CODEGEN: 多用途なプログラム合成のための革新的なオープンソース言語モデル
導入
大規模言語モデル (LLM) の台頭により、私たちは自然言語処理やテキスト生成からプログラミングに至るまで、多くのタスクについて異なる考え方やアプローチをするようになりました。 OpenAI の GPT-3 および GPT-4 から、Anthropic Claude、Google の PaLM、そして Apple の確かに、私たちはポスト LLM の時代にいます。
最もエキサイティングなツールの 1 つは、誰もがコーディングにアクセスできるようにするプログラム合成用のオープンソース LLM です。コードジェンといいます。 CODEGEN は Salesforce Research チームによって作成されました。この記事では、その機能とプログラミングの将来への影響について探っていきます。
前提条件
この記事の概念を理解するには、次の知識が必要です。
- プログラミング言語: Python または一般的な言語の基本。
- 言語モデル: GPT または Transformer ベースのアーキテクチャに関する一般的な知識。
- オープンソース ツール: GitHub リポジトリと基本的なコードのデプロイメントの経験。
CODEGEN: プログラム合成の民主化
プログラム合成用の高性能言語モデルは、トレーニング リソースとデータの不足により開発が滞っていました。現在、Salesforce Research チームは、サイズ範囲が 15 億から 161 億の CODEGEN と呼ばれる LLM ファミリを使用してこれに取り組み始めています。パラメータ。
CODEGEN の背後にある革新は、包括的なトレーニングです。自然言語とプログラミング言語の膨大なテキストのコーパスを利用し、CODEGEN による人間の言語とコードの深い理解につながります。これにより、多くのプログラム合成タスクで優れた性能を発揮します。
CODEGEN の最も印象的な点は、ゼロショット コード生成の事実上の標準評価である HumanEval ベンチマークでの優れた点です。 CODEGEN は、最先端のモデルを上回るパフォーマンスを発揮することで、特定のタスクを微調整することなく、高品質で機能的なコードを生成できる可能性を示しています。
プログラム合成を強化するための CodeGen の多段階トレーニング アプローチ
CodeGen のトランスフォーマー ベースのアーキテクチャは、セルフ アテンション メカニズムを利用して、自然言語とコードの複雑な関係をキャプチャします。 CodeGen をユニークなものにしているのは、さまざまなプログラミング言語にわたるコードを理解し、確実な習熟度で作成できるようにする多段階トレーニング アプローチです。 CodeGen モデルのトレーニング プロセスに含まれる 3 つの重要な段階は次のとおりです。
- 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 は、シングルターンのコード生成タスクでも依然として良好なパフォーマンスを発揮しました。しかし、モデルを構築している研究者はこれらの調査をさらに進め、複数ターンのプログラム合成を研究しています。ほとんどのプログラム合成の作業では、モデルに 1 つの完全な入力プロンプトを与え、モデルに 1 回でプログラムを吐き出させます。
Salesforce Research チームは、多くの場合、複雑な問題をモジュール化された小さなサブ問題に切り詰める、より微妙な段階的なアプローチが必要であることに気づきました。
この概念を調査するために、研究者らはマルチターン プログラミング ベンチマーク (MTPB) を開発しました。これは、複数ターンのプログラム合成を必要とする 115 の多様な問題セットで構成される包括的なデータセットです。このベンチマークで CODEGEN のパフォーマンスを評価することにより、シングルターン アプローチに対するマルチターン アプローチの大きな利点を実証することができました。
反復改良によるコード生成の強化
ユーザーが線形回帰モデルの実行を割り当てられている場合、ユーザーは「X と Y で線形回帰を実行してください」とモデルを要求できます。ここでの前提は、モデルがこの命令を流暢に理解し、包括的なコード スニペットを即座に提示することです。この手法は単純なタスクには役立ちますが、より複雑なプログラミングの課題に直面すると不十分になります。
マルチターンプログラミング合成は、このプロセスに革命をもたらします。タスクを小さなステップに分割して、時間の経過とともに改善できるようにします。たとえば、x と y に対して線形回帰を実行したい場合、すべてを一度に実行するのではなく、プログラムはタスクを完了する前に、ライブラリのインポートや変数の定義などの基本構造をセットアップすることから始めます。
ユーザーは、「モデルをデータに適合させ、係数を出力してください」のような追加のプロンプトを提供し、次に「新しい x セットの値を予測して、結果をプロットしてください」と言うことができます。これにより、タスクの各部分が正しく対処され、ユーザーからのフィードバックに基づいて変更できるようになります。以下の図は、線形回帰タスクのシングル ターンとマルチ ターンの例を示しています。
マルチターン プログラミング合成: 線形回帰タスクの段階的な実行
複数のターンを使用すると、多くの利点があります。各ターンが特定のタスクに焦点を当て、エラーを減らすため、コーディング プロセスをより正確に制御するのに役立ちます。ユーザーから全体を通じてフィードバックを得ることで、ユーザーのニーズや好みに合わせて調整を行うことができます。
上のフローチャートは、線形回帰モデルのセットアップに関して、シングル ターン プログラミング合成とマルチ ターン プログラミング合成の間に存在する顕著な相違を示しています。前者のアプローチを使用する場合、ユーザーは単に「x と y に対して線形回帰を実行する」というプロンプトを表示するだけで、瞬時に完全なコードを生成したいと考えます。ただし、この方法は、理解と反復的な改良を必要とする複雑なコーディングの課題に取り組むには限界があることが判明しています。
マルチターンの例では、プロセスを完了するために反復的なステップを実行します。ユーザーはプロンプトから開始し、必要なライブラリや変数などの基本的なフレームワークをセットアップするのに役立つ構造化された応答を受け取ります。後続の各対話には、データのフィッティング、係数の出力、新しい値の予測、および視覚化の作成を通じてモデルをガイドするためのフィードバックが含まれます。
CODEGEN とハグフェイストランスフォーマーの統合
Hugging Face ベースのシステムのもう 1 つの重要な要素は、開発者が CODEGEN などの LLM を操作できるようにする強力な多目的オープンソース ツールキットである Transformers ライブラリです。 CODEGEN を Transformers ライブラリに統合すると、ユーザーはアプリケーションやワークフローでモデルの機能を簡単に利用できるようになります。
以下は、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 ライブラリから必要な関数をインポートします。
AutoTokenizer
クラスとAutoModelForCausalLM
クラスを使用して、CODEGEN-2B-mono モデルとトークナイザーを読み込みます。- プロンプトを定義します。これは、関数が「hello world」を出力することを示すコメントです。
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 は、単一入力による人間の音声のようなコードの合成から、対話型のコード ヘルプ、会話型プログラミング インターフェイス、本格的なドメイン固有のアプリケーションまでの機能を提供します。
間違いなく、自然言語コード合成には、さらに強力な使用例が発見されるのを待っています。研究コミュニティと業界が達成可能な限界を押し上げる中、私たちは業界でさらに画期的なアプリケーションが登場することを楽しみにしています。
参考文献
- CodeGen の研究論文
- CodeGen の Github