🤖 Introdução ao Chatbot Auto-Resposta
O Chatbot Auto-Resposta é uma ferramenta poderosa que pode ajudar a automatizar respostas a perguntas frequentes, melhorar a experiência do usuário e reduzir a sobrecarga de trabalho para os profissionais de suporte. No entanto, a maioria dos tutoriais de chatbot pararam em exemplos simples e não abordam as necessidades de um sistema de produção. Neste artigo, vamos explorar como criar um Chatbot Auto-Resposta de produção usando FastAPI, OpenAI e Hybrid Retrieval.
Problema que o Chatbot Auto-Resposta resolve
Se você está construindo um sistema de suporte ao cliente, um sistema de triagem de tickets ou um assistente de conhecimento, provavelmente está procurando por uma solução que possa:
* Responder a perguntas frequentes de forma rápida e eficiente
* Reduzir a sobrecarga de trabalho para os profissionais de suporte
* Melhorar a experiência do usuário com respostas precisas e relevantes
O Chatbot Auto-Resposta pode ajudar a resolver esses problemas, mas é importante ter em mente que não é apenas uma questão de chamar uma API de chatbot e esperar que tudo funcione. É necessário pensar em uma arquitetura de produção, com camadas claras e separadas, para garantir que o sistema seja escalável, testável e confiável.
Por que este repositório é diferente
O repositório open-source que vamos explorar é diferente dos tutoriais comuns de chatbot porque aborda as necessidades de um sistema de produção. Ele separa as camadas de forma clara, com uma API de FastAPI, um serviço de resposta, um serviço de busca e um gateway de LLM. Além disso, ele inclui uma estrutura de pastas limpa e uma arquitetura de código que é fácil de entender e manter.
Repositório open-source
O repositório open-source que vamos explorar é o auto-reply-chatbot. Ele inclui todos os códigos e arquivos necessários para criar um Chatbot Auto-Resposta de produção. Além disso, ele inclui uma documentação detalhada e exemplos de uso para ajudar a entender como funciona.
Conclusão
O Chatbot Auto-Resposta é uma ferramenta poderosa que pode ajudar a automatizar respostas a perguntas frequentes e melhorar a experiência do usuário. No entanto, é importante ter em mente que não é apenas uma questão de chamar uma API de chatbot e esperar que tudo funcione. É necessário pensar em uma arquitetura de produção, com camadas claras e separadas, para garantir que o sistema seja escalável, testável e confiável. O repositório open-source que vamos explorar é uma excelente opção para criar um Chatbot Auto-Resposta de produção.
🏗 Arquitetura do Chatbot
O chatbot auto-resposta é projetado com uma arquitetura de camadas limpa, que inclui:
API (FastAPI)
A API é a camada de entrada do sistema, responsável por receber as solicitações do usuário e encaminhá-las para a próxima camada.
# app/api/routes/conversations.py
from fastapi import APIRouter
router = APIRouter()
AnswerService
O AnswerService é responsável por gerar respostas para as solicitações do usuário. Ele recebe as solicitações da API e as encaminha para a próxima camada.
# app/services/answer_service.py
from typing import Dict
class AnswerService:
def get_answer(self, user_query: str) -> Dict:
# Implementação da lógica de resposta
pass
RetrievalService
O RetrievalService é responsável por recuperar informações relevantes para as solicitações do usuário. Ele recebe as solicitações da AnswerService e as encaminha para a próxima camada.
# app/services/retrieval.py
from typing import Dict
class RetrievalService:
def get_relevant_info(self, user_query: str) -> Dict:
# Implementação da lógica de recuperação de informações
pass
LLM Gateway
O LLM Gateway é responsável por encapsular a lógica de comunicação com o modelo de linguagem. Ele recebe as solicitações da RetrievalService e as encaminha para o modelo de linguagem.
# app/services/llm_gateway.py
from typing import Dict
class LLMGateway:
def get_response(self, user_query: str) -> Dict:
# Implementação da lógica de comunicação com o modelo de linguagem
pass
A arquitetura de camadas limpa permite que o sistema seja:
- Testável: Cada camada pode ser testada isoladamente.
- Escalável: Cada camada pode ser escalada independentemente.
- Produtivo: A arquitetura de camadas limpa permite que o sistema seja implantado em produção com confiança.
📂 Estrutura do Projeto
A estrutura do projeto é dividida em várias pastas e arquivos principais, cada um com uma responsabilidade específica. Isso inclui:
📁 app
*
📁 api
+
📁 routes
–
conversations.py
*
📁 services
+
answer_service.py
+
retrieval.py
+
ingestion.py
+
llm_gateway.py
*
📁 search
+
embeddings.py
*
📁 main.py
A estrutura acima separa a lógica de negócios, regras de negócios, lógica de recuperação e abstração do provedor de LLM em pastas e arquivos específicos. Isso permite uma melhor organização e manutenção do código, além de facilitar a adição de novas funcionalidades e a substituição de dependências.
app/
├── api/
│ └── routes/
│ └── conversations.py
├── services/
│ ├── answer_service.py
│ ├── retrieval.py
│ ├── ingestion.py
│ └── llm_gateway.py
├── search/
│ └── embeddings.py
└── main.py
🧠 Camada de LLM e Padrão de Gateway
Padrão de Gateway
Em vez de chamar a OpenAI diretamente em todo lugar:
openai.chat.completions.create(...)
Nós o envolvemos em:
llm_gateway.chat(...)
Isso é feito para evitar o bloqueio de fornecedores e permitir a mudança de modelos ou provedores de LLM. Com o padrão de gateway, podemos:
* Mudar de modelo de LLM sem afetar o resto do sistema
* Trocar de provedor de LLM sem alterar o código
* Adicionar logging e políticas de retry
* Medir o custo de tokens
* Implementar outras funcionalidades sem afetar a lógica de negócios
Benefícios do Padrão de Gateway
O padrão de gateway oferece vários benefícios, incluindo:
* Flexibilidade: permite mudanças de modelo ou provedor de LLM sem afetar o resto do sistema
* Escalabilidade: permite adicionar funcionalidades sem afetar a lógica de negócios
* Manutenção: permite adicionar logging e políticas de retry sem afetar o sistema
* Economia: permite medir o custo de tokens e otimizar o uso de recursos
Implementação do Padrão de Gateway
A implementação do padrão de gateway envolve criar uma camada de gateway que encapsula a lógica de chamada à OpenAI. Isso pode ser feito criando uma classe que implementa a interface do LLM e que chama a OpenAI por trás das cenas.
class LLMGateway:
def chat(self, input_text):
# Chamada à OpenAI
response = openai.chat.completions.create(input_text)
return response
Agora, em vez de chamar a OpenAI diretamente, podemos chamar o gateway:
gateway = LLMGateway()
response = gateway.chat(input_text)
Isso permite mudanças de modelo ou provedor de LLM sem afetar o resto do sistema.
📊 Recuperação e Embeddings
Fluxo de Ingestão de Documentos
O sistema utiliza o modelo text-embedding-3-small para gerar embeddings de documentos. O fluxo de ingestão de documentos é o seguinte:
# Ingestão de documentos
def ingest_documento(documento):
# Gerar embeddings do documento
embeddings = modelo.gerar_embedding(documento)
# Armazenar os embeddings em um banco de dados
armazenar_embeddings(embeddings)
Fluxo de Recuperação de Respostas
O sistema utiliza o modelo text-embedding-3-small para gerar embeddings de perguntas e respostas. O fluxo de recuperação de respostas é o seguinte:
# Recuperação de respostas
def recuperar_resposta(pergunta):
# Gerar embeddings da pergunta
embeddings_pergunta = modelo.gerar_embedding(pergunta)
# Buscar respostas com embeddings semelhantes
respostas = buscar_respostas(embeddings_pergunta)
# Retornar a resposta mais relevante
return respostas[0]
Criação de uma Base Sólida para um Sistema de RAG
A combinação dos fluxos de ingestão de documentos e recuperação de respostas cria uma base sólida para um sistema de RAG. O sistema pode ser facilmente escalado e personalizado para atender às necessidades específicas de cada aplicação. Além disso, a utilização de embeddings permite que o sistema seja mais eficiente e eficaz na recuperação de respostas relevantes.
Fonte de Referência: dev.to.
Curadoria e Adaptação: Redação Yassutaro Developers.