HumanEval から CoderEval へ: コード生成モデルは本当に機能しますか?

この記事は、Huawei Cloud Community「HumanEval から CoderEval へ: コード生成モデルは本当に機能しますか?」から共有されたものです。"、著者: Huawei Cloud Software Analysis Lab.

この記事では主に、CoderEval というコード生成大規模モデル評価ベンチマークを紹介し、このベンチマークで 3 つのコード生成モデル (CodeGen、PanGu-Coder、ChatGPT) のパフォーマンスを評価および比較します。研究者らは、CoderEval を構築するために実際のオープンソース プロジェクトからコード生成タスクを選択し、これらのタスクを外部依存度に応じて 6 つのレベルに分け、生成された目標に応じて 3 種類の生成タスクに分けました。さまざまな状況シナリオにおけるさまざまな大規模モデルの生成効果。実験結果は、これら 3 つのモデルが他のタスクに比べて自己完結型関数の生成に優れていることを示しています。ただし、実際のプロジェクトのほとんどの関数は、さまざまな程度のコンテキスト情報に依存しています。したがって、モデルの考慮および考慮能力を向上させることが重要です。コードのコンテキスト情報を利用する 生成テクノロジの実際の使いやすさは非常に重要です。この研究の論文は、ソフトウェア エンジニアリングに関するトップ カンファレンスである ICSE 2024 で発表されました。

1. HumanEval から CoderEval へ

ImageNet が画像認識であるように、Defects4J は欠陥検出であるように、ツールと手法が主な貢献となる研究分野では、広く受け入れられ採用されている評価データセットとそれをサポートするベンチマーク指標があり、この分野の研究開発は開発が重要です。評価手法は、さまざまな手法のレベルを同一次元で水平比較し、成熟度と実用性とのギャップを見積もる物差しとしての役割を果たす一方で、風見鶏としても機能する。 、さまざまな手法の共通の最適化を直接導き、反復目標によって研究者が前進する方向が決まります。

コード生成の分野では、最も広く使用されているのは、Codex 論文で OpenAI によってオープンソース化されている HumanEval です。このベンチマーク セットは、OpenAI エンジニアによって手動で作成された 164 のプログラミング タスクで構成されており、トレーニング セットとの重複がないようにします。ある程度です。HumanEval の最初のバージョンは Python 言語のみをサポートしており、各プログラミング タスクにはタスクの説明、リファレンス コード、いくつかのテスト サンプルなどが含まれています。最近、一部の研究者は HumanEval を複数のプログラミング言語に拡張しました。例: 清華大学の CodeGeex チームは、HumanEval に基づいて HumanEval-X をオープンソース化し、HumanEval を C++、Java、JavaScript、Go およびその他の言語に拡張しました。2022 年 8 月 19 日にリリースされました。 arXiv で公開された論文では、HumanEval を 18 言語に拡張する MultiPL-E を提案しています。

ただし、HumanEval 自体にはいくつかの問題があり、コード生成タスク、特にコード生成の研究や実際の開発を対象としたツールの評価プラットフォームとしては適していません。HumanEval の拡張に基づくタイプの作業は、HumanEval のタスク記述、参照コード、テスト サンプル、および実行環境を他の言語に翻訳または適応するだけであり、HumanEval 自体の問題の一部を本質的に解決するものではありません。では、これらの問題とは何でしょうか? HumanEval のタスクとテスト サンプル、および複数のモデルによって生成された結果を手動で検査した後、主に次の問題を要約しました。

1. この分野は単一であり、データ構造操作、単純なアルゴリズムなど、言語自体の基本的なプログラミング知識のみをカバーします。

2. タスク自体が単純すぎる リファレンス コードはすべて自己完結型の単一関数であり、複合型、カスタム型、サードパーティ ライブラリ、クロスプロセス呼び出しなどは考慮されていません。

3. テストは十分に完了しておらず、簡単に誤った判断につながる可能性があります (AlphaCode 論文の結論によると、HumanEval にはタスクごとに平均 7.77 のテスト サンプルがあり、テストの誤報率は 30% にも上ります)。

