1.9 KiB
1.9 KiB
Day 5 Deep Dive: 生成质量为什么不等于训练 loss
深挖问题 1:eval_llm 如何构造输入?
打开 eval_llm.py。
关键差异:
if 'pretrain' in args.weight:
inputs = tokenizer.bos_token + prompt
else:
inputs = tokenizer.apply_chat_template(...)
说明:
- pretrain 模型只适合文本续写。
- SFT 模型适合 chat template。
- 如果推理模板和训练模板不一致,效果会明显变差。
深挖问题 2:采样参数如何影响输出?
generate 中关键参数:
temperature:logits 除以温度,越高越随机。top_p:只在累计概率前 p 的 token 中采样。top_k:只在概率最高 k 个 token 中采样。repetition_penalty:惩罚已出现 token。
实验建议:
python eval_llm.py --weight full_sft --temperature 0.3 --top_p 0.9
python eval_llm.py --weight full_sft --temperature 0.9 --top_p 0.95
观察:
- 低温更稳定,但可能死板。
- 高温更多样,但更容易胡编。
深挖问题 3:为什么 loss 低但生成差?
常见原因:
- 数据分布简单,loss 易降但泛化差。
- teacher-forcing 训练,推理时错误会累积。
- 评测 prompt 超出训练分布。
- 模板不一致。
- 采样参数过激。
- 小模型容量不足。
深挖问题 4:Tool call 如何评测?
打开 scripts/eval_toolcall.py。
关注:
- 工具 schema 如何给模型。
- 模型如何输出
<tool_call>。 parse_tool_calls如何解析。execute_tool如何执行。- 工具结果如何追加回 messages。
失败类型分类:
格式失败:JSON 不合法或标签不闭合
选择失败:调用了错误工具
参数失败:工具对但参数错
利用失败:工具结果对,但最终回答错
今日产出
写一份 eval_report.md,至少包含:
- 评测命令
- prompt 列表
- 每个 prompt 的回答
- 评分表
- 失败样例
- 下一步改进建议