12-03-05 — Desafio: Defina 5 Métricas para Monitorar um Agente RAG em Produção
TL;DR
Desafio prático: antes de ver a resposta, tente definir sozinho as 5 métricas mais importantes para monitorar um agente RAG em produção. Depois compare com o template de dashboard abaixo. O objetivo não é decorar — é desenvolver o raciocínio de instrumentação.
Contexto: o que é um agente RAG em produção
Um agente RAG (Retrieval-Augmented Generation) em produção tem ao menos três subsistemas monitoráveis independentemente:
- Retrieval: busca vetorial + reranking → documentos candidatos
- Augmentation: montagem do contexto → prompt final
- Generation: LLM → resposta
Cada subsistema pode falhar de forma diferente. Boas métricas cobrem todos os três.
Resposta do desafio: as 5 métricas essenciais
Métrica 1 — Retrieval Relevance Score
O que mede: Quão relevantes são os documentos recuperados em relação à query do usuário.
Como calcular: Score médio de similaridade coseno entre o embedding da query e os embeddings dos top-K documentos recuperados. Ou usar um LLM judge para avaliar relevância semântica.
Threshold sugerido: < 0.70 → alerta; < 0.60 → crítico
O que fazer quando falha: Investigar qualidade do índice, revisar estratégia de chunking, verificar se a base de conhecimento está atualizada.
Métrica 2 — Context Coverage (Faithfulness)
O que mede: A resposta gerada está fundamentada nos documentos recuperados? O modelo está "inventando" informações não presentes no contexto?
Como calcular: Via LLM judge — dada a resposta e os documentos, quantas afirmações da resposta podem ser verificadas nos documentos? (Framework RAGAS: faithfulness score.)
Threshold sugerido: < 0.80 → alerta (20% de alucinação é muito)
O que fazer quando falha: Ajustar o system prompt para ser mais restritivo, aumentar a quantidade de contexto, ou adicionar pós-processamento de verificação.
Métrica 3 — Answer Relevance
O que mede: A resposta gerada responde de fato à pergunta do usuário? (Diferente de faithfulness: você pode ser fiel ao contexto mas responder outra coisa.)
Como calcular: LLM judge compara a pergunta original com a resposta gerada. O RAGAS framework calcula isso gerando perguntas sintéticas a partir da resposta e comparando com a original.
Threshold sugerido: < 0.75 → alerta
O que fazer quando falha: Revisar o prompt de instrução, testar chunking diferente, verificar se a query precisa de pré-processamento (expansão de query, reformulação).
Métrica 4 — End-to-End Latência P95
O que mede: Tempo total da query do usuário até a primeira resposta (TTFT — Time to First Token) e tempo até resposta completa, no percentil 95.
Como calcular: Medir em três pontos: início da query, fim do retrieval, fim da geração. P95 (não P50) porque o tail latency é o que o usuário mais sente.
Threshold sugerido: TTFT P95 > 3s → alerta; total P95 > 15s → alerta
O que fazer quando falha: Profiling por subsistema — onde está o gargalo? Retrieval lento? LLM com alta carga? Contexto muito grande?
Métrica 5 — No-Answer Rate (Abstention Rate)
O que mede: Com que frequência o agente responde "não sei" ou recusa responder por falta de contexto relevante.
Como calcular: Classificar respostas como "abstention" quando contêm padrões de recusa ("não encontrei informações", "não tenho dados sobre", etc.) ou quando o retrieval retorna score abaixo do threshold.
Threshold sugerido: > 15% → investigar; > 30% → crítico (base de conhecimento inadequada)
O que fazer quando falha: Auditar o escopo da base de conhecimento vs. escopo das queries reais. Identificar as categorias de perguntas sem resposta e decidir: expandir a base ou comunicar limitação ao usuário.
Template de Dashboard
Abaixo o template de dashboard Grafana/JSON para monitorar as 5 métricas. Adapte os datasources para sua infraestrutura.
# Template: configuração de dashboard em código (Grafana-as-code com Grafonnet)
# Ou use diretamente como referência para criar via UI
DASHBOARD_CONFIG = {
"title": "RAG Agent — Production Monitoring",
"refresh": "1m",
"panels": [
{
"title": "Retrieval Relevance Score",
"type": "timeseries",
"targets": ["avg(rag_retrieval_relevance_score) by (1m)"],
"thresholds": [
{"value": 0.70, "color": "yellow"},
{"value": 0.60, "color": "red"}
],
"position": {"x": 0, "y": 0, "w": 12, "h": 8}
},
{
"title": "Context Faithfulness Score",
"type": "timeseries",
"targets": ["avg(rag_faithfulness_score) by (1m)"],
"thresholds": [
{"value": 0.80, "color": "yellow"},
{"value": 0.60, "color": "red"}
],
"position": {"x": 12, "y": 0, "w": 12, "h": 8}
},
{
"title": "Answer Relevance Score",
"type": "timeseries",
"targets": ["avg(rag_answer_relevance_score) by (1m)"],
"thresholds": [{"value": 0.75, "color": "yellow"}],
"position": {"x": 0, "y": 8, "w": 12, "h": 8}
},
{
"title": "E2E Latency P95 (ms)",
"type": "timeseries",
"targets": [
"histogram_quantile(0.95, rag_latency_ms_bucket{stage='retrieval'})",
"histogram_quantile(0.95, rag_latency_ms_bucket{stage='generation'})",
"histogram_quantile(0.95, rag_latency_ms_bucket{stage='total'})"
],
"thresholds": [
{"value": 3000, "color": "yellow"}, # TTFT
{"value": 15000, "color": "red"} # total
],
"position": {"x": 12, "y": 8, "w": 12, "h": 8}
},
{
"title": "No-Answer Rate (%)",
"type": "stat",
"targets": [
"rate(rag_abstention_total[5m]) / rate(rag_requests_total[5m]) * 100"
],
"thresholds": [
{"value": 15, "color": "yellow"},
{"value": 30, "color": "red"}
],
"position": {"x": 0, "y": 16, "w": 8, "h": 6}
},
{
"title": "Requests per minute",
"type": "stat",
"targets": ["rate(rag_requests_total[1m]) * 60"],
"position": {"x": 8, "y": 16, "w": 8, "h": 6}
},
{
"title": "Error Rate (%)",
"type": "stat",
"targets": [
"rate(rag_errors_total[5m]) / rate(rag_requests_total[5m]) * 100"
],
"thresholds": [
{"value": 1, "color": "yellow"},
{"value": 5, "color": "red"}
],
"position": {"x": 16, "y": 16, "w": 8, "h": 6}
}
]
}
Instrumentação: como emitir essas métricas
from opentelemetry import metrics
import time
meter = metrics.get_meter("rag-agent")
# Histogramas para latência
latency_histogram = meter.create_histogram(
"rag_latency_ms",
description="E2E latency por stage",
unit="ms"
)
# Gauges para scores de qualidade
relevance_gauge = meter.create_observable_gauge(
"rag_retrieval_relevance_score",
callbacks=[lambda obs: obs.observe(current_relevance_score)]
)
# Counters para abstentions
abstention_counter = meter.create_counter("rag_abstention_total")
request_counter = meter.create_counter("rag_requests_total")
class InstrumentedRAGAgent:
def query(self, user_query: str) -> dict:
request_counter.add(1)
start = time.time()
# Stage 1: Retrieval
retrieval_start = time.time()
docs, relevance_score = self.retrieval.search(user_query)
latency_histogram.record(
(time.time() - retrieval_start) * 1000,
{"stage": "retrieval"}
)
# Stage 2: Generation
gen_start = time.time()
response, faithfulness = self.llm.generate(user_query, docs)
latency_histogram.record(
(time.time() - gen_start) * 1000,
{"stage": "generation"}
)
# Total
latency_histogram.record(
(time.time() - start) * 1000,
{"stage": "total"}
)
# Detectar abstention
if self._is_abstention(response):
abstention_counter.add(1)
return {"response": response, "relevance": relevance_score}
Como isso se conecta
- 12-03-03 (A/B Testing): Use as 5 métricas como critério de comparação nos seus A/B tests de prompts e modelos.
- 12-03-04 (Drift Detection): Retrieval relevance e faithfulness são os primeiros indicadores de data drift em sistemas RAG.
- 09-xx (RAG): As métricas do desafio são diretamente aplicáveis a qualquer arquitetura RAG do módulo 9.
- 12-03-01 (Alertas e SLOs): As 5 métricas precisam de SLOs definidos formalmente e alertas configurados para fechar o loop de observabilidade.
- 13-xx (Governança): Dashboards de observabilidade são evidência de conformidade em auditorias de sistemas de IA.
Fontes
- Es, S. et al. (2023). RAGAS: Automated Evaluation of Retrieval Augmented Generation. arXiv:2309.15217. — Framework de referência para as métricas de faithfulness e answer relevance.
- LangChain. (2024). LangSmith Evaluation Framework. docs.smith.langchain.com — Implementação prática de evals para RAG.
- Garg, S. et al. (2024). ARES: An Automated Evaluation Framework for RAG Systems. arXiv:2311.09476. — Alternativa ao RAGAS com foco em automação.
- Grafana Labs. (2024). Best Practices for LLM Observability Dashboards. grafana.com