
资源:
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}
}