4日前、Cognition LabはDevinを発表しました。これは初めてのAIソフトウェアエンジニアと称されています。
DevinはSWE-Benchコードベンチマークにおける最新技術であり、トップクラスのAI企業の実際のエンジニアリング面接に成功し、さらにUpworkで実際の仕事を完了しています。Devinは自主的なエージェントであり、独自のシェル、コードエディタ、およびWebブラウザを使用してエンジニアリングタスクを解決します。
Devinの能力
長期的な推論と計画の進展により、Devinは数千もの意思決定が必要な複雑なエンジニアリングタスクを計画し、遂行することができます。Devinは各ステップで関連するコンテキストを思い出せ、時間とともに学習し、誤りを修正することができます。
私たちはさらに、シェル、コードエディタ、ブラウザなどの一般的な開発ツールをDevinに装備しました。これらすべてはサンドボックス計算環境内にあり、人間が作業を行うために必要なすべてのツールが揃っています。
最後に、私たちはDevinにユーザーとの積極的な協力能力を与えました。Devinは進行状況をリアルタイムで報告し、フィードバックを受け取り、必要に応じてあなたと一緒にデザイン選択を行います。
できるいくつかの例
Devinは不慣れな技術を学ぶことができます。ブログ記事を読んだ後、DevinはModal上でControlNetを実行し、Saraのために隠されたメッセージを持つ画像を生成しました。 Devinはアプリケーションを端から端まで構築し、デプロイすることができます。Devinは生命ゲームをシミュレートするインタラクティブなサイトを作成しました!それは段階的にユーザー要求の機能を追加し、その後Netlifyにアプリケーションをデプロイしました。 Devinは自主的にコードリポジトリ内のバグを見つけて修正することができます。DevinはAndrewのオープンソース競技プログラミング本のメンテナンスとデバッグを手伝いました。 Devinは自分のAIモデルを訓練し、微調整することができます。DevinはGitHub上の研究リポジトリへのリンクのみ与えられ、大規模言語モデルの微調整を設定しました。 Devinはオープンソースリポジトリ内のバグや機能リクエストに対処することができます。GitHub問題へのリンクを提供するだけで、Devinはすべての必要なセットアップとコンテキスト収集を完了します。 Devinは成熟したプロダクションリポジトリに貢献することができます。この例はSWE-benchベンチマークの一部です。Devinはsympy Python代数システムでの対数計算の誤りを解決しました。Devinはコード環境を設定し、誤りを再現し、独立して修正案を記述しテストしました。 DevinをUpworkで実際の仕事に受けさせても、それに対応できます!ここでは、Devinはコンピュータビジョンモデルを実行するためにコードを記述し、デバッグしました。
Devinのパフォーマンス
私たちはSWE-benchでDevinを評価しました。これは、代理がDjangoやscikit-learnなどのオープンソースプロジェクトで見つけた実世界のGitHub問題を解決することを求める挑戦的なベンチマークです。
Devinは13.86%の問題を端から端まで正しく解決し、以前の最高レベルである1.96%を大きく上回りました。正確にどのファイルを編集する必要があるかが指定されている場合でも、以前の最良モデルは4.80%の問題しか解決できませんでした。
Devinはデータセットのランダムな25%の部分集合で評価されました。Devinは無支援でしたが、他のすべてのモデルは支援されていました(つまり、どのファイルを編集する必要があるかがモデルに明確に伝えられています)。
SWE-bench技術報告書
SWE-benchを使用しました。これは、GitHubの問題とプルリクエストで構成されるソフトウェアエンジニアリングシステムの自動化ベンチマークです。SWE-benchは、HumanEvalなどの独立した関数に限定される基準テストとは異なり、ユニットテストを通じてシステムが実世界のコードベースの問題を解決する能力を決定的に評価します。
SWE-benchは、GitHubの人気のあるオープンソースPythonリポジトリから抽出された2,294個の問題とプルリクエストのデータセットです。その目標は、システムが実世界のコードを書く能力をテストすることです。各SWE-benchインスタンスには、GitHubの問題とそれを解決するためのプルリクエストが含まれています。プルリクエストには、コード変更前に失敗し、後に通過する単位テスト(「失敗から通過」テスト)が含まれます。diffは2つの部分に分けられ、patchとtest_patchに分かれています。それぞれコード変更とテスト変更が含まれます。その後、システムはGitHubの問題の説明と問題時のリポジトリに基づいてdiffを生成することが求められます。すべての単位テストが適用後の変更で通過すれば、その例は成功とみなされます。
SWE-benchにおいて、LLMは正しいファイルを編集する一連のリストを与えられる(「支援」)か、または問題テキストの類似性に基づいて編集すべきファイルを検索する別のシステムが使用される(「無支援」)。エージェントとして、Devinはファイルリストを受け取らず、自らファイルをナビゲートします。これは「無支援」のLLMに近い方法です。SWE-benchの例を正しく解決するのは困難です。難しいPRは数十のファイルを変更する必要があり、後方互換性を維持し、または大量の複雑な推論を行う必要があります。支援下でも、最良のLLMは4.80%の成功率に達しました。
分析
多段階プランニング
Devinは環境からのフィードバックを得るために多段階プランニングを実行することができます。72%の通過テストは10分以上かかりますが、反復の能力がDevinの成功を助けました。
定性的な例
例1: ✅ scikit-learn__scikit-learn-10870
Devinは当初、説明に混乱し、字義通りself.lower_bound_ = max_lower_boundを追加し、その後selfを返しました。しかし、これは実際に誤りでした。なぜなら、その変数はまだ定義されていませんでした。
問題説明で提供されたテストコードとして、Devinは次にテストファイルを更新しました:
しかし、テストを実行しエラーを受け取った後、Devinはファイルを修正しました:
この修正を終えた後、Devinはテストを再実行し、それが通過することを確認し、成功して終了しました。
この例にはいくつか興味深い点があります:
Devinは元の問題の指示に非常に厳密に従いますが、これらの指示は必ずしも正確ではありません。これはユーザーの好みとの過剰な一致を示しています。
Devinは環境内でテストを実行し、エラーを修正することができます。ソフトウェア開発者が反復することが重要であるように、エージェントも同様にそれを実現する必要があります。
例2: ✅ django__django-10973
Devinは正しいファイルdjango/db/backends/postgresql/client.pyを特定し、完全な編集を完了しました:
ここでは、Devinが大量のコードを成功裏に修正できました。SWE-benchの多くの成功した編集は一行のdiffで構成されていますが、Devinは複数行を同時に処理できました。
例3: ❌ sympy__sympy-17313
これは、コンピュータ代数システムを修正して、正または負として指定可能な値に対するfloorとceilingオブジェクト上の比較演算子を適切に処理するという困難なタスクです。これには複雑な論理推論と多数の導出ステップが必要です。
Devinは正しいクラスではなくfracクラスを誤って編集し、floorクラスやceilingクラスを編集しませんでした。また、Devinは一つの比較演算子__gt__のみを編集し、__lt__、__le__、__ge__を修正する必要がありました。この編集はかなり不十分でした。
正しいdiffは以下で見ることができます:https://github.com/sympy/sympy/pull/17313/files。このdiffは非常に複雑で、多くのエッジケース処理と大量のユニットテストが含まれており、sympyコードベースの深い理解が必要です。(注意:SWE-benchインスタンスを通過するには、すべてのテストが通過する必要があります。)
例4: ❌ scikit-learn__scikit-learn-10774
このタスクは、リポジトリ内のすべてのデータセットに追加の返却オプション機能を追加することに関わっています。Devinはいくつかのデータセットに対してこのような編集を成功させました。以下にその一例を示します。
Devinはcalifornia_housing.py、covtype.py、kddcup99.py、mldata.pyのデータセットに対して同様の編集を成功させましたが(実際にはオリジナルのPRはこれらを除外していました)。不幸にも、lfw.pyとrcv1.pyの2つのデータセットを見逃したため、最終テストは失敗しました。CognitionチームはDevinの複数ファイル編集能力を向上させる予定です。
テスト駆動型の実験
Cognitionは追加の実験を行い、最終的なユニットテストと問題文をDevinに提供しました。この「テスト駆動開発」設定では、成功通過率が23%(100個のサンプリングテスト中)に向上しました。(なお、テスト自体の変更は評価前に削除されています。)
代理が基礎真実テストパッチにアクセスできたとしても、この結果は他のSWE-benchの結果とは比較できません。しかし、テスト駆動開発はソフトウェアエンジニアリングにおける一般的なパターンであるため、この設定はSWE-benchの自然な拡張です。将来、より多くのテスト駆動型エージェントが登場することが期待されます。
テスト問題を解決する新しい例
✅ django__django-13321: Devinは関数の前に印刷ステートメントを追加し、ユニットテストを実行し、印刷結果に基づいてファイルを編集することでこの問題を解決しました。テストケースの存在により、Devinがデバッグするのが容易になりました。
✅ django__django-16983: 新しいユニットテストアサーションは特定のエラーメッセージ「'filter_horizontal[0]'の値には[…]を含めることはできません」を発行しました。テストパッチなしではテストを通過することは不可能であり、これがベンチマークの問題を示しており、テストパッチなしでは完全なスコアを得ることは不可能であることを示しています。