【AlphaCodium】プログラミングに特化した最高性能のコード生成手法
3つの要点
✔️ AlphaCodiumと呼ばれるコード生成手法を提案
✔️ 前処理フェーズと反復フェーズからなるフローでコードを生成
✔️ AlphaCodiumを導入したLLMのコード生成能力が大幅に向上
Code Generation with AlphaCodium: From Prompt Engineering to Flow Engineering
written by Tal Ridnik,Dedy Kredo,Itamar Friedman
(Submitted on 16 Jan 2024)
Comments: Published on arxiv.
Subjects: Machine Learning (cs.LG); Computation and Language (cs.CL); Software Engineering (cs.SE)
code:
本記事で使用している画像は論文中のもの、紹介スライドのもの、またはそれを参考に作成したものを使用しております。
AlphaCodiumと呼ばれるコード生成手法を提案
本論文の内容は、「AlphaCodiumと呼ばれる手法によって、LLMのコード生成能力を向上させる」というもの。
本研究のポイントは、以下の通りです。
- 課題:既存の自然言語向け最適化手法では、LLMのコード生成能力を引き延ばせない
- 解決手法:AlphaCodiumという「テスト駆動型の多段階コード生成フロー」による最適化
- ポイント:AlphaCodiumにより、GPT-4のコード生成能力を向上できた
つまり、AlphaCodiumという独自のコード生成手法によって、プログラミング分野におけるLLMの性能を向上できたのです。
ちなみに、AlphaCodiumは汎用の言語モデル(GPTやDeepSeekなど)を追加の学習なしでそのまま利用し、専用のフローを適用することでコード生成性能を大幅に向上させることに成功しています。
これは追加データや計算コストの大きな学習フェーズを必要とせず、様々な言語モデルに適用可能な手法だと言えるでしょう。
既存の手法ではLLMのコード生成能力を引き出せない
近年の大規模言語モデル(LLM)は、単純なプログラミングタスクのコード生成においても、非常に高い性能を誇ります。しかし、実世界のプログラミングは一段と複雑であるため、近年のLLMでも要領を得ないことが多いです。
その理由として、コード生成タスクには、自然言語処理とは異なる特有の課題があり、自然言語向けの最適化手法がそのまま適用できないことが挙げられます。
具体的には、以下のような課題があるそうです。
- プログラミング言語によって文法規則が異なる
- 些細な間違いが文法エラーを引き起こす
- 不正入力など例外的な状況を適切に処理するのが困難
- 自然言語で記述された問題文を詳細にコードに反映させるのが困難
- 時間計算量やメモリ使用量などの非機能要件への対応が困難
- 複雑なデータ構造やアルゴリズムの適切な選択と実装が困難
- 複数コードと結合して動作することを意識した設計が困難
- 実行環境の制約が困難
これまでは、「自然言語タスク向けの最適化手法」でコード生成を行っていたため、タスクがより複雑になるとエラーを引き起こしやすくなるということ。
そこで、より複雑なコーディングタスクでの性能を上げるために、コーディングタスクに特化した最適化手法が研究されてきました。
既存研究
CodeContestsデータセットの公開により、競技プログラミングプラットフォームから収集された、一段と難しいプログラミング問題を解くモデルや手法を評価できるようになりました。
先行研究のAlphaCodeでは、ファインチューニングにより大量の計算を行っており、実用的ではないとされています。
また、CodeChainでは、新しい推論フレームワークが導入されています。
AlphaCodiumの具体的なフロー
AlphaCodiumのコード生成プロセスは、「前処理フェーズ」と「反復フェーズ」の2つの主要な段階に分けられています。
上図の左側が前処理フェーズで、右側が反復フェーズに当たります。
前処理フェーズ
前処理フェーズでは、自然言語で指定された問題について分析・推論が行われます。具体的には以下のような処理が行われます。
- 問題文から目標、入力、出力、ルール、制約などを抽出し、AIによって箇条書き
- 問題文の理解に基づき、複数の解答コードの候補を生成
- 生成された解答コードをランク付けし、優れたものを選択
- 選択された解答コードに対して検証テストを実行
- 検証テストの結果を分析し、追加のテストケースを作成
つまり、前処理フェーズでは自然言語処理によって問題を分析し、初期の解答コード候補を生成・選別するとともに、反復フェーズで使用するテストケースを準備します。
以下は、与えられた問題文の例で、タスク目標、入力、出力、ルール、制約などの情報が含まれています。
そして、上記の問題文から情報を抽出し、以下のようにAIによって箇条書きでまとめます。
反復フェーズ
反復フェーズでは、前処理フェーズで生成された解答コードを改善していきます。具体的には以下のようなサイクルを繰り返します。
- 前処理フェーズで選択された解答コードを初期コードとする
- 初期コードを「公開テスト」でテスト
- テスト結果を分析し、コードを修正・改善
- 改善したコードを再度テストし、結果が向上したらそのコードを採用
- 「AIが生成した追加テスト」を使ってさらに反復改善
- 改善したコードを再度テストし、結果が向上したらそのコードを採用
つまり、反復フェーズでは実際にコードを実行し、テスト結果をフィードバックとして解答コードを段階的に改善していきます。テストには既存のテストデータセットに加えて、AIが生成した追加のテストセットも活用することで、網羅性の高い検証が可能になっているそう。
コード生成タスクのためのテクニック
AlphaCodiumを用いてコードを生成する際、以下のテクニックを使うことで、より効果的であると述べられています。
- YAML形式の構造化出力の利用
- 箇条書き形式による意味的な推論
- モジュール式のコード生成
- ダブルバリデーションによるソフトな意思決定
- 探索の余地を残し、直接的な質問を避ける
- テストアンカー
これらの手法は、本研究に限らず、一般的なLLMを使用したコード生成タスクにも、広く適用可能だと考えられています。
それぞれのテクニックについて、順に説明します。
YAML形式の構造化出力の利用
プロンプト設計の際、YAML形式での出力を要求することで、複雑なタスクを体系的に表現でき、プロンプトエンジニアリングの手間を大幅に削減できます。
著者らによると、特にコード生成タスクにおいて、JSONよりもYAML形式が適してるとのこと。
生成されるコードには、シングルクォート、ダブルクォート、特殊文字などが含まれることが多いが、JSONではこれらの文字を有効に配置するのが難しい。一方、YAMLではブロックスカラー形式を使えば、適切なインデントさえ守れば、任意のテキストやコードを正しく表現できるとのこと。
また、YAML形式ではJSONのような中括弧、引用符、エスケープ文字が不要なため、JSONよりもトークン数が少なくて済みます。
これにより、コストと推論時間を削減でき、品質の向上にもつながるとのこと。
箇条書き形式による意味的な推論
問題について推論させる際、出力を箇条書き形式にすることで、より良い結果が得られるとのこと。箇条書きにすることで、LLMが問題の内容をより深く理解を促し、出力が改善されるためです。
モジュール式のコード生成
単一の関数を生成するのではなく、細かく複数の関数に分割してコードを生成するよう指示することで、バグの少ない良質なコードが生成されるとのこと。
ダブルバリデーションによるソフトな意思決定
生成された出力を再度生成し、必要に応じて修正するよう求める追加ステップを設けることで、LLMに対し「批判的に推論すること」を促します。
これは直接的な「Yes or No」で答えさせる質問よりも効果的とのこと。
探索の余地を残し、直接的な質問を避ける
複雑な問題について直接質問すると、しばしば誤った回答が生成されます。そこで、より簡単なタスクから徐々にデータを蓄積していくフローを採用します。不可逆な決定は避け、探索とコードの反復の余地を残すことが重要とのこと。
テストアンカー
AIが生成したテストの中には誤ったものもあるため、公開テストセットで検証済みのテストをアンカーとして使用し、コードの誤った修正を防ぎます。
本手法の有効性
実験内容
本研究では、提案手法の有効性を検証するために、競技プログラミング問題のデータセットであるCodeContestsを用いた実験を行っています。
本実験では、直接プロンプト入力する方法と比較して、AlphaCodiumがLLMのコード生成性能をどの程度向上させるかを評価しています。
加えて、先行研究の「AlphaCode」や「CodeChain」と比較して、AlphaCodiumの性能を評価しています。
データセット
本研究では、競技プログラミング問題のデータセットである「CodeContests」を用いて、AlphaCodiumの性能評価を行っています。
CodeContestsデータセットの主な特徴は以下の通りです。
- 競技プログラミングプラットフォームから収集された問題で構成
- 自然言語の問題記述が長く複雑
- 各問題には約200のプライベートの入出力テストが用意
- 1万問の学習データ、107問の検証データ、165問のテストデータが含まれる(本研究では学習セットは使用せず、検証セットとテストセットのみを使用している)
以上のように、CodeContestsは競技プログラミングに特化した、現実的で難易度の高い問題で構成された良質なベンチマークだと言えるでしょう。
結果
先述の通り、本研究では以下の2つの実験が行われています。
- 直接プロンプト入力 vs AlphaCodium
- 先行研究 vs AlphaCodium
順番に見ていきましょう。
・直接プロンプト入力 vs AlphaCodium
各問題につき5つのコードを生成し、正解率(pass@5)を比較しています。
結果は以下の通りです(method列の「Direct」=直接プロンプト入力)。
結果より、GPT-4を使用した場合、検証セットにおいてAlphaCodiumは、正解率を19%から44%に向上していることが分かります(2.3倍の改善)。
また、GPT-3.5やDeepSeekなど他のモデルでも、一貫して大幅な改善が見られます。
・先行研究 vs AlphaCodium
先ほどと同様、各問題につき5つのコードを生成し、正解率(pass@5)を比較しています。
結果は以下の通りです。
結果より、同じGPT-3.5モデルを使用した場合、AlphaCodiumはCodeChainを上回る性能を達成しています。
ちなみに、AlphaCodeはファインチューニングと大量の計算を行っているのに対し、AlphaCodiumはLLMを学習せずにそのまま使用しています。しかし、それでもAlphaCodiumはAlphaCodeと同等以上の性能を、計算量を1万分の1以下に抑えて達成していることが分かります。
AlphaCodiumによってLLMのコード生成性能を大幅に向上
本記事では、競技プログラミング問題に特化した新しいコード生成手法である「AlphaCodium」の研究をご紹介しました。
本研究は、LLMのコード生成性能を大幅に向上させることを実証した重要な研究です。
本研究の限界点としては、以下の3点が挙げられます。
- 本手法は競技プログラミング問題に特化しており、実開発への応用には工夫が必要
- CodeContestsのみでなく、他のデータセットでの有効性検証も望まれる
- 本手法はコード生成に特化しており、他のタスクへの適用可能性は不明
個人的な意見
本研究は、従来のプロンプトエンジニアリングとは一線を画した手法であり、高度なコード生成手法の可能性を示唆する重要な成果だと思いました。
ただ、本論文でも述べられている通り、実際の開発現場で利用するには、まだまだ改善の余地がありそうです。
本研究のプロジェクトは、GitHubにも公開されているので、試してみるのも良いでしょう。
この記事に関するカテゴリー