Slide 1

Slide 1 text

Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜 macopy YAPC::Fukuoka 2025 2025-11-14 15:30〜 Track B

Slide 2

Slide 2 text

自己紹介: macopy ● 面白法人カヤック ○ グループ情報部,バックエンドエンジニア ● X: @mackee_w, GitHub: mackee ● Kamakura.go 主催 ● YAPC参加歴14年 ○ これまでのトーク内容 ■ ハードウェア, IoT ■ テストの高速化 ■ 静的解析

Slide 3

Slide 3 text

最近好きなもの ● LLM, AI Agent, AI Coding ○ 元々SFが好き ○ 現実世界にSF的なものが実装されるのがワクワクする ■ mRNAワクチンもワクワクしながら打ちに行った ○ AIによって社会がどう変わるのかみたいなのが興味がある ● 3Dプリンティング ○ 自己複製機械としての3Dプリンタ面白くないですか?? ● WebAssembly ○ Compile Once, Run Anywhere

Slide 4

Slide 4 text

おーっとWASMと言え ば!?!?

Slide 5

Slide 5 text

[AD]Perl Anybatrossやっています https://perlbatross.kayac.com/ ● 前回,前々回のYAPCでも行なったコードゴルフコンテスト ● 今回からPerl以外の言語にも対応しました

Slide 6

Slide 6 text

今日話すこと ● なぜLLMがコードを書けるようになったのか ○ LLMがコードを書く時のハードル ○ エージェント による進化と洗練 ● コーディングエージェントを書いてみよう ○ ライブコーディング ○ SWE-Benchを解かせる

Slide 7

Slide 7 text

今日話さないこと ● どのコーディングエージェントが良いかなどは話さない ● 具体的に仕事でAIエージェントを使うかなどは話さない ● LLMやファインチューニング等の話は詳しくはしない ○ 外側のエージェントの説明を主に行います

Slide 8

Slide 8 text

なぜこのトークをしたいか ● 2025年になって突然生成AIに コーディングさせる世の中に なっている ように見える ○ 2024年までコードを書く主 体は明らかに人間だった

Slide 9

Slide 9 text

いきなり世界が変わったよう に見えたが 論文の世界では少しずつこの 世界に近づいていった

Slide 10

Slide 10 text

なぜLLMがコードを書けるよ うになったのか

Slide 11

Slide 11 text

年表 ● Attention is All You Need (Vaswani et al., 2017) ○ Transformerの提案 ● GPT (Radford et al., 2018), GPT-2 (Radford et al., 2019), GPT-3 (Brown et al., 2020) ○ 大規模言語モデルの登場 ● InstructGPT (Ouyang et al., 2022) ○ 指示に従うモデルの登場 => ChatGPT ○ LLMが多くの人にとっての実用になる

Slide 12

Slide 12 text

この頃のLLMでコードを書かせる論文 ● Evaluating Large Language Models Trained on Code (Chen et al., 2021) ○ 初期のGitHub Copilotのベースになった論文 ○ docstringに書かれている仕様をもとに続きのコードを生成 ● ここで挙げられている課題 ○ 仕様がが長いと性能が落ちる ○ 操作のステップが多い問題でミスる

Slide 13

Slide 13 text

この時はまだ一発勝負だった ● 課題をLLMに与えてコードを生成 -> それが正しいかを見る ● LLMが内部にもつ知識にのみに依存する

Slide 14

Slide 14 text

ここで我々がコードを書いているときにどうしている か考えてみよう 1. 仕様を読む 2. 周辺のコードを読む 3. コードを書く 4. 動かしてみる 5. うまく動かなかったらエラーメッセージなどを 見て直す

Slide 15

Slide 15 text

人間は一発勝負でコードを書 いていない

Slide 16

Slide 16 text

