Slide 1

Slide 1 text

ࡾ୐༔հ / Pepabo R&D Institute, GMO Pepabo, Inc. 2024.10.23 Fukuoka.go#20 GoݴޠͰλʔϛφϧϑϨϯυϦʔͳ AIίϚϯυafaΛͭͬͨ͘

Slide 2

Slide 2 text

ϓϦϯγύϧΤϯδχΞ ࡾ୐ ༔հ / @monochromegane  2 https://blog.monochromegane.com Yusuke Miyake ϖύϘݚڀॴ ݚڀһɺത࢜ʢ৘ใՊֶʣ

Slide 3

Slide 3 text

1. ͸͡Ίʹ

Slide 4

Slide 4 text

• ੜ੒AIͷ࣮༻Խʹ൐͍ɺ։ൃ؀ڥͱͷ౷߹͕ਐΜͰ͍Δ • ౰ॳͷੜ੒AIαʔϏεʹΑΔίʔσΟϯάࢧԉ͸ɺϓϥάΠϯతͳҐஔ෇͚Ͱ ͋ͬͨ • ྫ: (Vim, Emacs, VSCode etc…) + GitHub Copilot ͳͲ • ۙ೥Ͱ͸ɺίʔσΟϯάࢧԉޮ཰ͷ޲্ͷͨΊɺ͜ΕΒͷػೳ͕༧Ί૊Έࠐ· Εͨ։ൃ؀ڥʢΤσΟλ΍λʔϛφϧΞϓϦʣ͕ओྲྀʹͳ͍ͬͯΔ • ྫ: Cursor, Warp ͳͲ  4 എܠ

Slide 5

Slide 5 text

• ᶃ ։ൃࢧԉػೳͱ։ൃ؀ڥͷີ݁߹ • ར༻͍ͨ͠ࢧԉػೳʹΑͬͯ։ൃ؀ڥͦͷ΋ͷͷҠߦ͕ٻΊΒΕΔ • ༗ྗͳ։ൃ؀ڥ͸͋Δ͕ɺ·ͩ·ͩ৽͍͠΋ͷ͕ग़ݱ͢ΔՄೳੑ͸ߴ͍ • ᶄ ։ൃࢧԉػೳͷ։ൃ؀ڥ΁ͷแؚ • ར༻͍ͨ͠ࢧԉػೳͷͨΊʹɺͦͷ։ൃ؀ڥʢΤσΟλɺλʔϛφϧʣΛ։ ͖ɺͦͷ؀ڥͷྲّྀʹԊͬͯ݁ՌΛಘΔ • ͦͷ؀ڥ୯ମͰॲཧ͕׬݁͠ͳ͍৔߹ɺ֎෦؀ڥͱͷ࿈ܞʹ͸Ұखؒඞཁ  5 ՝୊

Slide 6

Slide 6 text

• ີ݁߹΍แؚʹىҼ͢Δ՝୊͸ɺUNIX఩ֶͱͷ૬ҧ͔Βઆ໌Ͱ͖ͦ͏  6 UNIX఩ֶ w • Write programs that do one thing and do it well. Ұͭͷ͜ͱΛ͏·͘΍ΔϓϩάϥϜΛॻ͘ • Write programs to work together. ࿈ܞ͢ΔϓϩάϥϜΛॻ͘ • Write programs to handle text streams, because that is a universal interface. ීวతͳΠϯλʔϑΣʔεͰ͋ΔςΩετετϦʔϜΛѻ͏ϓϩάϥϜΛॻ͘ IUUQTFOXJLJQFEJBPSHXJLJ6OJY@QIJMPTPQIZ → λʔϛφϧϑϨϯυϦʔͳAIίϚϯυͰղܾ

Slide 7

Slide 7 text

2. AFA λʔϛφϧϑϨϯυϦʔͳAIίϚϯυ

Slide 8

Slide 8 text

