Back

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:

  1. Ingestão e ETL: Lidar com PDFs, tabelas e HTML bagunçado.
  2. Chunking Avançado: Divisão semântica, recuperação de documento pai (Parent-Document Retrieval).
  3. Busca Híbrida: Combinar recuperação densa (vetorial) e esparsa (BM25/Splade).
  4. Re-ranking: Usar um cross-encoder para refinar os resultados.
  5. 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:

  1. Divida os documentos em chunks "filhos" pequenos (ex: 200 tokens) para os embeddings.
  2. Vincule cada chunk filho ao seu chunk "pai" (ex: 1000 tokens) ou ao documento completo.
  3. 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 0x80040115 ou 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).

  1. Executar Busca Vetorial: Obtenha os top 50 resultados.
  2. Executar Busca BM25: Obtenha os top 50 resultados.
  3. Fundir Resultados: Use um algoritmo como Reciprocal Rank Fusion (RRF) para combinar as listas.

RRF(d)=rR1k+r(d)RRF(d) = \sum_{r \in R} \frac{1}{k + r(d)}

Onde r(d)r(d) é a classificação do documento dd 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:

  1. Recuperar: Obtenha 100 candidatos usando Busca Híbrida (Rápido).
  2. Re-rankear: Passe esses 100 pares (Consulta + Doc) através de um Cross-Encoder (ex: bge-reranker-v2-m3 ou Cohere Rerank).
  3. 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:

  1. Relevância do Contexto: O contexto recuperado é útil para a consulta?
  2. Fidelidade (Faithfulness): A resposta é derivada apenas do contexto?
  3. 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.

AI EngineeringRAGVector DatabasesLLMSystem Design

Explore ferramentas relacionadas

Experimente estas ferramentas gratuitas do Pockit