一発勝負のパイプラインだと必要なファイルを読め ない ● 何が必要になるかわからないので全部コードを読ませる ○ コンテキストが溢れてしまう ○ コンテキストに収まっても参考にできない ■ Lost in the middle (Liu et al., 2023) ● 仕様を読んだ上で必要なファイルがなんなのかを判断し、それを読む判 断が必要になる

Slide 17

Slide 17 text

一方RAGの世界でも似たようなことが ● Retrieval-Augmented Generation (Lewis et al., 2020) ○ 外部知識ベースから情報を取得して応答を生成 ○ このときも実は一発勝負 ○ でも我々がググる時も一発勝負じゃないよね? ● HotpotQA (Yang et al., 2018) のようなマルチホップ推論タスクが課題 ○ 複数の情報源から情報を集めて答えを出す ○ 一発勝負では難しい

Slide 18

Slide 18 text

人がやっていることを模倣することで性能を上げる ● WebGPT (Nakano et al., 2021) ○ LLMがWebを検索し、情報を取得して応答を生成 ○ テキストベースのブラウザを操作するコマンドをLLMに提供

Slide 19

Slide 19 text

WebGPTのパイプライン

Slide 20

Slide 20 text

ツールを汎用化すれば Web 検索以外にも使えるのではな いか?

Slide 21

Slide 21 text

ReAct (Yao et al., 2022) ● WebGPTのような行動と観察のループをより一般化 ● なぜその行動を取るのかを説明し、ログに残す ● Thought, Action, Observation のループを定義

Slide 22

Slide 22 text

ReActのプロンプト Solve a question answering task with interleaving Thought, Action, Observation steps. Thought can reason about the current situation, and Action can be three types: Here are some examples. <例を示す> Chain of Thought(Wei et al., 2022) と Few-Shot(Brown et al., 2020)を組み合わせたプロン プト

Slide 23

Slide 23 text

ReActが自律的に判断し行 動する"AIエージェント "の基 礎になる

Slide 24

Slide 24 text

ReActの考え方をコード生成タスクに導入する ● Reflexion(Shinn et al., 2023) ○ シンタックスエラーなどをフィードバックする, 自己反省を入れる ● InterCode(Yang et al., 2023) ○ 1ループごとに実行を行い、エラーなどをそのままフィードバックする

Slide 25

Slide 25 text

AIにコードを書かせるベンチマーク ● HumanEval (Chen et al., 2021) ○ 関数仕様からコードを生成し,ユニットテストで評価 ● APPS (Hendrycks et al., 2021) ○ より大規模なコーディング問題集 ● SWE-Bench (Jimenez et al., 2023) ○ 実際のGitHubリポジトリから抽出されたコーディング課題 ○ リポジトリ全体から必要なファイルを読む必要がある

Slide 26

Slide 26 text

SWE-Bench中のパイプライン

Slide 27

Slide 27 text

SWE-Benchはまだ一発勝負 ● 実リポジトリを対象に正しいパッチを生成できるかどうかを評価 ● 関連ファイルは事前にコンテキストに入れられている ○ 関連ファイルはBM25もしくは実際に元となったPull Requestの変更 差分から抽出 ● Claude 2で1.96%しか解決できない

Slide 28

Slide 28 text

SWE-Agent (Yang et al., 2024) ● リポジトリ探索, ファイル読み込み, ファイル編集をツール化 ● ReActのフレームワークを用いてエージェントを構築 ● GPT-4 Turboを用いてSWE-Benchで12.47%解決を達成

Slide 29

Slide 29 text

今っぽくなった!

Slide 30

Slide 30 text

それ以降はみなさんが知る通りです ● SWE-Bench Verifiedの解決率は70%まで到達 ○ SWE-Bench Verified はSWE-Benchの中でも特に信頼性の高い テストスイートを持つタスク群 ● 汎用LLMがコード生成タスクも得意になった ● ツールの種類・使い方が洗練された ● コード生成ツールがお金になることにみんな気がついた

Slide 31

Slide 31 text

