English interface selected · this article is currently written in Chinese.
失败轨迹怎样用于下一轮训练:错误分类、修正监督与筛选偏差
English overview →具备清晰骨架、初步数学推导或工程验证,持续补充论据与实测。
数字花园
🌿 什么是数字花园与思想演进?
遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:
- 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
- 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
- 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
- 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
模型把商品 A17 写成了 A18,工具返回“商品不存在”。接下来模型改成 A17,查询成功。这样的记录值不值得保留?当然值得。但把整段记录原样加入 SFT,不一定是在教模型避免错误。
如果每条 assistant 消息都作为正确目标,第一条错误调用也会被训练。模型既被教“应该写 A18”,又被教“收到错误后改成 A17”。我们原本想学习恢复,却顺带强化了失败的起点。
本篇讨论怎样把失败变成可用证据,而不是简单地把失败删掉,或者把修正后的记录一律称为好数据。沿用库存任务,例子与统计均为教学构造,未运行模型训练。
先定位错误,不急着生成反思
看到任务失败,先检查最早可以确认的偏差。模型输出无法解析,属于格式问题;字段合法却选错商品,是参数问题;参数正确而服务超时,是环境故障;查询结果正确却回答“已预订”,则是结果解释或约束遵循问题。
| 观察到的现象 | 可以确认什么 | 还不能直接断言什么 |
|---|---|---|
| 请求写 A18,用户要 A17 | 商品参数不匹配 | 模型完全不理解工具 |
| 合法请求超时 | 这次没有得到有效结果 | 库存为零,或模型不会查询 |
| 返回 2 件,却说足够 3 件 | 回答与证据矛盾 | 整段所有动作都错误 |
| 查对了,评分仍为零 | 需要检查评分规则和完整轨迹 | 评分器一定正确或一定错误 |
错误分类可以多标签。一次格式错误可能引发重试,重试又耗尽预算。日志里既要保留起因,也要保留最后停止原因,不能只用一个“失败”覆盖整个过程。
模型自己写出的反思是一种诊断建议,不是错误原因的最终证据。“我没有认真考虑用户需求”很难指导修复;“用户请求 A17,而调用参数是 A18”则能直接由记录核对。
三种改进,更新的东西不同
重试是再尝试一次。如果模型参数、提示和反馈都没变,只是重新采样,成功率也可能提高,因为多了一次机会。
上下文修正把错误信息或经验放进下一次输入。模型权重可以完全不变,但行为受新上下文影响。Reflexion 的方法就利用反馈生成文本反思并保存在记忆中,供后续尝试使用;其“学习”不能直接等同于梯度更新。Reflexion v4,第 3 节
参数训练则把经过核对的数据用于 SFT、偏好学习或其他更新。只有确实更新并评测了参数,才可以报告相应的训练效果。
这三者可以组合,但成本与证据要分开记。一个带着十次历史反馈才成功的系统,不应被描述为首次就会完成任务。把反思写进长期记忆后,还需要界定测试之间是否共享它;否则前一题的信息可能影响后一题。
同一段失败,可以形成两类不同示范
设用户明确要求 A17,模型却调用 A18,环境返回 unknown_sku。这个错误码只说明当前请求中的商品不存在,不会神奇地告诉模型正确编号是什么。模型应从原始用户请求中找回 A17。
第一类数据教首次正确行动:输入是原始请求与工具定义,目标是查询 A17。错误调用和之后的反馈不进入这个样本。我们要在对应环境里核验这条正确动作,不能仅凭改了一个字符就宣布整条新轨迹成功。
第二类数据教失败恢复:输入包含原始请求、错误调用和环境返回,目标只是修正后的 A17 调用。错误调用保留为历史条件,但不作为本次应模仿的目标。
| 数据类型 | 模型能看到什么 | 本次应学什么 |
|---|---|---|
| 首次正确 | 原始请求、接口定义 | 一开始选对 A17 |
| 恢复 | 上述信息,加 A18 调用和错误返回 | 根据请求与错误修正参数 |
两类都可能有用。只有恢复样本时,模型可能学会“先错一次再修”;只有干净样本时,它未必知道实际遇到错误后如何继续。是否混合、如何配比,需要根据部署故障分布验证,不能把两类记录混在一起却不标来源。
修正后的轨迹必须重新获得环境证据
假设把错误调用 A18 改成 A17,却保留旧结果“商品不存在”,新记录仍然不一致。反过来,保留 A18 调用、把结果手改成 A17 的库存,也不是真实修复。
正确做法是保留不可覆盖的原始记录,从允许修正的检查点分叉,实际执行修正动作,再保存新的返回值和后续结果。记录父轨迹、分叉位置、修正来源、环境快照和验证状态。
对于本文只读固定环境,分叉比较简单;若以前的错误操作已经写入数据库或预订库存,就不能假设“把历史文字改回去”能够撤销实际效果。需要恢复环境快照,或者在当前真实状态下执行补偿流程。没有这层处理,修正示范可能从一个根本不存在的世界开始。
不要把验证通过简化成“修正调用能解析”。语法、语义、工具执行和最终任务结果仍然是不同层次。对于还未完成任务的局部修正,只标记局部通过。
只保留成功,数据分布会悄悄改变
设有 100 个任务,其中容易任务和困难任务各 50 个。模型在容易任务上成功 45 个,在困难任务上成功 10 个。如果只收集成功轨迹,会留下 55 条,其中容易任务占:
原始任务中容易样本占 50%,筛选后却超过八成。这不是模型真的把所有难题学会了,而是难题更少进入训练集。
如果再对失败任务多试几次,留下第一次成功的结果,数据还会偏向“能通过更多尝试被解决”的任务。最终数据只显示成功,原先消耗了多少失败尝试却可能消失。应保留所有尝试的父子关系、采样预算和选择规则。
成功筛选可以是有用的数据方法,但必须报告每类任务的保留率与缺失情况。只做去重不能修复这种偏差,简单提高困难任务权重也不能创造尚未获得的可靠示范。
偏好对也必须在可比较的条件下构造
想把失败轨迹和成功轨迹做成偏好对,先检查它们是否回答同一个任务,是否拥有相同工具和预算,是否从可比较的初始状态开始。
尤其不要把“没看到错误反馈的首次回答”和“已经知道正确答案的修正版”直接作为同一上下文下的好坏回答。两者获得的信息不同,偏好标签可能教会模型利用训练时的额外提示,而不是改善真实首次决策。
多步轨迹若选择不同动作,会自然看到不同工具结果,这本身不等于不可比较;关键是环境规则和初始条件一致,结果由对应动作产生。训练算法如何表示这些环境消息、哪些 token 计入策略概率,则需要另外明确,不能把整段日志当成普通回答字符串就结束。
给反馈留一个独立的检查出口
如果反思由模型生成,修正也由同一个模型生成,再由它自己说“现在正确了”,整个链条缺少独立证据。至少应使用参数约束、真实执行返回、任务规则或人工抽查核验关键结论。
隐藏测试答案也不能被当作普通训练反馈。若在测试中给模型失败原因并允许修正,这是一种带反馈的评测协议;它与无反馈首次测试不同,应该单独报告。测试实例随后若进入训练,也需要换独立测试集,不能继续把它叫未见任务。
本文的本地检查用一个极小环境执行 A18 与 A17:前者返回错误,后者返回杭州库存 2。检查恢复样本只监督修正动作,首次正确样本没有错误反馈,同时检测把旧错误返回贴到新请求上的不一致记录。这是数据构造检查,不是语言模型自纠错能力测试。
下一轮实验应回答哪一个问题
可以先保持训练预算与评测环境固定,比较干净示范、干净示范加恢复样本两种条件。首次任务完成率、错误后的恢复率与总调用成本分别报告。
恢复率的分母也要明确。如果只对模型自身失败的任务计算,不同模型的失败集合可能不同,数字不能直接横向比较。另设一组固定的错误历史,用同样的历史测试恢复行为,再配合闭环任务测试,更容易判断差异来自哪里。
同样,要检查恢复能力提高时,首次错误是否也变多。如果模型学会了先触发错误再依赖反馈,总体系统可能更慢,而不是更可靠。
失败轨迹最有价值的部分,是它保留了偏差发生时模型看到了什么、做了什么,以及环境怎样回应。把这条证据链保留下来,再决定哪些片段做上下文、哪些片段做目标,下一轮训练才有机会解决已知问题,而不是重新学习同一个错误。
文章概念网络
从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。
49 / 49 个节点 · 正文标记术语与关键词概念
失败轨迹怎样用于下一轮训练:错误分类、修正监督与筛选偏差
回到原文 ↗最后更新于 2026-10-23
引用本文
@article{2026-10-23-llm-training-tool-05-failures,
author = {枫语},
title = {失败轨迹怎样用于下一轮训练:错误分类、修正监督与筛选偏差},
journal = {枫语},
year = {2026},
month = {oct},
url = {https://meiluosi.github.io/posts/2026-10-23-llm-training-tool-05-failures/}
}