Los chatbots de modelo de lenguaje grande (LLM) como ChatGPT y GPT-4 se equivocan mucho, especialmente si la información que busca es reciente ("Cuénteme sobre el Super Bowl 2024") o sobre temas menos populares ("¿Qué son? ¿Algunas buenas películas para ver de [inserte su director extranjero favorito]?"). WikiChat utiliza Wikipedia y el siguiente proceso de 7 etapas para asegurarse de que sus respuestas sean objetivas. Cada etapa numerada implica una o más convocatorias de LLM.
Consulte nuestro artículo para obtener más detalles: Sina J. Semnani, Violet Z. Yao*, Heidi C. Zhang* y Monica S. Lam. 2023. WikiChat: Detener la alucinación de los chatbots de modelos de lenguaje grandes mediante una conexión a tierra de pocos disparos en Wikipedia. En Hallazgos de la Asociación de Lingüística Computacional: EMNLP 2023, Singapur. Asociación de Lingüística Computacional.
(22 de agosto de 2024) ¡WikiChat 2.0 ya está disponible! Las actualizaciones clave incluyen:
Ahora admite la recuperación de datos estructurados como tablas, cuadros de información y listas, además de texto.
Tiene scripts de preprocesamiento públicos de Wikipedia de la más alta calidad.
Utiliza el modelo de recuperación multilingüe BGE-M3 de última generación.
Utiliza Qdrant para búsqueda vectorial escalable.
Utiliza RankGPT para reclasificar los resultados de búsqueda.
Soporte multilingüe: de forma predeterminada, recupera información de 10 Wikipedias diferentes: ?? Inglés, ?? Chino, ?? Español, ?? portugués, ?? Ruso, ?? Alemán, ?? Farsi, ?? Japonés, ?? Francés, y ?? Italiano.
Recuperación de información mejorada
API de búsqueda de Wikipedia multilingüe gratuita: ofrecemos una API de búsqueda gratuita (pero de velocidad limitada) de alta calidad para acceder a 10 Wikipedias, que abarcan más de 180 millones de incrustaciones de vectores.
Compatibilidad ampliada con LLM: admite más de 100 LLM a través de una interfaz unificada, gracias a LiteLLM.
Canalización optimizada: opción para una canalización más rápida y rentable al fusionar las etapas "generar" y "extraer reclamo" de WikiChat.
Compatibilidad LangChain: Totalmente compatible con LangChain ?️?.
¡Y mucho más!
(20 de junio de 2024) ¡WikiChat ganó el Premio de Investigación Wikimedia 2024!
El Premio de Investigación del Año 2024 de @Wikimedia es para "WikiChat: Detener la alucinación de grandes chatbots modelo lingüísticos mediante una conexión a tierra de unos pocos disparos en Wikipedia" ⚡
– Taller Wiki 2024 (@wikiworkshop) 20 de junio de 2024
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(16 de mayo de 2024) Nuestro documento de seguimiento "? SPAGHETTI: Respuesta a preguntas de dominio abierto a partir de fuentes de datos heterogéneas con recuperación y análisis semántico" se acepta en los hallazgos de ACL 2024. Este documento agrega soporte para datos estructurados como tablas y cuadros de información. y listas.
(8 de enero de 2024) Se lanzan los modelos destilados LLaMA-2. Puede ejecutar estos modelos localmente para obtener una alternativa más económica y rápida a las API pagas.
(8 de diciembre de 2023) Presentamos nuestro trabajo en EMNLP 2023.
(27 de octubre de 2023) La versión lista para cámara de nuestro artículo ya está disponible en arXiv.
(6 de octubre de 2023) Nuestro artículo es aceptado en los hallazgos de EMNLP 2023.
La instalación de WikiChat implica los siguientes pasos:
Instalar dependencias
Configure el LLM de su elección. WikiChat admite más de 100 LLM, incluidos modelos de OpenAI, Azure, Anthropic, Mistral, HuggingFace, Together.ai y Groq.
Seleccione una fuente de recuperación de información. Puede ser cualquier punto final HTTP que se ajuste a la interfaz definida en retrieval/retriever_server.py. Proporcionamos instrucciones y scripts para las siguientes opciones:
Utilice nuestra API gratuita y de velocidad limitada para Wikipedia en 10 idiomas.
Descargue y aloje usted mismo nuestro índice de Wikipedia proporcionado.
Cree y ejecute un nuevo índice personalizado a partir de sus propios documentos.
Ejecute WikiChat con la configuración que desee.
[Opcional] Implemente WikiChat para acceso multiusuario. Proporcionamos código para implementar un front-end y un backend simples, así como instrucciones para conectarse a una base de datos de Azure Cosmos DB para almacenar conversaciones.
Este proyecto ha sido probado con Python 3.10 en Ubuntu 20.04 LTS (Focal Fossa), pero debería ser compatible con muchas otras distribuciones de Linux. Si planeas usar esto en Windows WSL o macOS, o con una versión diferente de Python, prepárate para posibles soluciones de problemas durante la instalación.
Los requisitos de hardware varían según el uso previsto:
Uso básico: ejecutar WikiChat con API de LLM y nuestra API de búsqueda de Wikipedia tiene requisitos mínimos de hardware y debería funcionar en la mayoría de los sistemas.
Índice de búsqueda local: si desea alojar un índice de búsqueda localmente, asegúrese de tener suficiente espacio en disco para el índice. Para índices grandes, la latencia de recuperación depende en gran medida de la velocidad del disco, por lo que recomendamos utilizar SSD y preferiblemente unidades NVMe. Por ejemplo, las máquinas virtuales optimizadas para almacenamiento como Standard_L8s_v3 en Azure son adecuadas para esto.
LLM local: si planea utilizar WikiChat con un LLM local, es necesaria una GPU para alojar el modelo.
Creación de un nuevo índice de recuperación: si desea indexar una colección, necesita una GPU para incrustar documentos en vectores. El modelo de integración predeterminado (BAAI/BGE-M3) requiere al menos 13 GB de memoria GPU para ejecutarse.
Primero, clona el repositorio:
clon de git https://github.com/stanford-oval/WikiChat.git cd WikiChat
Recomendamos utilizar el entorno conda especificado en conda_env.yaml. Este entorno incluye Python 3.10, pip, gcc, g++, make, Redis y todos los paquetes de Python necesarios.
Asegúrese de tener instalado Conda, Anaconda o Miniconda. Luego crea y activa el entorno conda:
conda env crear --archivo conda_env.yaml conda activar wikichat python -m spacy download en_core_web_sm # Spacy solo es necesario para ciertas configuraciones de WikiChat
Si ve el error: Error en la búsqueda de Redis después de ejecutar el chatbot, probablemente significa que Redis no está instalado correctamente. Puedes intentar reinstalarlo siguiendo su documentación oficial.
Mantenga este entorno activado para todos los comandos posteriores.
Instale Docker para su sistema operativo siguiendo las instrucciones en https://docs.docker.com/engine/install/. WikiChat utiliza Docker principalmente para crear y servir bases de datos vectoriales para su recuperación, específicamente? Inferencia de incrustación de texto y Qdrant. En versiones recientes de Ubuntu, puedes intentar ejecutar inv install-docker. Para otros sistemas operativos, siga las instrucciones del sitio web de Docker.
WikiChat usa invoke para agregar comandos personalizados para diversos propósitos. Para ver todos los comandos disponibles y sus descripciones, ejecute:
invocar --lista
o la taquigrafía:
inv-l
Para obtener más detalles sobre un comando específico, utilice:
inv [nombre del comando] --ayuda
Estos comandos se implementan en la carpeta tareas/.
WikiChat es compatible con varios LLM, incluidos modelos de OpenAI, Azure, Anthropic, Mistral, Together.ai y Groq. También puedes usar WikiChat con muchos modelos alojados localmente a través de HuggingFace.
Para configurar su LLM:
Complete los campos correspondientes en llm_config.yaml.
Cree un archivo llamado API_KEYS (que está incluido en .gitignore).
En el archivo API_KEYS, configure la clave API para el punto final de LLM que desea utilizar. El nombre de la clave API debe coincidir con el nombre que proporcionó en llm_config.yaml en api_key. Por ejemplo, si está utilizando modelos OpenAI a través de openai.com y puntos finales Mistral, su archivo API_KEYS podría verse así:
# Complete los siguientes valores con sus claves API. Asegúrese de que no haya espacio adicional después de la clave.# Git ignora los cambios realizados en este archivo, por lo que puede almacenar sus claves aquí de forma segura durante el desarrollo.OPENAI_API_KEY=[Su clave API de OpenAI de https://platform.openai.com/ claves de API] MISTRAL_API_KEY=[Su clave API Mistral de https://console.mistral.ai/api-keys/]
Tenga en cuenta que los modelos alojados localmente NO necesitan una clave API, pero debe proporcionar un punto final compatible con OpenAI en api_base. El código ha sido probado con ? Inferencia de generación de texto.
De forma predeterminada, WikiChat recupera información de 10 Wikipedias a través del punto final en https://wikichat.genie.stanford.edu/search/. Si solo quieres probar WikiChat, no necesitas modificar nada.
Descargue el índice del 1 de agosto de 2024 de 10 idiomas de Wikipedia desde ? Hub y extráigalo:
inv descargar-wikipedia-index --workdir ./workdir
Tenga en cuenta que este índice contiene aproximadamente 180 millones de incrustaciones de vectores y, por lo tanto, requiere al menos 500 GB de espacio vacío en el disco. Utiliza la cuantificación binaria de Qdrant para reducir los requisitos de RAM a 55 GB sin sacrificar la precisión ni la latencia.
Inicie un servidor FastAPI similar a la opción 1 que responda a las solicitudes HTTP POST:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port
Inicie WikiChat pasando la URL de este recuperador. Por ejemplo:
demostración de inv --retriever-endpoint "http://0.0.0.0:/búsqueda"
Tenga en cuenta que este servidor y su modelo integrado se ejecutan en CPU y no requieren GPU. Para obtener un mejor rendimiento, en sistemas compatibles puede agregar --use-onnx para usar la versión ONNX del modelo de incorporación, para reducir significativamente la latencia de incorporación.
El siguiente comando descargará, preprocesará e indexará el último volcado HTML de la Wikipedia kurda, que utilizamos en este ejemplo por su tamaño relativamente pequeño.
inv index-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir --language ku
Preprocese sus datos en un archivo de líneas JSON (con extensión de archivo .jsonl o .jsonl.gz) donde cada línea tiene los siguientes campos:
{"id": "entero", "content_string": "string", "article_title": "string", "full_section_title": "string", "block_type": "string", "language": "string", " last_edit_date": "cadena (opcional)", "num_tokens": "entero (opcional)"}
content_string debe ser el texto fragmentado de sus documentos. Recomendamos fragmentar a menos de 500 tokens del tokenizador del modelo integrado. Consulte esto para obtener una descripción general de los métodos de fragmentación. block_type y language solo se utilizan para proporcionar filtrado en los resultados de búsqueda. Si no los necesita, simplemente puede configurarlos en block_type=text y language=en. El script alimentará full_section_title y content_string al modelo de incrustación para crear vectores de incrustación.
Consulte preprocessing/preprocess_wikipedia_html_dump.py para obtener detalles sobre cómo se implementa esto para los volcados de HTML de Wikipedia.
Ejecute el comando de indexación:
inv index-collection --collection-path--collection-name
¿Este comando inicia los contenedores acoplables para? Inferencia de incrustación de texto (una por GPU disponible). De forma predeterminada, utiliza la imagen de la ventana acoplable compatible con las GPU NVIDIA con arquitectura Ampere 80, por ejemplo, A100. También está disponible la compatibilidad con algunas otras GPU, pero deberá elegir la imagen de la ventana acoplable correcta entre las imágenes de la ventana acoplable disponibles.
(Opcional) Agregar un índice de carga útil
recuperación de Python/add_payload_index.py
Esto permitirá consultas que filtren por idioma o tipo de bloque. Tenga en cuenta que, en el caso de índices grandes, es posible que el índice tarde varios minutos en volver a estar disponible.
Después de indexar, cargue y use el índice como en la opción 2. Por ejemplo:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-portcurl -X POST 0.0.0.0:5100/search -H "Tipo de contenido: aplicación/json" -d '{" query": ["¿Qué es GPT-4?", "¿Qué es LLaMA-3?"], "num_blocks": 3}'
Inicie WikiChat pasando la URL de este recuperador. Por ejemplo:
demostración de inv --retriever-endpoint "http://0.0.0.0:/búsqueda"
Divida el índice en partes más pequeñas:
tar -cvf -| cerdo -p 14 | split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - /qdrant_index.tar.gz.part-
Sube las partes resultantes:
python retrieval/upload_folder_to_hf_hub.py --folder_path--repo_id <¿ID de repositorio activado? Centro>
Puedes ejecutar diferentes configuraciones de WikiChat usando comandos como estos:
inv demo --engine gpt-4o # el motor puede tener cualquier valor configurado en llm_config, por ejemplo, mistral-large, claude-sonnet-35, local demostración de inv --pipeline generate_and_correct # las canalizaciones disponibles son early_combine, generate_and_correct y retrieve_and_generate inv demo --temperature 0.9 # cambia la temperatura de las etapas orientadas al usuario como refinamiento
Para obtener una lista completa de todas las opciones disponibles, puede ejecutar inv demo --help
Este repositorio proporciona código para implementar una interfaz de chat basada en web a través de Chainlit y almacenar conversaciones de usuarios en una base de datos Cosmos DB. Estos se implementan en backend_server.py y base de datos.py respectivamente. Si desea utilizar otras bases de datos o interfaces, debe modificar estos archivos. Para el desarrollo, debería ser sencillo eliminar la dependencia de Cosmos DB y simplemente almacenar las conversaciones en la memoria. También puede configurar los parámetros del chatbot definidos en backend_server.py, por ejemplo, para usar un LLM diferente o agregar/eliminar etapas de WikiChat.
Después de crear una instancia a través de Azure, obtenga la cadena de conexión y agregue este valor en API_KEYS.
COSMOS_CONNECTION_STRING=[Su cadena de conexión de Cosmos DB]
Al ejecutar esto, se iniciarán los servidores backend y front-end. Luego puede acceder al front-end en el puerto especificado (5001 por defecto).inv chainlit --backend-port 5001
Puede utilizar este punto final API para crear prototipos de sistemas RAG de alta calidad. Consulte https://wikichat.genie.stanford.edu/search/redoc para obtener la especificación completa.
Tenga en cuenta que no ofrecemos ninguna garantía sobre este punto final y no es apto para producción.
(Muy pronto...)
Publicamos públicamente Wikipedia preprocesada en 10 idiomas.
WikiChat 2.0 no es compatible con los puntos de control LLaMA-2 ajustados publicados. Consulte la versión 1.0 por ahora.
Para evaluar un chatbot, puedes simular conversaciones utilizando un simulador de usuario. El parámetro de subconjunto puede ser inicial, final o reciente, correspondiente a los tres subconjuntos presentados en el documento de WikiChat. También puedes especificar el idioma del usuario (WikiChat siempre responde en el idioma del usuario). Este script lee el tema (es decir, un título y artículo de Wikipedia) del archivo benchmark/topics/{subset}_articles_{language}.json correspondiente. Utilice --num-dialogues para establecer el número de diálogos simulados a generar y --num-turns para especificar el número de turnos en cada diálogo.
inv simular-usuarios --num-dialogues 1 --num-turns 2 --pasaje en modo de simulación --language es --subset head
Dependiendo del motor que esté utilizando, esto puede llevar algún tiempo. Los diálogos simulados y los archivos de registro se guardarán en benchmark/simulated_dialogues/. También puede proporcionar cualquiera de los parámetros de canalización anteriores. Puede experimentar con diferentes características de usuario modificando user_characteristics en benchmark/user_simulator.py.
El código, los modelos y los datos de WikiChat se publican bajo la licencia Apache-2.0.
Si ha utilizado código o datos de este repositorio, cite los siguientes artículos:
@inproceedings{semnani-etal-2023-wikichat,title = "{W}iki{C}hat: Detener las alucinaciones de los chatbots de modelos de lenguaje grandes mediante Few-Shot Grounding en {W}ikipedia",author = "Semnani, Sina y Yao, Violet y Zhang, Heidi y Lam, Monica",editor = "Bouamor, Houda y Pino, Juan y Bali, Kalika",booktitle = "Hallazgos de la Asociación de Lingüística Computacional: EMNLP 2023",mes = diciembre,año = "2023",address = "Singapur",publisher = "Asociación de Lingüística Computacional",url = "https://aclanthology.org/2023.findings-emnlp.157",pages = "2387--2413", }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI}: Respuesta a preguntas de dominio abierto a partir de fuentes de datos heterogéneas con recuperación y análisis semántico",author = "Zhang, Heidi y Semnani, Sina y Ghassemi, Farhad y Xu, Jialiang y Liu, Shicheng y Lam, Monica",editor = "Ku, Lun-Wei y Martins, Andre y Srikumar, Vivek",booktitle = "Hallazgos de la Asociación de Lingüística Computacional ACL 2024",mes = agosto,año = "2024",address = "Bangkok, Tailandia y reunión virtual",publisher = "Asociación de Lingüística Computacional",url = "https://aclanthology.org/2024.findings-acl.96",pages = "1663- -1678", }