まとめ: なぜLLMがコードを書けるようになったの か ● コード生成タスクがベンチマークとして示された ● 一発勝負の生成では色々厳しいと気がついた ● 人間がやっていることを模したReActというフレームワークが提案された ● LLMの進化とともに、"エージェント"という概念が生まれてコード生成タス クに適用された

Slide 32

Slide 32 text

コーディングエージェントを 書いてみよう

Slide 33

Slide 33 text

● Perlでエージェントを書いてみます ● mini-swe-agentを参考にしています ○ https://github.com/SWE-agent/mini-swe-agent ● 基本的なReActループを実装し、タスクが行えることを確認します ライブコーディングでやること

Slide 34

Slide 34 text

● チャット的なUIは実装しない。引数にタスクを与えてタスクが完了すると終 了する 実装戦略

Slide 35

Slide 35 text

● さくらのAI Engineを使用 ○ https://www.sakura.ad.jp/aipf/ai-engine/ ● Qwen3-Coder-480B-A35B-Instruct-FP8 ○ アリババ社のQwen3シリーズのコード生成特化モデル ○ SWE-Bench Verified Bash Onlyで55.40%の解決率 ■ 2025年8月時点 ■ 上はOpenAI o3, GPT-5 mini, Claude 4 Sonnetなど ■ 下はGemini 2.5 Pro, Claude 3.7 Sonnetなど モデル

Slide 36

Slide 36 text

● [ ] APIクライアントを作成 ● [ ] メッセージを受け取ってLLMに投げて応答を表示 ● [ ] Perlコードの生成 ● [ ] Perlコードの実行 ● [ ] Perlコードの出力をフィードバック ● [ ] タスクの終了方法の定義 実装の手順

Slide 37

Slide 37 text

● さくらのAI EngineのAPIを呼び出すクライアントを作成 ○ といってもOpenAI API互換なので簡単です ● HTTPクライアントはHTTP::Tinyishを使用 ○ HTTP::Tiny(標準モジュール)と同じインターフェイスで、curlや LWP::UserAgentがあればそれを使う ● JSONのエンコード・デコードはJSON::PPを使用 ○ 標準モジュール ● 後述する理由でperl v5.34がターゲット まずAPIクライアントを作ろう

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

● 1つ目の引数をメッセージとして受け取りLLMにそのまま投げる ● 応答をそのまま表示する メッセージを受け取って LLMに投げて応答を表示し よう

Slide 40

Slide 40 text

● [x] APIクライアントを作成 ● [x] メッセージを受け取って LLMに投げて応答を表示 ● [ ] Perlコードの生成 ● [ ] Perlコードの実行 ● [ ] Perlコードの出力をフィードバック ● [ ] タスクの終了方法の定義 途中経過

Slide 41

Slide 41 text

● 多くのAIエージェントは予め定義されたツールを指定して環境操作する ● mini-swe-agentは代わりにbash上でコマンドを打つことで操作する ● 今回は環境操作を行うための Perlコードを書かせて evalで実行する ○ Executable Code Actions Elicit Better LLM Agents (Wang et al., 2024) ■ Pythonコードを環境操作に使う例が示されている 環境操作の方法

Slide 42

Slide 42 text

● LLMにコードを書かせるプロンプトを追加する ● 予告ですがReActループを示唆するようなプロンプトにしています Perlコードの生成

Slide 43

Slide 43 text

● LLMの応答からコードブロックを抽出してevalで実行 ○ 危険なのでみなさんはDockerなどのサンドックス内で動かそうね! ● 正規表現でperl ... を抽出 ○ perlがついていないことも想定 ● Capture::Tinyで標準出力をトラップ ● Term::ANSIColorを使って色つけしてわかりやすいようにコードの出力を 表示 Perlコードの実行

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

● [x] APIクライアントを作成 ● [x] メッセージを受け取ってLLMに投げて応答を表示 ● [x] Perlコードの生成 ● [x] Perlコードの実行 ● [ ] Perlコードの出力をフィードバック ● [ ] タスクの終了方法の定義 途中経過

