Conversar com o ChatGPT é divertido e informativo – tenho conversado com ele no passado e explorado algumas idéias novas para aprender. Mas esses são casos de uso mais casual e a novidade pode desaparecer rapidamente, sobretudo quando o senhor percebe que pode gerar alucinações.
Como poderíamos usá-la de uma maneira mais produtiva? Com o recente lançamento do GPT série 3.5 API pela OpenAI, podemos fazer muito mais do que apenas conversa fiada. Um caso de uso muito produtivo para as empresas e seu uso pessoal é o QA (Question Answering) – o senhor pergunta ao bot em linguagem natural sobre seus próprios documentos/dados, e ele pode responder rapidamente ao senhor, recuperando informações dos documentos e gerando uma resposta [1]. O senhor pode usá-lo para apoio ao cliente, sintetizando pesquisas de usuários, sua gestão de conhecimentos pessoais, e muito mais!
Neste artigo, vou explorar como construir seu próprio Q&Um chatbot baseado em seus próprios dados, inclusive por que algumas abordagens não funcionam, e um guia passo a passo para construir um documento Q&Um chatbot de maneira eficiente com llama-index e GPT API.
(Se você só quer saber como construir o Q&Um chatbot, você pode pular diretamente para a seção “Construindo o documento Q&Um chatbot passo a passo”)
Meu trabalho diário é como gerente de produto – ler o feedback dos clientes e os documentos internos toma uma grande parte da minha vida. Quando o ChatGPT saiu, pensei imediatamente na idéia de usá-lo como um assistente para me ajudar a sintetizar o feedback do cliente ou encontrar documentos antigos relacionados a produtos sobre a característica em que estou trabalhando.
Primeiro pensei em afinar o modelo do GPT com meus próprios dados para alcançar o objetivo. Mas o aperfeiçoamento custa bastante dinheiro e requer um grande conjunto de dados com exemplos. Também é impossível afinar cada vez que há uma mudança no documento. Um ponto ainda mais crucial é que o refinamento simplesmente não pode deixar o modelo “conhecer” todas as informações contidas nos documentos, mas sim ensinar ao modelo uma nova habilidade. Portanto, para a GQ (multi)documento, o refinamento não é o caminho a seguir.
A segunda abordagem que me vem à mente é uma engenharia rápida, fornecendo o contexto nos pedidos. Por exemplo, em vez de fazer a pergunta diretamente, posso anexar o conteúdo do documento original antes da pergunta propriamente dita. Mas o modelo do GPT tem uma atenção limitada – ele só pode receber alguns milhares de palavras no pedido (cerca de 4000 fichas ou 3000 palavras). É impossível dar-lhe todo o contexto no prontuário, desde que tenhamos milhares de e-mails de feedback de clientes e centenas de documentos de produtos. Também é caro se o senhor passar em um contexto longo ao API, porque o preço se baseia no número de fichas que o senhor usa.
I will ask you questions based on the following context:
— Start of Context —YOUR DOCUMENT CONTENT
— End of Context—
My question is: “What features do users want to see in the app?”
(Se o senhor quiser saber mais sobre afinação e engenharia rápida para o GPT, pode ler o artigo: https://medium.com/design-bootcamp/3-ways-to-tailor-foundation-language-models-like-gpt-for-your-business-e68530a763bd)
Como a urgência tem limitações no número de fichas de entrada, tive a idéia de primeiro usar um algoritmo para pesquisar os documentos e escolher os trechos relevantes e depois passar apenas esses contextos relevantes para o modelo GPT com minhas perguntas. Enquanto estava pesquisando essa idéia, encontrei uma biblioteca chamada gpt-index (agora renomeada para LlamaIndex), que faz exatamente o que eu queria fazer e é simples de usar. [2].
Na próxima seção, vou dar um tutorial passo a passo sobre o uso do LlamaIndex e do GPT para construir um Q& um chatbot sobre seus próprios dados.
Nesta seção, construiremos um chatbot baseado em documentos existentes com o LlamaIndex e o GPT (text-davinci-003), para que o senhor possa fazer perguntas sobre seu documento e obter uma resposta do chatbot, tudo em linguagem natural.
Pré-requisitos
Antes de iniciarmos o tutorial, precisamos preparar algumas coisas:
- Sua chave API OpenAI, que pode ser encontrada em https://platform.openai.com/account/api-keys.
- Uma base de dados de seus documentos. A LlamaIndex apoia muitas fontes de dados diferentes, como Notion, Google Docs, Asana, etc. [3]. Para este tutorial, usaremos apenas um simples arquivo de texto para demonstração.
- Um ambiente Python local ou um ambiente online Caderno de notas do Google Colab.
Fluxo de trabalho
O fluxo de trabalho é simples e dá apenas alguns passos:
- Construa um índice dos dados de seus documentos com o LlamaIndex
- Consultar o índice com linguagem natural
- A LlamaIndex recuperará as partes relevantes e as entregará ao GPT imediatamente.
- Pergunte ao GPT com o contexto relevante e construa uma resposta
O que a LlamaIndex faz é converter seus dados originais de documentos em um índice vetorizado, que é muito eficiente de ser consultado. Ele usará esse índice para encontrar as partes mais relevantes, com base na semelhança entre a consulta e os dados. Em seguida, ligará o que for recuperado no prompt que enviará ao GPT para que o GPT tenha o contexto para responder à sua pergunta.
Instalação
Primeiro teremos de instalar as bibliotecas. Basta executar o seguinte comando em seu terminal ou no caderno de anotações do Google Colab. Esses comandos irão instalar tanto o LlamaIndex quanto o OpenAI.
!pip install llama-index
!pip install openai
Em seguida, vamos importar as bibliotecas em python e instalar sua chave API OpenAI num novo arquivo .py.
# Import necessary packages
from llama_index import GPTSimpleVectorIndex, Document, SimpleDirectoryReader
import osos.environ['OPENAI_API_KEY'] = 'sk-YOUR-API-KEY'
Construção do índice e sua economia
Depois de instalarmos as bibliotecas necessárias e de importá-las, precisaremos construir um índice do seu documento.
Para carregar seu documento, o senhor pode usar o método SimpleDirectoryReader fornecido pela LllamaIndex ou pode carregá-lo a partir de cordas.
# Loading from a directory
documents = SimpleDirectoryReader('your_directory').load_data()
# Loading from strings, assuming you saved your data to strings text1, text2, ...
text_list = [text1, text2, ...]
documents = [Document