GitHub ウェアハウス データの統計によると、HumanEval に対応する自己完結型の単一関数は、Python プロジェクトのトップ 100 の 11.2%、Java プロジェクトのトップ 100 の 21.3% しか占めていないため、HumanEval は実際にはパフォーマンスを正確に反映していない可能性があります。実際のプロジェクトレベルの開発におけるコード生成モデル。

HumanEval の限界と欠点に対応して、私たちは実際のシナリオと実際のユーザーを対象としたコード生成モデルのユーザビリティ評価システムである CoderEval を提案しました。CoderEval は、現在広く使用されている評価ベンチマークの問題をある程度解決しており、主に次の点に反映されています。

1. 実際のオープンソース プロジェクトから直接派生し、複数の分野をカバーしているため、さまざまな分野でのコード生成のパフォーマンスを包括的に評価できます。

2. プロジェクト コードで複雑なデータ型または開発者定義型を考慮し、オブジェクト指向機能とクロスプロセス呼び出しをサポートします。

3. 可能な限り網羅性と完全性を確保するために、より完全なテスト セットを用意し、それによってテストの誤警報率をある程度まで削減します。

要約すると、HumanEval と比較して、CoderEval は実際の開発シナリオの生成タスクにより適合しています。大規模なモデルに基づいたコード生成ツールの段階的な実装と商用化の状況において、さまざまなモデルの実際のパフォーマンスをより正確に反映し、比較できる可能性があります。モデル: ツールとして実装された後の開発者のエクスペリエンス。次に、CoderEval のコンポーネント、構築プロセス、および使用方法を簡単に紹介します。CoderEval の論文は ICSE2024 ( https://arxiv.org/abs/2302.00288  ) に受理されており、CoderEval-GitHub は現在オープンソース ( https://github.com/CodeArtsSnap/CoderEval  ) です。

2. CoderEval: 実際の開発シナリオにおけるコード生成モデルの評価

CoderEval コンポーネント

全体として、CoderEval は主に 3 つの部分で構成されます。

1. 生成タスク: 関数/メソッドを基本単位とするコード生成タスク。これには、タスクの説明 (つまり、自然言語の注釈)、関数のシグネチャ、参照コード (つまり、元のコードの実装)、それが配置されているファイルのすべてのコンテキスト コードが含まれます。 、およびそれが配置されているプロジェクトのその他のファイルの内容。

2. テスト コード: 特定のプログラミング タスクの単体テスト プログラミング タスクは、1 つ以上のテスト ファイル、1 つ以上のテスト メソッド、および追加のテスト データ (オペレーティング ファイルなどのプログラミング タスク内のファイルなど) に対応する場合があります。 ) ;

3. テスト環境: CoderEval の関数/メソッドでは、カスタム型の使用、言語標準ライブラリまたはサードパーティ ライブラリの呼び出し、プロジェクト内の他のメソッドの呼び出しなどが許可されているため、それらは、目的に設定された環境で実行する必要があります。プロジェクト。この目的を達成するために、CoderEval は Docker に基づいてサンドボックス テスト環境を構築しました。この環境には、すべてのテスト済みプロジェクトとその依存関係が含まれており、単一エントリの自動実行プログラムが付属しています。このテスト環境はオンラインサービスとして提供される予定です。

CoderEval ビルド プロセス

図 1 | CoderEval の構築プロセス

図 1 は、特定のプログラミング言語 (ターゲット言語) 用に CoderEval を構築する一般的なプロセスを示しており、主に 3 つの部分に分かれています。

1. ターゲットの選択: GitHub または CodeHub からターゲット言語に基づいてプロジェクト内の高品質なターゲット関数/メソッドをテスト タスクとして選択します

2. データ収集:テスト候補タスクごとに、対象関数/メソッドのメタ情報、自己情報、テスト情報などを分析・収集

3. 環境構築:対象プロジェクトと依存関係を準備し、テストコードの実行環境を提供し、テストを実行してテストコードと対象コードの正しさを検証します。

