このリポジトリには、2024 年国際機械学習会議で発表される論文「リポジトリを介した反復ツールによる自然言語からクラスレベルのコード生成」の公式コードとデータが含まれています。データ中心の機械学習研究に関するワークショップ ( ICML'24 での DMLR ワークショップ)。
私たちの仕事は次のことを紹介します。
匿名性を目的として使用される代替タイトル:リポジトリを介した反復的でツール強化された推論を使用した自然言語からのクラスレベルのコード生成
LLM はコード生成タスクにおいて大きな可能性を示しており、さまざまなベンチマークにわたって関数またはステートメント レベルで有望な結果を達成しています。ただし、特に現実世界のソフトウェア リポジトリのコンテキスト内で、クラスなどのコード アーティファクトの作成に関連する複雑さは、まだ十分に解明されていません。これまでの研究では、クラスレベルの生成を独立したタスクとして扱い、現実世界のソフトウェア環境の特徴である複雑な依存関係や相互作用を無視していました。
このギャップに対処するために、実際のリポジトリ内で複雑なクラスレベルのコードを生成する際に LLM を厳密に評価するように設計された包括的なベンチマークである RepoClassBench を導入します。 RepoClassBench には、選択したリポジトリからの Java、Python、C# にわたる「自然言語からクラスへの生成」タスクが含まれています。データセット内の各クラスには、リポジトリ内でファイル間の依存関係があるだけでなく、その機能を検証するための対応するテスト ケースも含まれていることを確認します。現在のモデルは、主に関連するリポジトリ コンテキストへの露出が限られているため、ベンチマークによってもたらされる現実的な課題に苦戦していることがわかりました。
この欠点に対処するために、私たちは Retrieve-Repotools-Reflect (RRR) を導入します。これは、LLM に静的分析ツールを装備し、エージェントベースのフレームワークでリポジトリ レベルのコンテキストを繰り返しナビゲートして推論するための新しいアプローチです。私たちの実験では、RRR が RepoClassBench の既存のベースラインを大幅に上回るパフォーマンスを示し、プログラミング言語間およびさまざまな設定下でのその有効性を示しています。私たちの調査結果は、ソフトウェア開発の複雑さをより正確に反映するためにリポレベルの依存関係を組み込むコード生成ベンチマークの重要な必要性を強調しています。
私たちの取り組みは、LLM のリポジトリ コンテキストの理解を強化するために特殊なツールを活用する利点を示しています。
data
: RepoClassBench データセットの内容と、評価ハーネス パイプラインを初期化するためのメタデータが含まれます。詳細はこちら。repoclassbench
: Java、C#、Python のリポジトリ環境を初期化するコードが含まれています。クラスコードの一部を取得し、リポジトリ内のテストケースに関してその正確さを測定します。詳細はこちら。repotools
: リポジトリについて推論するためにエージェント フレームワークによって使用される静的分析ツールの実装が含まれています。rrr
: ベンチマーク タスクを解決するために評価ハーネスと対話する RRR エージェントのコードproject_utils
: プロジェクト全体で使用される共通のユーティリティ関数言語 | タスクの数 |
---|---|
ジャワ | 130 |
パイソン | 97 |
C# | 60 |
ベンチマーク データはdata/input
にあり、Python、Java、C# ごとに別のファイルが存在します。各ファイルには、各タスクの次の属性が含まれています。
task_id
: ベンチマーク内の各タスクの一意の識別子。class_name
: テストされるクラスの名前。file_name
: リポジトリ内のクラスのグラウンド トゥルース実装を含むファイルへのパス。detailed_description
: コードを生成するためにエージェント/LLM によって使用されるクラスの詳細な説明。sketchy_description
: クラスのあまり詳細ではない説明。コード生成の代替プロンプトを提供します。repo_metadata
: クラスを含むリポジトリに関する情報。次のものが含まれます。repo_name
commit_id
evaluation_metadata
: 生成されたコードの正確さを評価するためのデータ:ground_truth_class_body
: テスト対象のクラスの正しい実装。 プロジェクトを開始するには、次の手順に従います。
git clone https://github.com/microsoft/repoclassbench
cd repoclassbench
conda create --name repoclassbench_env python=3.11
conda activate repoclassbench_env
pip install -r requirements.txt
パイプライン/セットアップを評価する前に、評価ハーネス内の必要な環境とリポジトリが適切にセットアップされていることを確認してください。そうでない場合、3 つの言語にわたる 1 つ以上のタスクのグラウンド トゥルース実装が失敗する可能性があります。次のテストを実行して、セットアップが適切であることを確認します。
# To ensure harness is setup for C#
pytest -x repoclassbench/tests/test_csharp.py
# To ensure harness is setup for Java
pytest -x repoclassbench/tests/test_java.py
# To ensure harness is setup for Python
pytest -x repoclassbench/tests/test_python.py
コード生成アプローチがベンチマークとどのように比較されるかを確認する準備ができている場合は、開始に役立つサンプル コードがrepoclassbench/tests
ディレクトリにあります。このステップバイステップ ガイドに従って、特定のタスクでコードをテストします。
まず、使用しているプログラミング言語のDataset
オブジェクトを作成します。たとえば、Python コードをテストしている場合は、次のように記述します。
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
次に、コードをテストするタスクをデータセットから選択します。これを行うには、一意の識別子 ( task_id
) を使用してtask
オブジェクトを取得します。
# Replace 'task_id' with the actual ID of the task you want to test
task = dataset . get_instance_and_setup_env ( task_id )
タスクの評価ツールを取得します。これにより、エバリュエーター、生成する必要があるクラスの説明、および関連するコード リポジトリの場所を含むTaskData
オブジェクトが得られます。
# Get the evaluator from the task object
evaluator = task . evaluator
# The path to the repository files and the class description are also available
repository_path = task . repo_dir
description_to_use = task . description
最後に、生成されたコードがどのように実行されるかを確認します。エバリュエーターを使用してコードをテストし、結果を出力します。
# 'code_test' should be replaced with the class code generated by your approach
evaluation_results = evaluator . evaluate ( code_test )
# Display the outcome of the evaluation
print ( "Number of passed testcases: " , evaluation_results . passed_tests )
print ( "Number of failed testcases: " , evaluation_results . failed_tests )
print ( "Did the code compile/pass linter checks: " , evaluation_results . compile_status )
print ( "Error feedback from the harness: " , evaluation_results . error_feedback )
code_test
アプローチによって生成された実際のコードに置き換えることを忘れないでください。評価者はテスト ケースに対してコードを実行し、合格したテストの数、失敗したテストの数、コードが正常にコンパイルされたかどうか、および発生したエラーに関するフィードバックを提供します。
コードとベンチマークを使用する場合は、次の論文を引用することを検討してください。
@inproceedings{deshpande2024classlevelcodegenerationnatural,
title={Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository},
author={Ajinkya Deshpande and Anmol Agarwal and Shashank Shet and Arun Iyer and Aditya Kanade and Ramakrishna Bairi and Suresh Parthasarathy},
booktitle={ICML 2024 Workshop on Data-Centric Machine Learning Research},
year={2024},
url={https://openreview.net/forum?id=yqjr7ojVYa}
}
このプロジェクトは貢献と提案を歓迎します。ほとんどの投稿では、投稿を使用する権利をお客様が有しており、実際に当社に付与することを宣言する投稿者ライセンス契約 (CLA) に同意する必要があります。詳細については、https://cla.opensource.microsoft.com をご覧ください。
プル リクエストを送信すると、CLA ボットが CLA を提供する必要があるかどうかを自動的に判断し、PR を適切に装飾します (ステータス チェック、コメントなど)。ボットが提供する指示に従ってください。 CLA を使用するすべてのリポジトリでこれを 1 回行うだけで済みます。
このプロジェクトはマイクロソフトのオープンソース行動規範を採用しています。詳細については、「行動規範に関するよくある質問」を参照するか、追加の質問やコメントがあれば [email protected] までお問い合わせください。
このプロジェクトには、プロジェクト、製品、またはサービスの商標またはロゴが含まれている場合があります。 Microsoft の商標またはロゴの許可された使用には、Microsoft の商標およびブランド ガイドラインが適用され、それに従わなければなりません。このプロジェクトの修正バージョンで Microsoft の商標またはロゴを使用することは、混乱を引き起こしたり、Microsoft のスポンサーであることを暗示したりしてはなりません。第三者の商標またはロゴの使用には、それらの第三者のポリシーが適用されます。