Share
Embed
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
2024.10.23 Fukuoka.go#20
https://fukuokago.connpass.com/event/330951/
monochromegane
October 23, 2024
Transcript
25 slides
-
ࡾ༔հ / Pepabo R&D Institute, GMO Pepabo, Inc. 2024.10.23 Fukuoka.go#20
GoݴޠͰλʔϛφϧϑϨϯυϦʔͳ AIίϚϯυafaΛͭͬͨ͘ -
• ੜAIͷ࣮༻Խʹ͍ɺ։ൃڥͱͷ౷߹͕ਐΜͰ͍Δ • ॳͷੜAIαʔϏεʹΑΔίʔσΟϯάࢧԉɺϓϥάΠϯతͳҐஔ͚Ͱ ͋ͬͨ • ྫ: (Vim, Emacs, VSCode
etc…) + GitHub Copilot ͳͲ • ۙͰɺίʔσΟϯάࢧԉޮͷ্ͷͨΊɺ͜ΕΒͷػೳ͕༧ΊΈࠐ· Εͨ։ൃڥʢΤσΟλλʔϛφϧΞϓϦʣ͕ओྲྀʹͳ͍ͬͯΔ • ྫ: Cursor, Warp ͳͲ  4 എܠ -
• ᶃ ։ൃࢧԉػೳͱ։ൃڥͷີ݁߹ • ར༻͍ͨ͠ࢧԉػೳʹΑͬͯ։ൃڥͦͷͷͷҠߦ͕ٻΊΒΕΔ • ༗ྗͳ։ൃڥ͋Δ͕ɺ·ͩ·ͩ৽͍͠ͷ͕ग़ݱ͢ΔՄೳੑߴ͍ • ᶄ ։ൃࢧԉػೳͷ։ൃڥͷแؚ
• ར༻͍ͨ͠ࢧԉػೳͷͨΊʹɺͦͷ։ൃڥʢΤσΟλɺλʔϛφϧʣΛ։ ͖ɺͦͷڥͷྲّྀʹԊͬͯ݁ՌΛಘΔ • ͦͷڥ୯ମͰॲཧ͕݁͠ͳ͍߹ɺ֎෦ڥͱͷ࿈ܞʹҰखؒඞཁ  5 ՝ -
• ີ݁߹แؚʹىҼ͢Δ՝ɺ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ίϚϯυͰղܾ -
• ੜ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) -
 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 -
• ݸผػೳͷϓϩάϥϜΛ࣮͢ΔͷͰͳ͘ϓϩϯϓτͰࢦࣔ͢Δ  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. ීวతͳΠϯλʔϑΣʔεͰ͋ΔςΩετετϦʔϜΛѻ͏ϓϩάϥϜΛࢦࣔ͢Δ -
• ΫϦοϓϘʔυͷதΛஔ͖͑  11 ϓϩϯϓτʹΑΔಈతίϚϯυͱͯ͠ͷAFA $ pbpaste | afa -p
“Ϗδωεϝʔϧͷจମʹͯ͠” | pbcopy • ϑΝΠϧͷઆ໌ afa -p “༻ར༻ͷ؍Ͱઆ໌ͯ͠” LICENSE.md • ϫϯϥΠφʔͷఏҊ afa -p “JSONϑΝΠϧΛྻڍ” -j suggestion | jq -r ‘.cmd’ -
• AFAɺ༧Ίొͨ͠γεςϜϓϩϯϓτͱϢʔβʔϓϩϯϓτΛࢦఆՄೳ • ϓϩϯϓτςϯϓϨʔτͱͳ͓ͬͯΓɺίϚϯυͷ࣮ߦ࣌ͷίϯςΩετʹ Ԡͯ͡ಈతʹมԽ  12 ϓϩϯϓτςϯϓϨʔτ $ echo
"Please explain the following.\n{{ (index .Files 0).Content }}" > CONFIG_PATH/templates/user/explain.tmpl $ afa -u explain /path/to/file -
• 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' -
 14 σϞ: λʔϛφϧ্ͰͷίϚϯυαδΣετ Zsh Line Editor (ZLE)ͱΈ߹ ΘͤΔ͜ͱͰɺόοϑΝΛೖྗ ͱͯ͠ϫϯϥΠφʔΛαδΣε
