🙌
マルチエージェントなコード生成エージェント、AgentCoderを理解する
コード生成の性能を向上させるために3つのエージェントを用いるAgentCoderについて
ポイント
- AgentCoderは、マルチエージェントで動作するコード生成フレームワーク
- 3つのエージェント(プログラマーエージェント、テストデザイナーエージェント、テストエグゼキューターエージェント)が役割に応じて協調しながら、コード生成を行う
- テストデザイナーエージェントは生成されたコードのテストケースを生成し、テストエグゼキューターエージェントはテストケースを実行し、プログラマーエージェントにフィードバックを提供
- プログラマーエージェントはテストエグゼキューターエージェントからのフィードバックも受けながらコードの生成・改善を行う
背景
- In-context Learningを用いて、コード生成タスクの性能を向上させる取り組みは数多く行われている
-
self-edit
- 自動生成コードを開発者が記述したテストケースに照らして実行
- コードがテストケースに合格しなかった場合には、提供されたエラーメッセージを使って改善するように促す
-
CodeCoT
- LLMに関数と対応するテストケースの両方を生成させる、生成されたコードをローカル環境で自動生成されたテストケースと照らし合わせて実行する自己検証フェーズの採用
- Code Chain-of-Thought(思考の連鎖によるコード生成)の手法を提唱
- LLMにコード生成の際に、問題理解、アルゴリズム選択、擬似コード作成、実際のコード生成という一連の思考プロセスを遂行させる
- コードとテストケースの両方を同一LLMに生成させるため、自己中心バイアス (Self Serving Bias) の可能性
課題
- 既存の研究では、コードの生成とテストケースの生成および実行のバランスを取ることが難しく、コード生成タスクで高い性能を達成すると、テストケース生成の効果が低下する可能性を指摘
- 同じLLMモデルがコードとテストケースを生成すると機能的なエラーが見逃される可能性がある
- 自己中心バイアス (Self Serving Bias, Self Bias)
アプローチ
- マルチエージェントのアプローチを採用(プログラマーエージェント、テストデザイナーエージェント、テストエグゼキューターエージェント)
- プログラマーエージェントはコードの生成、テストデザイナーエージェントはテストケースの作成、テストエグゼキューターエージェントは、テストケースの実行結果を元にフィードバックを与える
- テストエグゼキューターエージェントからのフィードバックに基づき、プログラマーエージェントは反復的にコードの生成・改善プロセスをこなす
成果
- 12のLLMと13の最適化手法を用いた評価実験により、AgentCoderがすべてのベースラインアプローチを上回ることが示された
- GPT-4を使用したAgentCoderは、すべてのデータセットで平均91.5%のpass@1を獲得し、最先端のアプローチの86.8%を上回った
- HumanEval-ETとMBPP-ETでは、GPT-3.5を使用したAgentCoderが77.4%と89.1%のpass@1を獲得したのに対し、他のアプローチはそれぞれ69.5%と63.0%であった。
- テストデザイナーエージェントが生成したテストケースは、より高いコードカバレッジを達成し、単一のエージェントが生成したテストケースよりも優れていることが示された
- 反復回数を増やすことで、AgentCoderの性能がさらに向上することが確認された。
エージェントの組み合わせパターンによる効果も評価されており、プログラマエージェント単体に比べ、テストデザイナーやテストエグゼキューターと組み合わせた場合にpass@1が向上することが報告されています。
一方で、テストデザイナーあるいはテストエグゼキューターが欠けていると、AgentCoderを大きく下回る結果となりました。
この結果から、3つのエージェントが協調して機能することが、コード生成の性能向上に不可欠であることを本論文では主張しています。
エージェント設計
プログラマエージェント: code generation with Chain-of-Thought instruction
プログラマエージェントは、コードの生成とフィードバックを元にしたコード改善の2つのシナリオに対応します。
コード生成
- プログラマエージェントは、Chain-of-Thoughtアプローチを用いて、タスクをより小さく管理可能なステップに分解
- Chain-of-Thoughtプロセスは、以下4つのステップ
- 問題の理解と明確化
- アルゴリズムと手法の選択
- 擬似コードの作成
- コード生成
- e.g.) 与えられた数字のリストの中で、与えられた閾値より近い2つの数字があるかどうかをチェックする
- タスクを理解し、リスト内の数字のペアを特定の閾値内で識別する要件を解釈する
- リスト内の各数のペアを比較する効率的な方法を決定する
- 解決策のためのステップ・バイ・ステップのガイドまたは擬似コードを作成する
- 擬似コードを実行可能なコードに変換する
コード改善
- プログラマエージェントによって生成されたコードは、様々な種類のエラー(構文エラーや実行時エラー)を含む可能性がある
- テストエグゼキューターエージェントによるテスト実行エラーのフィードバックを受け、コードを反復的に改善する
- プロセスは繰り返し行われ、プログラマエージェントは、すべてのテストケースに合格するまで、フィードバックに基づいてコードを改善し続ける
テストデザイナーエージェント: generating basic, edge, and large scale tests
テストデザイナーエージェントは、以下の3つの側面を満たすように設計されています。
基本的なテストケースの生成
- コードの基本的な機能をカバーするテストケースを設計
- 通常の条件下でコードが期待通りに動作することを保証
- 例えば、リストをソートするタスクでは、典型的な入力に対してリストが正しくソートされることを検証
エッジテストケースのカバー
- 極端な、あるいは異常な条件下でのコードの振る舞いを評価するためのテストケースを設計
- 境界条件、予期しない入力、稀なシナリオでコードに挑戦し、基本的なテストでは明らかにならないコードの潜在的なバグや弱点を特定
- 例えば、空のリストや非常に大きな数字のリストを使用して、ソートアルゴリズムをテストする
大規模な入力のカバー
- コードの性能とスケーラビリティを評価するためのテストケースを生成
- 高負荷条件下でコードをテストし、機能性と性能が維持されているかどうかを評価
- 例えば、何百万もの要素を持つリストでソートアルゴリズムをテスト
テストエグゼキューターエージェント: code validation and feedback Integration
テストエグゼキューターエージェントは、プログラマエージェントとテストデザイナーエージェントとは異なり、Pythonスクリプトによって実装されています。
ローカル環境と他の2つのエージェントと対話し、生成されたコードスニペットとテストケースを実際のローカル環境で実行し、その結果を分析・フィードバックすることで、コードの正確性と品質を確保するのが役割です。
コードスニペットとテストケースの収集
- プログラマエージェントによって生成されたコードと、テストデザイナーエージェントによって生成されたテストケースを受け取る
ローカル環境でのコードスニペットとテストケースの検証
- 受け取ったコードとテストケースをローカル環境で実行
テスト結果の分析と判定
- 出力を分析し、すべてのテストケースに成功したかどうかを判断
エラー情報のフィードバック
- 実行結果にエラー情報(例えば、シンタックスエラー)が含まれている場合、テストエグゼキューターエージェントはエラー情報をプログラマエージェントに返却
- プログラマエージェントに、報告されたエラーの修正を要求
まとめ
Agentic Design Patternsで言うところのマルチエージェントに該当する設計でしたが、一方でプログラマーエージェントは内部でコード生成を行う前にプランニングプロセスを挟むなど、複数のデザインパターンの組み合わせを想起する設計でした。
Discussion