Chatbot model bahasa besar (LLM) seperti ChatGPT dan GPT-4 sering kali melakukan kesalahan, terutama jika informasi yang Anda cari adalah informasi terkini (“Ceritakan tentang Super Bowl 2024.”) atau tentang topik yang kurang populer (“Apa itu beberapa film bagus untuk ditonton dari [masukkan sutradara asing favorit Anda]?"). WikiChat menggunakan Wikipedia dan saluran 7 tahap berikut untuk memastikan tanggapannya faktual. Setiap tahap bernomor melibatkan satu atau lebih panggilan LLM.
Lihat makalah kami untuk lebih jelasnya: Sina J. Semnani, Violet Z. Yao*, Heidi C. Zhang*, dan Monica S. Lam. 2023. WikiChat: Menghentikan Halusinasi Chatbot Model Bahasa Besar dengan Beberapa Pemotretan di Wikipedia. Dalam Temuan Association for Computational Linguistics: EMNLP 2023, Singapura. Asosiasi Linguistik Komputasi.
(22 Agustus 2024) WikiChat 2.0 sekarang tersedia! Pembaruan penting meliputi:
Kini mendukung pengambilan dari data terstruktur seperti tabel, kotak info, dan daftar, selain teks.
Memiliki skrip pra-pemrosesan Wikipedia publik dengan kualitas tertinggi
Menggunakan model pengambilan multibahasa yang canggih BGE-M3.
Menggunakan Qdrant untuk pencarian vektor yang dapat diskalakan.
Menggunakan RankGPT untuk mengubah peringkat hasil pencarian.
Dukungan Multibahasa: Secara default, mengambil informasi dari 10 Wikipedia berbeda: ?? Bahasa inggris, ?? Cina, ?? Spanyol, ?? Portugis, ?? Rusia, ?? Jerman, ?? Farsi, ?? Jepang, ?? Prancis, dan ?? Italia.
Peningkatan Pengambilan Informasi
API Pencarian Wikipedia Multibahasa Gratis: Kami menawarkan API pencarian berkualitas tinggi, gratis (namun tarifnya terbatas) untuk akses ke 10 Wikipedia, yang mencakup lebih dari 180 juta penyematan vektor.
Kompatibilitas LLM yang Diperluas: Mendukung 100+ LLM melalui antarmuka terpadu, berkat LiteLLM.
Saluran Pipa yang Dioptimalkan: Opsi untuk saluran pipa yang lebih cepat dan hemat biaya dengan menggabungkan tahapan "hasilkan" dan "ekstrak klaim" di WikiChat.
Kompatibilitas LangChain: Sepenuhnya kompatibel dengan LangChain ?️?.
Dan Masih Banyak Lagi!
(20 Juni 2024) WikiChat memenangkan Penghargaan Penelitian Wikimedia 2024!
Penghargaan Penelitian @Wikimedia Tahun 2024 diberikan kepada "WikiChat: Menghentikan halusinasi chatbot model bahasa besar dengan beberapa kali mendarat di Wikipedia" ⚡
— Lokakarya Wiki 2024 (@wikiworkshop) 20 Juni 2024
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(16 Mei 2024) Makalah tindak lanjut kami "? SPAGHETTI: Menjawab Pertanyaan Domain Terbuka dari Sumber Data Heterogen dengan Pengambilan dan Parsing Semantik" diterima di Temuan ACL 2024. Makalah ini menambahkan dukungan untuk data terstruktur seperti tabel, kotak info dan daftar.
(8 Januari 2024) Model LLaMA-2 sulingan dirilis. Anda dapat menjalankan model ini secara lokal untuk mendapatkan alternatif yang lebih murah dan cepat dibandingkan API berbayar.
(8 Desember 2023) Kami mempresentasikan karya kami di EMNLP 2023.
(27 Oktober 2023) Versi siap pakai kamera dari makalah kami kini tersedia di arXiv.
(06 Oktober 2023) Makalah kami diterima pada Temuan EMNLP 2023.
Menginstal WikiChat melibatkan langkah-langkah berikut:
Instal dependensi
Konfigurasikan LLM pilihan Anda. WikiChat mendukung lebih dari 100 LLM, termasuk model dari OpenAI, Azure, Anthropic, Mistral, HuggingFace, Together.ai, dan Groq.
Pilih sumber pengambilan informasi. Ini bisa berupa titik akhir HTTP apa pun yang sesuai dengan antarmuka yang ditentukan di retrieval/retriever_server.py. Kami memberikan instruksi dan skrip untuk opsi berikut:
Gunakan API gratis kami dengan tarif terbatas untuk Wikipedia dalam 10 bahasa.
Unduh dan host sendiri indeks Wikipedia yang kami sediakan.
Buat dan jalankan indeks khusus baru dari dokumen Anda sendiri.
Jalankan WikiChat dengan konfigurasi yang Anda inginkan.
[Opsional] Terapkan WikiChat untuk akses multi-pengguna. Kami menyediakan kode untuk menyebarkan front-end dan backend sederhana, serta instruksi untuk menyambungkan ke database Azure Cosmos DB untuk menyimpan percakapan.
Proyek ini telah diuji dengan Python 3.10 di Ubuntu 20.04 LTS (Focal Fossa), tetapi proyek ini harus kompatibel dengan banyak distribusi Linux lainnya. Jika Anda berencana untuk menggunakan ini pada Windows WSL atau macOS, atau dengan versi Python yang berbeda, bersiaplah untuk kemungkinan pemecahan masalah selama instalasi.
Persyaratan perangkat keras bervariasi berdasarkan tujuan penggunaan Anda:
Penggunaan Dasar: Menjalankan WikiChat dengan API LLM dan API pencarian Wikipedia kami memiliki persyaratan perangkat keras minimal dan dapat bekerja pada sebagian besar sistem.
Indeks Pencarian Lokal: Jika Anda ingin menghosting indeks pencarian secara lokal, pastikan Anda memiliki ruang disk yang cukup untuk indeks tersebut. Untuk indeks besar, latensi pengambilan sangat bergantung pada kecepatan disk, jadi sebaiknya gunakan SSD dan sebaiknya drive NVMe. Misalnya, VM dengan penyimpanan yang dioptimalkan seperti Standard_L8s_v3 di Azure cocok untuk ini.
LLM Lokal: Jika Anda berencana menggunakan WikiChat dengan LLM lokal, GPU diperlukan untuk menghosting model tersebut.
Membuat Indeks Pengambilan Baru: Jika Anda ingin mengindeks koleksi, Anda memerlukan GPU untuk menyematkan dokumen ke vektor. Model penyematan default (BAAI/BGE-M3) memerlukan setidaknya 13 GB memori GPU untuk dijalankan.
Pertama, kloning repositori:
git klon https://github.com/stanford-oval/WikiChat.git cd WikiChat
Kami merekomendasikan penggunaan lingkungan conda yang ditentukan di conda_env.yaml. Lingkungan ini mencakup Python 3.10, pip, gcc, g++, make, Redis, dan semua paket Python yang diperlukan.
Pastikan Anda telah menginstal Conda, Anaconda, atau Miniconda. Kemudian buat dan aktifkan lingkungan conda:
conda env buat --file conda_env.yaml conda mengaktifkan wikichat python -m spacy download en_core_web_sm # Spacy hanya diperlukan untuk konfigurasi WikiChat tertentu
Jika Anda melihat Kesalahan: Pencarian Redis gagal setelah menjalankan chatbot, itu mungkin berarti Redis tidak diinstal dengan benar. Anda dapat mencoba menginstalnya kembali dengan mengikuti dokumentasi resminya.
Biarkan lingkungan ini tetap aktif untuk semua perintah berikutnya.
Instal Docker untuk sistem operasi Anda dengan mengikuti petunjuk di https://docs.docker.com/engine/install/. WikiChat menggunakan Docker terutama untuk membuat dan menyajikan basis data vektor untuk pengambilan, khususnya? Inferensi Penyematan Teks dan Qdrant. Pada versi Ubuntu terbaru, Anda dapat mencoba menjalankan inv install-docker. Untuk sistem operasi lain, ikuti petunjuk di situs buruh pelabuhan.
WikiChat menggunakan pemanggilan untuk menambahkan perintah khusus untuk berbagai tujuan. Untuk melihat semua perintah yang tersedia dan deskripsinya, jalankan:
panggil --list
atau singkatannya:
masuk -l
Untuk detail lebih lanjut tentang perintah tertentu, gunakan:
inv [nama perintah] --membantu
Perintah-perintah ini diterapkan di folder tugas/.
WikiChat kompatibel dengan berbagai LLM, termasuk model dari OpenAI, Azure, Anthropic, Mistral, Together.ai, dan Groq. Anda juga dapat menggunakan WikiChat dengan banyak model yang dihosting secara lokal melalui HuggingFace.
Untuk mengonfigurasi LLM Anda:
Isi kolom yang sesuai di llm_config.yaml.
Buat file bernama API_KEYS (yang disertakan dalam .gitignore).
Dalam file API_KEYS, atur kunci API untuk titik akhir LLM yang ingin Anda gunakan. Nama kunci API harus sesuai dengan nama yang Anda berikan di llm_config.yaml di bawah api_key. Misalnya, jika Anda menggunakan model OpenAI melalui openai.com dan titik akhir Mistral, file API_KEYS Anda mungkin terlihat seperti ini:
# Isi nilai berikut dengan kunci API Anda. Pastikan tidak ada spasi tambahan setelah kunci.# Perubahan pada berkas ini diabaikan oleh git, sehingga Anda dapat menyimpan kunci dengan aman di sini selama pengembangan.OPENAI_API_KEY=[Kunci API OpenAI Anda dari https://platform.openai.com/ kunci api] MISTRAL_API_KEY=[Kunci API Mistral Anda dari https://console.mistral.ai/api-keys/]
Perhatikan bahwa model yang dihosting secara lokal TIDAK memerlukan kunci API, tetapi Anda perlu menyediakan titik akhir yang kompatibel dengan OpenAI di api_base. Kode telah diuji dengan ? Inferensi Pembuatan Teks.
Secara default, WikiChat mengambil informasi dari 10 Wikipedia melalui titik akhir di https://wikichat.genie.stanford.edu/search/. Jika Anda hanya ingin mencoba WikiChat, Anda tidak perlu mengubah apa pun.
Unduh indeks 10 bahasa Wikipedia 1 Agustus 2024 dari ? Hub dan ekstrak:
inv unduh-wikipedia-index --workdir ./workdir
Perhatikan bahwa indeks ini berisi ~180 juta penyematan vektor dan oleh karena itu memerlukan setidaknya 500 GB ruang disk kosong. Ia menggunakan kuantisasi biner Qdrant untuk mengurangi kebutuhan RAM hingga 55 GB tanpa mengorbankan akurasi atau latensi.
Mulai server FastAPI mirip dengan opsi 1 yang merespons permintaan HTTP POST:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port
Mulai WikiChat dengan memasukkan URL dari retriever ini. Misalnya:
inv demo --retriever-endpoint "http://0.0.0.0:/pencarian"
Perhatikan bahwa server ini dan model penyematannya berjalan pada CPU, dan tidak memerlukan GPU. Untuk performa yang lebih baik, pada sistem yang kompatibel, Anda dapat menambahkan --use-onnx untuk menggunakan model penyematan versi ONNX, untuk menurunkan latensi penyematan secara signifikan.
Perintah berikut akan mengunduh, memproses terlebih dahulu, dan mengindeks dump HTML terbaru dari Wikipedia Kurdi, yang kami gunakan dalam contoh ini karena ukurannya yang relatif kecil.
inv indeks-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir --bahasa ku
Proses awal data Anda menjadi file JSON Lines (dengan ekstensi file .jsonl atau .jsonl.gz) yang setiap barisnya memiliki bidang berikut:
{"id": "integer", "content_string": "string", "article_title": "string", "full_section_title": "string", "block_type": "string", "bahasa": "string", " last_edit_date": "string (opsional)", "num_tokens": "integer (opsional)"}
content_string harus berupa potongan teks dokumen Anda. Kami merekomendasikan untuk menggabungkan hingga kurang dari 500 token tokenizer model penyematan. Lihat ini untuk ikhtisar metode chunking.block_type dan bahasa hanya digunakan untuk memberikan pemfilteran pada hasil pencarian. Jika Anda tidak membutuhkannya, Anda cukup mengaturnya ke block_type=text dan Language=en. Skrip akan memasukkan full_section_title dan content_string ke model penyematan untuk membuat vektor penyematan.
Lihat preprocessing/preprocess_wikipedia_html_dump.py untuk detail tentang bagaimana hal ini diterapkan untuk dump HTML Wikipedia.
Jalankan perintah pengindeksan:
inv indeks-koleksi --koleksi-jalur--nama-koleksi
Perintah ini memulai kontainer buruh pelabuhan untuk? Inferensi Penyematan Teks (satu per GPU yang tersedia). Secara default, ia menggunakan image buruh pelabuhan yang kompatibel dengan GPU NVIDIA dengan arsitektur Ampere 80, misalnya A100. Dukungan untuk beberapa GPU lain juga tersedia, tetapi Anda harus memilih image buruh pelabuhan yang tepat dari image buruh pelabuhan yang tersedia.
(Opsional) Tambahkan indeks muatan
pengambilan python/add_payload_index.py
Ini akan mengaktifkan kueri yang memfilter berdasarkan bahasa atau tipe_blok. Perhatikan bahwa untuk indeks besar, mungkin diperlukan waktu beberapa menit agar indeks tersedia kembali.
Setelah pengindeksan, muat dan gunakan indeks seperti pada opsi 2. Misalnya:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-portcurl -X POST 0.0.0.0:5100/search -H "Tipe Konten: aplikasi/json" -d '{" query": ["Apa itu GPT-4?", "Apa itu LLaMA-3?"], "num_blocks": 3}'
Mulai WikiChat dengan memasukkan URL dari retriever ini. Misalnya:
inv demo --retriever-endpoint "http://0.0.0.0:/pencarian"
Bagi indeks menjadi beberapa bagian yang lebih kecil:
tar -cvf -| babiz -p 14 | split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - /qdrant_index.tar.gz.part-
Unggah bagian yang dihasilkan:
pengambilan python/upload_folder_to_hf_hub.py --folder_path--repo_id
Anda dapat menjalankan konfigurasi WikiChat yang berbeda menggunakan perintah seperti ini:
inv demo --engine gpt-4o # engine dapat berupa nilai apa pun yang dikonfigurasi di llm_config, misalnya, mistral-large, claude-sonnet-35, local inv demo --pipeline menghasilkan_dan_benar # saluran pipa yang tersedia adalah early_combine, menghasilkan_dan_benar dan mengambil_dan_menghasilkan inv demo --temperature 0.9 # mengubah suhu tahapan yang dihadapi pengguna seperti penyempurnaan
Untuk daftar lengkap semua opsi yang tersedia, Anda dapat menjalankan inv demo --help
Repositori ini menyediakan kode untuk menyebarkan antarmuka obrolan berbasis web melalui Chainlit, dan menyimpan percakapan pengguna ke database Cosmos DB. Ini diimplementasikan di backend_server.py dan database.py masing-masing. Jika Anda ingin menggunakan database atau front-end lain, Anda perlu memodifikasi file-file ini. Untuk pengembangan, menghilangkan ketergantungan pada Cosmos DB harus mudah dan cukup menyimpan percakapan di memori. Anda juga dapat mengonfigurasi parameter chatbot yang ditentukan di backend_server.py, misalnya untuk menggunakan LLM berbeda atau menambah/menghapus tahapan WikiChat.
Setelah membuat instans melalui Azure, dapatkan string koneksi dan tambahkan nilai ini di API_KEYS.
COSMOS_CONNECTION_STRING=[string koneksi Cosmos DB Anda]
Menjalankan ini akan memulai server backend dan front-end. Anda kemudian dapat mengakses front-end pada port yang ditentukan (5001 secara default).inv chainlit --backend-port 5001
Anda dapat menggunakan titik akhir API ini untuk membuat prototipe sistem RAG berkualitas tinggi. Lihat https://wikichat.genie.stanford.edu/search/redoc untuk spesifikasi lengkap.
Perhatikan bahwa kami tidak memberikan jaminan apa pun tentang titik akhir ini, dan titik akhir ini tidak cocok untuk produksi.
(Segera hadir...)
Kami secara publik merilis Wikipedia yang telah diproses sebelumnya dalam 10 bahasa.
WikiChat 2.0 tidak kompatibel dengan pos pemeriksaan LLaMA-2 yang telah disempurnakan dan dirilis. Silakan merujuk ke v1.0 untuk saat ini.
Untuk mengevaluasi chatbot, Anda dapat menyimulasikan percakapan menggunakan simulator pengguna. Parameter subset dapat berupa kepala, ekor, atau terkini, sesuai dengan tiga subset yang diperkenalkan di makalah WikiChat. Anda juga dapat menentukan bahasa pengguna (WikiChat selalu membalas dalam bahasa pengguna). Skrip ini membaca topik (yaitu, judul dan artikel Wikipedia) dari file benchmark/topics/{subset}_articles_{lingual}.json yang sesuai. Gunakan --num-dialogues untuk mengatur jumlah simulasi dialog yang akan dihasilkan, dan --num-turns untuk menentukan jumlah putaran di setiap dialog.
inv simulasi-pengguna --num-dialogues 1 --num-turns 2 --simulation-mode bagian --bahasa en --subset head
Tergantung pada mesin yang Anda gunakan, ini mungkin memerlukan waktu. Dialog simulasi dan file log akan disimpan di benchmark/simulated_dialogues/. Anda juga dapat memberikan parameter saluran apa pun dari atas. Anda dapat bereksperimen dengan karakteristik pengguna yang berbeda dengan memodifikasi user_characteristics di benchmark/user_simulator.py.
Kode, model, dan data WikiChat dirilis di bawah lisensi Apache-2.0.
Jika Anda telah menggunakan kode atau data dari repositori ini, harap kutip makalah berikut:
@inproceedings{semnani-etal-2023-wikichat,title = "{W}iki{C}hat: Menghentikan Halusinasi Chatbot Model Bahasa Besar dengan Beberapa Pemotretan di {W}ikipedia",author = "Semnani, Sina dan Yao, Violet dan Zhang, Heidi dan Lam, Monica",editor = "Bouamor, Houda dan Pino, Juan dan Bali, Kalika",booktitle = "Temuan Asosiasi Linguistik Komputasi: EMNLP 2023",bulan = Desember,tahun = "2023",alamat = "Singapura",penerbit = "Asosiasi Linguistik Komputasi",url = "https://aclanthology.org/2023.findings- emnlp.157",halaman = "2387--2413", }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI}: Jawaban Pertanyaan Domain Terbuka dari Sumber Data Heterogen dengan Pengambilan dan Parsing Semantik",author = "Zhang, Heidi dan Semnani, Sina dan Ghassemi, Farhad dan Xu, Jialiang dan Liu, Shicheng dan Lam, Monica",editor = "Ku, Lun-Wei dan Martins, Andre dan Srikumar, Vivek",booktitle = "Temuan Asosiasi Linguistik Komputasi ACL 2024",bulan = Agustus,tahun = "2024",address = "Bangkok, Thailand dan pertemuan virtual",publisher = "Asosiasi Linguistik Komputasi" ,url = "https://aclanthology.org/2024.findings-acl.96",halaman = "1663--1678", }