Cursor Agentハーネスの継続的改善: コンテキストウィンドウからマルチエージェントの未来へ
Cursorチームは、AIコーディング支援エージェントのハーネスをソフトウェア製品として開発する方法を詳述。静的コンテキストから動的取得への進化、品質評価の二方式(ベンチマークとオンラインA/Bテスト)、劣化の追跡・修正システム、モデル別のカスタマイズ、ミッドチャットでのモデル切り替えの課題と解決策を紹介し、最後にマルチエージェント協働の展望を語っている。
Cursorチームはブログ記事で、AIコーディングアシスタントのエージェントハーネスを、ソフトウェア製品と同様のアプローチで継続的に改善している方法を公開した。同記事は、コンテキストウィンドウの管理からマルチエージェントの未来像まで、幅広いトピックをカバーしている。
コンテキストウィンドウの進化
エージェントと大規模言語モデルのインタラクションの中核はコンテキストウィンドウである。2024年末の初代エージェントでは、モデルが自力でコンテキストを選択する能力が低かったため、チームは多くのコンテキストエンジニアリングに注力した。例えば、編集後にlintエラーや型エラーを表示したり、ファイル読み込みの行数を調整したり、1ターンに呼び出せるツール数を制限したりした。また、コードベースのフォルダ構成や意味的に一致するコードスニペットなど、大量の静的コンテキストを常に提供していた。しかし、モデル能力の向上に伴い、それらの静的コンテキストのほとんどは不要となり、エージェントが作業中に動的にコンテキストを取得する方式へ移行した。チームは、動的コンテキストの提供方法をさらに拡充することに注力している。
ハーネス変更の評価方法
ハーネスとモデルがエージェントの品質を決定するが、「良い」を定義するのは難しい。そこで、複数の評価レイヤーを構築した。公開ベンチマークに加え、内部評価スイートCursorBenchを維持し、標準化された品質評価と時系列比較を可能にしている。しかし、ベンチマークは実際の使用を近似するに過ぎないため、オンライン実験も実施している。複数のハーネスバリアントを並行デプロイし、A/Bテストで実際の使用状況を評価する。レイテンシ、トークン効率、ツール呼び出し回数などの客観的指標に加え、より曖昧な品質を測るために「コード保持率」(エージェントが生成したコードが一定時間後にユーザーのコードベースに残っている割合)と、LLMを用いたユーザー満足度分析を利用している。ユーザーが次の機能に進むならエージェントが仕事をした証拠であり、スタックトレースを貼るなら失敗の証拠とみなす。オンラインテストは時として有望なアイデアを却下することもある。例えば、より高価なコンテキスト要約モデルを試したが、品質向上はわずかでコストに見合わなかった。
劣化の追跡と修復
モデルや機能が増えるにつれ、ハーネスは複雑化し、バグの表面積が広がる。ツール呼び出しのエラーは特に有害で、コンテキストに残り「コンテキスト劣化」を引き起こす。未知のエラーはハーネスのバグとして扱われるが、多くのエラーは「予期される」ものだ。例えば、モデルが存在しないファイルを読もうとするなどのエラーを原因別に分類している。InvalidArgumentsやUnexpectedEnvironmentはモデルの誤りやコンテキストの矛盾を捉え、ProviderErrorは外部ベンダーの障害を捉える。これらの指標に基づいてアラートを設定し、深刻な劣化を検知する。未知のエラー率がしきい値を超えた場合、即座にアラートが発報される。予期されるエラーについては、異常検知アラートを設定し、ベースラインからの有意な乖離を監視する。さらに、週次の自動化プロセスでログを検索し、新規または急増した問題を特定してチケットを作成する。この「ソフトウェアファクトリー」プロセスにより、未知のツール呼び出しエラーを一桁削減した。
モデル別のハーネスカスタマイズ
ハーネスの抽象化はモデル非依存だが、サポートする各モデルごとに深くカスタマイズされている。OpenAIのモデルはパッチベースの編集形式に、Anthropicのモデルは文字列置換に最適化されているため、ハーネスは各モデルが訓練時に使用したツール形式を提供する。カスタマイズはプロンプトレベルにも及び、OpenAIのモデルはより逐語的で正確な指示に従う傾向がある一方、Claudeは直感的で曖昧な指示に寛容である。新モデルの早期アクセスを得た場合、最も近い既存モデルのハーネスから開始し、オフライン評価で困惑点を見つけ、チームメンバーが使用して問題を表面化させ、ハーネスを調整する。時にはモデル特有の癖に対処することもある。例えば、あるモデルがコンテキストが埋まると「コンテキスト不安」を示し、作業を拒否したため、プロンプト調整で軽減した。
ミッドチャットでのモデル切り替えの支援
ユーザーが会話の途中でモデルを切り替える場合、異なるモデルの行動、プロンプト、ツール形式に対応する必要がある。Cursorは自動的に適切なハーネスに切り替えるが、モデルは別のモデルが生成した会話履歴を扱うことになる。この問題に対処するため、ハーネスはモデルに対して、他のモデルから引き継いだことを伝えるカスタム指示を追加し、現在のツールセットに含まれないツールを呼び出さないように誘導する。また、キャッシュはプロバイダーおよびモデル固有であるため、切り替え時にキャッシュミスが発生し、最初のターンが遅く高コストになる。チームは切り替え時に会話を要約することでこのペナルティを軽減しようと試みたが、複雑なタスクでは詳細が失われる可能性がある。そのため、一般的には1つの会話中は同じモデルを使い続けることを推奨している。別の方法として、新しいコンテキストウィンドウを持つサブエージェントを利用することも可能で、ユーザーは特定のモデルでサブエージェントを実行するよう直接依頼できる。
ハーネスとソフトウェア開発の未来
AI支援ソフトウェアエンジニアリングの未来はマルチエージェント協働にある。単一のエージェントですべてのサブタスクを実行するのではなく、システムは専門のエージェントに委任する方法を学ぶ。計画用、高速編集用、デバッグ用など、各エージェントが最適な範囲で動作する。この連携をうまく機能させるためには、ハーネスが不可欠である。システムはどのエージェントを派遣するか、そのエージェントの強みに合わせてタスクを組み立てるか、結果を一貫したワークフローに統合するかを決定する必要がある。このオーケストレーション能力は、個々のエージェントではなくハーネスに備わる。したがって、ハーネスエンジニアリングはエージェントの成功にとって今後さらに重要になると結論付けている。