CustomizeConcepts
Evaluations
Evaluation 衡量训练好的 model 在 held-out 数据上的表现。MinT 支持三种评估模式:benchmark 指标(exact match、BLEU、自定义函数)、在测试集上做采样补全、用单独的 evaluator model 做 LLM-as-judge 打分。
Concept
Evaluation 在训练循环外完成。你从 checkpoint 创建一个 SamplingClient,再在测试集上做补全。结果按下面几种方式打分:
- Exact match —— Model 输出是否与 target 完全一致?适合答案确定的任务(数学、代码、事实题)。
- Custom metric function —— 用户自定义打分器,算任务特定指标(BLEU、ROUGE、F1、任务成功率)。
- LLM-as-judge —— 用单独的 evaluator model 给 completion 质量打分。适合主观任务(helpfulness、coherence、风格),exact match 不适用的场合。
所有评估结果都按结构化格式(JSONL)记录,用于分析和报告。
Pattern
import mint
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 模式 | 用另一个 model 打分 | (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 model 也可能带自己的偏好和倾向。在用 judge 打分做决策之前,先在一份人工标注的子集上验证 judge 的打分。
- 批量评估:用异步 API 批量做 completion 提升效率:先收集多个 sampling future,再一起 await 结果。