O que é RAG Desnecessário?
RAG Desnecessário (RAG for Small Data) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Dispensáveis. Um pipeline de busca vetorial para 20 páginas que cabem inteiras no contexto.
Um assistente jurídico responde perguntas sobre um contrato de serviços. Dezoito páginas. Uns doze mil tokens.
O time montou do jeito que os tutoriais ensinam. Quebrar o contrato em pedaços pequenos, virar cada pedaço um embedding, guardar num banco vetorial. A cada pergunta, buscar os quatro pedaços mais parecidos e deixar o modelo responder.
Aí um usuário pergunta. Posso rescindir sem multa se o fornecedor atrasar a entrega? A busca traz a cláusula de rescisão. Não traz a cláusula de multas, que fica em outra página e fala em inadimplemento contratual, não em atraso.
O modelo responde sim, sem multa. A cláusula 14.3 diz o contrário. E aqui está o detalhe que faz disso um smell. O contrato inteiro cabia com folga no contexto do modelo. Nesta aula, você vai aprender a notar quando a busca é uma aposta que você não precisava fazer.
O centro da questão é este. A busca acha pedaços parecidos com a pergunta. Ela não acha os pedaços de que você precisa para responder.
Atrasar a entrega soa perto de prazo e rescisão. A cláusula de multas fala em inadimplemento, e no espaço vetorial ela fica longe. Então o modelo responde com um quinto do contrato, e não sabe o que ficou de fora.
Quando o documento inteiro cabe, deixe o modelo que leu tudo decidir o que é relevante. Não uma busca que só leu a pergunta.
Vamos andar pelo pipeline.
Começa com um material pequeno e completo. Um contrato, todas as cláusulas ali.
Depois ele é quebrado. E a quebra separa cláusulas que dependem uma da outra. A regra está na página quatro, a exceção na página onze.
Os pedaços viram vetores e vão para o banco.
A cada pergunta, a busca escolhe alguns. E erra quando as palavras não batem, mesmo quando o sentido bate.
E o modelo responde com uma fração do material, com toda a confiança. Nada no prompt diz a ele que a cláusula 14 existe.
Então, os sinais. O conteúdo total é pequeno, dezenas de páginas, e caberia inteiro na janela de contexto.
Tem chunking, embeddings e banco vetorial para meia dúzia de documentos.
As respostas erradas vêm da busca perdendo o trecho certo. Principalmente perguntas que juntam partes distantes do documento.
E o time gasta mais tempo ajustando tamanho de pedaço do que resolvendo o problema do usuário.
Ninguém monta isso por descuido. Tem bons motivos.
RAG virou a resposta padrão para IA sobre documentos. É a primeira arquitetura que todo tutorial mostra.
As janelas cresceram. O que precisava de busca há poucos anos hoje cabe inteiro, com sobra.
Foi pensado para uma escala futura. E se forem mil contratos? Talvez sejam. Hoje é um.
E o custo do contexto foi mal calculado. Mandar o documento inteiro em toda pergunta parece caro, até você contar o cache de prompt.
Uma pergunta para você. O assistente erra uma pergunta porque a cláusula de exceção não voltou da busca. Um colega propõe subir de quatro para oito pedaços por pergunta. O contrato inteiro tem 24 pedaços. O que você responde?
Oito pedaços resolve esta pergunta. A próxima pode depender do nono. Você continua apostando que a busca acerta, para um material que já cabia inteiro.
E trocar o modelo de embedding também não resolve. Um embedding melhor aproxima palavras parecidas. Ele não liga uma cláusula a uma exceção que não se parece nada com a pergunta. Com doze mil tokens, mande tudo e meça no eval.
O tratamento é a refatoração da próxima aula. Trocar RAG por contexto direto. Mande o documento inteiro e use cache de prompt para não pagar a leitura cheia em toda pergunta.
Um detalhe decide se o cache funciona. O documento precisa ficar no começo do prompt, igualzinho em toda chamada.
A pergunta vem depois. Se a pergunta vem primeiro, o começo do prompt muda toda vez e o cache nunca acerta.
Um time aprendeu isso do jeito difícil. Trocou para o contrato inteiro, e a conta subiu muito além do esperado. O trace mostrou a pergunta na frente do contrato. A correção não foi voltar para o RAG. Foi mudar uma linha de lugar.
O que você ganha vale a pena. O modelo vê as ligações entre as cláusulas. Não tem chunking, nem índice, nem busca para ajustar. E as citações ficam mais precisas, porque o modelo vê cada cláusula com número e página.
Agora o outro lado. Isso não é uma regra contra RAG.
Se o material não cabe, ou cresce rápido, você precisa de busca. Uma base de quatro mil artigos que muda toda semana, com busca híbrida, não é este smell. Ali, a busca se paga.
O controle de acesso é o caso sutil. Um manual de RH de trinta páginas cabe fácil. Mas se cada funcionário só pode ver a seção do próprio cargo, mandar tudo mostra ao modelo seções que essa pessoa não pode ver. Busca filtrada, ou um contexto montado por cargo no código, é como você garante a permissão.
E se o cache não se aplica ao seu tráfego, e o volume de perguntas é muito alto, calcule o custo por pergunta antes de decidir.
E o erro comum também vai no sentido contrário. Um manual de quarenta páginas, perguntas sobre seções isoladas, busca quase sempre certa, custo baixo. Material pequeno, sozinho, não é motivo para refazer. Rode as duas versões no eval. Se o contexto direto acerta mais pelo mesmo custo, troque. Se empatar, fique com a que é mais simples de manter.
O que observar. No eval, marque cada resposta errada pela causa. O trecho certo estava no prompt ou não? Se a maioria dos erros é trecho que nunca chegou, é este smell, em números.
Mantenha um conjunto de perguntas que precisam de duas seções distantes, como a regra e a exceção. São essas que o chunking quebra primeiro.
E depois da troca, olhe a taxa de acerto do cache no trace. Uma taxa perto de zero quer dizer que algo no começo do prompt está mudando. Uma data, o nome do usuário, ou a pergunta no lugar errado.
Então, a ideia para levar. Busca é uma aposta de que ela vai achar o que a resposta precisa. Quando o documento cabe na janela, você não precisa fazer essa aposta. Dê ao modelo o documento inteiro e deixe ele decidir o que importa.
Na próxima aula, a gente faz a refatoração passo a passo, com segurança e o cache no lugar certo: trocar RAG por contexto direto. Até lá.
RAG for Small Data
RAG Desnecessário (RAG for Small Data) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Dispensáveis. Um pipeline de busca vetorial para 20 páginas que cabem inteiras no contexto.
Um assistente jurídico responde perguntas sobre um contrato de prestação de serviços de 18 páginas. A arquitetura (anonimizada):
contrato.pdf (18 páginas, ~12 mil tokens)
-> quebrado em pedaços de 500 tokens
-> embeddings num banco vetorial
pergunta -> busca os 4 pedaços mais parecidos -> modelo responde
Pergunta: “Posso rescindir sem multa se o fornecedor atrasar a entrega?”. A busca trouxe a cláusula de rescisão, mas não a de penalidades, que ficava em outra página e falava de “inadimplemento” em vez de “atraso”. O modelo respondeu “sim, sem multa”. A cláusula 14.3 dizia o contrário.
O contrato inteiro cabia no contexto do modelo com folga. Quatro pedaços de 500 tokens são 2 mil dos 12 mil: o modelo respondeu olhando para um sexto do documento, sem saber disso.
Sinais de RAG Desnecessário:
flowchart LR
D(["1. Contrato de 18 páginas"]):::io --> C["2. Cortar em pedaços"]:::tool
C --> V[("3. Banco vetorial")]:::store
Q(["Pergunta"]):::io --> S["4. Buscar 4 pedaços"]:::tool
V --> S
S --> M(["5. Modelo vê um sexto do contrato"]):::llm
A busca vetorial acha pedaços parecidos com a pergunta. Ela não acha pedaços necessários para responder. “Atrasar a entrega” é parecido com a cláusula de prazos e de rescisão. A cláusula de penalidades fala de “inadimplemento contratual”, e fica longe na distância entre vetores.
Contratos são cheios disso: uma cláusula define um termo, outra aplica, uma terceira abre exceção. Responder certo exige ler as três juntas. Quando o documento inteiro cabe no contexto, quem decide o que é relevante é o modelo, que leu tudo, e não a busca, que leu só a pergunta.
A própria Anthropic, no post em que apresentou o Contextual Retrieval (setembro de 2024), recomenda o caminho simples: se a base tem menos de 200 mil tokens (cerca de 500 páginas), inclua tudo no prompt e use cache, sem busca.
| Refatoração | Escolha quando |
|---|---|
| Trocar RAG por Contexto Direto | O material cabe na janela com folga. Mande o documento inteiro e use cache de prompt para não pagar a leitura a cada pergunta. Para ligar o cache, veja Introduzir Cache. |
O medo de mandar tudo é o custo. Faça a conta com o seu caso. Exemplo com o contrato de 12 mil tokens e uma sessão de 30 perguntas:
| Tokens de entrada lidos | Observação | |
|---|---|---|
| Contexto direto sem cache | 360 mil | 12 mil vezes 30 perguntas |
| Contexto direto com cache | 12 mil escritos, 348 mil lidos do cache | A leitura de cache custa uma fração do preço normal |
| RAG com 4 pedaços | 60 mil, mais embeddings e infraestrutura | Mais barato por chamada, e erra a cláusula 14.3 |
Na Anthropic, por exemplo, ler do cache custa 10% do preço normal de entrada, e escrever no cache custa um pouco mais que o preço normal. Com essas proporções, as 30 perguntas com cache custam em entrada algo perto de 50 mil tokens a preço cheio. Confira a tabela do seu provedor, porque proporções e tempo de expiração do cache mudam de um para outro.
Para o cache funcionar, o documento precisa estar no começo do prompt, igual em toda chamada. A pergunta vem depois.
Contexto direto não é “jogue tudo e esqueça”. O paper “Lost in the Middle” (Liu et al., 2023) mostrou que modelos usam pior a informação no meio de contextos longos do que no começo e no fim. Modelos mais novos melhoraram nisso, mas o efeito vale ser medido no seu eval.
Duas práticas ajudam: mantenha a estrutura do documento (números de cláusula, títulos de seção) e peça que a resposta cite a cláusula usada. Uma citação errada aparece rápido na revisão.
Responda as 6 perguntas para concluir a aula. Só assistir não conclui: a checagem é o que conta para a trilha e para o certificado.
RAG Desnecessário (RAG for Small Data) é um smell de IA, ou seja, um sinal de problema em sistemas com LLM, do grupo Dispensáveis. Um pipeline de busca vetorial para 20 páginas que cabem inteiras no contexto.
Com Trocar RAG por Contexto Direto. Cada refatoração traz o passo a passo seguro, com eval antes e depois.
Nos cenários reais Assistente jurídico.