12-03-05 — Desafio: Defina 5 Métricas para Monitorar um Agente RAG em Produção

⏱ 8 min Fontes validadas em: 2026-04-29

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.

🎯 Instrução do desafio: Pare aqui. Pegue papel ou abra um editor. Escreva suas 5 métricas antes de continuar lendo. Justifique cada uma: o que ela mede, por que importa, e o que fazer quando sai do threshold.

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:

  1. Retrieval: busca vetorial + reranking → documentos candidatos
  2. Augmentation: montagem do contexto → prompt final
  3. 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.

⚠️ Armadilha: Alta similaridade coseno ≠ documentos úteis. Um chunk de 5 palavras pode ter score 0.95 mas não conter informação suficiente. Combine com context coverage (abaixo).

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.

💡 Bônus — Métrica 6 (para sistemas críticos): Human Escalation Rate — frequência com que usuários pedem para falar com humano ou revisam/corrigem a resposta do agente. Proxy poderoso de insatisfação mesmo sem feedback explícito.

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

  1. 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.
  2. LangChain. (2024). LangSmith Evaluation Framework. docs.smith.langchain.com — Implementação prática de evals para RAG.
  3. Garg, S. et al. (2024). ARES: An Automated Evaluation Framework for RAG Systems. arXiv:2311.09476. — Alternativa ao RAGAS com foco em automação.
  4. Grafana Labs. (2024). Best Practices for LLM Observability Dashboards. grafana.com