
Ressourcen:
Infer-Retrieve-Rank (IRERA) ist ein generisches und modulares Programm , das Wechselwirkungen zwischen vorbereiteten Sprachmodellen und Retrievers zur effizienten Lösung von Multi-Label-Klassifizierungsaufgaben mit extremer Anzahl von Klassen (≥10.000 Klassen) spezifiziert. Mit nur ≅ 50 markierten Input-Beispielen kann IRERA optimiert werden, um eine modernste Leistung zu erzielen, obwohl sie nicht beendet sind. Diese Optimierung beinhaltet im Allgemeinen die Lösung eines starken Lehrersprachenmodells (z. B. GPT4), das die Aufgabe löst und Anweisungen oder Demonstrationen sammelt, die ein effizienteres, studentischer Sprachmodell (z. B. LAMA-2) helfen, die Aufgabe besser zu lösen. Ein Benutzer kann problemlos angeben, welche Teile des Programms mit welchem LMS implementiert sind, um die perfekte Balance zwischen Kosten und Leistung zu erzielen.
Das Ziel von IRERA ist es, leicht auf ein breites Spektrum von Aufgaben anwendbar zu sein, bei denen Sprachmodelle und Abrufen inferenziert werden. Zu diesem Zweck entwirft dieses Repository (i) die Logik des Infer-Retieve-Ranks, (ii) die Eingabeaufforderungen, IRERA an eine bestimmte Domäne anzupassen, und (iii) Optimierungstechniken zur Verbesserung der Leistung. All dies wird durch das DSPY -Programmiermodell ermöglicht.
LM -Aufrufe unserer Ergebnisse werden zwischengespeichert, dh Sie können unsere Läufe reproduzieren, ohne für die Inferenzkosten selbst zu zahlen.
Erstellen Sie die Conda -Umgebung:
conda create -n xmc python=3.10
conda activate xmc
DSPY installieren. Unsere Arbeit basiert auf einem experimentellen Zweig der DSPY.
git clone -b irera --single-branch https://github.com/stanfordnlp/dspy.git
cd dspy/
git checkout 802f2d5f26c1a64d8aad6adbd8b4394b9c4bb743
pip install .
cd ..
Installieren Sie den Rest der Anforderungen:
pip install -r requirements.txt
Alle LM -Aufrufe, um unsere Läufe zu reproduzieren, werden zwischengespeichert. Wenn Sie jedoch neue Anrufe ausführen möchten, müssen Sie OpenAI- und lokale Modelle einrichten.
Stellen Sie Ihren OpenAI -API -Schlüssel ein:
export OPENAI_API_KEY=<your-key>
Richten Sie für lokale Modelle (z. B. LLAMA-2) über diese Schritte eine lokale Schnittstelle zur Textgenerierung (TGI) ein. Stellen Sie sicher, dass Sie das url -Feld in lm_config.json auf Ihren TGI -Server richten.
Laden Sie die Daten und den Cache, die erforderlich sind, um unsere Ergebnisse zu reproduzieren.
bash scripts/load_data.sh
bash scripts/load_cache.sh
Alle Kompilierungen, die Irera aus unserem Papier läuft, können durch Ausführen von bash scripts/compile_left_to_right.sh oder bash scripts/run_left_to_right.sh reproduziert werden. Wir bieten den resultierenden Programmstatus in results_precompiled/ .
Laden Sie unsere kompilierte Irera für ESCO_Tech und bewerten Sie:
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
Kompilieren Sie Ihre eigene IRera auf Esco_Tech und bewerten Sie:
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
Die Befehlszeilenargumente werden in den jeweiligen Dateien erläutert.
Wenn Sie die Läufe beschleunigen möchten, können Sie Multithreading verwenden (Warnung: Dies kann manchmal das Caching durcheinander bringen).
export DSP_NUM_THREADS=8
Die Ergebnisse von run_irera.py unterscheiden sich geringfügig von der von compile_irera.py , wahrscheinlich aufgrund eines geringfügigen Fehlers beim Laden und Speichern von Modellen. Wir nehmen die Ergebnisse von compile_irera.py als offizielle Ergebnisse, die wir in der Zeitung berichten.
Um IRERA auf eine neue Aufgabe anzuwenden, müssen Sie minimal einen neuen Datensatz hinzufügen und eine benutzerdefinierte Signatur schreiben
Die Datenladelogik ist in src/data_loaders definiert. Jeder Loader sollte eine Validierung und ein Testdatenrahmen minimal zurückgeben, wobei jede Zeile über ein Feld 'text' (das eine string ist) und ein 'label' -Feld (eine list von strings ) enthält.
compile_irera erwartet eine .txt -Datei, in der jede Zeile über das Argument --ontology_path ein Etikett ist. Diese Etiketten können keine Kommas enthalten, da dies derzeit bricht, in denen die Etiketten in eine von Kommas getrennte Liste eingebettet werden. Stellen Sie sicher, dass Etiketten keine Nachlagerungen haben. Via --prior_path muss ein Wörterbuch geliefert werden, das Beschriftungen auf Wahrscheinlichkeiten abbilden.
Eine Signatur zeigt ein in Kontext-Lernmodul an, wie seine Aufgabe ist und wie die Eingänge und Ausgänge aussehen. Sie können es als minimale Null-Schotten-Eingabeaufforderung für die Aufgabe vorstellen. Alle Unterschriften sind in src/programs/signatures.py definiert.
So fügen Sie eine neue Signatur, eine einfache Unterklasse dspy.Signature mit Ihren benutzerdefinierten Feldern und der Beschreibung hinzu. Fügen Sie Ihre neue Klasse dem Dictionary supported_signatures am Ende von src/programs/signatures.py hinzu, damit auf den gesamten Code zugegriffen werden kann.
RAW -Metriken sind in src/evaluators.py src/metrics.py definiert. Stellen Sie beim Hinzufügen einer Metrik sicher, dass Sie sie dem Wörterbuch für supported_metrics am unteren Rand von src/evaluators.py hinzufügen, damit es im gesamten Code verwendet werden kann.
Das Ziel von IRERA ist es, modular und leicht auf neue Aufgaben anwendbar zu sein. Um IRERA zu ändern, müssen Sie nur minimal benutzerdefinierte Logik für (neue) Module schreiben, die benutzerdefinierte Optimierer schreiben, die Ihr Programm starten.
Infer-Retrieve-Rank ist in src/programs/infer_retrieve_rank.py definiert. Es wird mit einer Konfiguration initialisiert, die in src/programs/config.py definiert ist. Sie können neue Programme schreiben oder das Verhalten von IRera manipulieren, indem Sie den Python -Code in der forward ändern.
Wenn Sie neue Hyperparameter einführen, addieren Sie diese zu der von Ihnen verwendeten Konfiguration. Andernfalls werden diese nicht gespeichert und geladen.
Optimierungsstrategien sind in src/optimizer.py definiert. Stellen Sie beim Hinzufügen eines neuen Optimierers sicher, dass Sie ihn dem Dictionary am supported_optimizers Rahmen der Datei zu dem im gesamten Code zugegriffen werden können.
Derzeit sind sich Optimierer bewusst, welche Module das to-optimierte Programm hat. Dies muss gelöst werden, sodass Optimierungsstrategien flexibel auf verschiedene Programme angewendet werden können.
Ich freue mich, Kooperationen zu übernehmen! Kontaktieren Sie mich gerne an der im Papier definierten E -Mail oder durch Öffnen eines Problems oder an der Anfrage auf der Github -Seite. Hier sind einige Probleme, an denen wir arbeiten könnten:
Forschung:
Software -Engineering:
src/programs/retrieve.py effizienter machen Beachten Sie über zukünftige Arbeiten, indem Sie @kareldoStrlnck auf Twitter folgen.
Wenn Sie dieses Repo als nützlich empfanden oder in Ihrer Arbeit infer-retieve-rank verwenden, zitieren Sie uns bitte:
@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}
}