Chatbots de modelo de linguagem grande (LLM), como ChatGPT e GPT-4, erram muito, especialmente se a informação que você procura for recente ("Conte-me sobre o Super Bowl de 2024.") ou sobre tópicos menos populares ("O que são alguns bons filmes para assistir de [insira seu diretor estrangeiro favorito]?"). O WikiChat usa a Wikipedia e o seguinte pipeline de 7 estágios para garantir que suas respostas sejam factuais. Cada estágio numerado envolve uma ou mais chamadas LLM.
Confira nosso artigo para mais detalhes: Sina J. Semnani, Violet Z. Yao*, Heidi C. Zhang* e Monica S. Lam. 2023. WikiChat: Acabando com a alucinação de chatbots de modelos de linguagem grande por Few-Shot Grounding na Wikipedia. Em Resultados da Association for Computational Linguistics: EMNLP 2023, Singapura. Associação de Lingüística Computacional.
(22 de agosto de 2024) WikiChat 2.0 já está disponível! As principais atualizações incluem:
Agora oferece suporte à recuperação de dados estruturados, como tabelas, infoboxes e listas, além de texto.
Possui scripts públicos de pré-processamento da Wikipédia da mais alta qualidade
Usa o modelo de recuperação multilíngue de última geração BGE-M3.
Usa Qdrant para pesquisa vetorial escalável.
Usa RankGPT para reclassificar os resultados da pesquisa.
Suporte multilíngue: Por padrão, recupera informações de 10 Wikipédias diferentes: ?? Inglês, ?? Chinês, ?? Espanhol, ?? Português, ?? Russo, ?? Alemão, ?? Persa, ?? Japonês, ?? Francês e ?? Italiano.
Recuperação de informações aprimorada
API de pesquisa multilíngue gratuita da Wikipédia: oferecemos uma API de pesquisa gratuita e de alta qualidade (mas com taxa limitada) para acesso a 10 Wikipédias, abrangendo mais de 180 milhões de incorporações de vetores.
Compatibilidade expandida com LLM: suporta mais de 100 LLMs por meio de uma interface unificada, graças ao LiteLLM.
Pipeline Otimizado: Opção para um pipeline mais rápido e econômico, mesclando os estágios "gerar" e "extrair reivindicação" do WikiChat.
Compatibilidade LangChain: Totalmente compatível com LangChain ?️?.
E muito mais!
(20 de junho de 2024) WikiChat ganhou o Prêmio de Pesquisa Wikimedia de 2024!
O Prêmio de Pesquisa do Ano de 2024 da @Wikimedia vai para "WikiChat: Acabando com a alucinação de chatbots de grandes modelos de linguagem com base em poucas tentativas na Wikipedia" ⚡
- Wiki Workshop 2024 (@wikiworkshop) 20 de junho de 2024
? https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(16 de maio de 2024) Nosso artigo de acompanhamento "? SPAGHETTI: Resposta a perguntas de domínio aberto de fontes de dados heterogêneas com recuperação e análise semântica" foi aceito nas descobertas do ACL 2024. Este artigo adiciona suporte para dados estruturados como tabelas, infoboxes e listas.
(8 de janeiro de 2024) São lançados modelos destilados LLaMA-2. Você pode executar esses modelos localmente para obter uma alternativa mais barata e rápida às APIs pagas.
(8 de dezembro de 2023) Apresentamos nosso trabalho no EMNLP 2023.
(27 de outubro de 2023) A versão pronta para câmera do nosso artigo já está disponível no arXiv.
(06 de outubro de 2023) Nosso artigo foi aceito nas conclusões do EMNLP 2023.
A instalação do WikiChat envolve as seguintes etapas:
Instalar dependências
Configure o LLM de sua escolha. WikiChat oferece suporte a mais de 100 LLMs, incluindo modelos de OpenAI, Azure, Anthropic, Mistral, HuggingFace, Together.ai e Groq.
Selecione uma fonte de recuperação de informações. Pode ser qualquer endpoint HTTP que esteja em conformidade com a interface definida em retrieval/retriever_server.py. Fornecemos instruções e scripts para as seguintes opções:
Use nossa API gratuita e com taxa limitada para Wikipedia em 10 idiomas.
Baixe e hospede você mesmo nosso índice da Wikipedia fornecido.
Crie e execute um novo índice personalizado a partir de seus próprios documentos.
Execute o WikiChat com a configuração desejada.
[Opcional] Implante o WikiChat para acesso multiusuário. Fornecemos código para implantar um front-end e um back-end simples, bem como instruções para se conectar a um banco de dados do Azure Cosmos DB para armazenar conversas.
Este projeto foi testado com Python 3.10 no Ubuntu 20.04 LTS (Focal Fossa), mas deve ser compatível com muitas outras distribuições Linux. Se você planeja usar isso no Windows WSL ou macOS, ou com uma versão diferente do Python, esteja preparado para possíveis soluções de problemas durante a instalação.
Os requisitos de hardware variam de acordo com o uso pretendido:
Uso básico: A execução do WikiChat com APIs LLM e nossa API de pesquisa da Wikipedia possui requisitos mínimos de hardware e deve funcionar na maioria dos sistemas.
Índice de pesquisa local: se você pretende hospedar um índice de pesquisa localmente, certifique-se de ter espaço em disco suficiente para o índice. Para índices grandes, a latência de recuperação depende muito da velocidade do disco, por isso recomendamos o uso de SSDs e, de preferência, unidades NVMe. Por exemplo, VMs otimizadas para armazenamento, como Standard_L8s_v3 no Azure, são adequadas para isso.
LLM local: se você planeja usar o WikiChat com um LLM local, é necessária uma GPU para hospedar o modelo.
Criando um novo índice de recuperação: Se quiser indexar uma coleção, você precisa de uma GPU para incorporar documentos a vetores. O modelo de incorporação padrão (BAAI/BGE-M3) requer pelo menos 13 GB de memória GPU para funcionar.
Primeiro, clone o repositório:
clone do git https://github.com/stanford-oval/WikiChat.git CD WikiChat
Recomendamos usar o ambiente conda especificado em conda_env.yaml. Este ambiente inclui Python 3.10, pip, gcc, g++, make, Redis e todos os pacotes Python necessários.
Certifique-se de ter Conda, Anaconda ou Miniconda instalado. Em seguida, crie e ative o ambiente conda:
conda env criar --file conda_env.yaml conda ativar wikichat python -m spacy download en_core_web_sm # Spacy só é necessário para certas configurações do WikiChat
Se você vir o erro: a pesquisa do Redis falhou após executar o chatbot, provavelmente significa que o Redis não está instalado corretamente. Você pode tentar reinstalá-lo seguindo a documentação oficial.
Mantenha este ambiente ativado para todos os comandos subsequentes.
Instale o Docker para o seu sistema operacional seguindo as instruções em https://docs.docker.com/engine/install/. O WikiChat usa Docker principalmente para criar e servir bancos de dados vetoriais para recuperação, especificamente ? Inferência de incorporação de texto e Qdrant. Nas versões recentes do Ubuntu, você pode tentar executar inv install-docker. Para outros sistemas operacionais, siga as instruções no site do docker.
O WikiChat usa invocar para adicionar comandos personalizados para diversos fins. Para ver todos os comandos disponíveis e suas descrições, execute:
invocar --lista
ou a abreviatura:
inv -l
Para obter mais detalhes sobre um comando específico, use:
inv [nome do comando] --help
Esses comandos são implementados na pasta tarefas/.
WikiChat é compatível com vários LLMs, incluindo modelos de OpenAI, Azure, Anthropic, Mistral, Together.ai e Groq. Você também pode usar o WikiChat com muitos modelos hospedados localmente via HuggingFace.
Para configurar seu LLM:
Preencha os campos apropriados em llm_config.yaml.
Crie um arquivo chamado API_KEYS (que está incluído em .gitignore).
No arquivo API_KEYS, configure a chave de API para o terminal LLM que você deseja usar. O nome da chave de API deve corresponder ao nome fornecido em llm_config.yaml em api_key. Por exemplo, se você estiver usando modelos OpenAI via openai.com e endpoints Mistral, seu arquivo API_KEYS pode ter esta aparência:
# Preencha os seguintes valores com suas chaves de API. Certifique-se de que não haja espaço extra após a chave.# As alterações neste arquivo são ignoradas pelo git, para que você possa armazenar suas chaves com segurança aqui durante o desenvolvimento.OPENAI_API_KEY=[Sua chave de API OpenAI de https://platform.openai.com/ chaves de API] MISTRAL_API_KEY=[Sua chave de API Mistral de https://console.mistral.ai/api-keys/]
Observe que os modelos hospedados localmente NÃO precisam de uma chave de API, mas você precisa fornecer um endpoint compatível com OpenAI em api_base. O código foi testado com ? Inferência de geração de texto.
Por padrão, o WikiChat recupera informações de 10 Wikipédias por meio do endpoint em https://wikichat.genie.stanford.edu/search/. Se você quiser apenas experimentar o WikiChat, não precisa modificar nada.
Baixe o índice de 1º de agosto de 2024 de 10 idiomas da Wikipedia em? Hub e extraia-o:
inv download-wikipedia-index --workdir ./workdir
Observe que este índice contém cerca de 180 milhões de embeddings de vetores e, portanto, requer pelo menos 500 GB de espaço vazio em disco. Ele usa a quantização binária do Qdrant para reduzir os requisitos de RAM para 55 GB sem sacrificar a precisão ou a latência.
Inicie um servidor FastAPI semelhante à opção 1 que responde a solicitações HTTP POST:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-port
Inicie o WikiChat passando a URL deste recuperador. Por exemplo:
inv demo --retriever-endpoint "http://0.0.0.0:/search"
Observe que este servidor e seu modelo de incorporação são executados em CPU e não requerem GPU. Para melhor desempenho, em sistemas compatíveis você pode adicionar --use-onnx para usar a versão ONNX do modelo de incorporação, para reduzir significativamente a latência de incorporação.
O comando a seguir irá baixar, pré-processar e indexar o dump HTML mais recente da Wikipedia curda, que usamos neste exemplo devido ao seu tamanho relativamente pequeno.
inv index-wikipedia-dump --embedding-model BAAI/bge-m3 --workdir ./workdir --linguagem ku
Pré-processe seus dados em um arquivo JSON Lines (com extensão de arquivo .jsonl ou .jsonl.gz), onde cada linha possui os seguintes campos:
{"id": "inteiro", "content_string": "string", "article_title": "string", "full_section_title": "string", "block_type": "string", "idioma": "string", " last_edit_date": "string (opcional)", "num_tokens": "inteiro (opcional)"}
content_string deve ser o texto fragmentado dos seus documentos. Recomendamos dividir para menos de 500 tokens do tokenizer do modelo de incorporação. Veja isto para obter uma visão geral sobre métodos de agrupamento.block_type e idioma são usados apenas para fornecer filtragem nos resultados da pesquisa. Se você não precisar deles, você pode simplesmente configurá-los para block_type=text e language=en. O script alimentará full_section_title e content_string no modelo de incorporação para criar vetores de incorporação.
Consulte preprocessing/preprocess_wikipedia_html_dump.py para obter detalhes sobre como isso é implementado para dumps HTML da Wikipedia.
Execute o comando de indexação:
inv index-collection --collection-path--collection-name
Este comando inicia contêineres docker para ? Inferência de incorporação de texto (uma por GPU disponível). Por padrão, ele usa a imagem docker compatível com GPUs NVIDIA com arquitetura Ampere 80, por exemplo, A100. O suporte para algumas outras GPUs também está disponível, mas você precisará escolher a imagem do docker correta entre as imagens do docker disponíveis.
(Opcional) Adicione um índice de carga útil
recuperação python/add_payload_index.py
Isso permitirá consultas que filtram por idioma ou tipo de bloco. Observe que, para índices grandes, pode levar vários minutos para que o índice fique disponível novamente.
Após a indexação, carregue e use o índice como na opção 2. Por exemplo:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-portcurl -X POST 0.0.0.0:5100/search -H "Tipo de conteúdo: aplicativo/json" -d '{" query": ["O que é GPT-4?", "O que é LLaMA-3?"], "num_blocks": 3}'
Inicie o WikiChat passando a URL deste recuperador. Por exemplo:
inv demo --retriever-endpoint "http://0.0.0.0:/search"
Divida o índice em partes menores:
tar -cvf -| porcoz -p 14 | split --bytes=10GB --numeric-suffixes=0 --suffix-length=4 - /qdrant_index.tar.gz.part-
Faça upload das partes resultantes:
python retrieval/upload_folder_to_hf_hub.py --folder_path--repo_id
Você pode executar diferentes configurações do WikiChat usando comandos como estes:
inv demo --engine gpt-4o # engine pode ser qualquer valor configurado em llm_config, por exemplo, mistral-large, claude-sonnet-35, local inv demo --pipeline generate_and_correct # pipelines disponíveis são early_combine, generate_and_correct e retrieve_and_generate inv demo --temperature 0.9 # altera a temperatura dos estágios voltados ao usuário, como refinamento
Para obter uma lista completa de todas as opções disponíveis, você pode executar inv demo --help
Este repositório fornece código para implantar uma interface de bate-papo baseada na web via Chainlit e armazenar conversas de usuários em um banco de dados Cosmos DB. Eles são implementados em backend_server.py e database.py respectivamente. Se quiser usar outros bancos de dados ou front-ends, será necessário modificar esses arquivos. Para o desenvolvimento, deve ser simples remover a dependência do Cosmos DB e simplesmente armazenar as conversas na memória. Você também pode configurar parâmetros do chatbot definidos em backend_server.py, por exemplo, para usar um LLM diferente ou adicionar/remover estágios do WikiChat.
Após criar uma instância via Azure, obtenha a string de conexão e adicione esse valor em API_KEYS.
COSMOS_CONNECTION_STRING=[Sua string de conexão do Cosmos DB]
Executar isso iniciará os servidores back-end e front-end. Você pode então acessar o front-end na porta especificada (5001 por padrão).inv chainlit --backend-port 5001
Você pode usar este endpoint de API para criar protótipos de sistemas RAG de alta qualidade. Consulte https://wikichat.genie.stanford.edu/search/redoc para obter as especificações completas.
Observe que não oferecemos nenhuma garantia sobre esse endpoint e ele não é adequado para produção.
(Em breve...)
Lançamos publicamente a Wikipédia pré-processada em 10 idiomas.
O WikiChat 2.0 não é compatível com os pontos de verificação LLaMA-2 ajustados lançados. Consulte v1.0 por enquanto.
Para avaliar um chatbot, você pode simular conversas usando um simulador de usuário. O parâmetro do subconjunto pode ser inicial, final ou recente, correspondendo aos três subconjuntos introduzidos no artigo do WikiChat. Você também pode especificar o idioma do usuário (o WikiChat sempre responde no idioma do usuário). Este script lê o tópico (ou seja, um título e artigo da Wikipedia) do arquivo benchmark/topics/{subset}_articles_{language}.json correspondente. Use --num-dialogues para definir o número de diálogos simulados a serem gerados e --num-turns para especificar o número de turnos em cada diálogo.
inv simular-usuários --num-dialogues 1 --num-turns 2 --passagem do modo de simulação --linguagem en --subset head
Dependendo do mecanismo que você está usando, isso pode levar algum tempo. Os diálogos simulados e arquivos de log serão salvos em benchmark/simulated_dialogues/. Você também pode fornecer qualquer um dos parâmetros de pipeline acima. Você pode experimentar diferentes características do usuário modificando user_characteristics em benchmark/user_simulator.py.
O código, modelos e dados do WikiChat são lançados sob a licença Apache-2.0.
Se você usou código ou dados deste repositório, cite os seguintes artigos:
@inproceedings{semnani-etal-2023-wikichat,title = "{W}iki{C}hat: Acabando com a alucinação de chatbots de modelos de linguagem grande por poucos tiros na {W}ikipedia",author = "Semnani, Sina e Yao, Violet e Zhang, Heidi e Lam, Monica",editor = "Bouamor, Houda e Pino, Juan e Bali, Kalika",título do livro = "Resultados da Associação de Lingüística Computacional: EMNLP 2023", mês = dezembro, ano = "2023", endereço = "Singapura", editor = "Associação de Linguística Computacional", url = "https://aclanthology.org/2023 .findings-emnlp.157",páginas = "2387--2413", }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI}: Resposta a perguntas de domínio aberto de fontes de dados heterogêneas com recuperação e análise semântica",author = "Zhang, Heidi e Semnani, Sina e Ghassemi, Farhad e Xu, Jialiang e Liu, Shicheng e Lam, Mônica",editor = "Ku, Lun-Wei e Martins, Andre e Srikumar, Vivek",booktitle = "Findings of the Association for Computational Linguistics ACL 2024",mês = agosto,ano = "2024",endereço = "Bangkok, Tailândia e reunião virtual",editor = "Associação de Lingüística Computacional",url = "https://aclanthology.org/2024.findings-acl.96",páginas = "1663--1678", }