12-03-02 — Avaliacoes offline: ground truth, LLM-as-judge, RAGAS, DeepEval

⏱ 15 minFontes validadas em: 2026-04-29

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

  1. Curadoria de producao: Amostre 200-500 conversas reais, peça especialistas para rotular respostas ideais
  2. Casos de borda: Inclua intencionalmente perguntas dificeis, ambiguas e edge cases
  3. Cobertura de dominio: Garanta representacao de todos os topicos que o sistema deve cobrir
  4. 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

MetricaO que medeIdeal
FaithfulnessA resposta e suportada pelos documentos recuperados?1.0
Answer RelevancyA resposta e relevante para a pergunta?1.0
Context PrecisionOs documentos recuperados sao relevantes?1.0
Context RecallO 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
💡 Estrategia de eval para times .NET
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

Fontes

  1. RAGAS Documentation — RAG evaluation framework (2025)
  2. DeepEval Documentation — LLM evaluation for CI/CD (2025)
  3. Microsoft Docs — Evaluate your generative AI app with Azure AI Foundry (2025)
  4. RAGAS: Automated Evaluation of Retrieval Augmented Generation (2023)