τ͠ɺόοϑΝΛஔɻ ίϚϯυͷΈΛऔಘ͢ΔͨΊʹ Structured outputΛ׆༻ https://github.com/monochromegane/afa/blob/main/examples/command_suggestion.gif -
 15 σϞ: ΤσΟλ্ͰͷίʔυαδΣετ VimͷൣғબͱΈ߹ΘͤΔ ͜ͱͰɺબൣғΛೖྗͱͯ͠ ࢦࣔʹج͍ͮͨमਖ਼Ͱஔɻ ίϯςΩετͱͯ֘͠ϑΝΠ ϧ໊ͱϑΝΠϧશମͷ༰ ͍ͯ͠ΔʢCursorͷ@symbol
తͳڍಈʣ ൺֱૢ࡞ख׳ΕͨΤσΟλͰ ͋Ε༻ҙͳͣ ͜Εɺमਖ਼ίʔυͷ݁ՌͷΈΛऔಘ ͢ΔͨΊʹStructured outputΛ׆༻ https://github.com/monochromegane/afa/blob/main/examples/code_suggestion.gif -
• ͍ΘΏΔνϟοτϞʔυ • ୯ൃͷਪͰऴΘΒͳ͍Α͏ͳ૬ޓతͳఏҊλʔϛφϧ͔Β࣮ߦͰ͖Δ • ಠཱͨ͠ϦονTUIίϚϯυʢafa-tuiʣఏڙ͍ͯ͠Δ • աڈͷཤྺอ͓࣋ͯ͠Γɺ࠶։Մೳ  16
ΠϯλϥΫςΟϒϞʔυ $ afa new # νϟοτ։࢝ $ afa resume # ۙͷཤྺΛ࠶։ $ afa source -l SESSION_NAME # ཤྺΛࢦఆͯ͠࠶։ -
• λʔϛφϧʹදࣔ͞ΕͨΤϥʔϝοηʔδͷੳ • tmuxͷcapture-paneΛͬͯۙͷ࣮ߦ݁ՌΛੳɻෳߦʹΘͨΔΤϥʔ ϝοηʔδͷίϐϖͷख͕ؒল͚ͯศར • GitHubͷϓϧϦΫΤετͷࣗಈੜ • git diffͱgit
logͷใΛݩʹλΠτϧͱཁΛੜͯ͠ϓϧϦΫΤετΛ։͘ • pecoΛ༻͍ͨηογϣϯཤྺͷߜΓࠐΈͱಡΈࠐΈ • ΠϯλϥΫςΟϒͳߜΓࠐΈͰૉૣ͘աڈͷηογϣϯʹΞΫηε  18 ͦͷଞͷ࣮ྫ -
• հΤϯτϦ • 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 -
• ϦϦʔεϫʔΫϑϩʔʹɺSongmu/tagprΛ࠾༻ • ϦϦʔε༻ͷpull requestΛࣗಈ࡞͠ɺϚʔδ͞ΕͨΒࣗಈͰλάΛଧͭtagpr • ϦϦʔεϓϩηεΛεςʔτϨεʹ͢Δମݧͷྑ͞ • ͦͷଞɺϏϧυόʔδϣϯཧɺSongmu/gocredits, Songmu/goxz,
x-motemen/ gobump, tcnksm/ghr Λͬͯݟ௨͠Α͘Ͱ͖ͨ • Homebrewͷtapཧ@k1lowํࣜΛ࠾༻ • homebrew-tapϦϙδτϦ͔ΒͷϓϧܕʹΑΓɺݖݶཧΛ؆ૉԽͰ͖ͨ  21 CI -
• λʔϛφϧૢ࡞ͷըʹ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 -
• ੜAIαʔϏεͱ։ൃڥͷ౷߹ํࣜʹ͍ͭͯ՝Λཧ͠ɺUNIXֶͷ؍ ͔Βղܾख๏Λணͨ͠ • λʔϛφϧϑϨϯυϦʔͳAIίϚϯυΛ࣮ɾެ։͠ɺ۩ମతͳ׆༻ํ๏Λ հͨ͠ • ศར͕ͩɺ൚༻తͳίϚϯυͰ͋Δ͕Ώ͑ʹɺΩϥʔϢʔεέʔεͷొ͕ ͨΕΔʢࢦͤpecoʣ •
൚༻ίϚϯυΛલఏͱͨ͠πʔϧͷઃܭͱGoݴޠͰͷָ࣮͔ͬͨ͠ • ࡾGo  24 ·ͱΊ