Quando o RAG erra, quase nunca é o LLM: 4 falhas de recuperação e como logar cada uma
Todo problema de RAG parece problema do modelo. Quase nunca é.
Demorei pra aceitar isso. Ficava trocando modelo de embedding, mexendo no prompt, achando que o Claude tava inventando coisa. O que estava quebrado era o que eu entregava pra ele, e só ficou óbvio quando comecei a logar o que voltava da recuperação.
Depois que instrumentei, os erros se separaram em quatro tipos bem diferentes:
1. Score baixo, e o pipeline responde assim mesmo. A pergunta simplesmente não tem resposta na base. Quase ninguém checa. Um piso resolve:
# SELECT content, 1 - (embedding <=> %s) AS score ...
rows = cur.fetchall()
if not rows or rows[0][1] < 0.7:
return "Não tenho essa informação na base."
Feio, mas corta a maior parte das respostas inventadas com cara de certeza.
2. Chunk vizinho. "como resetar senha" trazendo "como resetar produto". Vetorialmente colado, na prática inútil. Esse foi o que mais me irritou, porque parece bug do modelo e não é: busca vetorial pura não separa as duas coisas. Hybrid search (vetor + BM25) rendeu mais aqui do que qualquer troca de embedding que eu tinha tentado antes.
3. Alucinação com o contexto certo na mão. O retrieval acertou e o modelo extrapolou mesmo assim. Isso é instrução, não recuperação: o system prompt precisa proibir na cara dura e pedir citação do trecho.
4. Chunk cortado no meio. Tabela partida, bloco de código sem fechamento. Chunking por contagem de token faz isso o tempo todo, e o estrago é silencioso: o modelo responde bonito em cima de um pedaço mutilado. Respeitar a estrutura do documento dá mais trabalho pra escrever e se paga na primeira semana.
Se fosse começar de novo, a primeira coisa que eu escreveria não era o pipeline, era o log. Score de cada chunk, quais entraram, tamanho de cada um. Sem isso você fica trocando peça no escuro.
Escrevi o passo a passo completo no blog, com pipeline em Python usando pgvector, Voyage e Claude, as estratégias de chunking e a comparação com fine-tuning: https://www.techknow.com.br/post/o-que-e-rag
Quem já tem isso em produção: o ganho maior veio de mexer no chunking ou de botar um reranker na frente?