Capítulo 10 · RAG · 9 min
Ler seus documentos
Como um LLM acessa milhares de páginas sem memorizá-las. Embeddings, busca semântica, contexto injetado.
Buscar antes de responder
Um LLM sabe o que foi comprimido em seus pesos durante o treinamento. Mas sua documentação interna, suas notas, suas faturas ou uma página publicada ontem não estão necessariamente ali.
O RAG adiciona uma etapa antes da geração: buscar documentos relevantes, colocá-los no contexto e deixar o modelo responder usando essa informação.
Escolha uma pergunta: ela é embedded, comparada aos chunks do corpus, e os mais relevantes são injetados no prompt antes da geração. É esse desvio que permite a um LLM responder sobre documentos que nunca viu durante o treinamento.
Duas coisas a guardar dessa manipulação. Primeiro, os chunks recuperados não são os que contêm as palavras da pergunta — pergunte "qual é o maior planeta?" e você recebe os gigantes gasosos, embora a palavra "maior" não apareça em nenhum desses trechos. Quem decide é a proximidade no espaço vetorial, não o vocabulário. Segundo, o modelo nunca vê o corpus inteiro: ele só recebe o punhado de trechos selecionados. Toda a qualidade de um RAG se joga, portanto, antes da geração. Se o chunk certo não for recuperado, nenhuma sutileza de prompt vai compensar — é por isso que o resto deste capítulo fala sobretudo de corte e de busca.
De documentos a vetores
Primeiro cortamos documentos em chunks. Cada chunk vira um embedding e é salvo em uma base vetorial.
Quando chega uma pergunta, ela também vira vetor. Depois buscamos os chunks mais próximos por similaridade semântica. Não buscamos apenas palavras iguais: buscamos significado próximo. (Na verdade, não comparamos com todos os chunks: passando de algumas dezenas de milhares de vetores, as bases vetoriais usam índices aproximados — HNSW, IVF — que encontram os vizinhos mais próximos sem percorrer tudo. É até a razão de existirem.)
É isso a busca semântica: "próximo" não quer dizer "que contém as mesmas palavras", e sim "que exprime um sentido parecido".
O prompt aumentado
Os chunks recuperados são inseridos no prompt:
Pergunta do usuário + contexto recuperado + instruções de resposta
O modelo não "aprende" esses documentos permanentemente. Ele os lê naquele momento, dentro da janela de contexto.
Por que é útil
RAG resolve três problemas práticos:
- atualidade — você pode responder com informação mais recente que o treinamento
- especialização — pode usar documentos privados ou técnicos
- rastreabilidade — pode mostrar de onde veio uma resposta
Mas não é magia. Se a busca recupera chunks ruins, o modelo raciocina com dados ruins.
Qual modelo de embedding usar?
Nem toda pergunta leva aos chunks certos com o mesmo embedding. Um modelo treinado em português generalista vai recuperar mal código Python; um modelo treinado em código vai recuperar mal trocas médicas.
As escolhas que aparecem na prática:
text-embedding-3-small/-large(OpenAI) — qualidade sólida, generalista, multilíngue. Por muito tempo o default de quem estava começando; hoje ultrapassado nos benchmarks, mas ainda perfeitamente utilizável.bge-large/bge-m3(BAAI) — open-source, excelente em multilíngue. Dominaram os benchmarks MTEB em 2024.- Gemini Embedding (Google) — na liderança do MTEB em inglês.
- Qwen3-Embedding (Alibaba) — o melhor dos modelos de pesos abertos, que você pode hospedar por conta própria.
- Voyage 3.x, Cohere
embed-v4, Jina v4 — as referências comerciais do momento, sendo a última multimodal (texto e imagens no mesmo espaço). all-MiniLM-L6-v2(Sentence-Transformers) — pequeno, rápido, possível de implantar localmente. Boa relação qualidade/custo para casos simples.- Modelos especializados por domínio (código, biomédico, jurídico) — sempre melhores no nicho, mais fracos em outros lugares.
Esse ranking muda a cada seis meses. E cuidado ao lê-lo: as pontuações do MTEB v2 não se comparam com as da v1, as tarefas mudaram entre as duas.
Uma regra prática: testar dois ou três modelos com seus dados e suas perguntas. O ranking MTEB diz pouco sobre seu caso de uso específico.
O reranker: uma segunda passagem
A busca vetorial tem um defeito: é rápida mas grosseira. Um embedding de algumas centenas de dimensões é uma média difusa de um texto. Muitos chunks "mais ou menos relevantes" flutuam no topo, e os realmente bons às vezes ficam afogados.
Por isso uma segunda etapa virou padrão em sistemas RAG sérios: o reranker.
A ideia em duas etapas:
- Primeira passagem (busca vetorial) — recupera os 50 ou 100 chunks mais próximos. Rápido.
- Segunda passagem (reranking) — um modelo pequeno (frequentemente um cross-encoder) avalia cada par
(pergunta, chunk)junto, dá uma pontuação precisa, e mantém o top 5–10. Lento por chunk, mas só é executado nos 50 candidatos da primeira passagem.
O reranker vê a pergunta e o chunk ao mesmo tempo, o que o embedding não faz. Ele capta sutilezas semânticas que a busca vetorial perde. Cohere, Jina AI, BAAI oferecem rerankers prontos para usar.
Sem reranker, seu RAG estagna. Com ele, a qualidade salta um nível sem mudar o resto do pipeline.
Fragilidades
Um pipeline RAG pode falhar por vários motivos:
- chunks grandes ou pequenos demais
- embeddings pouco adaptados ao domínio
- perguntas que precisam combinar muitas fontes
- contexto recuperado contraditório
- modelo que ignora parte do contexto
A qualidade depende tanto do retrieval quanto do modelo gerativo.
O próximo passo
Com RAG, o modelo pode consultar documentos. Mas o pipeline clássico — embed, retrieve, generate — é uma arquitetura "passiva": o modelo recebe uma pergunta, busca chunks, responde. Desde 2025, ele vem sendo concorrido em muitos casos de uso pela busca agêntica: damos ao modelo uma ferramenta de busca e o deixamos buscar em loop, reformular, cavar até ter o que precisa. Com ferramentas, ele pode fazer ainda mais: calcular, chamar APIs, navegar, escrever arquivos. Isso nos leva aos agentes.
Atualizado em