Avaliação offline: lm-eval-harness, deepeval local
⏱ 12 min·⭐ 60 XP
Pré-requisitos (0/1)0%
- ⬜🔒 RAG 100% local e privado: LanceDB, Ollama, Qdrant local(Local LLMs & Edge AI)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Por que avaliar localmente
Você fine-tunou um Qwen 2.5 para o seu domínio. Como saber se ficou melhor? Como saber se uma quantização Q5_K_M perdeu mais qualidade do que Q4_K_M valeria a economia de VRAM? Bench offline respondem isso sem chamar API paga. Stack: lm-eval-harness para benchmarks acadêmicos + deepeval/promptfoo para benchmarks customizados de domínio.
lm-evaluation-harness em 3 comandos
# Setup
pip install lm-eval
# Subir Ollama
ollama serve &
ollama pull qwen2.5:14b
# Rodar MMLU contra Qwen 2.5 local (5-shot, padrão)
lm_eval \
--model openai-completions \
--model_args base_url=http://localhost:11434/v1,model=qwen2.5:14b \
--tasks mmlu \
--output_path results/
# Rodar suite completa (várias horas)
lm_eval --model ... --tasks mmlu,gsm8k,humaneval,ifeval,gpqa_diamond,bbh \
--output_path results/Os benchmarks que importam
| Benchmark | Mede | Top scores 2026 |
|---|---|---|
| MMLU | Conhecimento academic geral | ~92% (frontier), ~75-85% (open ~14B) |
| GSM8K | Matemática grade school | ~95%+ (frontier) |
| HumanEval / MBPP | Code generation | Saturado — usar LiveCodeBench |
| LiveCodeBench | Code real, continuamente atualizado | Métrica viva |
| IFEval | Instruction following exato | Crítico para produção |
| GPQA-Diamond | PhD-level science questions | ~75%+ (frontier), ~45-60% open |
| BBH (Big-Bench Hard) | Reasoning multi-step | Bom indicador geral |
| MT-Bench / Arena Hard | Conversação multi-turn | LLM-as-judge |
| MUSR | Reasoning narrativa longa | Stress test de longo contexto |
BenchmarkMMLU
MedeConhecimento academic geral
Top scores 2026~92% (frontier), ~75-85% (open ~14B)
BenchmarkGSM8K
MedeMatemática grade school
Top scores 2026~95%+ (frontier)
BenchmarkHumanEval / MBPP
MedeCode generation
Top scores 2026Saturado — usar LiveCodeBench
BenchmarkLiveCodeBench
MedeCode real, continuamente atualizado
Top scores 2026Métrica viva
BenchmarkIFEval
MedeInstruction following exato
Top scores 2026Crítico para produção
BenchmarkGPQA-Diamond
MedePhD-level science questions
Top scores 2026~75%+ (frontier), ~45-60% open
BenchmarkBBH (Big-Bench Hard)
MedeReasoning multi-step
Top scores 2026Bom indicador geral
BenchmarkMT-Bench / Arena Hard
MedeConversação multi-turn
Top scores 2026LLM-as-judge
BenchmarkMUSR
MedeReasoning narrativa longa
Top scores 2026Stress test de longo contexto
deepeval — benchmark do SEU domínio
from deepeval import evaluate
from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
from deepeval.test_case import LLMTestCase
# Defina seus test cases (golden set do domínio)
cases = [
LLMTestCase(
input='Qual a cláusula de rescisão típica em contrato de SaaS BR?',
actual_output=meu_modelo_responde('Qual a cláusula...'),
expected_output='Cláusula típica inclui notice period de 30 dias...',
retrieval_context=['<docs recuperados pelo RAG>']
),
# ... mais 50-200 casos
]
# Métricas
metrics = [
AnswerRelevancyMetric(threshold=0.8, model='qwen2.5:14b'), # juiz local!
FaithfulnessMetric(threshold=0.85, model='qwen2.5:14b'),
]
# Avalia
results = evaluate(test_cases=cases, metrics=metrics)💡
deepeval permite usar LLM-as-judge com modelo LOCAL (Ollama) — sem mandar nada para OpenAI. Útil para compliance corporativo.
Quiz rápido
Você quantizou um modelo para economizar memória. Como decidir se a perda de qualidade compensa?
promptfoo — eval declarativa em YAML
# promptfooconfig.yaml
prompts:
- 'Resuma o documento: {{document}}'
providers:
- id: ollama:qwen2.5:14b
- id: ollama:llama3.3:70b
tests:
- vars:
document: 'Lorem ipsum dolor...'
assert:
- type: contains
value: 'palavra-chave'
- type: llm-rubric
value: 'Resume preserva fatos principais sem alucinar'
provider: ollama:qwen2.5:14b # juiz local
- vars:
document: '{{file:./docs/long.txt}}'
assert:
- type: similarity
value: 'Esperado resumo conciso'
threshold: 0.7Rodarnpx promptfoo eval
CI integrationFalha PR se métrica cai > limiar
Compare side-by-sideMúltiplos providers no mesmo run
Web UInpx promptfoo view abre dashboard local com diffs
Workflow real — antes/depois de quantizar
# Baseline: modelo FP16 não quantizado
lm_eval --model ... --model_args=model=qwen2.5:14b-fp16 \
--tasks mmlu,gsm8k,ifeval --output_path baseline/
# Após quantizar Q4_K_M
lm_eval --model ... --model_args=model=qwen2.5:14b-q4_k_m \
--tasks mmlu,gsm8k,ifeval --output_path q4_k_m/
# Diff
python -m lm_eval.scripts.diff baseline/ q4_k_m/
# Saída esperada: 2-4% drop em cada métrica — aceitável para 4x economia VRAMPerguntas frequentes
❓ Como avaliar modelo local sem depender de serviço externo?
Com arcabouço de avaliação executado na própria máquina, sobre conjunto próprio, usando critério programático onde possível e um modelo local como juiz onde não é. A limitação honesta é o juiz: modelo pequeno julga pior, e é preciso ancorar com casos corrigidos à mão.
❓ Benchmark padrão serve para modelo local?
Serve para comparar candidatos entre si e para detectar quantização que degradou. Não serve para prever desempenho na sua tarefa — e é justamente para isso que a maioria o usa. Conjunto próprio com vinte casos informa mais que benchmark inteiro.
❓ Como medir o efeito da quantização?
Rodando o mesmo conjunto no modelo em precisão original e no quantizado, e olhando onde a diferença aparece. Ela costuma ser pequena até certo ponto e desabar depois — e o ponto varia por modelo e por tarefa, o que torna a medição própria obrigatória.
Fixando
Quiz rápido
Por que um benchmark de código antigo é descrito como saturado, e o que se usa no lugar?
Quiz rápido
Qual é a vantagem de usar um modelo local como juiz na avaliação?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…