• ੜ੒AIαʔϏε΁ͷਪ࿦ΛίϚϯυϥΠϯͰ࣮ߦ͢Δπʔϧ • ೖग़ྗͱͯ͠ςΩετετϦʔϜΛલఏͱ͓ͯ͠ΓɺύΠϓ΍ϦμΠϨΫτΛ ༻͍ͯଞͷίϚϯυͱ࿈ܞ͠΍͍͢ͷ͕ಛ௃  8 AFA: λʔϛφϧϑϨϯυϦʔͳAIίϚϯυ $ echo $ERROR_MESSAGE | afa -p "What is happening?" /path/to/file1 /path/to/file2 • AFA͸ɺAI for AllͷུɻશͯͷίϚϯυͱ࿈ܞͰ͖Δͱ͍͏໨ඪΛදݱ •  AI for All := ∀x ∈ X, ∃AI(x)

Slide 9

Slide 9 text

 9 AFA: λʔϛφϧϑϨϯυϦʔͳAIίϚϯυ $ echo $ERROR_MESSAGE | afa -p "What is happening?" /path/to/file1 /path/to/file2 4ZTUFN 6TFS QSPNQUUFNQMBUF {{ .Message }} {{ if .MessageStdin }} ``` {{ .MessageStdin }}``` {{- end }} {{ range .Files }} - File: {{ .Name }} ``` {{ .Content }}``` {{ end -}} BGB 4UEJO 'JMF 1SPNQU (FOFSBUJWF"* 4FSWJDF 4UEPVU

Slide 10

Slide 10 text

• ݸผػೳͷϓϩάϥϜΛ࣮૷͢ΔͷͰ͸ͳ͘ϓϩϯϓτͰࢦࣔ͢Δ  10 AIΛલఏͱͨ͠UNIX఩ֶ w • Prompt programs that do one thing and do it well. Ұͭͷ͜ͱΛ͏·͘΍ΔϓϩάϥϜΛࢦࣔ͢Δ • Prompt programs to work together. ࿈ܞ͢ΔϓϩάϥϜΛࢦࣔ͢Δ • Prompt programs to handle text streams, because that is a universal interface. ීวతͳΠϯλʔϑΣʔεͰ͋ΔςΩετετϦʔϜΛѻ͏ϓϩάϥϜΛࢦࣔ͢Δ

Slide 11

Slide 11 text

• ΫϦοϓϘʔυͷத਎Λஔ͖׵͑  11 ϓϩϯϓτʹΑΔಈతίϚϯυͱͯ͠ͷAFA $ pbpaste | afa -p “Ϗδωεϝʔϧͷจମʹͯ͠” | pbcopy • ϑΝΠϧͷઆ໌ afa -p “঎༻ར༻ͷ؍఺Ͱઆ໌ͯ͠” LICENSE.md • ϫϯϥΠφʔͷఏҊ afa -p “JSONϑΝΠϧΛྻڍ” -j suggestion | jq -r ‘.cmd’

Slide 12

Slide 12 text

• AFA͸ɺ༧Ίొ࿥ͨ͠γεςϜϓϩϯϓτͱϢʔβʔϓϩϯϓτΛࢦఆՄೳ • ϓϩϯϓτ͸ςϯϓϨʔτͱͳ͓ͬͯΓɺίϚϯυͷ࣮ߦ࣌ͷίϯςΩετʹ Ԡͯ͡ಈతʹมԽ  12 ϓϩϯϓτςϯϓϨʔτ $ echo "Please explain the following.\n{{ (index .Files 0).Content }}" > CONFIG_PATH/templates/user/explain.tmpl $ afa -u explain /path/to/file

Slide 13

Slide 13 text

