Avaliação de LLMs com DeepEval e Ragas: Guia Prático para 2026
Guia prático de avaliação de LLMs em 2026 com DeepEval e Ragas: métricas que importam, código Python real, integração com CI/CD via GitHub Actions e técnicas comprovadas para detectar alucinações antes do deploy.
A avaliação de LLMs é o processo sistemático de medir a qualidade, precisão e segurança das respostas de modelos de linguagem grande usando métricas objetivas, conjuntos de testes e juízes automatizados, em vez de inspeção manual ad-hoc. Em 2026, dois frameworks open-source dominam o ecossistema Python: DeepEval, focado em testes unitários estilo pytest para qualquer aplicação LLM, e Ragas, especializado em avaliar pipelines RAG (Retrieval-Augmented Generation). Este guia mostra, com código real e métricas concretas, como integrar ambos em sua pipeline de CI/CD e parar de "achar" que seu modelo está bom.
DeepEval funciona como o pytest para LLMs: cada teste assertEqual vira um assert_test() com métricas como G-Eval, hallucination e bias.
Ragas calcula quatro métricas centrais para RAG (faithfulness, answer relevancy, context precision e context recall) com versão 0.2+ usando LLM-as-a-Judge por padrão.
LLM-as-a-Judge usa GPT-4o, Claude Opus 4.7 ou Gemini 2.5 Pro como avaliador; correlação com julgamento humano fica entre 0.7 e 0.85 em benchmarks recentes.
Ambos os frameworks integram com Langfuse, OpenTelemetry e GitHub Actions, permitindo bloquear PRs que regridem em métricas críticas.
Conjuntos sintéticos gerados pelo próprio Ragas (testset generator) reduzem custo de criação de golden datasets em até 90%.
O custo de avaliar 1.000 amostras com GPT-4o como juiz fica em torno de US$ 8–15 dependendo do tamanho do contexto.
O que é avaliação de LLMs e por que importa
Avaliação de LLMs (frequentemente chamada de LLM evals) é a disciplina de transformar julgamento subjetivo sobre respostas de modelos em sinais numéricos reprodutíveis. Sem evals, equipes confiam em "vibes". Alguém roda 10 prompts, acha bom, dá deploy. Já vi isso acontecer mais vezes do que gostaria. Quando o modelo regride após um fine-tune, mudança de prompt ou upgrade de versão (GPT-4o → GPT-5, Claude Sonnet 4.5 → 4.6), ninguém percebe até um usuário reclamar.
O ciclo correto tem quatro etapas: (1) construir um conjunto de avaliação (golden dataset) com 50–500 exemplos representativos; (2) definir métricas que reflitam o que importa para o negócio (fidelidade ao contexto para RAG, ausência de viés para chatbots públicos, formato JSON válido para APIs estruturadas); (3) rodar evals automatizados em cada mudança; (4) bloquear releases quando métricas críticas regridem além de um limiar.
O impacto é mensurável. Segundo o paper original "Judging LLM-as-a-Judge with MT-Bench", juízes GPT-4 atingem 85% de concordância com avaliadores humanos especialistas, taxa equivalente à concordância entre dois humanos. Isso tornou viável escalar avaliação para milhares de amostras sem orçamento de anotação humana proibitivo.
DeepEval vs Ragas: qual escolher
Os dois frameworks resolvem problemas diferentes. DeepEval é genérico e roda como o pytest: você escreve test_*.py com asserts sobre saídas de qualquer LLM. Ragas é especializado em RAG e foca em quatro métricas canônicas que medem se o seu sistema de recuperação está alimentando o gerador com o contexto certo. A tabela abaixo compara as dimensões que realmente diferenciam os dois.
Regra prática: se você está construindo um chatbot, agente ou classificador, comece com DeepEval. Se você está construindo RAG sobre uma base de documentos, comece com Ragas e adicione DeepEval depois para testes de segurança e formato. Os dois podem coexistir no mesmo projeto — eu uso ambos em produção há cerca de oito meses.
Métricas essenciais para avaliar LLMs em 2026
Antes de escolher framework, é preciso entender o que cada métrica realmente mede. As cinco abaixo cobrem 80% dos casos de uso reais.
Faithfulness (fidelidade)
Mede se a resposta gerada contém apenas afirmações sustentáveis pelo contexto recuperado. Funciona extraindo cada afirmação da resposta com um LLM e verificando se cada uma pode ser inferida do contexto. Pontuação 1.0 = nenhuma afirmação não-suportada. É a métrica anti-alucinação por excelência em RAG.
Answer Relevancy
Avalia quão diretamente a resposta endereça a pergunta. O Ragas gera N perguntas reversas a partir da resposta e calcula similaridade cosseno com a pergunta original. Respostas evasivas ou tangenciais caem para 0.4–0.6.
Context Precision e Context Recall
Precision mede se os documentos recuperados relevantes aparecem nos primeiros postos do ranking (sinal para retriever). Recall mede se TODA informação necessária para responder está presente no contexto (sinal para chunking e índice).
G-Eval
Métrica genérica do DeepEval onde você descreve em linguagem natural o critério ("a resposta deve ser educada e em português brasileiro") e o framework gera automaticamente os steps de avaliação usando chain-of-thought. Ideal para critérios de produto não cobertos por métricas pré-definidas.
Hallucination, Bias e Toxicity
Detectam respostas factualmente erradas (alucinação), enviesadas por gênero/raça/idade (bias) e tóxicas ou ofensivas (toxicity). Essenciais para qualquer LLM com interface pública.
Avaliando um chatbot com DeepEval passo a passo
Vou mostrar como avaliar um chatbot de suporte técnico em Python. Instale DeepEval 2.x e configure a chave do OpenAI (qualquer modelo OpenAI-compatível funciona, incluindo Azure e Ollama local).
Crie um arquivo test_chatbot.py com um teste por caso de uso:
import pytest
from deepeval import assert_test
from deepeval.test_case import LLMTestCase
from deepeval.metrics import (
AnswerRelevancyMetric,
HallucinationMetric,
GEval,
)
from deepeval.test_case import LLMTestCaseParams
# Seu cliente LLM real (OpenAI, Anthropic, vLLM local)
from meu_chatbot import responder
@pytest.mark.parametrize(
"pergunta,contexto",
[
(
"Como reseto minha senha?",
["Para resetar a senha, acesse /conta/senha e clique em 'Esqueci'."],
),
(
"Qual o horario de atendimento?",
["Atendemos de segunda a sexta, das 9h as 18h, horario de Brasilia."],
),
],
)
def test_chatbot(pergunta, contexto):
resposta = responder(pergunta, contexto)
caso = LLMTestCase(
input=pergunta,
actual_output=resposta,
retrieval_context=contexto,
context=contexto,
)
relevancia = AnswerRelevancyMetric(threshold=0.7, model="gpt-4o-mini")
alucinacao = HallucinationMetric(threshold=0.3, model="gpt-4o-mini")
tom = GEval(
name="Tom profissional",
criteria="A resposta deve ser educada, em PT-BR, e nao usar girias.",
evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT],
threshold=0.8,
model="gpt-4o-mini",
)
assert_test(caso, [relevancia, alucinacao, tom])
Rodar é igual ao pytest: deepeval test run test_chatbot.py. O comando exporta um relatório HTML com pontuações por métrica, motivo do juiz (chain-of-thought) e pass/fail por threshold. Eu costumo configurar threshold de 0.7 para relevancy e 0.3 para hallucination. Ou seja, no máximo 30% de afirmações não-suportadas.
Avaliando uma pipeline RAG com Ragas
Para RAG, Ragas é mais ergonômico. Instale a versão 0.2+ e prepare um EvaluationDataset com quatro colunas: user_input, response, retrieved_contexts e reference. Para conectar com nosso conteúdo anterior sobre pipelines RAG em produção, este passo se encaixa após a etapa de geração e antes do deploy.
pip install -U "ragas>=0.2.10" datasets
from ragas import EvaluationDataset, evaluate
from ragas.metrics import (
Faithfulness,
ResponseRelevancy,
LLMContextPrecisionWithReference,
LLMContextRecall,
)
from ragas.llms import LangchainLLMWrapper
from langchain_openai import ChatOpenAI
juiz = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o", temperature=0))
# Cada amostra reflete uma chamada real da sua pipeline
amostras = [
{
"user_input": "Qual e a politica de devolucao?",
"retrieved_contexts": [
"Devolucoes sao aceitas em ate 30 dias apos a compra...",
"Produtos perecíveis nao sao elegiveis para devolucao...",
],
"response": "Voce tem 30 dias para devolver, exceto perecíveis.",
"reference": "30 dias, excluindo perecíveis.",
},
# ... mais 49 amostras representativas
]
dataset = EvaluationDataset.from_list(amostras)
resultado = evaluate(
dataset=dataset,
metrics=[
Faithfulness(llm=juiz),
ResponseRelevancy(llm=juiz),
LLMContextPrecisionWithReference(llm=juiz),
LLMContextRecall(llm=juiz),
],
)
print(resultado)
df = resultado.to_pandas()
df.to_csv("ragas_run_2026_06_17.csv", index=False)
O retorno é um DataFrame onde cada linha tem as quatro pontuações entre 0 e 1. Em produção, eu rodo Ragas duas vezes por semana sobre 200 amostras amostradas do tráfego real (anonimizadas) e plotando médias móveis no Grafana. Quedas súbitas em context_precision geralmente indicam que mudei o chunking; quedas em faithfulness indicam que o prompt do gerador permitiu mais especulação.
Para gerar um dataset sintético inicial quando você não tem dados de tráfego, use o TestsetGenerator:
LLM-as-a-Judge é o padrão de usar um modelo (normalmente mais forte que o avaliado) como juiz das respostas. O juiz recebe a pergunta, a resposta candidata e, opcionalmente, uma referência, e retorna uma pontuação numérica com justificativa em chain-of-thought. Substituiu praticamente todas as métricas baseadas em n-grams (BLEU, ROUGE) para tarefas abertas porque correlaciona muito melhor com julgamento humano.
Use LLM-as-a-Judge quando: (1) a tarefa permite múltiplas respostas válidas (resumir, conversar, gerar código, escolher ferramentas em agentes com function calling); (2) você não tem golden answers exatas; (3) precisa avaliar critérios subjetivos como tom, clareza ou utilidade. Evite quando: (1) há uma resposta canônica única e barata de verificar com regex/parsing; (2) custo importa e há milhões de amostras (use modelos menores como juízes ou um destilado fine-tunado).
Para reduzir viés do juiz, três técnicas comprovadas: position swapping (rodar A→B e B→A em comparações pareadas), multi-judge (combinar GPT-4o + Claude Opus 4.7 e usar mediana), e reference-based (sempre que possível, fornecer a referência ao juiz em vez de pedir avaliação absoluta).
Como detectar alucinações em produção
Alucinações em produção exigem uma estratégia de duas camadas: detecção offline (em CI) e detecção online (durante inferência). Offline, use o FaithfulnessMetric do Ragas ou o HallucinationMetric do DeepEval sobre amostras de tráfego real. Online, três técnicas funcionam bem:
Self-check via logprobs: peça ao modelo para classificar sua própria resposta como "confiante" ou "incerto"; se a probabilidade do token "confiante" for menor que 0.7, marque a resposta para revisão humana.
SelfCheckGPT: gere 3–5 respostas com temperatura alta e meça consistência entre elas. Inconsistência alta = provável alucinação. Custa 3–5x mais por requisição mas detecta 70%+ dos casos.
Verificação contra contexto: em RAG, rode um segundo LLM barato (GPT-4o-mini, Haiku 4.5) que extrai cada afirmação da resposta e verifica presença literal ou parafrásica no contexto. Bloqueia respostas com mais de 30% de afirmações não-suportadas.
O passo compare_baseline.py compara as pontuações do PR contra as do main armazenadas em S3 e falha o job se qualquer métrica regredir mais que 5%. Isso impede que melhorias em uma dimensão escondam quedas em outra.
Observabilidade com Langfuse e OpenTelemetry
Evals offline em CI não capturam degradação em produção. Para isso, instrumente cada chamada LLM com Langfuse ou OpenTelemetry. Langfuse 3.0 (lançado em março de 2026) tem integração nativa com DeepEval e Ragas: traces enviados durante inferência são automaticamente avaliados em background usando as mesmas métricas do CI.
Dashboards mostram médias móveis das métricas por modelo, prompt version e segmento de usuário. Para fundamentos de instrumentação distribuída, a especificação Semantic Conventions for GenAI da OpenTelemetry é leitura obrigatória. Define atributos padronizados (gen_ai.system, gen_ai.request.model) que funcionam com qualquer backend (Langfuse, Datadog, Honeycomb).
Para o estado da arte em avaliação de RAG especificamente, a documentação oficial do Ragas mantém uma matriz atualizada de quais métricas fazem sentido para cada arquitetura (clássica, agentic, multi-hop).
Perguntas Frequentes
Qual a diferença entre DeepEval e Ragas?
DeepEval é um framework genérico tipo pytest com 14+ métricas (G-Eval, hallucination, bias) para qualquer LLM. Ragas é especializado em RAG com 8 métricas centradas em retrieval e geração (faithfulness, answer relevancy, context precision/recall). Use DeepEval para chatbots e agentes; use Ragas para pipelines RAG sobre bases de documentos. Os dois podem rodar juntos no mesmo projeto.
Quanto custa avaliar 1.000 respostas com LLM-as-a-Judge?
Usando GPT-4o como juiz, espere US$ 8–15 para 1.000 amostras com contextos de 1–2k tokens. Com GPT-4o-mini ou Claude Haiku 4.5 como juiz, cai para US$ 1–3, mas a correlação com humanos diminui de ~0.85 para ~0.7. Para CI/CD, rode amostras menores (50–100) em cada PR e datasets completos só semanalmente.
Como criar um golden dataset sem ter dados de produção?
Use o TestsetGenerator do Ragas ou o Synthesizer do DeepEval para gerar perguntas sintéticas a partir dos seus documentos. Comece com 50 amostras geradas, revise manualmente por 1–2 horas para remover questões triviais ou ambíguas, e expanda para 200–500 conforme o produto evolui. Sintético + curadoria humana custa ~10% do tempo de criar tudo do zero.
LLM-as-a-Judge tem viés contra respostas curtas?
Sim, e pesquisas de 2024–2025 mostram que GPT-4 e Claude tendem a preferir respostas mais longas e estruturadas, mesmo quando informações curtas são equivalentes. Mitigue usando avaliação pareada com position swapping, multi-judge (combine GPT-4o + Claude Opus + mediana), ou critérios G-Eval explícitos que penalizem verbosidade ("recompense concisão quando a resposta completa cabe em menos de 100 palavras").
Posso rodar Ragas e DeepEval com modelos locais (Ollama, vLLM)?
Sim. Ambos suportam qualquer backend OpenAI-compatível. Para Ollama, aponte OPENAI_BASE_URL para http://localhost:11434/v1. Para vLLM, idem com a porta do servidor. Como juiz, modelos menores que Llama 3.3 70B ou Qwen 2.5 72B costumam ter correlação baixa com humanos. Fique acima desse tamanho ou aceite ruído maior nas métricas.
Guia prático de structured outputs em LLMs com JSON Schema: implementação em OpenAI, Anthropic e Gemini, unificação via Instructor e Pydantic-AI, armadilhas de produção e como validar respostas com segurança.
Langfuse (MIT, self-host) vs Helicone (proxy 5 min) vs Arize Phoenix (eval rigoroso): comparação prática de observabilidade LLM em 2026, com código OpenTelemetry, métricas e o dashboard que você vai desejar ter construído primeiro.
Compare como Anthropic, OpenAI e Google implementam cache de prompts em 2026: TTLs, preços, exemplos de código em Python e as regras práticas para maximizar hits em produção e cortar até 90% do custo de tokens de entrada.