RAG (Retrieval-Augmented Generation) em produção é menos sobre o modelo de linguagem e mais sobre engenharia de retrieval. Este artigo documenta a arquitetura padrão que aplicamos em sistemas RAG da North Studio para bases de 100 mil a 10 milhões de documentos, com latência abaixo de 800ms p95 e custo por query abaixo de US$ 0,01.
Em uma linha
Um sistema RAG produtivo combina: chunking semântico, embeddings de qualidade (text-embedding-3-large ou Voyage-3), retrieval híbrido (BM25 + vetor), re-ranking com modelo cross-encoder, e generation com citações forçadas — tudo com eval contínuo contra dataset gold.
1. Ingestão e chunking
Chunking é a etapa mais subestimada do RAG. Chunk ruim implica retrieval ruim implica resposta ruim, independentemente do modelo de geração.
Regra prática: chunks entre 300 e 800 tokens, com overlap de 10 a 15%. Respeite fronteiras semânticas (parágrafo, seção); nunca quebre no meio de uma frase. Para documentos estruturados (PDFs técnicos, manuais), prefira chunking guiado por estrutura (capítulos, headings) em vez de janela fixa.
Metadata por chunk é obrigatória: source URL, título do documento, seção, data de publicação, autor, tags. Sem metadata, retrieval híbrido degrada e citações ficam imprecisas.
2. Embeddings
Em 2026, os defaults seguros são: text-embedding-3-large da OpenAI (3072 dim, batendo a maioria dos benchmarks MTEB), voyage-3 da Voyage AI (especialmente forte em domínios técnicos), e cohere-embed-multilingual-v3 para conteúdo multi-idioma.
Custo importa em escala. Para bases acima de 1 milhão de chunks, considere modelos open-source self-hosted (BGE, e5-mistral) que entregam 85 a 95% da qualidade a fração do custo. Armazene embeddings em pgvector (Postgres com extensão), Qdrant, ou Pinecone — para a maioria dos casos, pgvector é suficiente e elimina um sistema da infra.
3. Retrieval híbrido (vetor + lexical)
Retrieval puramente vetorial perde queries com termos raros, números, IDs ou jargão técnico. Retrieval puramente lexical (BM25) perde paráfrases e semântica.
Padrão produtivo: rode os dois em paralelo, recupere top-50 de cada, e combine com Reciprocal Rank Fusion (RRF) ou pesos ponderados (60% vetor / 40% BM25 como ponto de partida). PostgreSQL com pgvector + full-text search nativo entrega isso em uma única query.
4. Re-ranking com cross-encoder
Top-K do retrieval híbrido (digamos K=50) ainda contém ruído. Re-ranking com modelo cross-encoder (que olha a query e o chunk juntos, não em vetores separados) reordena com qualidade muito superior, mas é caro: rodar cross-encoder em 50 chunks pode adicionar 200 a 400ms.
Modelos canônicos: Cohere Rerank-3, Voyage Rerank-2, ou bge-reranker-v2 self-hosted. Reduza top-K do retrieval (50 para 8) após re-ranking — gera contexto de qualidade alta para o LLM.
5. Generation com citações
O LLM recebe top-K re-ranked como contexto, mais a query original e system prompt que obriga citações. Padrão: cada afirmação não-trivial na resposta deve referenciar um chunk por ID (e.g., [doc-42]). Sem citação, a resposta é rejeitada e re-gerada.
Para modelos: Claude 4.x Sonnet ou GPT-4o para complexidade média-alta; Haiku 4.5 ou GPT-4o-mini para queries triviais (use router de complexidade). Em pt-BR técnico, Claude Sonnet performa consistentemente melhor que GPT-4o em benchmarks internos da North Studio.
6. Eval contínuo
RAG sem eval é fé. Mantenha dataset gold de 100 a 500 queries anotadas com respostas esperadas e chunks relevantes. Rode eval automatizado em CI (Langfuse, LangSmith ou pipeline customizado) a cada mudança em chunking, embedding, retrieval, re-ranking, ou prompt.
Métricas: recall@k (porcentagem de queries que recuperaram o chunk correto), citation accuracy (porcentagem de citações que apontam para o chunk certo), answer faithfulness (porcentagem de afirmações suportadas por chunks recuperados, via LLM-as-judge).
Números de referência
- Latência p95: 600 a 800ms para base de 1M chunks com infra dimensionada.
- Custo por query: US$ 0,005 a 0,015 (embedding + retrieval + re-rank + generation).
- Recall@10 alcançável: 85 a 92% com o pipeline acima.
- Setup inicial: 2 a 3 semanas para PoC; 6 a 8 semanas para hardening produtivo.