CODEGEN: 多目的プログラム合成のための革新的なオープンソース言語モデル
紹介
大規模言語モデル(LLM)の台頭に伴い、私たちは自然言語処理やテキスト生成からプログラミングに至るまで、多くのタスクに対して異なる考え方やアプローチをしています。OpenAIのGPT-3やGPT-4、AnthropicのClaude、GoogleのPaLM、AppleのCertainlyなど、私たちはポストLLM時代に突入しています。
最も興奮させるツールの1つは、プログラム合成のためのオープンソースのLLMで、誰もがコーディングにアクセスできるようになったものです。それはCODEGENと呼ばれています。CODEGENはSalesforce Researchチームによって作成されました。この文章では、その機能とプログラミングの未来への影響を探っていきます。
前提条件
この記事の概念を理解するためには、以下の知識が必要です:
- プログラミング言語: Pythonやその他の人気のある言語の基本。
- 言語モデル: GPTまたはトランスフォーマーベースのアーキテクチャに関する一般的な知識。
- オープンソースツール: GitHubリポジトリや基本的なコードデプロイメントの経験。
CODEGEN: プログラム合成の民主化
プログラム合成のための高性能言語モデルは、トレーニングリソースとデータの不足により制約されてきました。現在、Salesforce Researchチームは、1.5億から16.1億のパラメータを持つCODEGENと呼ばれるLLMのファミリーに取り組み始めました。
CODEGEN の革新は、包括的なトレーニングにあります。自然言語とプログラミング言語の膨大なコーパスを活用し、CODEGEN が人間の言語とコードを深く理解することを可能にしています。これにより、多くのプログラム合成タスクで優れた成果を上げることができます。
CODEGENの最も印象的な側面は、ゼロショットコード生成の事実上の標準評価であるHumanEvalベンチマークにおける優秀さです。最先端のモデルを上回ることで、CODEGENは特定のタスクを微調整することなく、高品質で機能的なコードを生成する可能性を示しています。
プログラム合成を強化するためのCodeGenのマルチステージトレーニングアプローチ
CodeGenのトランスフォーマーベースのアーキテクチャは、自己注意メカニズムを利用して自然言語やコードにおける複雑な関係を捉えます。CodeGenをユニークにしているのは、様々なプログラミング言語に渡ってコードを理解し生成する能力を強化するマルチステージのトレーニングアプローチです。CodeGenモデルのトレーニングプロセスに関わる三つの重要なステージは次の通りです:
- CODEGEN-NL: 最初にコードデータを含む大規模なキュレーションデータセットであるThe Pileで事前トレーニングされました。この段階は、自然言語理解の基盤を確立します。
- CODEGEN-MULTI: CODEGEN-NLを基にして、この段階ではC、C++、Go、Java、JavaScript、Pythonなど複数のプログラミング言語のコードを含むデータセットであるBigQueryでのトレーニングが含まれています。
- CODEGEN-MONO: 最終段階は、GitHubリポジトリからのPythonコードのデータセットであるBigPythonを使用して、Python特有の機能に焦点を当てています。
画像の出所
逐次トレーニングアプローチの可能性があるため、CodeGenは自然言語といくつかのプログラミング言語を理解することができます。このため、プログラム合成に関連するタスクに対して効果的なソリューションです。
マルチターンプログラム合成の力を解き放つ
マルチターンプログラム合成は、コード作成における最先端の方法論を表しています。このアプローチでは、ユーザーとシステムが反復的に対話しながら、プログラムを徐々に作成、洗練、修正していきます。
従来の単一ターン技術が個別のプロンプトから完全なスニペットを生成するのに対し、マルチターン合成は対話型の開発を可能にします。これにより、より複雑で正確なコードが生成されるのです。
マルチターンプログラム合成の主要概念
こちらはマルチターンプログラム合成のいくつかの重要な概念です:
- 逐次改良: マルチターン合成は、ユーザーとマシンのコラボレーションの循環的な特性を活用します。ユーザーが提供する最初の入力または高尚な説明から、モデルは初期のコードドラフトを生成します。その後、ユーザーはプロンプトを改良し、修正を求め、訂正を指定することができます。これにより、最終出力を最適化するための進行的な反復が行われます。
- 対話型インタラクション:このアプローチは、ユーザーとモデルがアイデアの活発な交換を行うインタラクティブなインターフェースを促進します。モデルはさらなる明確化のために質問をし、ユーザーは追加の詳細を返信します。それに応じて、モデルはコードを更新します。
- コンテキストの保持: システムが会話のコンテキストを保持する能力は、ユーザーの意図を理解する能力を高め、行われた変更を効率的に統合する上で不可欠です。これは、複数のステップや調整を必要とする複雑なプログラミングタスクを処理するために重要です。
CODEGENによるマルチターンコード生成
これは印象的です – 誰もCODEGENを過小評価すべきではありません。CODEGENは、シングルターンのコード生成タスクでも良好なパフォーマンスを発揮しました。しかし、モデルを構築している研究者たちは、これらの調査をさらに進め、多ターンプログラム合成を探求しています。ほとんどのプログラム合成の取り組みでは、タスクはモデルに単一の完全な入力プロンプトを与え、一度でプログラムを生成しようとさせることです。
Salesforceの研究チームは、複雑な問題を小さなモジュール化されたサブプロブレムに分割する、より細やかで段階的なアプローチがしばしば必要であることに気づきました。
この概念を調査するために、研究者たちはマルチターンプログラミングベンチマーク(MTPB)を開発しました。これは、マルチターンプログラム合成を必要とする115の多様な問題セットから成る包括的なデータセットです。このベンチマークにおけるCODEGENのパフォーマンスを評価することで、単一ターンアプローチに対するマルチターンアプローチの重要な利点を示すことができました。
反復的な洗練を通じてコード生成を向上させる
ユーザーが線形回帰モデルを実行するように指示されている場合、彼は「XとYで線形回帰を実行して」とモデルに要求することができます。ここでの前提は、モデルがこの指示を流暢に理解し、包括的なコードスニペットを迅速に提示するということです。この手法は簡単なタスクには有効ですが、より複雑なプログラミングの課題に直面すると不十分になります。
マルチターンプログラミング合成はこのプロセスを革命化します。それはタスクをより小さなステップに分割し、時間をかけて改善できるようにします。たとえば、xとyに対して線形回帰を行いたい場合、一度にすべてを行うのではなく、プログラムはライブラリのインポートや変数の定義など、基本的な構造を設定することから始まり、その後にタスクを完了します。
ユーザーは「データにモデルを適合させて係数を出力する」といったプロンプトを提供し、次に「新しいxのセットに対して値を予測し、結果をプロットする」と言うことができます。これにより、タスクの各部分が正しく対処されることが保証され、ユーザーからのフィードバックに基づいて変更が可能となります。下の図は、線形回帰タスクのための単一ターンと複数ターンの例を示しています。
マルチターンプログラミング合成:線形回帰タスクのステップバイステップ実行
複数のターンを使用することには多くの利点があります。各ターンが特定のタスクに焦点を当てることで、コーディングプロセスをより正確に管理することができ、エラーが減ります。ユーザーからのフィードバックを通じて調整を行うことで、彼らのニーズや好みにより合ったものにすることができます。
上のフローチャートは、線形回帰モデルを設定する際のシングルターンとマルチターンのプログラミング合成の間に存在する際立った相違を捉えています。前者のアプローチを使用する際、ユーザーは単に「xとyの線形回帰を実行する」というプロンプトを出し、瞬時に完全なコード生成を求めます。しかし、この方法は、理解や反復的な改善を必要とする複雑なコーディング課題に対処するには限界があります。
複数回のやり取りの例では、プロセスを完了するために反復的なステップを踏んでいきます。ユーザーはプロンプトから始まり、必要なライブラリや変数などの基本的なフレームワークを設定するのに役立つ構造化された応答を受け取ります。その後の各インタラクションは、モデルをデータにフィットさせるためのフィードバックを提供し、係数の印刷、新しい値の予測、視覚化の作成を通じて導いていきます。
CODEGENをHugging Face Transformersと統合する
Hugging Faceベースのシステムにとってもう一つの重要な要素は、Transformersライブラリです。これは、開発者がCODEGENを含む大規模言語モデル(LLM)を扱うことを可能にする強力な汎用オープンソースツールキットです。TransformersライブラリにCODEGENを統合することで、ユーザーはアプリケーションやワークフローでモデルの機能を簡単に活用できるようになります。
ここでは、Hugging Face Transformersライブラリを使用してCODEGENを使う方法の例を示します:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("Salesforce/codegen-2B-mono")
model = AutoModelForCausalLM.from_pretrained("Salesforce/codegen-2B-mono")
inputs = tokenizer("# this function prints hello world", return_tensors="pt")
sample = model.generate(__inputs, max_length=128)
print(tokenizer.decode(sample[0], truncate_before_pattern=[r"\n\n^#", "^'''", "\n\n\n"]))
出力 :
上記のコードは、CODEGEN-2B-monoモデルをロードし、与えられたプロンプトに基づいてコードを生成する方法を示しています。手順の内訳は次のとおりです:
- Transformersライブラリから必要な関数をインポートします。
- CODEGEN-2B-monoモデルとトークナイザーを
AutoTokenizerとAutoModelForCausalLMクラスを使用してロードします。 - プロンプトを定義してください。これは、関数が「こんにちは、世界」と出力すべきであることを示すコメントです。
- 出力の最大長、サンプリング戦略、生成するシーケンスの数など、さまざまなパラメータを指定して、
model.generate()関数を使用してコード補完を生成します。 - 出力テンソルをトークナイザーを使ってデコードすることで生成されたコードを印刷します。
このコードの出力は「hello world」を表示する完全なPython関数です。また、モデルとトークナイザーのパスを適切に置き換えることで、CODEGEN-2.0やCODEGEN-2.5などの他のCODEGENモデルを試すこともできます。モデルはHugging Face Hubで利用可能です。
CODEGENの実用アプリケーション
CODEGENの多様性は学術的なベンチマークを超えて広がっており、さまざまな業界や分野での実用的な応用の豊富さを提供しています。このオープンソースの言語モデルの力を示すいくつかの主要なユースケースがあります。
自動コード生成
CODEGENの最も明白な使用例は、コードの自動生成です。開発者は、CODEGENに組み込まれた自然言語理解を活用することで、より迅速に新しいソフトウェアを作成できるようになります。これは、自然言語生成と自動コード生成機能によって補完されます。これにより、特に迅速なプロトタイピングが必要な場合や、反復開発の文脈で役立つ際に、執筆と保守にかかる時間と労力を大幅に節約できます。
インテリジェントコードアシスタンス
CODEGENは、開発者にリアルタイムで機能に基づく提案、コード補完のヒント、コードリファクタリングの提案を提供できるより高度なコード支援ソフトウェアに埋め込むこともできます。このようにして、言語モデルは開発者が問題を解決する速度を加速させることができます。
会話型プログラミングインターフェース
CODEGENのマルチターン機能はプログラム合成をサポートし、対話型プログラミングインターフェースを作成することを可能にします。ユーザーは、システムと自然言語で対話し、プログラムに何をしてほしいかを説明することができ、コードを書く必要がありません。このアプローチは、直接コードを書く必要があるという障壁を取り除くため、特に非技術的なユーザーや限られたコーディング経験を持つユーザーにとって便利です。
ドメイン特化型コード生成
さらに、CODEGENは特定のドメインや業界に微調整したり適応させたりすることができます。その基盤となる知識とルーチンのカプセル化は、金融セクターなどの特定の領域で設定および訓練されて、カスタマイズされた取引アルゴリズムやリスク管理モデルを生成することができます。同様に、医療業界では、CODEGENを使用して医療決定支援システムや患者管理アプリを作成することができます。
教育と学習アプリケーション
CODEGENの効果的なマルチターン合成は、学生やプログラマーを目指す人々のための強化学習ツールとして機能します。合成プロセスに段階的なフィードバックをスムーズに統合することにより、CODEGENは対話型チューターとして効果的に使用できます。これにより、コーディングスキル、プログラミングのテクニック、論理的推論能力の発展を促進します。このようなシステムは、遠隔または自己ペースで学習が行われる環境に特に適していると言えます。
結論
Salesforce Researchのオープンソースの大規模言語モデルCODEGENは、プログラム合成を新たなレベルに引き上げます。大規模言語モデルに内在する指数関数的な能力と、これらのモデルへのアクセスを提供することによってもたらされる民主化を組み合わせることで、CODEGENは数年の合成研究を活用できます。新しいマルチターン合成機能を取り入れることで、プログラミングやソフトウェア開発への変革的アプローチを可能にする潜在能力を秘めています。
CODEGENは、1つの入力で人間のようなコードを合成する能力から、インタラクティブなコードヘルプ、対話型プログラミングインターフェース、そして本格的なドメイン特化型アプリケーションまでの機能を提供しています。
疑いもなく、自然言語コード合成において発見されるのを待っているより強力なユースケースが存在します。研究コミュニティと業界が達成できるものの限界を押し広げる中で、私たちは業界におけるさらに革新的な応用を見られることを楽しみにしています。
参考文献
- CodeGen研究論文
- CodeGenのGitHub


