
Como funciona um bot RAG moderno
Um bom pipeline RAG é mais do que “colocar documentos em uma base de dados vetorial”. O fluxo básico é assim:| Passo | O que acontece |
|---|---|
| Load | Lê arquivos locais em Markdown, texto ou reStructuredText |
| Chunk | Divide documentos longos em seções sobrepostas |
| Embed | Usa embeddings da Venice para transformar chunks em vetores |
| Store | Salva vetores e metadados de origem no Qdrant |
| Retrieve | Faz embedding da pergunta do usuário e executa busca vetorial |
| Re-rank | Usa um cross-encoder para repontuar os melhores candidatos |
| Answer | Envia o melhor contexto a um modelo de chat Venice com instruções de citação |
Instalando as dependências
Usaremos o SDK Python da OpenAI porque a Venice expõe uma API compatível com OpenAI. Também usaremos o cliente Python do Qdrant com suporte a FastEmbed:requirements.txt com os mesmos pacotes:
Escolhendo os modelos
Crie um arquivo chamadorag_bot.py e comece adicionando os imports, estruturas de dados, URL da API e nomes dos modelos:
base_url e a chave de API.
Você pode listar os modelos Venice disponíveis com:
Criando os clientes Venice e Qdrant
Crie um cliente Venice compatível com OpenAI para embeddings e chat completions:| Modo | Quando usá-lo |
|---|---|
QdrantClient(":memory:") | Demos e testes locais rápidos |
QdrantClient(path="./qdrant_data") | Armazenamento local persistente |
QdrantClient(url=..., api_key=...) | Um cluster Qdrant remoto ou gerenciado |
Carregando e dividindo documentos em chunks
Para este tutorial, deixaremos o bot ingerir arquivos ou pastas locais. Comece com arquivos.md, .rst e .txt:
1000 caracteres com 150 caracteres de overlap é um bom padrão para documentos mistos de Markdown e texto. Chunks menores podem melhorar a precisão. Chunks maiores podem preservar mais contexto. A configuração certa frequentemente depende dos tipos de documentos que você está armazenando.
Fazendo embedding de documentos com a Venice
Quando temos os chunks, fazemos o embedding em lotes:Armazenando vetores no Qdrant
Antes de inserir pontos, crie uma coleção Qdrant com o tamanho de vetor correto. A maneira mais fácil de saber o tamanho do vetor é fazer o embedding do primeiro batch e depois usarlen(embeddings[0]).
source, chunk_index e conteúdo. Isso torna a ingestão repetida idempotente para chunks inalterados.
Recuperando chunks candidatos
No momento da pergunta, o bot faz embedding da pergunta do usuário e pede ao Qdrant as melhores correspondências vetoriais:limit aqui é o número de candidatos. Geralmente deve ser maior que o número de chunks que você planeja enviar ao modelo, porque o próximo passo vai re-rankeá-los. Um bom padrão é recuperar 8 candidatos e enviar os 4 melhores ao modelo de chat.
Re-ranking com FastEmbed
Agora adicionamos a parte que faz a recuperação parecer muito mais inteligente.- Recuperar um conjunto maior de candidatos com busca vetorial.
- Re-rankear apenas esses candidatos localmente.
- Enviar os poucos chunks de topo ao modelo de linguagem.
candidate_k=8 e top_k=4. Aumente candidate_k se a fonte certa frequentemente está próxima mas não está chegando ao contexto final.
Respondendo com chat completions da Venice
Quando o contexto é selecionado, formate-o com números de origem:Executando o bot
Quando você montar as peças em um script, salve comorag_bot.py. Uma primeira execução simples pode usar alguns documentos de amostra integrados para que você verifique o pipeline antes de ingerir seus próprios arquivos:
Opções úteis de CLI
Exponha os principais knobs de recuperação como opções de CLI para poder ajustar o bot sem editar código:| Opção | Padrão | O que controla |
|---|---|---|
--candidate-k | 8 | Número de resultados de busca vetorial para re-rankear |
--top-k | 4 | Número de chunks re-rankeados enviados ao modelo de chat |
--chunk-size | 1000 | Tamanho máximo do chunk antes do overlap |
--chunk-overlap | 150 | Caracteres repetidos entre chunks vizinhos |
--embedding-batch-size | 32 | Número de chunks por requisição de embeddings à Venice |
--qdrant-path | indefinido | Caminho de armazenamento local persistente do Qdrant |
--qdrant-url | indefinido | URL remota do Qdrant |
--skip-ingest | false | Consulta uma coleção existente sem recarregar docs |
--recreate-collection | false | Exclui e reconstrói a coleção Qdrant |
Notas de privacidade
Para uma configuração RAG privada, pense em cada camada separadamente:| Camada | Consideração de privacidade |
|---|---|
| Embeddings da Venice | Chunks de documentos são enviados à Venice para criar vetores |
| Chat da Venice | Contexto recuperado é enviado à Venice para responder à pergunta |
| Qdrant local | Vetores e payloads permanecem na sua máquina |
| Qdrant remoto | Vetores e payloads são armazenados onde quer que seu servidor Qdrant rode |
| Re-ranker FastEmbed | O re-ranking roda localmente quando o modelo está disponível |
Erros comuns para tratar de imediato
| Sintoma | O que geralmente significa | O que fazer |
|---|---|---|
Set VENICE_API_KEY before running this example. | A variável de ambiente está ausente | Exporte VENICE_API_KEY antes de rodar o script |
Document path does not exist | Um caminho passado a --docs está errado | Verifique o caminho do arquivo ou pasta |
| Resultados de recuperação vazios | Nada foi ingerido ou a coleção errada está sendo consultada | Remova --skip-ingest ou confirme --collection e --qdrant-path |
| Erro de tamanho de vetor no Qdrant | A coleção foi criada com um modelo de embedding diferente | Recrie a coleção após mudar de modelo de embedding |
| Primeiro re-rank lento | FastEmbed pode estar baixando ou inicializando o cross-encoder | Deixe a primeira execução terminar; as próximas devem ser mais rápidas |
Para onde ir a seguir
Quando você tiver a baseline rodando, as melhorias de maior impacto geralmente são:- Adicionar loaders específicos para PDFs, HTML, tickets ou páginas internas de wiki.
- Armazenar metadados mais ricos como títulos, headings, datas, donos e URLs.
- Ajustar
candidate_k,top_k, tamanho de chunk e overlap em perguntas reais. - Adicionar perguntas de avaliação para medir a qualidade da recuperação antes e depois das mudanças.
- Fazer streaming do chat completion final da Venice para uma experiência interativa melhor.