
リソース:
Imple-retrieve-Rank (Irera)は、極端なクラス(10,000以上のクラス)でマルチラベル分類タスクを効率的に解決するために、前処理された言語モデルとレトリーバー間の相互作用を指定する一般的でモジュール式プログラムです。 50のラベル付けされた入力例のみを使用して、Ireraを最適化して、微調ューされていないにもかかわらず最先端のパフォーマンスを実現できます。この最適化には、一般に、強力な教師言語モデル(GPT4など)がタスクを解決し、より効率的な学生言語モデル(LLAMA-2など)を支援する指示またはデモンストレーションを収集することが含まれます。ユーザーは、どのLMSを使用してプログラムのどの部分が実装されているかを簡単に指定して、コストとパフォーマンスの完全なバランスをとることができます。
Ireraの目標は、言語モデルと検索を含む幅広いタスクに簡単に適用できることです。この目的のために、このリポジトリは、(i)Imple-Retrieve-Rankの論理、(ii)Ireraを特定のドメインに適応させるために必要なプロンプトと(iii)パフォーマンスを改善するための最適化手法。これらはすべて、DSPYプログラミングモデルを通じて可能になります。
結果のLMコールはキャッシュされています。つまり、推論コストを自分で支払うことなく、ランを再現できます。
コンドラ環境を作成します:
conda create -n xmc python=3.10
conda activate xmc
DSPYをインストールします。私たちの仕事は、DSPYの実験分岐に依存しています。
git clone -b irera --single-branch https://github.com/stanfordnlp/dspy.git
cd dspy/
git checkout 802f2d5f26c1a64d8aad6adbd8b4394b9c4bb743
pip install .
cd ..
残りの要件をインストールします。
pip install -r requirements.txt
ランを再現するためのすべてのLM呼び出しはキャッシュされています。ただし、新しい通話を実行する場合は、OpenAIおよびローカルモデルをセットアップする必要があります。
Openai APIキーを設定します:
export OPENAI_API_KEY=<your-key>
ローカルモデル(LLAMA-2など)の場合、これらの手順を介してローカルテキスト生成インターフェイス(TGI)を設定します。 lm_config.jsonのurlフィールドをTGIサーバーに指すようにしてください。
結果を再現するために必要なデータとキャッシュをロードします。
bash scripts/load_data.sh
bash scripts/load_cache.sh
すべてのコンピレーションIreraは、私たちの論文から実行されていますbash scripts/compile_left_to_right.shまたはbash scripts/run_left_to_right.sh実行することで再現できます。結果のプログラム状態をresults_precompiled/で提供するため、コンパイルされたIreraプログラムをロードできます。
コンパイルされたIreraをESCO_TECH用にロードして評価します。
python run_irera.py
--dataset_name esco_tech
--state_path ./results_precompiled/esco_tech_infer-retrieve-rank_00/program_state.json
--lm_config_path ./lm_config.json
--do_validation
--do_test
esco_techで自分のireraをコンパイルして評価します。
python compile_irera.py
--dataset_name esco_tech
--ontology_name esco
--prior_path ./data/esco/esco_priors.json
--ontology_path ./data/esco/skills_en_label.txt
--infer_signature_name infer_esco
--rank_signature_name rank_esco
--retriever_model_name sentence-transformers/all-mpnet-base-v2
--infer_student_model_name llama-2-13b-chat
--infer_teacher_model_name gpt-3.5-turbo-instruct
--rank_student_model_name gpt-4-1106-preview
--rank_teacher_model_name gpt-4-1106-preview
--infer_compile_metric_name rp10
--rank_compile_metric_name rp10
--prior_A 0
--rank_topk 50
--do_validation
--do_test
--optimizer_name left-to-right
--lm_config_path ./lm_config.json
コマンドラインの引数は、それぞれのファイルで説明されています。
ランをスピードアップしたい場合は、マルチスレッドを使用できます(警告:これにより、キャッシングが時々混乱する可能性があります)。
export DSP_NUM_THREADS=8
run_irera.pyの結果は、 compile_irera.pyの結果とはわずかに異なります。これは、モデルの読み込みと保存のわずかなバグのためです。 compile_irera.pyの結果を、論文で報告する公式の結果として取ります。
Ireraを新しいタスクに適用するには、新しいデータセットを追加してカスタム署名を作成する必要があります。
データ読み込みロジックは、 src/data_loadersで定義されています。すべてのローダーは、各行に'text'フィールド( string 」と'label'フィールド( strings list )がある検証とテストのデータフレームを最小限に返す必要があります。
compile_irera 、各行が--ontology_path引数を介してラベルである.txtファイルを期待しています。これらのラベルには、コンマを分離されたリストにラベルを埋め込むことが現在破損しているため、これらのラベルにはコンマを含めることはできません。ラベルにトレーリングスペースがないことを確認してください。 via --prior_path辞書を提供する必要があります。これは、確率にラベルをマッピングする必要があります。
署名は、コンテキスト内学習モジュールに、そのタスクとは何か、入力と出力がどのように見えるかを示します。タスクの最小限のゼロショットプロンプトと考えることができます。すべての署名は、 src/programs/signatures.pyで定義されています。ここに新しい署名を追加します。
カスタムフィールドと説明に新しい署名、シンプルなサブクラスdspy.Signature追加するには。 src/programs/signatures.pyの下部にあるsupported_signatures辞書に新しいクラスを追加して、コード全体でアクセスできるようにします。
生のメトリックはsrc/metrics.pyで定義されており、 src/evaluators.pyのdspyロジックで包まれています。メトリックを追加するときは、 src/evaluators.pyの下部にあるsupported_metrics辞書に追加して、コード全体で使用できるようにしてください。
Ireraの目標は、モジュール式であり、新しいタスクに簡単に適用できることです。 Ireraを変更するには、(新しい)モジュールのカスタムロジックを作成する必要がある場合は、プログラムをブートストラップするカスタムオプティマーを作成します。
Imber-Retrieve-Rankはsrc/programs/infer_retrieve_rank.pyで定義されています。 src/programs/config.pyで定義された構成で初期化されます。新しいプログラムを作成したり、Pythonコードをforwardメソッドで変更してIreraの動作を操作したりできます。
新しいハイパーパラメーターを導入するときは、使用している構成にこれらを追加してください。それ以外の場合、これらは保存されてロードされません。
最適化戦略は、 src/optimizer.pyで定義されています。新しいオプティマイザーを追加するときは、ファイルの下部にあるsupported_optimizers辞書にそれを追加して、コード全体でアクセスできるようにしてください。
現在、オプティマイザーは、最適化プログラムがどのモジュールに持っているかを認識しています。これを解決する必要があるため、最適化戦略はさまざまなプログラムに柔軟に適用できます。
コラボレーションを嬉しく思います!論文で定義されている電子メールで、またはgithubページに問題やプルリクエストを開くことで、お気軽にお問い合わせください。ここに私たちが取り組むことができるいくつかの問題があります:
研究:
ソフトウェアエンジニアリング:
src/programs/retrieve.pyより効率的にしますTwitterで@kareldoostrlnckをフォローして、将来の作業を通知します。
このリポジトリが便利だと思った場合、またはあなたの仕事にingrect-retrieve-rankを使用している場合は、私たちを引用してください。
@article{d2024context,
title={In-Context Learning for Extreme Multi-Label Classification},
author={D'Oosterlinck, Karel and Khattab, Omar and Remy, Fran{c{c}}ois and Demeester, Thomas and Develder, Chris and Potts, Christopher},
journal={arXiv preprint arXiv:2401.12178},
year={2024}
}