一、推理链越拆越长,答案越跑越偏生产环境部署的客服 Agent 中,团队引入 Chain-of-Thought(CoT)prompting 来提升多跳问题准确率。实测发现,简单问题确实有提升,但问题需要超过三步推理时,最终答案准确率反而从 72% 掉到 51%。根因不是模型能力不足,而是中间步骤一旦出现偏差,后续推导都建在错误地基上。更隐蔽的是,模型对中间结论很自信,错误不会在输出中自我修正。[外链图片转存中…(img-m8eSDbVX-1780373783904)]
图1:Chain-of-Thought 中的错误传播示意
## 二、中间结论为什么会失真CoT 的本质是把单步生成拆成多步自回归。每一步的输出成为下一步的输入,这种递归结构天然具备错误放大效应。🔍 我们总结了三种最常见的失真模式:- ⚠️数值漂移:中间计算结果出现微小偏差,后续引用时不再核对原始数据,偏差被放大- ⚠️前提偷换:第二步引用了第一步的简化结论,却忽略了第一步成立的前提条件- ⚠️幻觉补全:遇到知识盲区时,模型不会停下来查询外部数据源,而是编造一个看似合理的中间结论继续推导下面是一段在真实场景中捕获到的错误推理链:python# 用户问题:"如果去年营收 1200 万,今年增长 15%,明年再增长 20%,三年总和是多少?"# 第一步(正确)# 今年营收 = 1200 * 1.15 = 1380 万# 第二步(引入微小误差)# 明年营收 = 1380 * 1.20 = 1656 万 ← 实际应为 1656,但模型写成 1650# 第三步(在错误基础上继续)# 三年总和 = 1200 + 1380 + 1650 = 4230 万 ← 正确答案应为 4236 万这个 6 万的偏差在财务对账场景中直接导致了审批链的驳回。| 推理步数 | 无 CoT 准确率 | 纯 CoT 准确率 | CoT + Step Verification 准确率 ||---------|------------|------------|-----------------------------|| 1-2 步 | 78% | 85% | 86% || 3-4 步 | 65% | 62% | 79% || 5 步以上 | 48% | 38% | 71% |上表数据来自我们在 GPT-4o 和 Claude 3.5 Sonnet 上针对 200 道多跳数学题和财务题的对比测试。步数增加时,纯 CoT 的准确率衰减速度明显快于无 CoT,而引入步骤验证后衰减被显著抑制。[外链图片转存中…(img-o2YJhkx4-1780373783906)]图2:不同推理步数下的准确率衰减对比
## 三、Step Verification 的工程实现解决思路不是在最终答案上做简单校验,而是在每一步中间结论生成后立即验证其正确性,只有验证通过才进入下一步。🛡️ 我们设计的轻量级 Step Verifier 包含两层校验:pythonclass StepVerifier: def __init__(self, llm_client, threshold: float = 0.85): self.llm = llm_client self.threshold = threshold def verify(self, premise: str, conclusion: str, step_type: str) -> dict: """ premise: 原始问题或上一步的正确结论 conclusion: 当前步骤生成的中间结论 step_type: 当前步骤类型,如 "calculation", "retrieval", "deduction" """ if step_type == "calculation": return self._verify_calculation(premise, conclusion) elif step_type == "retrieval": return self._verify_retrieval(premise, conclusion) else: return self._verify_consistency(premise, conclusion) def _verify_calculation(self, premise: str, conclusion: str) -> dict: # 对计算类步骤,要求模型用独立 prompt 重算并比对 recalc = self.llm.complete( f"根据条件 '{premise}',重新计算结果,只输出数字:" ) match = self._fuzzy_match_numbers(conclusion, recalc.strip()) return {"pass": match >= self.threshold, "confidence": match} def _fuzzy_match_numbers(self, a: str, b: str) -> float: nums_a = re.findall(r"\d+\.?\d*", a) nums_b = re.findall(r"\d+\.?\d*", b) if not nums_a or not nums_b: return 0.0 return 1.0 if nums_a[-1] == nums_b[-1] else 0.0核心原则是:验证必须独立于生成。如果让同一个模型在生成后自我检查,幻觉会被继承。我们用独立的 prompt 和更短的生成长度来做验证,降低二次幻觉的概率。🔑 另一个关键设计是 “Verification Budget”:每道题最多允许 3 次重试,如果某一步连续 3 次验证失败,Agent 主动放弃当前推理链,转交人工处理,而不是继续蒙下去。## 四、边界与适用条件Step Verification 不是万能药。它的引入带来了额外的延迟和 token 消耗。在我们的测试中,开启验证后平均延迟增加了 35%,单次请求的 token 消耗增加了 60%。💡 以下场景适合引入 Step Verification:- 📌 多跳数值计算(财务、统计、供应链)- 📌 涉及外部知识检索的推理(法律、医疗)- 📌 错误代价高的决策链路(审批、风控)以下场景则不建议盲目引入:- 🚫 创意写作或头脑风暴,中间结论没有唯一正确答案- 🚫 极低延迟要求的实时对话,验证开销不可接受- 🚫 单步即可完成的问题,验证收益为负![]()
图3:Step Verification 的适用场景判断矩阵
## 五、趋势判断未来 3 到 6 个月,推理验证领域会出现两个明确趋势:🚀专用验证模型的兴起。不同于通用 LLM 自我检查,小型专用验证器(如 3B-7B 参数)将被训练来专门判断推理步骤的正确性,延迟和成本都远低于当前方案。🚀树状推理与自洽性检查的融合。类似 Tree-of-Thoughts 的多路径探索会与 Step Verification 结合,在分支节点做验证裁剪,而不是在单一路径上逐点检查。笔者认为,CoT 的价值不在于让模型 “说得更多”,而在于让推理过程变得可检查、可干预。Step Verification 正是把 “可检查” 落到工程实践的关键一步。## 总结Chain-of-Thought 提升了复杂问题的可解性,但也引入了错误传播的通道。Step Verification 通过在每一步加入独立校验,把错误拦截在中间环节,而不是等到最终答案才暴露。上文给出的轻量级验证器可以直接嵌入现有 Agent 框架中,作为 CoT 后处理层使用。以上就是 Chain-of-Thought 到 Step Verification 的工程实战经验。你在构建 Agent 时,是否也遇到过推理链越长答案越偏的问题?你认为专用验证模型会多大程度上替代当前的通用自检方案?欢迎在评论区交流。如果这篇文章对你有帮助,别忘了点赞收藏,后续会持续更新更多 AI Agent 的实战干货。关注我带你玩转AI