04-05-01 — Métricas de RAG
TL;DR
RAG tem dois componentes avaliáveis: o retriever (recuperou os chunks certos?) e o generator (gerou resposta correta a partir dos chunks?). As métricas fundamentais são: faithfulness (resposta baseada no contexto?), answer relevance (resposta responde à pergunta?), context recall (contexto continha a resposta?), e context precision (contexto recuperado era relevante?). Sem ground truth, use LLM-as-judge.
Por que medir RAG é diferente
Sistemas RAG falham de formas silenciosas. A resposta pode parecer ótima mas estar errada porque:
- O chunk certo não foi recuperado (falha do retriever)
- O chunk foi recuperado mas o LLM ignorou ele e alucionou (falha do generator)
- O chunk foi recuperado e usado, mas estava desatualizado (problema de dados)
- Múltiplos chunks contraditórios foram recuperados
Para saber onde o sistema está falhando, você precisa de métricas específicas para cada componente.
Framework de métricas
Métricas de Retrieval
Context Recall
Pergunta: "As informações necessárias para responder estavam nos chunks recuperados?"
Cálculo: proporção das sentenças da resposta esperada (ground truth) que podem ser atribuídas ao contexto recuperado.
Range: 0 a 1. Score baixo indica problema no retriever — os chunks certos não estão sendo encontrados.
Context Precision
Pergunta: "Os chunks recuperados eram relevantes para a query?"
Cálculo: proporção dos chunks recuperados que eram de fato relevantes para responder a query.
Range: 0 a 1. Score baixo indica ruído — muito lixo junto com a informação relevante. Isso dilui o contexto enviado ao LLM.
É o tradeoff clássico de IR (Information Retrieval). Aumentar k (mais chunks recuperados) aumenta recall mas diminui precision. Re-ranking melhora precision sem sacrificar recall. O objetivo é maximizar os dois, mas em RAG, recall costuma ser mais crítico — é melhor ter ruído do que perder a informação certa.
Métricas de Geração
Faithfulness (Fidelidade)
Pergunta: "A resposta é suportada pelo contexto fornecido? Há alucinações?"
Cálculo: proporção das afirmações na resposta que podem ser verificadas no contexto recuperado.
Range: 0 a 1. Score de 1.0 = cada afirmação da resposta tem suporte no contexto. Score baixo = o LLM está inventando além do contexto.
# Exemplo de avaliação de faithfulness com LLM-as-judge
def evaluate_faithfulness(question: str, context: list[str], answer: str, llm) -> float:
context_str = "\n".join(context)
prompt = f"""Dada a seguinte resposta e o contexto utilizado para gerá-la,
avalie se CADA afirmação da resposta é suportada pelo contexto.
Contexto:
{context_str}
Resposta:
{answer}
Para cada afirmação na resposta, responda "suportada" ou "não suportada".
Calcule: afirmações_suportadas / total_afirmações.
Retorne apenas o número entre 0 e 1."""
result = llm.invoke(prompt)
return float(result.strip())
Answer Relevance
Pergunta: "A resposta realmente responde à pergunta feita?"
Cálculo: usando LLM-as-judge ou, no RAGAS, gerando N perguntas da resposta e medindo similaridade com a query original.
Range: 0 a 1. Detecta respostas verdadeiras mas fora de tópico.
Answer Correctness
Pergunta: "A resposta está factualmente correta comparada com o ground truth?"
Cálculo: F1 semântico entre a resposta gerada e a resposta esperada.
Requer ground truth — é a métrica mais difícil de coletar mas a mais direta.
Avaliação sem ground truth: LLM-as-judge
Para faithfulness e answer relevance, é possível avaliar sem ground truth usando um LLM como juiz. Funciona surpreendentemente bem e permite avaliar em produção.
def llm_judge_faithfulness(context_chunks: list[str], answer: str, judge_llm) -> dict:
"""Usa GPT-4o como juiz de faithfulness. Sem ground truth necessário."""
context = "\n---\n".join(context_chunks)
response = judge_llm.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": f"""Analise se a resposta abaixo é fiel ao contexto fornecido.
Identifique quaisquer afirmações que não têm suporte no contexto.
CONTEXTO:
{context}
RESPOSTA A AVALIAR:
{answer}
Retorne JSON:
{{
"score": <0.0 a 1.0>,
"unsupported_claims": ["lista de afirmações sem suporte"],
"verdict": "faithful|unfaithful|partially_faithful"
}}"""
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
LLMs tendem a ser mais permissivos com respostas longas e detalhadas, e a concordar com afirmações confiantes mesmo quando falsas. Calibre seu judge com casos conhecidos antes de confiar nos scores de produção. Use GPT-4o ou Claude Opus para avaliar — modelos menores como GPT-3.5 são menos confiáveis como juízes.
Construindo um test set de golden questions
O investimento mais valioso em avaliação de RAG é criar um conjunto de 50-100 pares (pergunta, resposta esperada) no seu domínio. Com isso, você pode medir context recall, context precision e answer correctness de forma objetiva.
| Quantidade | Propósito | Tipo de pergunta |
|---|---|---|
| 20-30 | Perguntas factuais simples | "Qual é a multa por atraso no contrato X?" |
| 15-20 | Perguntas de raciocínio | "Compare as penalidades do contrato A e B" |
| 10-15 | Perguntas fora do domínio | Espera "não encontrei" como resposta correta |
| 5-10 | Perguntas com data crítica | Testa se o sistema usa doc correto por data |
Como isso se conecta
- 04-05-02 — RAGAS, DeepEval e frameworks — ferramentas que implementam essas métricas automaticamente
- 04-03-01 — Chunking — context recall baixo indica problemas de chunking ou retrieval
- 04-04-01 — Re-ranking — re-ranking melhora context precision
Fontes
- Es, S. et al. (2023). RAGAS: Automated Evaluation of Retrieval Augmented Generation. arxiv.org/abs/2309.15217
- Zheng, L. et al. (2023). Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. arxiv.org/abs/2306.05685
- Microsoft. Evaluation of RAG systems. learn.microsoft.com
- RAGAS Documentation. Metrics. docs.ragas.io