Mind Lab Toolkit (MinT)
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在测试集上生成 completionlist[Message]Message(response)
SamplingClient.sample()token 级生成ModelInputSampleOutput(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 结果。

本页目录