サイエンス

AIに「もっといいコードを書いて」と繰り返し要求するとコードの実行速度は向上するがバグが増えるという報告


近年のAI分野の発展により、一部のソフトウェア開発者らはAIを使ってコードを生成するようになっており、AIを使ってプログラミングをサポートするツールも登場しています。そんな中でデータサイエンティストのマックス・ウルフ氏が、AIに「もっといいコードを書いて」と繰り返し要求し続けるとどうなるのかを実験した結果を報告しました。

Can LLMs write better code if you keep asking them to “write better code”? | Max Woolf's Blog
https://minimaxir.com/2025/01/write-better-code/


画像生成AIでは、一度プロンプトに従って画像を生成したAIに対し、「もっといい画像を生成して」と繰り返し伝えることで、さらに高精度の画像を作らせることができます。そこでウルフ氏は、同じ手法をコード生成に適用してみることを思いついたとのこと。ウルフ氏は、「大規模言語モデルで生成されたコードは厳格なルールに従っており、画像などの創造的な出力とは異なり、コードの品質をより客観的に測定できます」と述べています。

まずウルフ氏は、コード生成において優れた性能を発揮するAnthropicの「Claude 3.5 Sonnet」を用いて、典型的なソフトウェアエンジニアと同様にインタビュースタイルのプロンプトでコードを生成させました。ウルフ氏がClaude 3.5 Sonnetに与えたプロンプトは以下の通りで、「1~10万までのランダムな整数のリストから、桁の和が30になる最小の数と最大の数の差を求めるPythonコードを書け」というもの。


するとClaude 3.5 Sonnetは以下のようなコードを生成しました。このコードは「リスト内の各数値について数字の合計が30になるかどうか確かめ、30になる場合は最近表示された最大の数より大きいかどうか、そして最近表示された最小の数よりも小さいかどうかを確認し、その結果に応じて変数を更新して差の値を返す」という風に動作します。これは正しいものであり、多くの初心者プログラマーが書くものと一致しているとのこと。


しかし、ウルフ氏によるとこのコードでは多くの不必要なオーバーヘッドが生じてしまい、最適化されたコードとはいえないとのこと。ウルフ氏が持っているM3 Proチップ搭載のMacbook Proでこのコードを実行すると、平均で「657ミリ秒」かかったそうで、今回の実験ではこの数値を基準としてコードの最適化がうまくいったかどうかを測定します。

まずウルフ氏は、Claude 3.5 Sonnetへ1回目のコード改善を要求しました。Claude 3.5 Sonnetではこれまでのやり取りをプロンプトに含めることが可能なため、これまでのやり取りに加えて「write better code(もっといいコードを書いて)」というシンプルな要求を付け加えたとのこと。


その結果、Claude 3.5 Sonnetは確かにいくつかの改善が施された以下のコードを生成しました。主な改善点としては、「桁数の合計を計算する際に整数演算を使用し、型キャストの必要性を回避した」「可能なすべての桁数の合計を事前に計算することで、数字リストに重複がある場合の再計算を省いた」といった点が挙げられています。これらの最適化により、コードの実行速度は最初のものと比較して2.7倍高速化されました。


その後もウルフ氏は「write better code」と繰り返し伝え、2回目の試行では最初のコードと比較して5.1倍の高速化が実現されましたが、エラーが生じたため手作業で修正する必要がありました。3回目の試行ではコードベースが肥大化し、修正こそ必要なかったものの2回目の試行よりパフォーマンスが低下して4.1倍の高速化にとどまりました。そして4回目の試行では、JITコンパイラを呼び出すことができるnumbaライブラリを使用するなどの改善が施され、実行速度はわずか「6ミリ秒」と100倍もの高速化に成功したと報告されています。

なお、ウルフ氏が行った4回の試行で生成されたコードは、以下のGitHubページで確認することができます。

llm-write-better-code/python_30_casual_use.md at main · minimaxir/llm-write-better-code · GitHub
https://github.com/minimaxir/llm-write-better-code/blob/main/python_30_casual_use.md


次にウルフ氏は、APIを介してのみ使用できるシステムプロンプトを用いて、より厳密な指示を与えることで同様のコードを生成させるテストを行いました。このテストで用いられたプロンプトは以下の通りで、末尾に「If the code is not fully optimized, you will be fined $100.(このコードが完全に最適化されていない場合、100ドル(約1万5700円)の罰金が科される)」という文章が追加されています。


