数据截至 (上游 commit 1c4253f6774b)
自我纠错:回滚、去重与对模型输出的容错修复
30 秒导读: 开源模型(30B/72B)没有闭源大模型那么"听话"——它会把工具调用格式写错、会拒答、会反复搜同一个词、会吐出坏掉的 JSON。MiroThinker 能让这类模型稳定跑几百个 turn,靠的不是模型本身,而是编排层围着"模型会犯的错"做的一整套容错:检测到问题就回滚(撤掉这一轮、重来),能就地修的就地修(参数别名、server 名、坏 JSON)。这一章讲的就是这层"纠错网"。
本章聚焦错误的判定与修复这一件事。循环骨架(主 Agent / 子 Agent 怎么一轮轮转)在 02-orchestrator-loop.md 里讲;这里只讲:每一轮里,系统怎么发现"这轮出错了"、发现后怎么回滚、以及在错误发生前后怎么把模型的输出"修好"。
1. 这是什么(零基础也能懂)
先建立一个直觉
让模型自己开着工具跑几百步,是件很脆弱的事。想象你雇了一个很努力但有点粗心的助理:
- 他有时会把"填表的格式"写错(该用 A 格式却用了 B 格式);
- 有时会说"这个我做不了"就撂挑子;
- 有时会一遍遍去查同一个已经查过的东西;
- 有时递给你的材料是残缺的(搜出来一条结果都没有,或者工具报错了)。
如果每一步都照单全收,几百步下来错误会像滚雪球一样累积,最后整个任务废掉。
MiroThinker 的做法:给助理配一个"复核 + 撤销"机制
MiroThinker 的编排器在每一轮模型说完话之后,先不急着执行,而是拿几把"尺子"去量这轮输出:
- 格式对不对?
- 是不是拒答了?
- 这个查询是不是刚才查过?
- 工具执行完,结果是不是"废的"(报错 / 空)?
只要有一把尺子亮红灯,就执行一个统一的动作:回滚(rollback)——把刚加进对话历史的那条助理消息撤掉,turn_count 减一,当作这一轮"没发生过",让模型重来一次。
三个层次的容错
这套纠错网分三层,由外到内:
| 层次 | 干什么 | 触发/动作 |
|---|---|---|
| 回滚 | 发现这轮"废了"就撤销重来 | 格式错 / 拒答 / 重复查询 / 结果报错或空 → pop() + 重试 |
| 就地修复 | 模型输出"差一点点",直接改对而不重来 | 参数别名改名、补 sandbox_id、从 system prompt 反解 server 名 |
| 解析容错 | 把模型吐的坏 JSON / 三种格式统一解析出来 | json_repair、多种 API 格式兼容、过滤 None |
一句话:回滚是"重来",修复是"改对",解析是"读懂"。它们叠在一起,才让粗心的开源模型也能跑长任务。