解説ねえ智也くん、この「Mix…
解説

ねえねえ、智也くん!これ見て!『A Study of Library Usage in Agent-Authored Pull Requests』って論文のタイトル。なんかすごそう!AIが自分でコード書いて、プルリクエストまで出すってこと?

ああ、それか。最近のAIコーディングエージェントについての研究だよ。エージェントっていうのは、単にコードを補完するんじゃなくて、計画を立ててツールを使いながら、まるで人間の開発者みたいに一連の作業をこなすAIのことさ。

へえ〜!で、そのエージェントさんたちがライブラリをどう使ってるか調べたの?ライブラリって、プログラミングで便利な機能をまとめたやつだよね?

そう。現実のソフトウェア開発では、ライブラリをうまく使いこなせないと意味がない。でも、これまでのLLMは、存在しないパッケージ名をでっち上げたり、バージョンを指定し忘れたりする問題があったんだ。エージェントが自律的に動くようになって、それが改善されるのか、それとも同じ問題を大規模に再現するだけなのか、誰も知らなかった。

なるほど!だから調べたんだ。で、どうやったの?

AIDevっていう、実際のGitHubリポジトリから集めた、エージェントが作成したプルリクエストの大規模データセットを使った。TypeScript、Python、Go、C#の4言語で、合計26,760件のPRを分析した。具体的には、3つの研究課題に答えるために、コードの差分や依存関係を定義するファイル(例えばPythonならrequirements.txt)から情報を抽出した。

ふむふむ。で、結果は?すごいことわかった?

まず、エージェントは結構な頻度でライブラリをインポートしてた。全体の約3割のPRで何かしらのライブラリを使ってる。でも、新しい依存関係をプロジェクトに追加するのはすごく稀で、たったの1.3%しかなかった。

え、なんで?新しい便利なライブラリを使えばいいのに。

論文では、エージェントがパッケージのインストールや環境の競合解決で苦労するから、現実的な制限として控えめになってる可能性があるって書いてある。あと、すでにプロジェクトにあるライブラリを使う方が安全だからかもね。

そっか。でも、稀に追加するときはちゃんとしてるの?

これが一番面白い発見の一つなんだけど、新しい依存関係を追加するとき、75%の確率でバージョンを指定してるんだ。例えば「pandas==2.0.0」みたいに。これまでの研究だと、LLMに直接コードを書かせたときは、バージョンについて言及するのは9%くらいしかなかったから、大幅な改善だ。

おお!すごい!なんでそんなに変わるの?

エージェントは、単なるコード生成じゃなくて、プロジェクト全体の文脈を見て、依存関係を定義するファイル(マニフェストファイル)自体を直接編集できるからだと思う。実際の開発ワークフローに近いから、自然と良い習慣が身につくのかもね。

なるほどー。あ、それと、どんなライブラリをよく使ってるの?

これも驚きで、とにかく種類が多い。3,988種類もの異なる外部ライブラリを使ってた。以前の研究ではLLMはよく知られたライブラリばかり使う傾向があったのに、エージェントは多種多様な選択をしている。言語別に見ると、TypeScriptはReactみたいなフロントエンド系、PythonはAIやデータ分析系、Goはクラウドやインフラ系のライブラリを好む傾向があって、それぞれのエコシステムの特徴を反映してる。

すごい!まるでその言語のプロみたいな選び方してるんだね。で、この研究って何がすごいの?

まず、AIコーディングエージェントが現実のソフトウェアエコシステムとどう関わるか、初めて大規模に実証的に明らかにした点だ。エージェントが依存関係を慎重に扱い、バージョン管理も意外としっかりしていることがわかったのは、実用化に向けて希望が持てる結果だと思う。

将来はもっとAIが開発を手伝ってくれて、楽になるかも!

そうだね。でも課題もある。新しい依存関係を追加するのが極端に少ない理由はまだ完全にはわかってないし、本当にプロジェクトのニーズに合った最適なライブラリを選べているかどうかの評価もこれからだ。あと、セキュリティ的に問題のあるライブラリを追加しないか、といった観点での研究も必要だろう。

そっか、完璧じゃないんだ。でも、AIがバージョン指定を忘れないってのは、人間の私よりしっかりしてるかも…私、よく「とりあえず最新で!」ってしちゃうし。

…それは、たぶん、エージェントに学んだほうがいいよ。バージョン固定は大事だから。
要点
AIコーディングエージェントが実際のソフトウェア開発でライブラリをどのように利用しているかを、26,760件のエージェント作成プルリクエストを分析して調査した。
エージェントはライブラリを頻繁にインポートする(PRの29.5%)が、新しい依存関係を追加することは稀(1.3%)である。
新しい依存関係を追加する際、エージェントはバージョンを明示する確率が高く(75.0%)、従来のLLM直接利用(約9%)と比べて「バージョン管理の衛生状態」が大幅に改善されている。
エージェントは驚くほど多様な外部ライブラリ(3,988種類)を使用しており、従来の非エージェント的LLM研究で見られた「限られたライブラリ選好」とは対照的である。
言語によってライブラリ利用パターンが異なり、TypeScriptは外部ライブラリを多用する一方、Goは標準ライブラリを好む傾向がある。
エージェントが追加する新しい依存関係は、テストや開発ツール関連が多く、プロジェクトの足場作りに貢献している可能性が高い。