• OpenAIͷStructured outputΛޮՌతʹ࢖͏͜ͱͰෆཁͳઆ໌΍ίʔυϒϩο Ϋه๏ͷআڈ͕ෆཁͱͳΓɺग़ྗ݁Ռͷ࿈ܞੑ͕޲্  13 Structured Outputͷαϙʔτ $ cat <<< EOS > CONFIG_PATH/schemas/command_suggestion.json { "type": "object", "properties": { "suggested_command": { "type": "string" } }, "additionalProperties": false, "required": [ "suggested_command" ] } EOS $ afa -j command_suggestion -p "JSONϑΝΠϧΛྻڍ" | jq -r '.suggested_command'

Slide 14

Slide 14 text

 14 σϞ: λʔϛφϧ্ͰͷίϚϯυαδΣετ Zsh Line Editor (ZLE)ͱ૊Έ߹ ΘͤΔ͜ͱͰɺόοϑΝΛೖྗ ͱͯ͠ϫϯϥΠφʔΛαδΣε τ͠ɺόοϑΝΛஔ׵ɻ ίϚϯυͷΈΛऔಘ͢ΔͨΊʹ Structured outputΛ׆༻ https://github.com/monochromegane/afa/blob/main/examples/command_suggestion.gif

Slide 15

Slide 15 text

 15 σϞ: ΤσΟλ্ͰͷίʔυαδΣετ Vimͷൣғબ୒ͱ૊Έ߹ΘͤΔ ͜ͱͰɺબ୒ൣғΛೖྗͱͯ͠ ࢦࣔʹج͍ͮͨमਖ਼Ͱஔ׵ɻ ίϯςΩετͱͯ֘͠౰ϑΝΠ ϧ໊ͱϑΝΠϧશମͷ಺༰΋౉ ͍ͯ͠ΔʢCursorͷ@symbol తͳڍಈʣ ൺֱૢ࡞΋ख׳ΕͨΤσΟλͰ ͋Ε͹༻ҙͳ͸ͣ ͜Ε΋ɺमਖ਼ίʔυͷ݁ՌͷΈΛऔಘ ͢ΔͨΊʹStructured outputΛ׆༻ https://github.com/monochromegane/afa/blob/main/examples/code_suggestion.gif

Slide 16

Slide 16 text

• ͍ΘΏΔνϟοτϞʔυ • ୯ൃͷਪ࿦ͰऴΘΒͳ͍Α͏ͳ૬ޓతͳఏҊ΋λʔϛφϧ͔Β࣮ߦͰ͖Δ • ಠཱͨ͠ϦονTUIίϚϯυʢafa-tuiʣ΋ఏڙ͍ͯ͠Δ • աڈͷཤྺ΋อ͓࣋ͯ͠Γɺ࠶։΋Մೳ  16 ΠϯλϥΫςΟϒϞʔυ $ afa new # νϟοτ։࢝ $ afa resume # ௚ۙͷཤྺΛ࠶։ $ afa source -l SESSION_NAME # ཤྺΛࢦఆͯ͠࠶։

Slide 17

Slide 17 text

 17 σϞ: ϦονTUIʹΑΔνϟοτ λʔϛφϧ্Ͱͷνϟοτى ಈɻผ్ఏڙ͢ΔϦονTUI͸ ϚʔΫμ΢ϯϋΠϥΠτ΍ϖʔ δϟʔͷ໾ׂΛ࣋ͭ https://github.com/monochromegane/afa/blob/main/examples/chat.gif

Slide 18

Slide 18 text

• λʔϛφϧʹදࣔ͞ΕͨΤϥʔϝοηʔδͷ෼ੳ • tmuxͷcapture-paneΛ࢖ͬͯ௚ۙͷ࣮ߦ݁ՌΛ෼ੳɻෳ਺ߦʹΘͨΔΤϥʔ ϝοηʔδͷίϐϖͷख͕ؒল͚ͯศར • GitHubͷϓϧϦΫΤετͷࣗಈੜ੒ • git diffͱgit logͷ৘ใΛݩʹλΠτϧͱཁ໿Λੜ੒ͯ͠ϓϧϦΫΤετΛ։͘ • pecoΛ༻͍ͨηογϣϯཤྺͷߜΓࠐΈͱಡΈࠐΈ • ΠϯλϥΫςΟϒͳߜΓࠐΈͰૉૣ͘աڈͷηογϣϯʹΞΫηε  18 ͦͷଞͷ࣮ྫ

