跳转至

第 1 章 任务规格、失败分类与基线设计

开场问题:“让客服模型更专业、更准确”为什么无法直接变成训练项目?

1.1 先写输入输出契约

任务定义至少包含:

  1. 输入由哪些字段组成,哪些字段可信,最长多长。
  2. 输出是自然语言、JSON、标签还是工具调用。
  3. 哪些信息必须出现,哪些绝不能出现。
  4. 不确定、缺资料、权限不足时应该怎么做。
  5. 延迟、成本和可解释性约束。

“专业”必须被拆成可观察行为,例如:引用给定文档、不编造政策、先给结论再解释、涉及退款必须调用订单工具、没有证据时明确说不知道。

1.2 成功标准必须包含反例

只列正向能力会制造一个永远能刷分的系统。每条行为规格都要同时写:

  • 正例:什么情况下应该做。
  • 反例:看起来相似但不该做的情况。
  • 边界例:信息不足、输入矛盾、超出权限时怎么办。
  • 对抗例:用户试图绕过 system 指令或诱导泄露时怎么办。

例如“主动调用搜索工具”不能只测该调用时是否调用,还要测常识问题是否乱调用、工具不可用时是否降级、检索结果冲突时是否承认不确定。

1.3 建立失败分类,而不是堆一袋错题

一个可用的分类法:

  • 知识缺失:没有相关事实或事实过时。
  • 理解错误:误解用户意图、指代或约束。
  • 推理错误:中间步骤错误、条件遗漏。
  • 指令错误:知道答案但没遵循格式、语气或优先级。
  • 工具错误:选错工具、参数错、忽略返回结果。
  • 安全错误:泄露、越权、危险指导或过度拒答。
  • 系统错误:截断、检索失败、解析器失败、超时。

分类的价值是决定修法。知识缺失去补检索或数据;格式错误做 SFT 或约束解码;工具参数错误补轨迹示范;系统超时不能拿训练数据修。

1.4 基线不是“原模型跑一下”

至少保留三条基线:

  • 零改动基线:原模型 + 最小 prompt。
  • 强 Prompt/RAG 基线:先证明不训练能到哪里。
  • 可实现的上界:人工答案、强教师模型或带正确工具结果的 oracle。

若强 Prompt 已达到上界的 98%,训练项目可能没有经济价值;若 oracle 也只有 70%,问题可能在数据或任务定义,不在模型。

1.5 训练集、开发集、测试集怎样切

不能随机把高度相似的样本打散。客服同一政策的不同改写、代码仓库中同一函数的多个版本、同一文档切出的片段,都应按来源分组后整体切分,否则测试集只是训练样本的近邻。

时间敏感任务应按时间切:过去数据训练,未来数据测试。用户个性化任务按用户切;代码任务按仓库切;多轮会话按完整会话切。切分单位必须对应你真正想泛化的单位。

1.6 指标要分层

硬指标适合自动判断:JSON 是否可解析、字段是否齐全、答案是否等于标准值、代码是否通过测试、工具调用是否成功。

软指标需要 rubric 或人工判断:帮助性、论证质量、语气、是否充分利用证据。

系统指标包括延迟、token 成本、调用次数和失败率。一个准确率提高 1%,但平均多调用五次工具的 Agent,未必更好。

最终不能只有一个总分。应保留能力切片和安全门禁:总分上涨不能掩盖某个高风险切片从 99% 跌到 90%。

核心问答

Q:为什么不能先收数据再定义指标? 因为数据会自然偏向“容易找到和标注的东西”,而不是业务真正重视的失败。指标先行才能决定该采什么。

Q:随机切分有什么问题? 相似样本会泄漏到测试集,得到的是近邻记忆能力,不是真实泛化能力。

Q:一个综合分数为什么危险? 权重可以掩盖硬性退化。安全、权限、结构化输出等必须设独立门槛,不允许被其他能力补偿。

Q:什么时候应该停止训练项目? 当强 Prompt/RAG 已接近上界,或上界本身很低且瓶颈在数据/流程时。