12-03-02 — Avaliacoes offline: ground truth, LLM-as-judge, RAGAS, DeepEval
TL;DR
Avaliacoes offline rodam antes de ir para producao — sobre datasets curados, sem usuarios reais. O pipeline basico e: (1) criar dataset com pares input/resposta esperada, (2) rodar o sistema sob avaliacao, (3) comparar com ground truth ou usar LLM-as-judge. RAGAS e o framework padrao para RAG. DeepEval e mais generico e tem integracao com CI/CD. Ambos rodam no seu pipeline antes de qualquer deploy.
O que sao avaliacoes offline
Analogia: testes unitarios e de integracao para software sao avaliacoes offline. Voce nao descobre que a funcao esta quebrada em producao — voce tem um suite de testes que roda no CI e bloqueia o deploy se algo falhar.
Para LLMs, o equivalente e um eval suite que roda antes de cada deploy e diz: "A qualidade desse novo prompt/modelo e pelo menos tao boa quanto a versao anterior?"
Ground Truth: a base de tudo
Ground truth e um dataset de pares (pergunta, resposta_correta) validado por humanos. E o ativo mais valioso para avaliacao de IA.
Como construir um dataset de ground truth
- Curadoria de producao: Amostre 200-500 conversas reais, peça especialistas para rotular respostas ideais
- Casos de borda: Inclua intencionalmente perguntas dificeis, ambiguas e edge cases
- Cobertura de dominio: Garanta representacao de todos os topicos que o sistema deve cobrir
- Versionamento: Trate o dataset como codigo — versione no Git, documente mudancas
LLM-as-Judge
Quando ground truth exato e impossivel (respostas abertas, analises), use outro LLM para avaliar. O judge recebe: (pergunta, resposta_do_sistema, criterios) e retorna um score com justificativa.
from openai import AzureOpenAI
JUDGE_PROMPT = """Voce e um avaliador especializado. Avalie a resposta do assistente com base nos criterios:
CRITERIOS:
1. CORRETUDE (0-10): A resposta e factualmente correta?
2. RELEVANCIA (0-10): A resposta aborda diretamente a pergunta?
3. COMPLETUDE (0-10): A resposta cobre todos os aspectos importantes?
PERGUNTA: {question}
RESPOSTA DO ASSISTENTE: {answer}
RESPOSTA DE REFERENCIA: {reference}
Responda em JSON: {{"corretude": X, "relevancia": X, "completude": X, "justificativa": "..."}}"""
def llm_judge(question: str, answer: str, reference: str, judge_model="gpt-4o") -> dict:
judge_client = AzureOpenAI(...)
response = judge_client.chat.completions.create(
model=judge_model,
response_format={"type": "json_object"},
messages=[{
"role": "user",
"content": JUDGE_PROMPT.format(
question=question, answer=answer, reference=reference
)
}]
)
import json
result = json.loads(response.choices[0].message.content)
result["score_medio"] = (result["corretude"] + result["relevancia"] + result["completude"]) / 30
return result
# Uso
scores = llm_judge(
question="Quais clientes estao abaixo da meta no Q1?",
answer="Os clientes ACME (-15%) e Globo (-8%) estao abaixo da meta.",
reference="ACME, Globo e Vale estao abaixo da meta com deficit de 15%, 8% e 3% respectivamente."
)
print(scores)
# {"corretude": 7, "relevancia": 10, "completude": 6, "score_medio": 0.77, ...}
RAGAS — Avaliacao de RAG
RAGAS (Retrieval Augmented Generation Assessment) e um framework focado em pipelines RAG. Mede tanto a qualidade do retrieval quanto da geracao.
Metricas principais do RAGAS
| Metrica | O que mede | Ideal |
|---|---|---|
| Faithfulness | A resposta e suportada pelos documentos recuperados? | 1.0 |
| Answer Relevancy | A resposta e relevante para a pergunta? | 1.0 |
| Context Precision | Os documentos recuperados sao relevantes? | 1.0 |
| Context Recall | O contexto contem as informacoes necessarias? | 1.0 |
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall
from ragas.llms import LangchainLLMWrapper
from langchain_openai import AzureChatOpenAI
from datasets import Dataset
# Dataset para avaliacao
data = {
"question": [
"Quais clientes estao abaixo da meta?",
"Qual o ticket medio em SP?",
],
"answer": [
"ACME e Globo estao 15% e 8% abaixo da meta.",
"O ticket medio em SP e R$ 45.230.",
],
"contexts": [
[
"ACME: meta R$ 500k, realizado R$ 425k (-15%)",
"Globo: meta R$ 300k, realizado R$ 276k (-8%)",
],
["SP - ticket medio: R$ 45.230 (Q1 2025)"],
],
"ground_truth": [
"ACME (-15%), Globo (-8%) e Vale (-3%) estao abaixo da meta.",
"Ticket medio em SP: R$ 45.230",
]
}
dataset = Dataset.from_dict(data)
llm = AzureChatOpenAI(model="gpt-4o", ...)
langchain_llm = LangchainLLMWrapper(llm)
results = evaluate(
dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
llm=langchain_llm,
)
print(results.to_pandas()[["faithfulness", "answer_relevancy", "context_precision", "context_recall"]])
DeepEval — Evals em CI/CD
DeepEval e um framework de testes para LLMs com sintaxe inspirada em pytest. Ideal para integrar evals no pipeline de CI/CD e bloquear deploys com regressao.
# test_agent_quality.py
import pytest
from deepeval import assert_test
from deepeval.metrics import (
AnswerRelevancyMetric,
FaithfulnessMetric,
HallucinationMetric
)
from deepeval.test_case import LLMTestCase
@pytest.mark.parametrize("question,expected_contains", [
("Quais clientes abaixo da meta?", "ACME"),
("Ticket medio SP?", "45.230"),
])
def test_agent_responde_corretamente(question, expected_contains):
# Executar agente
response = meu_agente.responder(question)
test_case = LLMTestCase(
input=question,
actual_output=response.content,
retrieval_context=response.context_docs,
)
# Metricas com threshold
relevancy_metric = AnswerRelevancyMetric(threshold=0.7, model="gpt-4o")
faithfulness_metric = FaithfulnessMetric(threshold=0.8, model="gpt-4o")
assert_test(test_case, [relevancy_metric, faithfulness_metric])
assert expected_contains in response.content
# Rodar: pytest test_agent_quality.py --deepeval
# Se score < threshold, o teste falha e o CI bloqueia o deploy
Use Azure AI Foundry Evaluations para evals gerenciados dentro do ecossistema Microsoft. O Foundry SDK tem suporte nativo a RAGAS-style metrics e integra com Azure Pipelines para CI/CD.
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import Evaluation, EvaluatorConfiguration
client = AIProjectClient.from_connection_string(os.environ["AIPROJECT_CONNECTION_STRING"])
# Executar avaliacao no Foundry
evaluation = client.evaluations.create(
evaluation=Evaluation(
display_name="eval-sales-agent-v2",
data=client.upload_file("test_dataset.jsonl"),
evaluators={
"relevance": EvaluatorConfiguration(id="azureml://built-in-eval/relevance"),
"groundedness": EvaluatorConfiguration(id="azureml://built-in-eval/groundedness"),
}
)
)
Como isso se conecta
- 12-03-01 Metricas: As metricas definidas ali sao o que os frameworks de eval medem
- 12-03-03 Avaliacoes online: Evals offline sao o baseline — online mede desvios em producao
- 12-02-01 LangSmith: LangSmith tem eval suite integrado que usa a mesma abordagem
- 09 Foundry: Azure AI Foundry Evaluations e a versao Microsoft desses frameworks