
Ресурсы:
SOR-ReTrieve-Rank (IRERA)-это общая и модульная программа , которая указывает взаимодействия между предварительно предварительно языковыми моделями и ретриверами для эффективного решения задач классификации с несколькими маркировкой с чрезвычайным количеством классов (≥10 000 классов). Используя только 50 маркированных примеров входных примеров, Irera может быть оптимизирована для достижения современной производительности, несмотря на то, что они не были созданы. Эта оптимизация, как правило, включает в себя сильную модель языка учителя (например, GPT4), решает задачу и собирает инструкции или демонстрации, которые помогают более эффективной модели языка ученика (например, LLAMA-2) лучше решить задачу. Пользователь может легко указать, какие части программы реализованы с использованием LMS, чтобы найти идеальный баланс между стоимостью и производительностью.
Цель Irera - легко применить к широкому спектру задач, включающих вывод с языковыми моделями и поиском. С этой целью, этот репозиторий раскрывает (i) логику вывода-ретрий-ранга, (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 и локальные модели.
Установите свой ключ API OpenAI:
export OPENAI_API_KEY=<your-key>
Для локальных моделей (например, Llama-2) настройте интерфейс локального генерации текста (TGI) через эти шаги. Обязательно укажите поле url в lm_config.json на ваш сервер 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
Скомпилируйте свою собственную Irera на ESCO_Tech и оцените:
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 . Каждый загрузчик должен минимально возвращать валидацию и тестирование DataFrame, где каждая строка имеет поле 'text' (которое является string ) и поле 'label' (которое является list strings ).
compile_irera ожидает файла .txt , в котором каждая строка представляет собой метку, через аргумент --ontology_path . Эти этикетки не могут содержать запятые, так как в настоящее время это разбивает встраивание ярлыков в разделенный запятой список. Убедитесь, что этикетки не имеют места для зацепления. Via --prior_path должен быть поставлен словарь, который отображает этикетки с вероятностью.
Подпись сообщает модуль обучения в контексте, какова его задача и как выглядят входные данные и выходы. Вы можете думать об этом как о минимальной подсказке с нулевым выстрелом для задачи. Все подписи определены в src/programs/signatures.py , добавьте здесь свою новую подпись.
Чтобы добавить новую подпись, простой подкласс dspy.Signature с вашими пользовательскими полями и описанием. Добавьте свой новый класс в словарь supported_signatures в нижней части src/programs/signatures.py чтобы его можно было получить по всему коду.
Необработанные метрики определены в src/metrics.py и обернуты логикой dspy в src/evaluators.py . При добавлении метрики обязательно добавьте его в словарь supported_metrics в нижней части src/evaluators.py чтобы его можно было использовать по всему коду.
Цель Irera - быть модульной и легко применимой к новым задачам. Чтобы изменить Irera, вам минимально необходимо написать пользовательскую логику для (новых) модулей, напишите пользовательские оптимизаторы, какие обрабатывают вашу программу.
SOR-РЕТИЗЕР-Ранк определяется в src/programs/infer_retrieve_rank.py . Он инициализируется с помощью конфигурации, определенной в src/programs/config.py . Вы можете написать новые программы или манипулировать поведением Irera, изменив код Python в forward методе.
Когда вы вводите новые гиперпараметры, обязательно добавьте их в конфигурацию, которую вы используете. В противном случае они не будут сохранены и загружены.
Стратегии оптимизации определены в src/optimizer.py . При добавлении нового оптимизатора обязательно добавьте его в словарь supported_optimizers в нижней части файла, чтобы его можно было получить по всему коду.
В настоящее время оптимизаторы знают, какие модули имеют программу оптимизации. Это должно быть решено, чтобы стратегии оптимизации могли быть гибко применены к различным программам.
Я рад принять участие в сотрудничестве! Не стесняйтесь обращаться ко мне по электронной почте, определенному в газете, или открыв проблему или запрос на развлечение на странице GitHub. Вот некоторые проблемы, над которыми мы могли бы поработать:
Исследовать:
Программная инженерия:
src/programs/retrieve.py более эффективным Получите уведомление о будущей работе, следуя @kareldoostrlnck в Твиттере.
Если вы нашли это репо полезным или используете SOR-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}
}