Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜

175 Views

November 14, 25

スライド概要

YAPC::Fukuoka 2025

profile-image

俺はPHP生まれ、Perl育ち、Goは大好き、RubyやTSビジネス付き合い、Yo,Yo,Yo

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

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

2.

スライドはこちら #yapcjapan #yapcjapanB で感想をつぶやいて ね! 質問はこちら slido.com #3387 416 Track Bです https://speakerdeck.com/ mackee/agentnizhi-rudaonazellmhazi-dong-dekodow oshu-keruyouninatutanoka

3.

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

4.

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

5.

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

6.

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

7.

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

8.

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

9.

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

10.

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

11.

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

12.

年表 ● 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が多くの人にとっての実用になる

13.

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

14.

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

15.

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

16.

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

17.

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

18.

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

19.

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

20.

WebGPTのパイプライン

21.

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

22.

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

23.

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

24.

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

25.

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

26.

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

27.

SWE-Bench中のパイプライン

28.

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

29.

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

30.

今っぽくなった!

31.

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

32.

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

33.

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

34.

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

35.

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

36.

モデル ● さくらの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など

37.

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

38.

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

40.

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

41.

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

42.

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

43.

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

44.

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

46.

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

47.

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

49.

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

51.

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

52.

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

54.

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

55.

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

57.

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

58.

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

59.

参考文献 ● 菊田遥平. 原論文から解き明かす生成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)

60.

参考文献 ● 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)

61.

参考文献 ● 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.

62.

参考文献 ● 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.