Evaluations¶
评测衡量训练好的模型在留出数据上的表现。Mint Recursive 支持三种评测方式:benchmark 指标(exact match、BLEU、自定义函数)、在测试集上采样补全,以及用单独的 evaluator 模型做 LLM-as-judge 打分。
Concept¶
评测在训练循环之外进行。你从 checkpoint 创建一个 SamplingClient,再在测试集上做补全。结果按下面几种方式打分:
- Exact match —— 模型输出是否与目标完全一致?适合答案确定的任务(数学、代码、事实题)。
- 自定义指标函数 —— 用户自己写打分器,计算任务特定指标(BLEU、ROUGE、F1、任务成功率)。
- LLM-as-judge —— 用单独的 evaluator 模型给补全质量打分。适合主观任务(helpfulness、coherence、风格),exact match 不适用的场合。
所有评测结果都按结构化格式(JSONL)记录,用于分析和报告。
Pattern¶
from mint import types
from mint.completers import TinkerMessageCompleter
# 加载训练好的 checkpoint
service_client = mint.ServiceClient()
sampling_client = service_client.create_sampling_client_from_checkpoint(
checkpoint_name="my-model-v1"
).result()
tokenizer = sampling_client.get_tokenizer()
renderer = mint.renderers.get_renderer("qwen3", tokenizer)
# 创建一个 message completer 做评估
completer = TinkerMessageCompleter(sampling_client=sampling_client, renderer=renderer)
# 示例测试集:简单 Q&A
test_examples = [
{
"question": "What is 2 + 2?",
"expected_answer": "4",
},
{
"question": "What is the capital of France?",
"expected_answer": "Paris",
},
]
# 跑 completion
results = []
for example in test_examples:
messages = [{"role": "user", "content": example["question"]}]
response = completer.complete(
messages=messages,
sampling_params=types.SamplingParams(max_tokens=32, temperature=0.0),
)
# 取出答案文本
answer_text = response["content"]
is_correct = example["expected_answer"].lower() in answer_text.lower()
results.append({
"question": example["question"],
"expected": example["expected_answer"],
"predicted": answer_text,
"correct": is_correct,
})
# 算指标
accuracy = sum(r["correct"] for r in results) / len(results)
print(f"Accuracy: {accuracy:.2%}")
# 复杂一点的指标可以自定义打分器
def custom_score(example, prediction):
# 任务特定打分逻辑示例
return 1.0 if prediction == example["expected_answer"] else 0.0
custom_scores = [
custom_score(test_examples[i], results[i]["predicted"])
for i in range(len(results))
]
print(f"Custom metric mean: {sum(custom_scores) / len(custom_scores):.4f}")
完整源码:https://github.com/MindLab-Research/mint-quickstart/blob/main/concepts/evaluations.py
API Surface¶
| 组件 | 用途 | 输入 | 输出 |
|---|---|---|---|
TinkerMessageCompleter |
在测试集上生成 completion | list[Message] |
Message(response) |
SamplingClient.sample() |
token 级生成 | ModelInput |
SampleOutput(tokens + logprobs) |
| 自定义指标函数 | 给单个 example 打分 | (example, prediction) |
float(分数) |
| LLM-as-judge 模式 | 用另一个模型打分 | (example, prediction) |
judge response |
记录结果:
- 把结果写到 JSONL:
{"question": "...", "expected": "...", "predicted": "...", "score": ...} - 用 pandas 或你常用的分析工具在测试集上聚合分数。
Caveats & Pitfalls¶
- 采样的确定性:要做公平对比,评测时用
temperature=0.0。非零温度引入随机性,结果更难复现。 - 测试集大小:测试集太小(< 100 example)指标方差大。用 1000+ 的测试集才能拿到可靠信号。
- 指标选型:exact match 只适合答案唯一的任务。开放式任务(摘要、创意写作)应该用自定义指标或 LLM judge。
- LLM judge 验证:用 judge 评分辅助决策前,先在人工标注的子集上验证评分结果。
- 批量评测:用异步 API 批量做 completion 提升效率——先收集多个 sampling future,再一起 await 结果。