Les chatbots à grand langage (LLM) comme ChatGPT et GPT-4 se trompent souvent, surtout si les informations que vous recherchez sont récentes (« Parlez-moi du Super Bowl 2024. ») ou sur des sujets moins populaires (« Que sont quelques bons films à regarder de [insérer votre réalisateur étranger préféré] ?"). WikiChat utilise Wikipédia et le pipeline en 7 étapes suivant pour s'assurer que ses réponses sont factuelles. Chaque étape numérotée implique un ou plusieurs appels LLM.
Consultez notre article pour plus de détails : Sina J. Semnani, Violet Z. Yao*, Heidi C. Zhang* et Monica S. Lam. 2023. WikiChat : Arrêter l'hallucination des chatbots de grands modèles de langage grâce à Few-Shot Grounding sur Wikipédia. Dans les résultats de l’Association for Computational Linguistics : EMNLP 2023, Singapour. Association pour la linguistique computationnelle.
(22 août 2024) WikiChat 2.0 est maintenant disponible ! Les principales mises à jour incluent :
Prend désormais en charge la récupération de données structurées telles que des tableaux, des infobox et des listes, en plus du texte.
Possède des scripts de prétraitement Wikipédia publics de la plus haute qualité
Utilise le modèle de récupération multilingue de pointe BGE-M3.
Utilise Qdrant pour la recherche vectorielle évolutive.
Utilise RankGPT pour reclasser les résultats de recherche.
Prise en charge multilingue : par défaut, récupère les informations de 10 Wikipédias différents : ?? Anglais, ?? Chinois, ?? Espagnol, ?? Portugais, ?? Russe, ?? Allemand, ?? Farsi, ?? Japonais, ?? Français, et ?? Italien.
Récupération d'informations améliorée
API de recherche Wikipédia multilingue gratuite : nous proposons une API de recherche gratuite (mais à débit limité) de haute qualité pour accéder à 10 Wikipédia, englobant plus de 180 millions d'intégrations vectorielles.
Compatibilité LLM étendue : prend en charge plus de 100 LLM via une interface unifiée, grâce à LiteLLM.
Pipeline optimisé : option pour un pipeline plus rapide et plus rentable en fusionnant les étapes « générer » et « extraire la réclamation » de WikiChat.
Compatibilité LangChain : Entièrement compatible avec LangChain ?️?.
Et bien plus encore !
(20 juin 2024) WikiChat a remporté le prix de recherche Wikimedia 2024 !
Le Prix de recherche @Wikimedia de l'année 2024 est décerné à « WikiChat : Stopper l'hallucination des chatbots à grands modèles de langage grâce à un ancrage en quelques coups sur Wikipédia » ⚡
– Atelier Wiki 2024 (@wikiworkshop) 20 juin 2024
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(16 mai 2024) Notre article de suivi « ? SPAGHETTI : Réponse aux questions en domaine ouvert à partir de sources de données hétérogènes avec récupération et analyse sémantique » est accepté dans les résultats de l'ACL 2024. Cet article ajoute la prise en charge des données structurées telles que les tableaux, les infobox. et des listes.
(8 janvier 2024) Sortie des modèles distillés LLaMA-2. Vous pouvez exécuter ces modèles localement pour une alternative moins chère et plus rapide aux API payantes.
(8 décembre 2023) Nous présentons nos travaux à l'EMNLP 2023.
(27 octobre 2023) La version prête à photographier de notre article est désormais disponible sur arXiv.
(6 octobre 2023) Notre article est accepté dans les conclusions de l'EMNLP 2023.
L'installation de WikiChat implique les étapes suivantes :
Installer les dépendances
Configurez le LLM de votre choix. WikiChat prend en charge plus de 100 LLM, notamment des modèles d'OpenAI, Azure, Anthropic, Mistral, HuggingFace, Together.ai et Groq.
Sélectionnez une source de recherche d'informations. Il peut s'agir de n'importe quel point de terminaison HTTP conforme à l'interface définie dans retrieval/retriever_server.py. Nous fournissons des instructions et des scripts pour les options suivantes :
Utilisez notre API gratuite et à débit limité pour Wikipédia en 10 langues.
Téléchargez et hébergez vous-même notre index Wikipédia fourni.
Créez et exécutez un nouvel index personnalisé à partir de vos propres documents.
Exécutez WikiChat avec la configuration souhaitée.
[Facultatif] Déployez WikiChat pour un accès multi-utilisateur. Nous fournissons du code pour déployer un front-end et un backend simples, ainsi que des instructions pour se connecter à une base de données Azure Cosmos DB pour stocker les conversations.
Ce projet a été testé avec Python 3.10 sur Ubuntu 20.04 LTS (Focal Fossa), mais il devrait être compatible avec de nombreuses autres distributions Linux. Si vous envisagez de l'utiliser sur Windows WSL ou macOS, ou avec une autre version de Python, préparez-vous à un dépannage potentiel lors de l'installation.
La configuration matérielle requise varie en fonction de votre utilisation prévue :
Utilisation de base : exécuter WikiChat avec les API LLM et notre API de recherche Wikipédia nécessite une configuration matérielle minimale et devrait fonctionner sur la plupart des systèmes.
Index de recherche local : si vous avez l'intention d'héberger un index de recherche localement, assurez-vous de disposer de suffisamment d'espace disque pour l'index. Pour les index volumineux, la latence de récupération dépend fortement de la vitesse du disque. Nous vous recommandons donc d'utiliser des disques SSD et de préférence des disques NVMe. Par exemple, les machines virtuelles optimisées pour le stockage comme Standard_L8s_v3 sur Azure conviennent à cela.
LLM local : si vous prévoyez d'utiliser WikiChat avec un LLM local, un GPU est nécessaire pour héberger le modèle.
Création d'un nouvel index de récupération : si vous souhaitez indexer une collection, vous avez besoin d'un GPU pour intégrer des documents dans des vecteurs. Le modèle d'intégration par défaut (BAAI/BGE-M3) nécessite au moins 13 Go de mémoire GPU pour fonctionner.
Tout d'abord, clonez le référentiel :
clone git https://github.com/stanford-oval/WikiChat.git cdWikiChat
Nous vous recommandons d'utiliser l'environnement conda spécifié dans conda_env.yaml. Cet environnement comprend Python 3.10, pip, gcc, g++, make, Redis et tous les packages Python requis.
Assurez-vous que Conda, Anaconda ou Miniconda est installé. Créez ensuite et activez l'environnement conda :
conda env créer --file conda_env.yaml conda activer wikichat python -m spacy download en_core_web_sm # Spacy n'est nécessaire que pour certaines configurations WikiChat
Si vous voyez Erreur : la recherche Redis a échoué après l'exécution du chatbot, cela signifie probablement que Redis n'est pas correctement installé. Vous pouvez essayer de le réinstaller en suivant sa documentation officielle.
Gardez cet environnement activé pour toutes les commandes ultérieures.
Installez Docker pour votre système d'exploitation en suivant les instructions sur https://docs.docker.com/engine/install/. WikiChat utilise Docker principalement pour créer et servir des bases de données vectorielles à des fins de récupération, en particulier ? Inférence d’intégration de texte et Qdrant. Sur les versions récentes d'Ubuntu, vous pouvez essayer d'exécuter inv install-docker. Pour les autres systèmes d'exploitation, suivez les instructions sur le site Web Docker.
WikiChat utilise Invoke pour ajouter des commandes personnalisées à diverses fins. Pour voir toutes les commandes disponibles et leurs descriptions, exécutez :
invoquer --list
ou le raccourci :
inv-l
Pour plus de détails sur une commande spécifique, utilisez :
inv [nom de la commande] --help
Ces commandes sont implémentées dans le dossier tâches/.
WikiChat est compatible avec divers LLM, notamment les modèles d'OpenAI, Azure, Anthropic, Mistral, Together.ai et Groq. Vous pouvez également utiliser WikiChat avec de nombreux modèles hébergés localement via HuggingFace.
Pour configurer votre LLM :
Remplissez les champs appropriés dans llm_config.yaml.
Créez un fichier nommé API_KEYS (qui est inclus dans .gitignore).
Dans le fichier API_KEYS, définissez la clé API du point de terminaison LLM que vous souhaitez utiliser. Le nom de la clé API doit correspondre au nom que vous avez fourni dans llm_config.yaml sous api_key. Par exemple, si vous utilisez des modèles OpenAI via openai.com et les points de terminaison Mistral, votre fichier API_KEYS pourrait ressembler à ceci :
# Remplissez les valeurs suivantes avec vos clés API. Assurez-vous qu'il n'y a pas d'espace supplémentaire après la clé.# Les modifications apportées à ce fichier sont ignorées par git, vous pouvez donc stocker vos clés ici en toute sécurité pendant le développement.OPENAI_API_KEY=[Votre clé API OpenAI depuis https://platform.openai.com/ clés API] MISTRAL_API_KEY=[Votre clé API Mistral depuis https://console.mistral.ai/api-keys/]
Notez que les modèles hébergés localement n'ont PAS besoin de clé API, mais vous devez fournir un point de terminaison compatible OpenAI dans api_base. Le code a été testé avec ? Inférence de génération de texte.
Par défaut, WikiChat récupère les informations de 10 Wikipédia via le point de terminaison https://wikichat.genie.stanford.edu/search/. Si vous souhaitez simplement essayer WikiChat, vous n'avez rien à modifier.
Téléchargez l'index du 1er août 2024 des 10 langues Wikipédia à partir de ? Hub et extrayez-le :
inv téléchargement-wikipedia-index --workdir ./workdir
Notez que cet index contient environ 180 millions de représentations vectorielles vectorielles et nécessite donc au moins 500 Go d'espace disque vide. Il utilise la quantification binaire de Qdrant pour réduire les besoins en RAM à 55 Go sans sacrifier la précision ou la latence.
Démarrez un serveur FastAPI similaire à l'option 1 qui répond aux requêtes HTTP POST :
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port
Démarrez WikiChat en transmettant l'URL de ce récupérateur. Par exemple:
inv demo --retriever-endpoint "http://0.0.0.0:/search"
Notez que ce serveur et son modèle d'intégration fonctionnent sur CPU et ne nécessitent pas de GPU. Pour de meilleures performances, sur les systèmes compatibles, vous pouvez ajouter --use-onnx pour utiliser la version ONNX du modèle d'intégration, afin de réduire considérablement la latence d'intégration.
La commande suivante téléchargera, prétraitera et indexera le dernier dump HTML de Wikipédia kurde, que nous utilisons dans cet exemple en raison de sa taille relativement petite.
inv index-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir --langue ku
Prétraitez vos données dans un fichier JSON Lines (avec l'extension de fichier .jsonl ou .jsonl.gz) où chaque ligne contient les champs suivants :
{"id": "integer", "content_string": "string", "article_title": "string", "full_section_title": "string", "block_type": "string", "langue": "string", " last_edit_date": "chaîne (facultatif)", "num_tokens": "entier (facultatif)"}
content_string doit être le texte fragmenté de vos documents. Nous recommandons de regrouper à moins de 500 jetons le tokenizer du modèle d'intégration. Voir ceci pour un aperçu des méthodes de segmentation. block_type et le langage ne sont utilisés que pour filtrer les résultats de recherche. Si vous n'en avez pas besoin, vous pouvez simplement les définir sur block_type=text et language=en. Le script alimentera full_section_title et content_string au modèle d'intégration pour créer des vecteurs d'intégration.
Voir preprocessing/preprocess_wikipedia_html_dump.py pour plus de détails sur la façon dont cela est implémenté pour les dumps HTML de Wikipédia.
Exécutez la commande d'indexation :
inv index-collection --collection-path--collection-name
Cette commande démarre les conteneurs Docker pour ? Inférence d’intégration de texte (une par GPU disponible). Par défaut, il utilise l'image docker compatible avec les GPU NVIDIA avec architecture Ampere 80, par exemple A100. La prise en charge de certains autres GPU est également disponible, mais vous devrez choisir la bonne image Docker parmi les images Docker disponibles.
(Facultatif) Ajouter un index de charge utile
récupération python/add_payload_index.py
Cela activera les requêtes qui filtrent sur la langue ou sur le type de bloc. Notez que pour les index volumineux, plusieurs minutes peuvent s’écouler avant que l’index redevienne disponible.
Après l'indexation, chargez et utilisez l'index comme dans l'option 2. Par exemple :
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-portcurl -X POST 0.0.0.0:5100/search -H "Type de contenu : application/json" -d '{" query": ["Qu'est-ce que GPT-4 ?", "Qu'est-ce que LLaMA-3 ?"], "num_blocks": 3}'
Démarrez WikiChat en transmettant l'URL de ce récupérateur. Par exemple:
inv demo --retriever-endpoint "http://0.0.0.0:/search"
Divisez l'index en parties plus petites :
tar -cvf -| pigz -p 14 | split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - /qdrant_index.tar.gz.part-
Téléchargez les pièces résultantes :
python retrieval/upload_folder_to_hf_hub.py --folder_path--repo_id
Vous pouvez exécuter différentes configurations de WikiChat en utilisant des commandes comme celles-ci :
inv demo --engine gpt-4o # le moteur peut avoir n'importe quelle valeur configurée dans llm_config, par exemple, mistral-large, claude-sonnet-35, local inv demo --pipeline generate_and_correct # les pipelines disponibles sont early_combine, generate_and_correct et retrieve_and_generate inv demo --temperature 0.9 # change la température des étapes destinées à l'utilisateur comme le raffinement
Pour une liste complète de toutes les options disponibles, vous pouvez exécuter inv demo --help
Ce référentiel fournit du code pour déployer une interface de discussion Web via Chainlit et stocker les conversations des utilisateurs dans une base de données Cosmos DB. Ceux-ci sont implémentés respectivement dans backend_server.py et database.py. Si vous souhaitez utiliser d'autres bases de données ou frontaux, vous devez modifier ces fichiers. Pour le développement, il devrait être simple de supprimer la dépendance à Cosmos DB et de simplement stocker les conversations en mémoire. Vous pouvez également configurer les paramètres du chatbot définis dans backend_server.py, par exemple pour utiliser un LLM différent ou ajouter/supprimer des étapes de WikiChat.
Après avoir créé une instance via Azure, obtenez la chaîne de connexion et ajoutez cette valeur dans API_KEYS.
COSMOS_CONNECTION_STRING=[Votre chaîne de connexion Cosmos DB]
L’exécution de cette opération démarrera les serveurs backend et front-end. Vous pouvez ensuite accéder au front-end sur le port spécifié (5001 par défaut).inv chainlit --backend-port 5001
Vous pouvez utiliser ce point de terminaison d'API pour prototyper des systèmes RAG de haute qualité. Voir https://wikichat.genie.stanford.edu/search/redoc pour les spécifications complètes.
Notez que nous ne fournissons aucune garantie concernant ce point de terminaison et qu’il n’est pas adapté à la production.
(À venir...)
Nous publions publiquement Wikipédia prétraité en 10 langues.
WikiChat 2.0 n'est pas compatible avec les points de contrôle LLaMA-2 affinés publiés. Veuillez vous référer à la v1.0 pour l'instant.
Pour évaluer un chatbot, vous pouvez simuler des conversations à l'aide d'un simulateur d'utilisateurs. Le paramètre de sous-ensemble peut être head, tail ou recent, correspondant aux trois sous-ensembles introduits dans l'article WikiChat. Vous pouvez également spécifier la langue de l'utilisateur (WikiChat répond toujours dans la langue de l'utilisateur). Ce script lit le sujet (c'est-à-dire un titre et un article Wikipédia) à partir du fichier benchmark/topics/{subset}_articles_{langue}.json correspondant. Utilisez --num-dialogues pour définir le nombre de dialogues simulés à générer, et --num-turns pour spécifier le nombre de tours dans chaque dialogue.
inv simuler-utilisateurs --num-dialogues 1 --num-tours 2 --simulation-mode passage --langue en --subset head
Selon le moteur que vous utilisez, cela peut prendre un certain temps. Les dialogues simulés et les fichiers journaux seront enregistrés dans benchmark/simulated_dialogues/. Vous pouvez également fournir n’importe lequel des paramètres de pipeline ci-dessus. Vous pouvez expérimenter différentes caractéristiques utilisateur en modifiant user_characteristics dans benchmark/user_simulator.py.
Le code WikiChat, ainsi que les modèles et les données, sont publiés sous licence Apache-2.0.
Si vous avez utilisé du code ou des données de ce référentiel, veuillez citer les articles suivants :
@inproceedings{semnani-etal-2023-wikichat,title = "{W}iki{C}hat : Arrêter l'hallucination des chatbots à grand modèle de langage grâce à une mise à la terre en quelques coups sur {W}ikipedia",author = "Semnani, Sina et Yao, Violet et Zhang, Heidi et Lam, Monica",éditeur = "Bouamor, Houda et Pino, Juan et Bali, Kalika",titre du livre = "Résultats de l'Association pour la linguistique computationnelle : EMNLP 2023",mois = décembre,année = "2023", adresse = "Singapour", éditeur = "Association pour la linguistique computationnelle", url = "https://aclanthology.org/2023.findings-emnlp.157", pages = "2387--2413", }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI} : Réponse aux questions en domaine ouvert à partir de sources de données hétérogènes avec récupération et analyse sémantique",author = "Zhang, Heidi et Semnani, Sina et Ghassemi, Farhad et Xu, Jialiang et Liu, Shicheng et Lam, Monica", éditeur = " Ku, Lun-Wei et Martins, Andre et Srikumar, Vivek ", titre du livre = " Résultats de l'Association pour la linguistique computationnelle ACL 2024 ", mois = août, année = "2024", adresse = "Bangkok, Thaïlande et réunion virtuelle", éditeur = "Association for Computational Linguistics", url = "https://aclanthology.org/2024.findings-acl.96", pages = "1663- -1678", }