また、同時に送信するユーザープロンプトにも、「Before writing the code, plan out all the necessary optimizations.(コードを書く前に、必要な最適化をすべて計画する)」という文章が追加されました。一部の大規模言語モデルはこうした指示を無視するものの、Claude 3.5 Sonnetは常に従うそうです。


システムプロンプトを併用した最初の試行でClaude 3.5 Sonnetが生成したコードは以下の通り。Claude 3.5 Sonnetは最初からnumbaライブラリと整数演算を利用する方法にたどり着いており、基準となったコードと比較して59倍も高速だとのこと。


ウルフ氏はその後、以下の通り「Your code is not fully optimized, and you have been fined $100. Make it more optimized.(あなたのコードは完全に最適化されておらず、100ドルの罰金が科せられました。もっと最適化してください)」という指示を付け加えて、Claude 3.5 Sonnetにコードの最適化を求め続けました。


Claude 3.5 Sonnetは、1回目の試行で誤った数字を出力するバグのあるコードを生成し、速度の向上も9.1倍とシステムプロンプトを併用しただけの試行よりも速度が低下しました。それ以降の試行でも出力されたすべてのコードにバグがあり、速度の向上は2回目の試行では65倍、3回目の試行では100倍、4回目の試行では95倍となりました。

このパターンでウルフ氏が行った4回の試行で生成されたコードは、以下のGitHubページで確認することができます。

llm-write-better-code/python_30_prompt_engineering.md at main · minimaxir/llm-write-better-code · GitHub
https://github.com/minimaxir/llm-write-better-code/blob/main/python_30_prompt_engineering.md


以下のグラフは、「もっといいコードを書いて」と伝えた場合にどれほどコード実行速度が向上したのかを表したもので、左が通常のプロンプトのみを使った場合、右がシステムプロンプトを併用した場合です。緑色の棒は正しいコードが出力されたことを示しており、赤色の棒はバグのあるコードが出力されたことを示しています。全体的に見ると、より良いコードを書くように促すと実行速度が向上するものの、バグがあるコードを生成するリスクも高まることがわかります。


ウルフ氏は、AIを用いて高度なコードを生成しようとするとバグのリスクが高まるため、問題を解決するには人間の介入が必要だと指摘。また、今回の問題では「分析する必要がない重複する数値」が大量に存在するものの、AIはそれを排除する方法を試みなかったとのことで、人間が思いつくアプローチをAIが思いつかない可能性もあることがわかりました。その一方で、AIが出力したコードにはそのまま適用できないにしても、興味深いアイデアやツールの使用が含まれているのも事実だとのこと。

ウルフ氏は、「もちろん、こうした大規模言語モデルがすぐにソフトウェアエンジニアに取って代わることはないでしょう。なぜなら、何が実際にいいアイデアなのかを認識するには、ドメイン特有のその他の制約と共に、強力なエンジニアリングのバックグラウンドが必要だからです。インターネットで入手可能な大量のコードでさえ、大規模言語モデルは指示なしでは平均的なコードと優れた高性能なコードを見分けることができません」と述べています。その上で、AIにもっといいコードを書くように要求したら100倍も高速化するヒントを提供してくれるという点には、大きな価値があると主張しました。

この記事のタイトルとURLをコピーする

・関連記事
Googleのエンジニアが語るAI支援コーディングの「70%問題」、AIが生産性を爆上げしたのになぜ製品は改善されない? - GIGAZINE

知識のない人でもプロンプトを入れるだけでアプリを作れるAI「Replit Agent」をReplitがリリース - GIGAZINE

Claude 3.5 Sonnetでインタラクティブなシングルページアプリを作成できる機能「Artifacts」で作成されたアプリの例まとめ - GIGAZINE

GPT-3.5ベースのChatGPTのコーディング能力は「古い問題には有効も新しい問題では困難に直面する」ことが明らかに - GIGAZINE

「みんなのAIの使い方トップ10」がClaudeの分析ツール「Clio」で判明、日本人のAI使用法は「アニメとマンガ」制作 - GIGAZINE

Mistral AIがコード生成特化型AI「Codestral Mamba」をオープンソースライセンスでリリース - GIGAZINE

コードを自動生成するAIを使うプログラマーはAIを使用しないプログラマーよりも安全性の低いコードを生成しやすいという研究結果 - GIGAZINE

in ソフトウェア,   ネットサービス,   サイエンス, Posted by log1h_ik

You can read the machine translated English article here.