重要なポイント
研究者は、LLMコードアシスタントにLangChain4jのドキュメントとAPIを利用させ、マルチエージェントコーディングシステムを自ら設計・実装させた。
この自己構築コーディングエージェントは、実際のバグを修正し、テストに合格し、LangChain4jを通じて自身の実行フローを公開した。
2つのエージェントパターンを比較したところ、より厳格なワークフローパターンは、LLMが引き起こす調整オーバーヘッドを排除することで、スーパーバイザーパターンよりも3倍高速であることが判明した。
新しく導入されたMonitoredAgentインターフェースにより、エージェントの呼び出しレポートやシステムトポロジを明確に取得できる。
実験では、同じエージェント設計でも、旧型で低価格のモデルではツール呼び出しループに陥って失敗したが、新型モデルではタスクを正常に完了した。
実験概要
研究者はメタ実験を実施した。LangChain4jのドキュメントをコードアシスタントに渡し、そのドキュメントに基づいて「自身のバージョン」を構築するよう要求した。具体的には、人間のエンジニアのようにコードを書き、テストし、デバッグできるマルチエージェントシステムを設計することを期待した。
LLMがドキュメントに基づいて自身のバージョンを構築できたことは、LangChain4jのAPIが十分に明確で使いやすいこと、またフレームワークが十分なオーケストレーション能力を提供しており、生成されたシステムが実際のデバッグタスクをエンドツーエンドで実行できることを示している。
このプロジェクトは、LangChain4jの新しいモニタリングツールのテストにも貢献した。AIに別のAIを構築させる場合、内部で何が起こっているかを明確に把握する必要がある。本稿では、実験のプロセスと結果を詳述する。関連プロジェクトのコードはこのリポジトリで入手できる。
「雰囲気コーディング」によるエージェントシステム
コードアシスタントに最初のコーディングエージェントを構築させるため、研究者は以下のプロンプトを作成した:
LangChain4jエージェントフレームワークのドキュメントとソースコードを学習し、それに基づいてあなた自身のクローンとなるコーディングエージェントを設計せよ。
数分の思考の後、アシスタントはLangChain4jのスーパーバイザーパターンを使用することを決定し、初期アーキテクチャを提案した:
public interface SupervisorCoderSystem {
@SupervisorAgent(description = """
一个多智能体编码助手,可以探索代码库、规划实现、编写/编辑代码、运行构建/测试。
它编排专门的子智能体来完成编码请求。
""", subAgents = {
ExplorerAgent.class,
PlannerAgent.class,
ImplementerAgent.class,
ExecutorAgent.class
})
@Override
String code(@K(UserRequest.class) String request,
@K(WorkingDirectory.class) String workingDirectory);
@SupervisorRequest
static String request(@K(UserRequest.class) String userRequest,
@K(WorkingDirectory.class) String workingDirectory) {
return "将'" + workingDirectory + "'作为工作目录,完成以下用户请求:" + userRequest;
}
}アシスタントはまた、4つのサブエージェントと、それらのシステムメッセージおよびユーザーメッセージを設計・開発した。探索エージェントは既存のコードを探索し、計画エージェントは行動計画を策定し、実装エージェントは計画に従ってコードを作成し、実行エージェントはコードをコンパイルして実行する。各サブエージェントには、ファイルシステムブラウザ、コードエディタ、コードランナーなどの適切なツールが装備された。
最初のイテレーションの結果は印象的だった。現実の「プロフェッショナル」なコードアシスタントも通常、同様のパターン(探索、計画、実装、実行の4ステップをスーパーバイザー方式でオーケストレーションする)に従っており、これは実験で生成された実装と一致していた。
コードアシスタントがこのようなシステムを設計・実装できたことは、自身の内部動作にある程度の理解を持ち、その理解を具体的なエージェントシステム設計に変換できることを示している。
コーディングエージェントを実稼働させる
CONTEXT_AFTERに続く部分は翻訳しないでください。設計したエージェントエンコーダーをテストするため、研究者はそれにバグのあるコードをいくつか作成させ、新しく作ったシステムで修正させました。アシスタントはCalculatorクラスを生成し、4つの微妙なバグを含むメソッドを持っています:
public class Calculator {
public int sum(List<Integer> numbers) {
int total = 0;
for (int i = 0; i <= numbers.size(); i++) { // Bug: 应该是 i < numbers.size()
total += numbers.get(i);
}
return total;
}
public double average(List<Integer> numbers) {
if (numbers.isEmpty()) return 0;
return sum(numbers) / numbers.size(); // Bug: 整数除法,应转为double
}
public int max(List<Integer> numbers) {
if (numbers.isEmpty()) throw new IllegalArgumentException("列表不能为空");
int max = 0; // Bug: 如果所有数都是负数,会返回0
for (int n : numbers) {
if (n > max) max = n;
}
return max;
}
public long factorial(int n) {
if (n < 0) throw new IllegalArgumentException("n必须非负");
long result = 1;
for (int i = 1; i < n; i++) { // Bug: 应包含n,即 i <= n
result *= i;
}
return result;
}
}次にテストを生成し、Calculatorを含むフォルダを一時ディレクトリにクローンして、LangChain4jエージェントエンコーダーを実行しました:
@Test
void workflow_should_fix_buggy_calculator() throws Exception {
var coder = CoderAgenticSystem.supervisorCoder(coderModel());
Path source = Path.of("src/test/resources/buggy-project");
Path workDir = Path.of("/tmp/buggy-calculator");
String result = coder.code(
"测试当前失败,因为Calculator.java存在Bug。请修复它。",
workDir.toAbsolutePath().toString());
assertThat(result).isNotBlank();
System.out.println("结果: " + result);
}コードを実行する際、OpenAIのgpt-4oモデルを使用しました。これはLangChain4jのデフォルトモデルであり、ツール呼び出しに対応しているためです。しかし結果は期待通りではなく、数分後にエラーが発生しました:
dev.langchain4j.agentic.agent.AgentInvocationException: Failed to invoke agent method: public abstract...