
Sumber daya:
Infer-Retrieve-Rank (IRAA) adalah program generik dan modular yang menentukan interaksi antara model bahasa pretrained dan retriever untuk menyelesaikan tugas klasifikasi multi-label secara efisien dengan jumlah kelas yang ekstrem (≥10.000 kelas). Menggunakan hanya ≅ 50 contoh input berlabel, Irera dapat dioptimalkan untuk mencapai kinerja canggih, meskipun tidak diatasi. Optimalisasi ini umumnya melibatkan memiliki model bahasa guru yang kuat (misalnya GPT4) menyelesaikan tugas dan mengumpulkan instruksi atau demonstrasi yang membantu model bahasa siswa yang lebih efisien (misalnya LLAMA-2) menyelesaikan tugas dengan lebih baik. Pengguna dapat dengan mudah menentukan bagian mana dari program yang diimplementasikan menggunakan LMS mana, untuk mencapai keseimbangan sempurna antara biaya dan kinerja.
Tujuan Irera adalah dengan mudah berlaku untuk berbagai tugas yang melibatkan kesimpulan dengan model bahasa dan pengambilan. Untuk tujuan ini, pelepasan repositori ini (i) Logika Infer-Retrieve-Rank, (ii) permintaan yang diperlukan untuk mengadaptasi Irera ke domain tertentu dan (iii) teknik optimasi untuk meningkatkan kinerja. Semua ini dimungkinkan melalui model pemrograman DSPY.
Panggilan LM dari hasil kami di -cache, artinya Anda dapat mereproduksi menjalankan kami tanpa membayar sendiri biaya inferensi sendiri.
Buat lingkungan conda:
conda create -n xmc python=3.10
conda activate xmc
Instal DSPY. Pekerjaan kami bergantung pada cabang eksperimental DSPY.
git clone -b irera --single-branch https://github.com/stanfordnlp/dspy.git
cd dspy/
git checkout 802f2d5f26c1a64d8aad6adbd8b4394b9c4bb743
pip install .
cd ..
Pasang sisa persyaratan:
pip install -r requirements.txt
Semua panggilan LM untuk mereproduksi lari kami di -cache. Namun, jika Anda ingin menjalankan panggilan baru, Anda harus mengatur model OpenAI dan lokal.
Atur tombol API OpenAI Anda:
export OPENAI_API_KEY=<your-key>
Untuk model lokal (misalnya LLAMA-2), atur antarmuka generasi teks lokal (TGI) melalui langkah-langkah ini. Pastikan untuk mengarahkan bidang url di lm_config.json ke server TGI Anda.
Muat data dan cache yang diperlukan untuk mereproduksi hasil kami.
bash scripts/load_data.sh
bash scripts/load_cache.sh
Semua kompilasi IRera berjalan dari makalah kami dapat direproduksi dengan menjalankan bash scripts/compile_left_to_right.sh atau bash scripts/run_left_to_right.sh . Kami menyediakan status program yang dihasilkan di results_precompiled/ sehingga Anda dapat memuat program Irera yang dikompilasi.
Muat Irera yang dikompilasi untuk ESCO_TECH dan evaluasi:
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
Kompilasi Irera Anda sendiri di Esco_tech dan evaluasi:
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
Argumen baris perintah dijelaskan dalam file masing -masing.
Jika Anda ingin mempercepat berjalan, Anda dapat menggunakan multithreading (peringatan: ini kadang -kadang dapat mengacaukan caching).
export DSP_NUM_THREADS=8
Hasil dari run_irera.py sedikit berbeda dari compile_irera.py , kemungkinan besar karena bug kecil dalam memuat dan menyimpan model. Kami mengambil hasil compile_irera.py sebagai hasil resmi yang kami laporkan di koran.
Untuk menerapkan Irera ke tugas baru, Anda minimal perlu menambahkan dataset baru dan menulis tanda tangan khusus
Logika pemuatan data didefinisikan dalam src/data_loaders . Setiap loader harus secara minimal mengembalikan validasi dan pengujian DataFrame, di mana setiap baris memiliki bidang 'text' (yang merupakan string ) dan bidang 'label' (yang merupakan list strings ).
compile_irera mengharapkan file .txt di mana setiap baris adalah label, melalui argumen --ontology_path . Label-label ini tidak dapat berisi koma, karena saat ini istirahat yang menanamkan label dalam daftar yang dipisahkan koma. Pastikan label tidak memiliki ruang trailing. Via --prior_path Kamus perlu disuplai label peta mana yang menjadi probabilitas.
Tanda tangan memberi tahu modul pembelajaran dalam konteks seperti apa tugasnya dan seperti apa input dan output. Anda dapat menganggapnya sebagai prompt nol-shot minimal untuk tugas tersebut. Semua tanda tangan didefinisikan dalam src/programs/signatures.py , tambahkan tanda tangan baru Anda di sini.
Untuk menambahkan tanda tangan baru, subclass sederhana dspy.Signature dengan bidang dan deskripsi khusus Anda. Tambahkan kelas baru Anda ke Kamus supported_signatures di bagian bawah src/programs/signatures.py sehingga dapat diakses di seluruh kode.
Metrik mentah didefinisikan dalam src/metrics.py dan dibungkus dengan logika DSPY di src/evaluators.py . Saat menambahkan metrik, pastikan untuk menambahkannya ke kamus supported_metrics di bagian bawah src/evaluators.py sehingga dapat digunakan di seluruh kode.
Tujuan Irera adalah menjadi modular dan mudah berlaku untuk tugas -tugas baru. Untuk mengubah Irera, Anda minimal perlu menulis logika khusus untuk modul (baru) menulis pengoptimal khusus yang mem -bootstrap program Anda.
Infer-retrieve-rank didefinisikan dalam src/programs/infer_retrieve_rank.py . Ini diinisialisasi dengan konfigurasi, didefinisikan dalam src/programs/config.py . Anda dapat menulis program baru atau memanipulasi perilaku Irera dengan mengubah kode Python dalam metode forward .
Saat Anda memperkenalkan hyperparameter baru, pastikan untuk menambahkan ini ke konfigurasi yang Anda gunakan. Kalau tidak, ini tidak akan disimpan dan dimuat.
Strategi optimasi didefinisikan dalam src/optimizer.py . Saat menambahkan pengoptimal baru, pastikan untuk menambahkannya ke kamus supported_optimizers di bagian bawah file, sehingga dapat diakses di seluruh kode.
Saat ini, pengoptimal mengetahui modul mana yang dimiliki program yang harus dioptimalkan. Ini perlu diselesaikan sehingga strategi optimasi dapat diterapkan secara fleksibel pada program yang berbeda.
Saya senang mengambil kolaborasi! Jangan ragu untuk menghubungi saya di email yang ditentukan di koran, atau dengan membuka masalah atau menarik permintaan di halaman GitHub. Berikut adalah beberapa masalah yang dapat kami kerjakan:
Riset:
Rekayasa Perangkat Lunak:
src/programs/retrieve.py lebih efisien Dapatkan pemberitahuan tentang pekerjaan di masa depan dengan mengikuti @kareldoostrlnck di Twitter.
Jika Anda menemukan repo ini bermanfaat atau menggunakan peringkat infer-retrieve dalam pekerjaan Anda, silakan kutip kami:
@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}
}