最初のバージョンとして、CoderEval はまず 2 つの主要な言語をサポートします。

• CoderEval4Python: 43 プロジェクトからの 230 のビルド タスクが含まれています

• CoderEval4Java: 10 プロジェクトからの 230 のビルド タスクが含まれています

コード生成モデルの効果と価値を実際のプロジェクト開発に真に反映するには、実際の多様なオープンソース プロジェクトから高品質な生成タスクを選択し、それらに可能な限り完全なテストを装備する必要があります。この目的を達成するために、まず GitHub 上の Python および Java プロジェクトのすべてのタグをクロールし、最も頻繁に使用される 14 個のタグと星の数に基づいていくつかのプロジェクトを除外し、次にプロジェクト内のすべてのテスト コードとテストされた関数/メソッドを抽出しました。 . 次の基準をすべて満たす部品のみを保管してください。

• テスト目的ではない、非推奨のインターフェイス形式の関数/メソッド

• 関数/メソッドレベルのコメントとして英語の自然言語記述を含めます。

• 正しく実行でき、テスト環境で元のテストに合格できる

これらのスクリーニング後に保持された関数/メソッドは、手動でスクリーニングされ、プログラムが分析されて、CoderEval でコード生成タスクが形成されます。各生成タスクによって提供される情報は次のとおりです。

• メタ情報(Meta):プロジェクトアドレス、ファイルパス、行番号範囲など。

• 独自の情報(ネイティブ):関数/メソッドの元のコメント、署名、コードなど

• コンテキスト情報 (Context、オプション): ファイルの内容、アクセス可能なコンテキスト情報、使用されるコンテキスト情報、実行レベルの分類など。

• テスト情報 (テスト): 手動で注釈を付けた自然言語記述、元のコードを 100% カバーするいくつかのテスト サンプルなど。

CoderEvalの使用方法

CoderEval は、次の 3 種類のタスクをサポートします。

1. 関数/メソッド ブロックの生成 (ブロック生成): コメント形式のタスクの説明や関数のシグネチャに基づいて、対応する関数を実装する完全な関数本体を生成します。

2. スニペットの生成: コンテキスト コードに基づいて、コード行全体またはコード ブロック全体 (if/for/try-catch フラグメントなど) を生成します。

3. 行補完: コード行の前半に基づいて、行の後半を完成させます。

CoderEval は 2 種類のインジケーターをサポートしています。

1. 比較ベースのメトリクス: HumanEval と同様に、生成されたコードの実際の動作効果を評価するためのテスト指標として Pass@k も使用し、モデルがさまざまなバージョンの実装を生成できるようにします。

2. 実行ベースのメトリクス: CodeBLEU、完全一致 (EM)、編集類似性 (ES)、およびその他の指標も保持され、生成されたコードと参照コードの違いを評価します。

CoderEval は、より詳細な評価をサポートしています。

1. コンテキスト認識の評価: 私たちの調査では、非自己完結型の関数/メソッドの場合、コード実装内の外部依存関係情報がその機能と動作にとって非常に重要であることがわかりました。したがって、モデルのコンテキスト認識 (外部依存関係情報を正しく生成する機能) も重要な指標となります。CoderEval は、生成タスクのプロジェクトとファイルの内容を入力として、元のコードで実際に使用されているコンテキスト情報を期待される出力として提供するため、生成されたコード内のコンテキスト情報の精度と再現率は、次のように分析および計算できます。コンテキスト認識の尺度、評価指標。

2. 階層的評価: 図 1 に示すように、CoderEval は、依存するコンテキスト情報に基づいて、生成タスクをさらに 6 つのレベル (self_contained、slib_runnable、plib_runnable、class_runnable、project_runnable) に分割し、対応するコードが実行できる環境を表します。実行する必要があります (標準ライブラリ、サードパーティ ライブラリ、現在のファイル、現在のプロジェクトなど)。CoderEval は、各レベルでのモデルの生成機能のより詳細なテストと分析をサポートしているため、現在のモデルの欠点と最適化の方向性 (コース学習の導入、ターゲットを絞った微調整、コンテキストを意識したターゲティング、プロモーションなど)。

