【AlphaCodium】Googleを超える最強コード生成AIが競プロで優勝できるか試してみた
WEELメディア事業部LLMリサーチャーの中田です。
1月16日、LLMによる高度なプログラミングコード生成を可能にするプロンプトエンジニア「AlphaCodium」を、CodiumAIが提案しました。
この手法を用いることで、従来のプロンプト手法よりも格段に、LLMのコード生成能力を向上できるんです、、、!
例えば、本技術を使えば、上記のようなコード生成も可能になります(ちなみにこれは、AlphaCodiumの会社が開発した、VS Codeの自動コード生成の拡張機能で、コードを生成している様子)。
GitHubでのスター数は、すでに1200を超えており、注目度が高いことを示しています。
この記事ではAlphaCodiumの使い方や、有効性の検証まで行います。本記事を熟読することで、AlphaCodiumの凄さを実感し、普通の手法による自動コード生成には戻れなくなるでしょう。
ぜひ、最後までご覧ください。
AlphaCodiumの概要
LLMにコードを生成させるタスクにおけるプロンプトエンジニアリングとして、「Flow Engineering」が以下の論文において提唱されました。
参考記事:Code Generation with AlphaCodium: From Prompt Engineering to Flow Engineering
本研究の基本的なアイデアとしては、「複数の段階に分けて、コードの生成と改善を繰り返す」というもの。
そして、今回のAlphaCodiumとは、このFlow Engineeringをオープンソース化したツールです。具体的には、以下の手順でコード生成が行われます。
- 前処理
- 反復処理
上図の左側が前処理工程を表し、以下の手順で処理が行われます。
- 問題を用意
- 複数の解答を生成する
- 解答をランク付け
- 検証テストを行う
- 追加テストを作成
また、上図の右側が反復処理を表し、以下の手順で処理が行われます。
- 最初のコードを生成
- その解答をテストする
- 結果をもとに改善
- AIテストでさらに反復
この手法を利用することで、LLMの性能を大幅に向上できたそう。
ただし、本手法は競技プログラミングの問題に特化しているため、開発にそのまま応用するには少し工夫が必要だそうです。
AlphaCodiumはGoogle DeepmindのAlphaCodeを超えていると言われていて、その精度に期待が高まりますね…!
AlphaCodiumの料金体系
AlphaCodiumはオープンソースであるため、誰でも無料で利用可能です。
なお、Metaの最強コード生成AIについて知りたい方はこちらの記事をご覧ください。
→【CodeLlama-70B】700億パラメーターコード生成AIをGPT-4と比較してみた
AlphaCodiumの使い方
今回は、Google ColabのT4を用いました。
まず、以下のコードを実行して、必要なライブラリをインストールしましょう。
!git clone https://github.com/Codium-ai/AlphaCodium.git
%cd AlphaCodium
!pip install -r requirements.txt
ここでいったん、ランタイムの再起動。続いて、「alpha_codium/settings/.secrets_template.toml」を同じフォルダ内で複製し、そのファイル名を「.secrets.toml」としましょう。そしてそのファイル内の以下の部分に、OpenAIのKeyを入れてください。
[openai]
key = "..."
次に、以下のページから、データセットをダウンロードし、alpha_codiumのルートディレクトリの直下に置きましょう。
参考記事:talrid/CodeContests_valid_and_test_AlphaCodium
最後に、以下のコードを実行すれば、コードが生成されます。
!python -m alpha_codium.solve_problem \
--dataset_name /path/to/dataset \
--split_name test \
--problem_number 0
「dataset_name」には、先ほどダウンロードしたデータセットフォルダへのパスを入力しましょう。また、「split_name」にはvalidまたはtestを指定します。
また、YAMLの構造化された形式で出力されます。
AlphaCodiumを動かすのに必要なPCのスペック
■Pythonのバージョン
Python 3.8以上
■必要なパッケージ
dynaconf==3.1.12
fastapi==0.99.0
PyGithub==1.59.*
retry==0.9.2
Jinja2==3.1.2
tiktoken==0.4.0
uvicorn==0.22.0
pytest==7.4.0
aiohttp==3.8.4
atlassian-python-api==3.39.0
GitPython==3.1.32
PyYAML==6.0
starlette-context==0.3.6
boto3==1.28.25
google-cloud-storage==2.10.0
ujson==5.8.0
azure-devops==7.1.0b3
msrest==0.7.1
openai
litellm
duckdb
datasets
notebook
black
evaluate
click
code_contests_tester==0.1.6
aiolimiter
Jinja2
tqdm
pysnooper
loguru
numpy
retry
AlphaCodiumを実際に使ってみた
ここでは、Polycarp and Coinsという問題をAlphaCodiumに解いてもらおうと思います。
参考記事:Polycarp and Coins
問題の概要は以下の通り。
「Polycarp and Coins」は、Polycarpが1と2のバーレス硬貨を使って正確にnバーレスを支払う必要がある問題です。
彼(Polycarp)は使用する各種硬貨の枚数の差を最小限に抑えたいと考えています。
目標は、1バーレス硬貨と2バーレス硬貨の枚数を表す二つの非負整数c1 とc2を見つけ、c1+2⋅c2=nかつ∣c1−c2∣ を最小化することです。
この問題は複数のテストケースを含み、各ケースで異なるnの値が与えられます。各シナリオに対して最適な硬貨の組み合わせを効率的に計算する必要があります。
Polycarp and Coins
つまり、次の条件を満たすc_1とc_2を見つける必要があります。
- c_1 + 2c_2 = n
- |c_1 – c_2|を最小限にする
例えば、n = 1000の場合、C1=334でC2=333となるのが正解です。具体的な計算式は、以下の通りです。
- nが3の倍数の場合、c1とc2を等しくする
- nが3で割った余りが1の場合、c1を1多くする
- nが3で割った余りが2の場合、c2を1多くする
実際のAlphaCodiumの出力は、以下のようなYAML形式です。
このような形式の出力を、自力で整形したPythonコードは、以下の通りです。
# nを読み込む
n = int(input())
# nを3で割った余りに基づいて処理を行う
r = n % 3
if r == 0:
# nが3の倍数の場合、c1とc2を等しくする
print(n // 3, n // 3)
elif r == 1:
# nが3で割った余りが1の場合、c1を1多くする
print((n // 3) + 1, n // 3)
else:
# nが3で割った余りが2の場合、c2を1多くする
print(n // 3, (n // 3) + 1)
試しに、n=1000と入力したところ、以下の様に出力されました。
334 333
正解ですね!
導入までが少しめんどくさいですが、精度は高いようです。
AlphaCodiumの推しポイントである超強力コード生成は本当なのか?
ここでは、Xor Distanceという、実際の競技プログラミングで出題された問題を、AlphaCodiumとGPT-4に解かせて、両者の出力を比較してみます。
参考記事:H. XOR and Distance
具体的には、「与えられた配列の各要素に0から2^k-1までの各整数をXOR演算することで、新しい配列を生成する」ような問題を、AlphaCodiumを使って解いてみます。
アルゴリズムとしては、以下の通りです。
- 新しい配列内の異なる2つの要素間の絶対差の最小値を求める
- この最小絶対差を、すべての整数(0から2^k-1)について計算し、その結果を出力
- 結果は、それぞれの整数に対する最小絶対差の値のリストとして表示
入力例は、以下の通りです。
- 入力: n = 3, k = 3, 配列 = [6, 0, 3]
- x = 0の場合、配列の要素にXORを適用すると[6, 0, 3]になり、2つの要素の最小絶対差は3
- x = 1の場合、配列の要素にXORを適用すると[7, 1, 2]になり、最小絶対差は1。
- 以下同様に、x = 2からx = 7まで計算
回答例としては、例えば上記のようにn=3, k=3で、配列a=[603]が入力された場合、[3 1 1 2 2 1 1 3]と出力されてほしいです。
この情報をAlphaCodiumに入力し、出力された内容を自力でPythonに直した結果が、以下の通りです。
n, k = map(int, input().split())
a = list(map(int, input().split()))
d = [0] * (1 << k)
for i in range(1 << k):
s = set()
for j in range(n):
s.add(i ^ a[j])
s = list(s)
s.sort()
d[i] = min([s[j] - s[j - 1] for j in range(1, len(s))])
print(*d)
# 出力結果
3 1 1 2 2 1 1 3
続いて、GPT-4(ChatGPTの有料版)に解かせた結果は、以下の通りです。
def min_xor_distance(arr, k):
max_val = 2 ** k
result = []
for x in range(max_val):
# 各xに対して配列の要素とXOR演算を行い、新しい配列を生成
xor_array = [a ^ x for a in arr]
# 新しい配列内の異なる要素間の最小絶対差を求める
xor_array.sort()
min_diff = min(abs(xor_array[i] - xor_array[i + 1]) for i in range(len(xor_array) - 1))
result.append(min_diff)
return result
# 入力例
n, k = 3, 3
arr = [6, 0, 3]
# 関数を実行して結果を出力
print(min_xor_distance(arr, k))
# 出力結果
[3, 1, 1, 2, 2, 1, 1, 3]
どちらも、正解を出力することができました!
ただ、導入までの労力や難易度を考えると、やはりChatGPTの有料版を使う方が、はるかに楽で便利です。
そのため、以下のような使い方をおすすめします。
- 開発経験があり、無料で利用したい方:AlphaCodium
- 開発未経験、もしくはサクッと導入したい方:GPT-4
まとめ
LLMにコードを生成させるタスクにおけるプロンプトエンジニアリングとして、「Flow Engineering」が以下の論文において提唱されました。
参考記事:Code Generation with AlphaCodium: From Prompt Engineering to Flow Engineering
本研究の基本的なアイデアとしては、「複数の段階に分けて、コードの生成と改善を繰り返す」というもの。そして、今回のAlphaCodiumとは、このFlow Engineeringをオープンソース化したツールです。
ただ、導入までの労力や難易度を考えると、やはりChatGPTの有料版を使う方が、はるかに楽で便利です。
そのため、以下のような使い方をおすすめします。
- 開発経験があり、無料で利用したい方:AlphaCodium
- 開発未経験、もしくはサクッと導入したい方:GPT-4
数年後には、誰もが天才プログラマーとして、高度なデジタル世界を実現するようになっているのかもしれないですね。
また、近年は超小型のLLMも増えてきています。そのため、例えばスマホから声だけでコードを生成し、それをスマホ上で実行できるよになっているかもしれません。
生成系AIの業務活用なら!
・生成系AIを活用したPoC開発
・生成系AIのコンサルティング
・システム間API連携
最後に
いかがだったでしょうか?
弊社では
・マーケティングやエンジニアリングなどの専門知識を学習させたAI社員の開発
・要件定義・業務フロー作成を80%自動化できる自律型AIエージェントの開発
・生成AIとRPAを組み合わせた業務自動化ツールの開発
・社内人事業務を99%自動化できるAIツールの開発
・ハルシネーション対策AIツールの開発
・自社専用のAIチャットボットの開発
などの開発実績がございます。
まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。
「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。
セミナー内容や料金については、ご相談ください。
また、サービス紹介資料もご用意しておりますので、併せてご確認ください。