GOCLAWLLM ENGINEERING
GoClaw 首页

12. 评估:证明模型真的变好了

核心工程3~5 小时
学习目标
  1. 区分模型、任务与系统指标
  2. 避免数据泄漏和不公平对比
  3. 保存逐样本结果并估计不确定性
前置知识
  • 概率与统计基础
  • 至少完成一次模型或系统实验

本章产物成对评估结果、置信区间、错误分类和结论边界。

12.1 三层评估

模型层:loss、perplexity、标准 benchmark
任务层:你的真实业务准确率、格式、引用与工具成功率
系统层:延迟、吞吐、成本、稳定性、安全和用户结果

只优化其中一层会误导。例如 benchmark 提升但延迟翻倍,可能不适合线上;格式准确率提高但事实错误增加,也不是成功。

12.2 数据划分

若反复查看 test 并据此调参,test 已经变成 validation。

对相似文档、同一用户、多轮对话或时间序列,应按组或时间切分,不能随机拆散后造成内容泄漏。

12.3 Perplexity

运行:

python code/07_evaluate_perplexity.py \
  --model Qwen/Qwen3-0.6B \
  --text data/tiny_corpus.txt

长文本超过模型窗口时,代码使用滑动窗口,并只统计每个窗口新增 token,避免重叠部分被重复计分。

Perplexity 的限制:

12.4 任务指标

按任务选择:

12.5 生成评估的陷阱

应保存原始输出,随机抽样人工复核,并报告失败类型。

12.6 lm-evaluation-harness

当前版本把模型后端拆为 optional extras。Transformers 后端:

python -m pip install "lm_eval[hf]"

先列出任务并用很小样本检查流程:

lm-eval ls tasks

正式命令应以当前 lm-eval --help 和项目文档为准,并保存:

12.7 微调实验的正确对照

至少包含:

组别用途
Base model知道原始能力
Base + prompt 优化判断是否根本无需微调
SFT/LoRA checkpoint A/B比较超参数
最终 adapter报告最终结果
负向/安全测试防止局部优化带来副作用

如果 prompt engineering 已经解决问题,微调可能增加了不必要的维护成本。

12.8 动手:建立可重复的评估记录

实验 07A|Evaluation 资源:CPU;时间:约 2 分钟;产物:逐样本分数、聚合指标、置信区间和错误分类。

先打开评估 Notebook。它完成两件事:

  1. 从 token 级 NLL 计算 mean NLL 与 perplexity。
  2. 对同一题集上的 baseline/treatment 分数做 paired bootstrap。

评估文件不要只保存一个最终百分比。推荐逐样本 JSONL:

{"id":"case-001","group":"format","expected":"valid_json","base_score":0,"candidate_score":1,"base_output":"...","candidate_output":"...","error_type":null}

汇总时至少报告:样本数、均值、置信区间、失败类型分布和原始结果路径。若区间包含 0,应写成“当前样本不足以确认稳定提升”,不能只展示正的点估计。

对语言模型困惑度运行:

python code/07_evaluate_perplexity.py \
  --model Qwen/Qwen3-0.6B \
  --text data/tiny_corpus.txt \
  --window 512 \
  --stride 256

验收问题:


本章依据

原理性结论以原始论文、官方文档或公开教材为依据。论文中的实验结果只适用于其声明的模型、数据、硬件和评估设置。

  1. 多场景、多指标和透明评估框架。

  2. 标准任务评估、请求适配与可复现运行配置。

  3. 负对数似然、交叉熵和困惑度的定义。