図 2 | CoderEval の依存関係レベル別のデータ分布

3. プロンプト評価: CoderEval は、モデルのメモリ効果、プロンプト フォーム、およびさまざまなモデルでのプロンプト品質の影響を調査するために、開発者によって追加でマークされた元のコメントとコード関数の説明の両方を提供します。

同じモデルに対して、3 種類のタスクに対して 2 種類の指標を同時に計算でき、その結果を相互に参照して、多角的により価値のある結論を導き出すことができます。たとえば、同じモデルで、Pass@k インデックスが低く、CodeBLEU インデックスが高い場合、モデルは正しいコードに近い結果を生成しましたが、コードの重要な詳細の一部にエラーがあることを意味します。この場合、ソフトウェアベースの分析が考慮されます プログラム修復技術が修復を試みます; 逆の状況が発生した場合、つまり、CodeBLEU およびその他の指標が低いが、Pass@k が高い場合、モデルが依存していないことを意味しますメモリ上で元のコードをコピーしますが、異なるが正しい他の解決策が生成されます。CoderEval は、多次元分析を通じて、モデルのパフォーマンスをターゲットに最適化するためのより適切な方向性のリファレンスを研究者に提供できます。

CoderEval は実際のオープンソース プロジェクトから派生したものであり、各モデルの学習データを正確に取得または制御することができないため、メモリ効果やモデルのコピー機構によるエラーが避けられない可能性があります。このようなエラーを軽減するための CoderEval の主な対策は次のとおりです。

1. すべてのタスクには、元の注釈を置き換えるために手動で書き直された注釈が追加されます。これにより、それらの注釈がトレーニング セットに存在しないことが保証されます。これを行うために、テストも行います

2. サンプル数を増やして、操作ベースの指標と比較ベースの指標を組み合わせて分析を実行し、元のコードとは異なる解決策をモデルが実装できるかどうかを分析できますが、テストに合格することができます。

3. Pass@K と ES インジケーターを同時に取得できます。これら 2 つのインジケーターを相互に比較します。Pass@K と ES が両方とも高い場合は、モデルのコピー動作が多い可能性があることを意味します。Pass@K が値が高く ES が低い場合は、モデルにコピー動作が多い可能性があることを意味します。モデルは、異なるが正しい他の実装を生成します。Pass@K が低く、ES が高い場合は、モデルが正しい結果に近いことを意味しますが、キーコード部分に細かい誤りがあります。

CoderEvalの実測結果

私たちは、業界によって提案された 3 つの代表的なモデルのパフォーマンスを CoderEval でテストしました。

1. CodeGen (Salesforce): GPT-2 アーキテクチャを使用して、最初に自然言語で事前トレーニングを実行し、次に複数のプログラミング言語の混合コーパスでトレーニングを続け、最後に単一のプログラミング言語で微調整します。

2. PanGuCoder (Huawei): PanGu-alpha アーキテクチャに基づいており、<自然言語記述、プログラミング言語コード> ペアの形式と多段階の事前トレーニング方法を採用しており、Text2Code タスクに焦点を当てており、中国人。

3. ChatGPT (OpenAI): GPT-3.5 シリーズ モデルに基づいており、人間のフィードバックを使用して微調整し、ユーザーの指示や質問に基づいてコードを生成できます。

いくつかの実験結果は次のとおりです。

1. 表 1 に示すように、CoderEval と HumanEval の両方で、ChatGPT の効果が他の 2 つのモデルの効果を大幅に上回っています。その理由は、モデルの規模が大きいこと、より十分なトレーニング、より適切なハイパーパラメーターなどが考えられます。

表 1 | CoderEval と HumanEval に対する 3 つのモデルの全体的な効果の比較

2. 表 1 に示すように、HumanEval では、ChatGPT の効果は他のモデルよりも大幅に優れており、その大きさは CoderEval での 3 つのモデル間の差よりもはるかに大きくなっています。HumanEval の制限を考慮すると、この結果は、HumanEval が単一のコード生成ベンチマークとしてはもはや適していない可能性があることを示しています。

