
Ressources:
Le rangement inférieur (Irera) est un programme générique et modulaire qui spécifie les interactions entre les modèles de langage pré-entraînés et les retrievers pour résoudre efficacement des tâches de classification multi-étiquettes avec une quantité extrême de classes (≥10 000 classes). En utilisant seulement ≅ 50 exemples d'entrée étiquetés, Irera peut être optimisé pour atteindre les performances de pointe, bien qu'il n'ait pas été finetuné. Cette optimisation implique généralement que le modèle de langue des enseignants forte (par exemple GPT4) résout la tâche et rassemble des instructions ou des démonstrations qui aident un modèle de langue étudiante plus efficace (par exemple Llama-2) à mieux résoudre la tâche. Un utilisateur peut facilement spécifier quelles parties du programme sont implémentées en utilisant quel LMS, pour trouver l'équilibre parfait entre le coût et les performances.
L'objectif d'Irera est d'être facilement applicable à un large éventail de tâches impliquant l'inférence avec les modèles de langue et la récupération. À cette fin, ce référentiel démêle (i) la logique du rang inférieur-Retrieve, (ii) les invites nécessaires pour adapter Irera à un domaine spécifique et (iii) des techniques d'optimisation pour améliorer les performances. Tout cela est rendu possible via le modèle de programmation DSPY.
Les appels LM de nos résultats sont mis en cache, ce qui signifie que vous pouvez reproduire nos courses sans payer pour que des coûts d'inférence vous coûtent vous-même.
Créer l'environnement conda:
conda create -n xmc python=3.10
conda activate xmc
Installer dspy. Notre travail repose sur une branche expérimentale de DSPY.
git clone -b irera --single-branch https://github.com/stanfordnlp/dspy.git
cd dspy/
git checkout 802f2d5f26c1a64d8aad6adbd8b4394b9c4bb743
pip install .
cd ..
Installez le reste des exigences:
pip install -r requirements.txt
Tous les appels LM pour reproduire nos courses sont mis en cache. Cependant, si vous souhaitez exécuter de nouveaux appels, vous devrez configurer des modèles OpenAI et locaux.
Définissez votre clé API Openai:
export OPENAI_API_KEY=<your-key>
Pour les modèles locaux (par exemple LLAMA-2), configurez une interface de génération de texte locale (TGI) via ces étapes. Assurez-vous de pointer le champ url dans lm_config.json sur votre serveur TGI.
Chargez les données et le cache nécessaires pour reproduire nos résultats.
bash scripts/load_data.sh
bash scripts/load_cache.sh
Toutes les compilations Irera fonctionnent à partir de notre article peuvent être reproduites en exécutant bash scripts/compile_left_to_right.sh ou bash scripts/run_left_to_right.sh . Nous fournissons l'état de programme résultant dans results_precompiled/ afin que vous puissiez charger nos programmes Irera compilés.
Chargez notre Irera compilée pour Esco_tech et évaluez:
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
Compilez votre propre Irera sur Esco_tech et évaluez:
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
Les arguments de ligne de commande sont expliqués dans les fichiers respectifs.
Si vous souhaitez accélérer les courses, vous pouvez utiliser le multithreading (avertissement: cela peut parfois gâcher la mise en cache).
export DSP_NUM_THREADS=8
Les résultats de run_irera.py sont légèrement différents de ceux de compile_irera.py , très probablement en raison d'un bug mineur dans les modèles de chargement et de sauvegarde. Nous prenons les résultats de compile_irera.py en tant que résultats officiels que nous rapportons dans le document.
Pour appliquer Irera à une nouvelle tâche, vous avez besoin d'ajouter un nouvel ensemble de données et d'écrire une signature personnalisée
La logique de chargement des données est définie dans src/data_loaders . Chaque chargeur doit renvoyer au minimum une validation et tester DataFrame, où chaque ligne a un champ 'text' (qui est une string ) et un champ 'label' (qui est une list de strings ).
compile_irera attend un fichier .txt où chaque ligne est une étiquette, via l'argument --ontology_path . Ces étiquettes ne peuvent pas contenir de virgules, car cela rompt actuellement l'intégration des étiquettes dans une liste séparée par des virgules. Assurez-vous que les étiquettes n'ont pas d'espaces de fuite. Via --prior_path Un dictionnaire doit être fourni qui mappe les étiquettes aux probabilités.
Une signature indique à un module d'apprentissage dans le contexte à quoi ressemble sa tâche et à quoi ressemblent les entrées et les sorties. Vous pouvez le considérer comme une invite minimale à zéro pour la tâche. Toutes les signatures sont définies dans src/programs/signatures.py , ajoutez votre nouvelle signature ici.
Pour ajouter une nouvelle signature, la sous-classe simple dspy.Signature avec vos champs personnalisés et vos description. Ajoutez votre nouvelle classe au dictionnaire supported_signatures en bas de src/programs/signatures.py afin qu'il puisse être accessible tout au long du code.
Les métriques brutes sont définies dans src/metrics.py et sont enveloppées de logique DSPY dans src/evaluators.py . Lorsque vous ajoutez une métrique, assurez-vous de l'ajouter au dictionnaire supported_metrics au bas de src/evaluators.py afin qu'il puisse être utilisé dans tout le code.
L'objectif d'Irera est d'être modulaire et facilement applicable aux nouvelles tâches. Pour modifier Irera, vous avez besoin d'écrire une logique personnalisée pour (de nouveaux) modules d'écriture d'optimisateurs personnalisés qui bootstrap votre programme.
Infer-reserieve-rank est défini dans src/programs/infer_retrieve_rank.py . Il est initialisé avec une configuration, définie dans src/programs/config.py . Vous pouvez écrire de nouveaux programmes ou manipuler le comportement d'Irera en modifiant le code Python dans la méthode forward .
Lorsque vous introduisez de nouveaux hyperparamètres, assurez-vous de les ajouter à la configuration que vous utilisez. Sinon, ceux-ci ne seront pas enregistrés et chargés.
Les stratégies d'optimisation sont définies dans src/optimizer.py . Lorsque vous ajoutez un nouvel optimiseur, assurez-vous de l'ajouter au dictionnaire supported_optimizers au bas du fichier, afin qu'il puisse être accessible tout au long du code.
Actuellement, les optimisateurs savent qui module le programme à optimiser. Cela doit être résolu afin que les stratégies d'optimisation puissent être appliquées de manière flexible à différents programmes.
Je suis heureux de prendre des collaborations! N'hésitez pas à me contacter à l'e-mail défini dans le document, ou en ouvrant un problème ou une demande de traction sur la page GitHub. Voici quelques problèmes sur lesquels nous pourrions travailler:
Recherche:
Génie logiciel:
src/programs/retrieve.py plus efficace Soyez informé des travaux futurs en suivant @KarelDoostrlnck sur Twitter.
Si vous avez trouvé ce repo utile ou utilisez le rantin inférieur dans votre travail, veuillez nous citer:
@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}
}