Construindo um Pipeline RAG Pronto para Produção: Um Guia Detalhado
Em 2024, tutoriais de "Converse com seu PDF" estão por toda parte. A receita é simples: dividir o texto, gerar embeddings com OpenAI, armazenar em um banco vetorial e consultar. Funciona como mágica para um documento de 5 páginas.
Mas quando você coloca isso em produção com 100.000 documentos, formatação complexa e consultas ambíguas de usuários, a mágica quebra. Você encontra o fenômeno "Lost in the Middle", alucinações devido a contexto irrelevante e picos de latência que destroem a experiência do usuário.
Este guia não é um "Hello World". É um mergulho profundo na construção de um pipeline RAG (Retrieval-Augmented Generation) pronto para produção. Vamos cobrir estratégias avançadas de chunking, busca híbrida (palavras-chave + vetores), modelos de re-ranking e como avaliar seu sistema sistematicamente.
A Anatomia de um Sistema RAG em Produção
Um pipeline RAG ingênuo é uma linha reta: Documentos -> Chunks -> Embeddings -> Vector DB -> Recuperação -> LLM.
Um pipeline RAG em produção parece mais um grafo complexo. Envolve:
- Ingestão e ETL: Lidar com PDFs, tabelas e HTML bagunçado.
- Chunking Avançado: Divisão semântica, recuperação de documento pai (Parent-Document Retrieval).
- Busca Híbrida: Combinar recuperação densa (vetorial) e esparsa (BM25/Splade).
- Re-ranking: Usar um cross-encoder para refinar os resultados.
- Geração: Prompt engineering com suporte a citações.
Vamos detalhar cada etapa.
Fase 1: Estratégias de Ingestão e Chunking
Lixo entra, lixo sai. Se seus chunks cortam uma frase no meio, ou se você perde o contexto de uma tabela, seu recuperador (retriever) não tem chance.
O Problema do Chunking de Tamanho Fixo
A maioria dos tutoriais usa RecursiveCharacterTextSplitter com um tamanho de 1000 e sobreposição de 200. Isso é "bom o suficiente" para texto simples, mas falha com dados estruturados.
Por que falha?
- Fragmentação de Contexto: Um parágrafo explicando um conceito pode ser dividido em dois, perdendo o significado semântico em ambas as metades.
- Separação de Cabeçalhos: Um título de seção pode acabar em um chunk diferente do seu conteúdo, deixando o conteúdo "órfão" e difícil de recuperar.
Estratégia 1: Chunking Semântico
Em vez de dividir por número de caracteres, divida por significado. Você pode usar um modelo de embeddings para calcular a similaridade de cosseno entre frases. Quando a similaridade cai abaixo de um limite, indica uma mudança de tópico e você começa um novo chunk.
# Exemplo conceitual de chunking semântico sentences = split_into_sentences(text) embeddings = model.encode(sentences) chunks = [] current_chunk = [sentences[0]] for i in range(1, len(sentences)): similarity = cosine_similarity(embeddings[i-1], embeddings[i]) if similarity < THRESHOLD: chunks.append(" ".join(current_chunk)) current_chunk = [sentences[i]] else: current_chunk.append(sentences[i])
Estratégia 2: Recuperação de Documento Pai (Parent-Document Retrieval)
Embeddings representam melhor chunks pequenos do que grandes. No entanto, LLMs precisam de mais contexto para responder com precisão.
A Solução:
- Divida os documentos em chunks "filhos" pequenos (ex: 200 tokens) para os embeddings.
- Vincule cada chunk filho ao seu chunk "pai" (ex: 1000 tokens) ou ao documento completo.
- Recupere com base no vetor do filho, mas alimente o LLM com o chunk pai.
Isso te dá o melhor dos dois mundos: recuperação precisa e contexto rico.
Fase 2: A Camada de Recuperação (Vetorial vs. Híbrida)
A busca vetorial (Dense Retrieval) é incrível para capturar a intenção semântica. Se um usuário busca "como consertar cano quebrado", ela encontra "guia de reparo hidráulico" mesmo que as palavras não se sobreponham.
No entanto, a busca vetorial luta com:
- Correspondências Exatas de Palavras-chave: Buscar um código de erro específico como
0x80040115ou um SKU de produto. - Jargão Específico do Domínio: Modelos de embeddings genéricos podem não entender as siglas da sua indústria.
Implementando Busca Híbrida
A busca híbrida combina Busca Vetorial (semântica) e Busca por Palavras-chave (BM25).
- Executar Busca Vetorial: Obtenha os top 50 resultados.
- Executar Busca BM25: Obtenha os top 50 resultados.
- Fundir Resultados: Use um algoritmo como Reciprocal Rank Fusion (RRF) para combinar as listas.
Onde é a classificação do documento em uma das listas. Isso garante que um documento que aparece em ambas as listas receba uma pontuação significativamente maior.
Fase 3: Re-ranking (O Ingrediente Secreto)
Se você fizer apenas uma coisa para melhorar seu pipeline RAG hoje, adicione um re-ranker.
Bancos de dados vetoriais são rápidos (Approximate Nearest Neighbors), mas trocam precisão por velocidade. Os embeddings são representações comprimidas.
Um modelo Cross-Encoder pega a consulta e o documento juntos e emite uma pontuação de similaridade. É muito mais preciso que embeddings bi-encoder, mas computacionalmente caro.
A Arquitetura:
- Recuperar: Obtenha 100 candidatos usando Busca Híbrida (Rápido).
- Re-rankear: Passe esses 100 pares (Consulta + Doc) através de um Cross-Encoder (ex:
bge-reranker-v2-m3ou Cohere Rerank). - Selecionar: Pegue os top 5 resultados re-rankeados para o LLM.
Esse padrão de "recuperação em dois estágios" é o padrão da indústria para RAG de alta precisão.
Fase 4: Geração e Guardrails contra Alucinações
Agora você tem o contexto certo. Como garantir que o LLM se atenha a ele?
1. Engenharia de Prompt do Sistema
Não diga apenas "Responda a pergunta". Seja específico.
"Você é um assistente útil. Use APENAS o contexto fornecido para responder à pergunta do usuário. Se a resposta não estiver no contexto, diga 'Não sei'. Não use conhecimento externo. Cite o ID do documento para cada afirmação."
2. Verificação de Citações
Force o modelo a gerar citações (ex: [Doc 1]). No seu pós-processamento, verifique se o texto citado realmente existe no chunk recuperado. Se o modelo cita um documento mas o fato não está lá, marque como uma possível alucinação.
Avaliação: RAGAS e TruLens
Como você sabe se suas mudanças realmente melhoraram o sistema? Você precisa de métricas.
Métricas da Tríade RAG:
- Relevância do Contexto: O contexto recuperado é útil para a consulta?
- Fidelidade (Faithfulness): A resposta é derivada apenas do contexto?
- Relevância da Resposta: A resposta realmente aborda a pergunta do usuário?
Frameworks como RAGAS usam um LLM (como GPT-4) para julgar essas métricas automaticamente.
# Exemplo de avaliação com RAGAS from ragas import evaluate from ragas.metrics import context_precision, faithfulness results = evaluate( dataset, metrics=[context_precision, faithfulness] )
Conclusão
Construir um protótipo RAG leva uma tarde. Construir um sistema RAG em produção leva meses de iteração.
As chaves para 2025:
- Vá além do chunking fixo: Use estratégias semânticas ou de documento pai.
- Híbrido é obrigatório: Não confie apenas em vetores; BM25 ainda é rei para palavras-chave.
- Re-ranking é alto ROI: Corrige os problemas de precisão da busca vetorial.
- Avaliação não é opcional: Você não pode otimizar o que não pode medir.
A era da IA "mágica" acabou. Agora estamos na era da Engenharia de IA, onde o design rigoroso do sistema e a avaliação importam mais que o modelo em si.
Explore ferramentas relacionadas
Experimente estas ferramentas gratuitas do Pockit