3. 図 2 に示すように、CoderEval では、3 つのモデル (Python: 32、Java: 56) によって正しく生成されたタスクに大きな重複があり、3 つのモデルが一部のタスクを解決する共通の機能を備えていることを示しています。同時に、1 つのモデルのみが正しく生成でき、他の 2 つのモデルが正しく生成されないタスクの場合、ChatGPT には Python と Java の両方で最も多くのタスクがあり (Python: 18、Java: 27)、これは ChatGPT がタスクのこの部分を解決するのが得意です。機能には大きな利点があります。最終的に、3 つのモデルによって解決されたタスクの数は、まだ約 40% (Python: 91/230) と 59% (Java: 136/230) しか占めていません。 CoderEval のすべてのタスクは、3 つのモデルの能力がある程度補完的であり、それぞれにまだ改善の余地があることを示しています。

図 3 | CoderEval と HumanEval の 3 つのモデルによって正しく生成された質問の数の比較

4. 表 2 に示すように、CoderEval のスタンドアロン サブセットでは、3 つのモデルのパフォーマンスは基本的に HumanEval のパフォーマンスに近く、ChatGPT のパフォーマンスは他の 2 つのモデルを大幅に上回っていますが、依存する他の生成タスクでは、コンテキスト情報 (実際の状況の 60% 以上を占める) を考慮すると、3 つのモデルのパフォーマンスは大幅に低下しています。最も強力な ChatGPT のパフォーマンスでさえ、大きく変動します。レベルによっては、3 つのモデルによって生成される結果は 10 倍にもなります。これは、コンテキスト依存のコード生成タスクが、大規模モデルのコード生成の最適化の次のステップの焦点であることをある程度示しています。

表 2 | CoderEval の 2 つのサブセットにおける 3 つのモデルのパフォーマンスの比較

実験データと分析プロセスの詳細については、CoderEval の論文を参照してください。

3. まとめ

CoderEval の論文は ICSE2024 ( https://arxiv.org/abs/2302.00288  )で公開されており、そのオープンソース プロジェクト バージョンは GitHub ( https://github.com/CodeArtsSnap/CoderEval  ) で入手できます。フォロー&スターワンクリックでフォローしてください。私たちは CoderEval を客観的、公正、包括的なベンチマークにすることに取り組んでいますが、改善に向けた努力にもかかわらず、依然としていくつかの制限とエラーが避けられません。したがって、私たちはコード生成研究者コミュニティの力を活用して、CoderEval のバージョンを反復および更新し続け、その言語サポート、データ セット、テスト方法などを拡張および改善し、それによって、コードインテリジェンスコミュニティ。

PaaS Technology Innovation LabはHuawei Cloudに所属しており、ソフトウェア分析、データマイニング、機械学習、その他のテクノロジーを包括的に活用して、ソフトウェア開発者に次世代のインテリジェントR&Dツールサービスのコアエンジンとスマートブレインを提供することに取り組んでいます。私たちはソフトウェア エンジニアリングの分野における強力な機能に焦点を当て、研究開発ツールの構築を継続し、価値の高いビジネス機能を提供し続けます。私たちと一緒に研究開発の新たな「領域」を創造しましょう!(詳細については、  [email protected]まで )

クリックしてフォローし、できるだけ早くHuawei Cloudの新しいテクノロジーについて学びましょう~

Alibaba Cloudが深刻な障害に見舞われ、全製品が影響(復旧) Tumblr がロシアのオペレーティングシステムAurora OS 5.0 を冷却新しいUIが公開 Delphi 12とC++ Builder 12、RAD Studio 12多くのインターネット企業がHongmengプログラマーを緊急採用UNIX時間17 億時代に突入しようとしている (すでに突入している) Meituan が兵力を募集し、Hongmeng システム アプリの開発を計画Amazon が Linux 上の .NET 8 への Android の依存を取り除くために Linux ベースのオペレーティング システムを開発独立した規模はFFmpeg 6.1「Heaviside」がリリースされまし
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4526289/blog/10142763