Slide 19

Slide 19 text

• ঺հΤϯτϦ • https://blog.monochromegane.com/blog/2024/09/16/afa/ • ϦϙδτϦ • https://github.com/monochromegane/afa • σϞʹ࢖ͬͨςϯϓϨʔτ΍ઃఆ΋ܝࡌ͍ͯ͠·͢ • Πϯετʔϧ͸ͪ͜Β  19 ࢖ͬͯΈͯͶ $ brew install monochromegane/tap/afa monochromegane/tap/afa-tui $ afa init

Slide 20

Slide 20 text

͓·͚

Slide 21

Slide 21 text

• ϦϦʔεϫʔΫϑϩʔʹ͸ɺSongmu/tagprΛ࠾༻ • ϦϦʔε༻ͷpull requestΛࣗಈ࡞੒͠ɺϚʔδ͞ΕͨΒࣗಈͰλάΛଧͭtagpr • ϦϦʔεϓϩηεΛεςʔτϨεʹ͢Δମݧͷྑ͞ • ͦͷଞɺϏϧυ΍όʔδϣϯ؅ཧ΋ɺSongmu/gocredits, Songmu/goxz, x-motemen/ gobump, tcnksm/ghr Λ࢖ͬͯݟ௨͠Α͘Ͱ͖ͨ • Homebrewͷtap؅ཧ͸@k1lowํࣜΛ࠾༻ • homebrew-tapϦϙδτϦ͔ΒͷϓϧܕʹΑΓɺݖݶ؅ཧΛ؆ૉԽͰ͖ͨ  21 CI

Slide 22

Slide 22 text

• λʔϛφϧૢ࡞ͷ࿥ըʹ͸charmbracelet/vhsΛ࠾༻ • https://github.com/charmbracelet/vhs • Goݴޠ࣮૷ • ೖྗ಺༰ΛઃఆϑΝΠϧʹهड़ͯ͠࠶ੜɾ࿥ը͢ΔͷͰۓு͠ͳ͍ • zshrcͷಡΈࠐΈͳͲΛ࣮ࢪ͢Δ͜ͱͰϩʔΧϧ؀ڥͱͷ෼཭΋༰қ  22 Demo Type "# AFA: Code suggestions using Vim." Sleep 500ms Ctrl+U Sleep 500ms Type "vim option.go" Sleep 500ms Enter Sleep 1s Type@50ms "jj" Sleep 500ms Type@20ms "11V" Sleep 500ms Type ":Afa" Sleep 500ms Enter

Slide 23

Slide 23 text

3. ·ͱΊ

Slide 24

Slide 24 text

• ੜ੒AIαʔϏεͱ։ൃ؀ڥͷ౷߹ํࣜʹ͍ͭͯ՝୊Λ੔ཧ͠ɺUNIX఩ֶͷ؍ ఺͔Βղܾख๏Λண૝ͨ͠ • λʔϛφϧϑϨϯυϦʔͳAIίϚϯυΛ࣮૷ɾެ։͠ɺ۩ମతͳ׆༻ํ๏Λ঺ հͨ͠ • ศར͕ͩɺ൚༻తͳίϚϯυͰ͋Δ͕Ώ͑ʹɺΩϥʔϢʔεέʔεͷొ৔͕଴ ͨΕΔʢ໨ࢦͤpecoʣ • ௒൚༻ίϚϯυΛલఏͱͨ͠πʔϧͷઃܭͱGoݴޠͰͷ࣮૷͸ָ͔ͬͨ͠ • ࡾGo  24 ·ͱΊ

Slide 25

Slide 25 text

No content