Slide 46

Slide 46 text

● evalの結果をそのままユーザーメッセージとしてフィードバック ● そしてループに入れる ○ コード実行の結果を見てさらにコードを書き換えたり別のコードを自律 的に書いたりできる Perlコードの出力をフィードバック

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

● このままだと無限ループになるのでタスクが終了したとLLMが伝える方法 を定義する ● コード実行の標準出力の先頭に__COMPLETE__があればタスク完了と みなす ○ mini-swe-agentが同様の方法を取っている タスクの終了方法の定義

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

● [x] APIクライアントを作成 ● [x] メッセージを受け取ってLLMに投げて応答を表示 ● [x] Perlコードの生成 ● [x] Perlコードの実行 ● [x] Perlコードの出力をフィードバック ● [x] タスクの終了方法の定義 これで完成?

Slide 51

Slide 51 text

● THOUGHTがない ○ Thought, Action, Observation のループを定義 ● コードを書く前になんでそのコードを書くのか自分で説明させると性能が 上がる なんか忘れてないかな?

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

● [x] APIクライアントを作成 ● [x] メッセージを受け取ってLLMに投げて応答を表示 ● [x] Perlコードの生成 ● [x] Perlコードの実行 ● [x] Perlコードの出力をフィードバック ● [x] タスクの終了方法の定義 ● [x] THOUGHTセクションの追加 完成!

Slide 54

Slide 54 text

● SWE-Bench Verifiedをやらせてみよう ○ 使用する課題 django_django-11299
 ○ コンテナイメージに入っているシステムPerlがv5.34 ● 実はこのままだとfew shotが足りないのでPull Request description とともにPerlコードの例を与えています ○ mini-swe-agentのSWE-Bench向けプロンプトを参考にしています これちゃんとコード書けるの?

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

まとめ ● AIエージェントが生まれる過程を論文をもとに挙げました ● Perlで簡単なコード生成エージェントを作成しました ○ Thought, Action, Observation のループを実装しました ○ few shotも入れました ● コード生成エージェントをSWE-Bench Verifiedの問題を使って動作確認 しました

Slide 57

Slide 57 text

Any questions? ベストトークへ投票お願いしま す!!!!

Slide 58

Slide 58 text

参考文献 ● 菊田遥平. 原論文から解き明かす生成AI. 技術評論社, 2025. ● Hajime Morita, Jun Mukai. Misreading Chat: #143 Can Language Models Resolve Real-World GitHub Issues?. ポッドキャ スト, 2024 ● Vaswani, A. et al. 2017. Attention is All You Need. ● Radford, A. et al. 2018. Improving Language Understanding by Generative Pre-Training.(GPT)

Slide 59

Slide 59 text

参考文献 ● Nakano, R. et al. 2021. WebGPT: Browser-assisted question-answering with human feedback. ● Chen, M. et al. 2021. Evaluating Large Language Models Trained on Code.(HumanEval / Codex) ● Hendrycks, D. et al. 2021. Measuring Coding Challenge Competence with APPS. ● Ouyang, L. et al. 2022. Training language models to follow instructions with human feedback.(InstructGPT)

Slide 60

Slide 60 text

参考文献 ● Wei, J. et al. 2022. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. ● Yao, S. et al. 2022. ReAct: Synergizing Reasoning and Acting in Language Models. ● Liu, H. et al. 2023. Lost in the Middle: How Language Models Use Long Context. ● Shinn, N. et al. 2023. Reflexion: Language Agents with Verbal Reinforcement Learning.

Slide 61

Slide 61 text

参考文献 ● Yang, K. et al. 2023. InterCode: Standardizing and Benchmarking Interactive Coding with Execution Feedback. ● Jimenez, C. et al. 2023. SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ● Yang, K. et al. 2024. SWE-Agent: Agent-Computer Interfaces Enable Automated Software Engineering. ● Wang, Y. et al. 2024. Executable Code Actions Elicit Better LLM Agents.