Chatbots mit großem Sprachmodell (LLM) wie ChatGPT und GPT-4 machen oft Fehler, insbesondere wenn die gesuchten Informationen aktuell sind („Erzählen Sie mir etwas über den Super Bowl 2024“) oder weniger beliebte Themen betreffen („Was sind?“) einige gute Filme zum Anschauen von [Ihren ausländischen Lieblingsregisseur einfügen]?“). WikiChat nutzt Wikipedia und die folgende 7-Stufen-Pipeline, um sicherzustellen, dass seine Antworten sachlich sind. Jede nummerierte Stufe umfasst einen oder mehrere LLM-Aufrufe.
Weitere Informationen finden Sie in unserem Artikel: Sina J. Semnani, Violet Z. Yao*, Heidi C. Zhang* und Monica S. Lam. 2023. WikiChat: Stoppen der Halluzination großer Sprachmodell-Chatbots durch Few-Shot Grounding auf Wikipedia. In Erkenntnissen der Association for Computational Linguistics: EMNLP 2023, Singapur. Verein für Computerlinguistik.
(22. August 2024) WikiChat 2.0 ist jetzt verfügbar! Zu den wichtigsten Updates gehören:
Unterstützt jetzt zusätzlich zum Text auch den Abruf aus strukturierten Daten wie Tabellen, Infoboxen und Listen.
Verfügt über die hochwertigsten öffentlichen Wikipedia-Vorverarbeitungsskripte
Verwendet das hochmoderne mehrsprachige Retrieval-Modell BGE-M3.
Verwendet Qdrant für die skalierbare Vektorsuche.
Verwendet RankGPT, um Suchergebnisse neu zu ordnen.
Mehrsprachige Unterstützung: Ruft standardmäßig Informationen aus 10 verschiedenen Wikipedias ab: ?? Englisch, ?? Chinesisch, ?? Spanisch, ?? Portugiesisch, ?? Russisch, ?? Deutsch, ?? Farsi, ?? Japanisch, ?? Französisch, und ?? Italienisch.
Verbesserter Informationsabruf
Kostenlose mehrsprachige Wikipedia-Such-API: Wir bieten eine hochwertige, kostenlose (aber ratenbegrenzte) Such-API für den Zugriff auf 10 Wikipedias mit über 180 Millionen Vektoreinbettungen.
Erweiterte LLM-Kompatibilität: Unterstützt dank LiteLLM mehr als 100 LLMs über eine einheitliche Schnittstelle.
Optimierte Pipeline: Option für eine schnellere und kostengünstigere Pipeline durch Zusammenführung der Phasen „Generieren“ und „Anspruch extrahieren“ von WikiChat.
LangChain-Kompatibilität: Vollständig kompatibel mit LangChain ?️?.
Und noch viel mehr!
(20. Juni 2024) WikiChat hat den Wikimedia Research Award 2024 gewonnen!
Der @Wikimedia Research Award des Jahres 2024 geht an „WikiChat: Stoppen der Halluzination großer Sprachmodell-Chatbots durch Few-Shot-Grounding auf Wikipedia“ ⚡
— Wiki-Workshop 2024 (@wikiworkshop) 20. Juni 2024
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(16. Mai 2024) Unser Folgepapier „? SPAGHETTI: Open-Domain Question Answering from Heterogeneous Data Sources with Retrieval and Semantic Parsing“ wird in die Ergebnisse von ACL 2024 aufgenommen. Dieses Papier fügt Unterstützung für strukturierte Daten wie Tabellen und Infoboxen hinzu und Listen.
(8. Januar 2024) Destillierte LLaMA-2-Modelle werden veröffentlicht. Sie können diese Modelle lokal ausführen, um eine günstigere und schnellere Alternative zu kostenpflichtigen APIs zu erhalten.
(8. Dezember 2023) Wir präsentieren unsere Arbeit auf der EMNLP 2023.
(27. Oktober 2023) Die kamerataugliche Version unseres Artikels ist jetzt auf arXiv verfügbar.
(06. Oktober 2023) Unser Beitrag wird in die Ergebnisse des EMNLP 2023 aufgenommen.
Die Installation von WikiChat umfasst die folgenden Schritte:
Abhängigkeiten installieren
Konfigurieren Sie das LLM Ihrer Wahl. WikiChat unterstützt über 100 LLMs, darunter Modelle von OpenAI, Azure, Anthropic, Mistral, HuggingFace, Together.ai und Groq.
Wählen Sie eine Informationsabrufquelle aus. Dies kann jeder HTTP-Endpunkt sein, der der in retrieval/retriever_server.py definierten Schnittstelle entspricht. Wir stellen Anleitungen und Skripte für die folgenden Optionen zur Verfügung:
Nutzen Sie unsere kostenlose, ratenbegrenzte API für Wikipedia in 10 Sprachen.
Laden Sie unseren bereitgestellten Wikipedia-Index herunter und hosten Sie ihn selbst.
Erstellen Sie einen neuen benutzerdefinierten Index aus Ihren eigenen Dokumenten und führen Sie ihn aus.
Führen Sie WikiChat mit der gewünschten Konfiguration aus.
[Optional] Stellen Sie WikiChat für den Mehrbenutzerzugriff bereit. Wir stellen Code zum Bereitstellen eines einfachen Front-Ends und Backends sowie Anweisungen zum Herstellen einer Verbindung mit einer Azure Cosmos DB-Datenbank zum Speichern von Konversationen bereit.
Dieses Projekt wurde mit Python 3.10 auf Ubuntu 20.04 LTS (Focal Fossa) getestet, sollte aber mit vielen anderen Linux-Distributionen kompatibel sein. Wenn Sie dies unter Windows WSL oder macOS oder mit einer anderen Python-Version verwenden möchten, müssen Sie während der Installation auf mögliche Fehlerbehebungen vorbereitet sein.
Die Hardwareanforderungen variieren je nach Verwendungszweck:
Grundlegende Verwendung: Das Ausführen von WikiChat mit LLM-APIs und unserer Wikipedia-Such-API erfordert minimale Hardwareanforderungen und sollte auf den meisten Systemen funktionieren.
Lokaler Suchindex: Wenn Sie beabsichtigen, einen Suchindex lokal zu hosten, stellen Sie sicher, dass Sie über ausreichend Speicherplatz für den Index verfügen. Bei großen Indizes hängt die Abruflatenz stark von der Festplattengeschwindigkeit ab. Wir empfehlen daher die Verwendung von SSDs und vorzugsweise NVMe-Laufwerken. Hierfür eignen sich beispielsweise speicheroptimierte VMs wie Standard_L8s_v3 auf Azure.
Lokales LLM: Wenn Sie WikiChat mit einem lokalen LLM verwenden möchten, ist eine GPU zum Hosten des Modells erforderlich.
Erstellen eines neuen Abrufindex: Wenn Sie eine Sammlung indizieren möchten, benötigen Sie eine GPU, um Dokumente in Vektoren einzubetten. Für die Ausführung des Standard-Einbettungsmodells (BAAI/BGE-M3) sind mindestens 13 GB GPU-Speicher erforderlich.
Klonen Sie zunächst das Repository:
Git-Klon https://github.com/stanford-oval/WikiChat.git CD WikiChat
Wir empfehlen die Verwendung der in conda_env.yaml angegebenen Conda-Umgebung. Diese Umgebung umfasst Python 3.10, pip, gcc, g++, make, Redis und alle erforderlichen Python-Pakete.
Stellen Sie sicher, dass Sie entweder Conda, Anaconda oder Miniconda installiert haben. Erstellen und aktivieren Sie dann die Conda-Umgebung:
conda env create --file conda_env.yaml Conda aktiviert Wikichat python -m spacy download en_core_web_sm # Spacy wird nur für bestimmte WikiChat-Konfigurationen benötigt
Wenn nach der Ausführung des Chatbots „Fehler: Redis-Suche fehlgeschlagen“ angezeigt wird, bedeutet dies wahrscheinlich, dass Redis nicht ordnungsgemäß installiert ist. Sie können versuchen, es erneut zu installieren, indem Sie der offiziellen Dokumentation folgen.
Lassen Sie diese Umgebung für alle nachfolgenden Befehle aktiviert.
Installieren Sie Docker für Ihr Betriebssystem, indem Sie den Anweisungen unter https://docs.docker.com/engine/install/ folgen. WikiChat verwendet Docker hauptsächlich zum Erstellen und Bereitstellen von Vektordatenbanken zum Abrufen, insbesondere ? Texteinbettungsinferenz und Qdrant. Auf neueren Ubuntu-Versionen können Sie versuchen, inv install-docker auszuführen. Befolgen Sie für andere Betriebssysteme die Anweisungen auf der Docker-Website.
WikiChat verwendet invoke, um benutzerdefinierte Befehle für verschiedene Zwecke hinzuzufügen. Um alle verfügbaren Befehle und ihre Beschreibungen anzuzeigen, führen Sie Folgendes aus:
--list aufrufen
oder die Abkürzung:
inv -l
Für weitere Details zu einem bestimmten Befehl verwenden Sie:
inv [Befehlsname] --help
Diese Befehle sind im Ordner „tasks/“ implementiert.
WikiChat ist mit verschiedenen LLMs kompatibel, darunter Modelle von OpenAI, Azure, Anthropic, Mistral, Together.ai und Groq. Sie können WikiChat auch mit vielen lokal gehosteten Models über HuggingFace verwenden.
So konfigurieren Sie Ihr LLM:
Füllen Sie die entsprechenden Felder in llm_config.yaml aus.
Erstellen Sie eine Datei mit dem Namen API_KEYS (die in .gitignore enthalten ist).
Legen Sie in der Datei API_KEYS den API-Schlüssel für den LLM-Endpunkt fest, den Sie verwenden möchten. Der Name des API-Schlüssels sollte mit dem Namen übereinstimmen, den Sie in llm_config.yaml unter api_key angegeben haben. Wenn Sie beispielsweise OpenAI-Modelle über openai.com und Mistral-Endpunkte verwenden, könnte Ihre API_KEYS-Datei so aussehen:
# Geben Sie die folgenden Werte mit Ihren API-Schlüsseln ein. Stellen Sie sicher, dass nach dem Schlüssel kein zusätzlicher Platz vorhanden ist.# Änderungen an dieser Datei werden von Git ignoriert, sodass Sie Ihre Schlüssel hier während der Entwicklung sicher speichern können.OPENAI_API_KEY=[Ihr OpenAI-API-Schlüssel von https://platform.openai.com/ API-Schlüssel] MISTRAL_API_KEY=[Ihr Mistral-API-Schlüssel von https://console.mistral.ai/api-keys/]
Beachten Sie, dass lokal gehostete Modelle KEINEN API-Schlüssel benötigen, Sie müssen jedoch einen OpenAI-kompatiblen Endpunkt in api_base bereitstellen. Der Code wurde mit getestet? Inferenz zur Textgenerierung.
Standardmäßig ruft WikiChat Informationen aus 10 Wikipedias über den Endpunkt unter https://wikichat.genie.stanford.edu/search/ ab. Wenn Sie WikiChat einfach ausprobieren möchten, müssen Sie nichts ändern.
Laden Sie den Index der 10 Wikipedia-Sprachen vom 1. August 2024 herunter von ? Hub und extrahieren Sie es:
inv download-wikipedia-index --workdir ./workdir
Beachten Sie, dass dieser Index etwa 180 Millionen Vektoreinbettungen enthält und daher mindestens 500 GB leeren Speicherplatz erfordert. Es nutzt die binäre Quantisierung von Qdrant, um den RAM-Bedarf auf 55 GB zu reduzieren, ohne Einbußen bei Genauigkeit oder Latenz.
Starten Sie einen FastAPI-Server ähnlich der Option 1, der auf HTTP-POST-Anfragen antwortet:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port
Starten Sie WikiChat, indem Sie die URL dieses Retrievers übergeben. Zum Beispiel:
inv demo --retriever-endpoint "http://0.0.0.0:/search"
Beachten Sie, dass dieser Server und sein Einbettungsmodell auf der CPU laufen und keine GPU erfordern. Für eine bessere Leistung können Sie auf kompatiblen Systemen --use-onnx hinzufügen, um die ONNX-Version des Einbettungsmodells zu verwenden und so die Einbettungslatenz deutlich zu verringern.
Mit dem folgenden Befehl wird der neueste HTML-Dump der kurdischen Wikipedia heruntergeladen, vorverarbeitet und indiziert, den wir in diesem Beispiel aufgrund seiner relativ geringen Größe verwenden.
inv index-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir --sprache ku
Verarbeiten Sie Ihre Daten in einer JSON-Zeilendatei (mit der Dateierweiterung .jsonl oder .jsonl.gz) vor, wobei jede Zeile die folgenden Felder enthält:
{"id": "integer", "content_string": "string", "article_title": "string", "full_section_title": "string", "block_type": "string", "sprache": "string", " last_edit_date": "string (optional)", "num_tokens": "integer (optional)"}
content_string sollte der fragmentierte Text Ihrer Dokumente sein. Wir empfehlen, den Tokenizer des Einbettungsmodells auf weniger als 500 Token aufzuteilen. Hier finden Sie eine Übersicht über Chunking-Methoden. Blocktyp und Sprache werden nur zum Filtern von Suchergebnissen verwendet. Wenn Sie sie nicht benötigen, können Sie sie einfach auf block_type=text und language=en setzen. Das Skript gibt full_section_title und content_string an das Einbettungsmodell weiter, um Einbettungsvektoren zu erstellen.
Einzelheiten dazu, wie dies für Wikipedia-HTML-Dumps implementiert wird, finden Sie unter preprocessing/preprocess_wikipedia_html_dump.py.
Führen Sie den Indexierungsbefehl aus:
inv index-collection --collection-path--collection-name
Dieser Befehl startet Docker-Container für ? Texteinbettungsinferenz (eine pro verfügbarer GPU). Standardmäßig wird das Docker-Image verwendet, das mit NVIDIA-GPUs mit Ampere 80-Architektur kompatibel ist, z. B. A100. Unterstützung für einige andere GPUs ist ebenfalls verfügbar, Sie müssen jedoch das richtige Docker-Image aus den verfügbaren Docker-Images auswählen.
(Optional) Fügen Sie einen Nutzlastindex hinzu
Python-Abruf/add_payload_index.py
Dadurch werden Abfragen ermöglicht, die nach Sprache oder Blocktyp filtern. Beachten Sie, dass es bei großen Indizes mehrere Minuten dauern kann, bis der Index wieder verfügbar ist.
Laden Sie nach der Indizierung den Index und verwenden Sie ihn wie in Option 2. Beispiel:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-portcurl -X POST 0.0.0.0:5100/search -H "Content-Type: application/json" -d '{" query": ["Was ist GPT-4?", "Was ist LLaMA-3?"], "num_blocks": 3}'
Starten Sie WikiChat, indem Sie die URL dieses Retrievers übergeben. Zum Beispiel:
inv demo --retriever-endpoint "http://0.0.0.0:/search"
Teilen Sie den Index in kleinere Teile auf:
tar -cvf –| pigz -p 14 | split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - /qdrant_index.tar.gz.part-
Laden Sie die resultierenden Teile hoch:
python retrieval/upload_folder_to_hf_hub.py --folder_path--repo_id
Sie können verschiedene Konfigurationen von WikiChat mit Befehlen wie diesen ausführen:
inv demo --engine gpt-4o # engine kann jeder in llm_config konfigurierte Wert sein, zum Beispiel mistral-large, claude-sonnet-35, local inv demo --pipeline generic_and_correct # Verfügbare Pipelines sind Early_combine, Generate_and_correct und Retriever_and_generate inv demo --temperatur 0.9 # ändert die Temperatur der benutzerorientierten Stufen wie Verfeinerung
Für eine vollständige Liste aller verfügbaren Optionen können Sie inv demo --help ausführen
Dieses Repository stellt Code bereit, um eine webbasierte Chat-Schnittstelle über Chainlit bereitzustellen und Benutzerkonversationen in einer Cosmos DB-Datenbank zu speichern. Diese sind in backend_server.py bzw. database.py implementiert. Wenn Sie andere Datenbanken oder Frontends verwenden möchten, müssen Sie diese Dateien ändern. Für die Entwicklung sollte es einfach sein, die Abhängigkeit von Cosmos DB zu entfernen und Konversationen einfach im Speicher zu speichern. Sie können auch in backend_server.py definierte Chatbot-Parameter konfigurieren, um beispielsweise ein anderes LLM zu verwenden oder Phasen von WikiChat hinzuzufügen/zu entfernen.
Nachdem Sie eine Instanz über Azure erstellt haben, rufen Sie die Verbindungszeichenfolge ab und fügen Sie diesen Wert in API_KEYS hinzu.
COSMOS_CONNECTION_STRING=[Ihre Cosmos DB-Verbindungszeichenfolge]
Wenn Sie dies ausführen, werden die Backend- und Front-End-Server gestartet. Sie können dann über den angegebenen Port (standardmäßig 5001) auf das Front-End zugreifen.inv chainlit --backend-port 5001
Sie können diesen API-Endpunkt zum Prototyping hochwertiger RAG-Systeme verwenden. Die vollständige Spezifikation finden Sie unter https://wikichat.genie.stanford.edu/search/redoc.
Beachten Sie, dass wir für diesen Endpunkt keine Garantien geben und er nicht für die Produktion geeignet ist.
(Kommt bald...)
Wir veröffentlichen vorverarbeitete Wikipedia in 10 Sprachen.
WikiChat 2.0 ist nicht mit den veröffentlichten fein abgestimmten LLaMA-2-Kontrollpunkten kompatibel. Bitte beziehen Sie sich vorerst auf Version 1.0.
Um einen Chatbot zu bewerten, können Sie Gespräche mithilfe eines Benutzersimulators simulieren. Der Subset-Parameter kann Head, Tail oder Recent sein, entsprechend den drei im WikiChat-Artikel eingeführten Subsets. Sie können auch die Sprache des Benutzers angeben (WikiChat antwortet immer in der Sprache des Benutzers). Dieses Skript liest das Thema (d. h. einen Wikipedia-Titel und -Artikel) aus der entsprechenden Datei benchmark/topics/{subset}_articles_{sprache}.json. Verwenden Sie --num-dialogs, um die Anzahl der zu generierenden simulierten Dialoge festzulegen, und --num-turns, um die Anzahl der Runden in jedem Dialog anzugeben.
inv simulieren-Benutzer --num-dialoges 1 --num-turns 2 --simulation-mode Passage --Sprache und --subset Kopf
Abhängig von der von Ihnen verwendeten Engine kann dies einige Zeit dauern. Die simulierten Dialoge und Protokolldateien werden in benchmark/simulated_dialogues/ gespeichert. Sie können auch einen der oben aufgeführten Pipeline-Parameter angeben. Sie können mit verschiedenen Benutzereigenschaften experimentieren, indem Sie user_characteristics in benchmark/user_simulator.py ändern.
WikiChat-Code sowie Modelle und Daten werden unter der Apache-2.0-Lizenz veröffentlicht.
Wenn Sie Code oder Daten aus diesem Repository verwendet haben, zitieren Sie bitte die folgenden Dokumente:
@inproceedings{semnani-etal-2023-wikichat,title = "{W}iki{C}hat: Stoppen der Halluzination großer Sprachmodell-Chatbots durch Few-Shot Grounding auf {W}ikipedia",author = "Semnani, Sina und Yao, Violet und Zhang, Heidi und Lam, Monica",editor = "Bouamor, Houda und Pino, Juan und Bali, Kalika",booktitle = „Ergebnisse der Association for Computational Linguistics: EMNLP 2023“,month = dec,year = „2023“,address = „Singapore“,publisher = „Association for Computational Linguistics“,url = „https://aclanthology.org/2023 .findings-emnlp.157",pages = "2387--2413", }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI}: Open-Domain-Fragenbeantwortung aus heterogenen Datenquellen mit Retrieval und semantischem Parsing",author = "Zhang, Heidi und Semnani, Sina und Ghassemi, Farhad und Xu, Jialiang und Liu, Shicheng und Lam, Monica",editor = "Ku, Lun-Wei und Martins, Andre und Srikumar, Vivek",booktitle = "Ergebnisse der Association for Computational Linguistics ACL 2024",month = aug,year = "2024",address = "Bangkok, Thailand und virtuelles Treffen",publisher = "Vereinigung für Computerlinguistik",url = „https://aclanthology.org/2024.findings-acl.96“,pages = „1663--1678“, }