
資源:
retrieve-rank (iRERA)是一個通用和模塊化程序,指定了預驗證的語言模型和檢索器之間的相互作用,以有效地解決了具有極高數量的類別(≥10,000個類)的多標籤分類任務。僅使用≅50個標記的輸入示例,即使沒有進行任何填充,也可以優化ERERA以實現最先進的性能。這種優化通常涉及具有強大的教師語言模型(例如GPT4)解決任務並收集指令或演示,以幫助更有效的學生語言模型(例如Llama-2)更好地解決任務。用戶可以輕鬆地使用LMS實現程序的哪些部分,以在成本和性能之間取得完美的平衡。
艾拉的目標是輕鬆適用於涉及語言模型和檢索的廣泛任務。為此,此存儲庫夾具(i)retrieve量級的邏輯,(ii)使艾拉(Irera)適應特定領域所需的提示以及(iii)優化技術以提高性能。所有這些都是通過DSPY編程模型實現的。
我們的結果的LM呼叫被緩存,這意味著您可以重現我們的跑步而無需支付任何推理費用。
創建Conda環境:
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
可以通過運行bash scripts/compile_left_to_right.sh或bash scripts/run_left_to_right.sh來複製所有彙編艾拉(Erera)。我們在results_precompiled/中提供了結果程序狀態,因此您可以加載我們的編譯IRERA程序。
為ESCO_TECH加載我們的編譯ERERA並評估:
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上編譯您自己的Erera並評估:
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文件。這些標籤無法包含逗號,因為目前會破壞將標籤嵌入逗號分隔的列表中。確保標籤沒有落後的空間。通過--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,您最少需要為(新)模塊編寫自定義邏輯,編寫自定義優化器,以引導您的程序。
src/programs/infer_retrieve_rank.py定義了ret-retrieve-rank。它是用src/programs/config.py中定義的配置初始化的。您可以通過更改forward方法更改Python代碼來編寫新程序或操縱ERERA的行為。
當您介紹新的超參數時,請確保將它們添加到所使用的配置中。否則,將不會保存和加載。
優化策略是在src/optimizer.py中定義的。添加新的優化器時,請確保將其添加到文件底部的supported_optimizers詞典中,以便在整個代碼中訪問它。
當前,優化器知道校準計劃具有哪些模塊。這需要解決,以便可以靈活地將優化策略應用於不同的程序。
我很高興進行合作!請隨時通過論文中定義的電子郵件或通過在GitHub頁面上打開問題或拉出請求來與我聯繫。這是我們可以解決的一些問題:
研究:
軟件工程:
src/programs/retrieve.py更高效通過在Twitter上關注@KareldooStrlnck,以通知未來的工作。
如果您發現此存儲庫有用或在您的工作中使用推論級別,請引用我們:
@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}
}