反思与自我修正:让失败证据改变下一次行动
区分空泛自评、外部反馈和可验证修正,用最小改动、停止条件与版本化经验避免“再想一遍”制造更自信的错误。
1“再想一遍”为什么不等于纠错直觉
“反思”一词最容易引起的误解,是把自我修正等同于“让模型再想一遍”。同一个模型读同一份上下文,凭什么第二遍一定比第一遍正确?没有任何机制保证这一点。第二遍推理时的权重、上下文与第一遍完全相同,模型并不会因为“再想一遍”的指令就获得任何新的信息;它可能发现一些表面矛盾,也可能顺着第一遍的原假设再走一次,甚至因为被要求“请找错误”而迎合指令,把原本正确的答案改坏。后两种情况与“纠错”恰好相反:一次是原样复述,一次是引入了新的破坏。
要理解为什么,需要区分两类输入对信息状态的改变。模型自我批评只发生在模型内部,它不接触世界,只接触自己已有的分布;因此它只能在同一组假设内部重新采样。而测试失败、编译器诊断、检索来源、环境观察或人类规则判断,来自模型之外,携带着模型此前并不拥有的信息。只有后者才可能真正改变信息状态:当测试执行返回失败时,模型第一次知道“按这个候选写出的代码跑不过”;当编译器给出诊断时,模型第一次知道具体哪一行违反了哪条约束。反思器(reflector)的任务,就是解释这些外部证据如何否定当前候选,而不是生成更长的内心独白。独白再长,只要没有新证据,就仍然停留在原来的盲点之内。
由此可以得到一个可操作的定义:一次修正只有在“候选发生可定位变化,并通过此前失败的验收且未破坏保护性测试”时,才算成功。这个定义把“反思”从一种态度变成了一条可以被检验的因果链——输入是什么,输出是什么,成功由什么判定。反思修正的输入有四项:当前候选、外部失败证据、受保护验收和修改预算;输出有三项:可证伪的原因假设、最小补丁和复测决定。原因假设必须可证伪,即它必须能被后续测试否定,否则它只是另一种解释的独白;补丁必须最小,因为改动越小,越容易确认究竟是哪一处变化消除了失败;复测决定则把新候选重新送回到产生失败证据的那套验收之下。
因果链可以这样完整地表述:外部验收(测试、编译、检索、环境或人工规则)对候选执行并产生失败证据;失败证据被输入反思器,改变模型的信息状态;模型据此提出可证伪的原因假设,并产出最小补丁;修改后的候选再次接受原验收与保护性测试的检验;如果原失败消失且保护性测试未破坏,修正才算成功。任何一个环节缺失,链条就断掉:没有失败证据,“反思”只是同一盲点内的重采样;没有复测,就无从知道修正是否真的有效。
这条边界的适用条件是严格的:反思修正只在存在外部失败证据时才有意义。模型自我批评本身不会改变信息状态;测试、编译、检索、环境或人工规则才会。因此,凡是“再想一遍”而没有新证据介入的场景,都不应被视为纠错,也不应被计入修正成功率。把这一点固定下来,后续关于反思闭环、反思记录和停止条件的讨论才有了共同的衡量尺度。
2反思闭环有哪些角色机制
一个能真正完成“反思—修正”的闭环,不是靠一个模型的单次输出,而是靠几个职责明确、产物分开的角色配合。把角色拆开是为了防止一种非常具体的失效模式:让同一个人既出题又判卷,他就有动机悄悄把标准放低;让同一个人既解释失败又动手修改,他就可能把尚未验证的解释当成事实直接写进候选。因此闭环里不同角色的状态与接口必须分开,哪怕它们由同一个模型分时承担。
闭环从执行器(executor)开始。执行器的职责只有一个:产生候选。候选可以是一段代码、一份文档、一个计划,它只是“当前版本”,不附带任何关于自身对错的判断。候选随即交给验证器(validator)。验证器的职责同样单一:执行外部验收,只返回可复现的通过/失败证据。注意“可复现”这个限定——验证器的输出必须是可以重新执行、任何人运行都得到同样结果的证据,例如测试的失败输出、编译器的诊断、检索到的来源、环境的观察值或人工规则的判断;它不负责解释失败原因,也不负责提出修改建议。这条限制是刻意的:如果验证器顺带给出修改方案,它的评判立场就被污染了。
当验证器返回失败证据时,反思器(reflector)才登场。反思器输入失败证据与当前候选,提出一个可证伪的原因假设,并据此设计一个最小修改(单一补丁)。反思器不直接改动候选,它输出的是“为什么失败”的假设和“改哪里”的方案。随后执行器把补丁应用到候选上,形成新候选,再由同一个验证器对新的候选复测。这里“同一个验证器”是硬约束:修正是否成功,必须由当初判定失败的那套验收来确认;换一套更容易通过的验收来复测,等于偷偷降低了标准。复测同时跑两类检查——此前失败的原测试,以及保护性测试。前者证明失败已消除,后者证明这次修改没有弄坏原本正常的部分。最后根据复测结果做出决定:保留新候选,或回退到修改前的版本;如果失败证据不足以定位原因,则继续调查而不是盲目改动。
把这条因果链完整写出来就是:候选 → 外部验证 → 失败证据 → 原因假设 → 单一补丁 → 原测试 + 保护性测试 → 保留或回退。它同时定义了反思闭环的输入与输出:输入包括候选、验证结果、原因假设、补丁和同一套验收;输出则是保留、回退、继续调查或停止这四种决定之一。当外部证据足够且补丁通过了原测试与保护性测试,输出是保留;当补丁没有通过验收,输出是回退;当失败证据不足以支撑可靠的原因假设,输出是继续调查;当继续投入已无收益,输出是停止。
这里需要再次强调接口分离的意义。验证器“只给可复现证据”不是技术洁癖,而是闭环可信度的来源:如果评判者可以在失败后偷偷降低验收标准,那么任何候选最终都能通过,闭环就退化成了一种仪式。同样,反思器的假设在获得验证之前始终只是假设,修改器不得把未经验证的解释当作事实;否则一次错误的归因会直接变成对候选的破坏。角色的分离使每一步的产物都可以被单独检查和单独追责:候选是谁生成的,证据是谁给出的,假设是谁提出的,补丁改动了什么,复测由谁完成。这种可追溯性,是闭环能够在失败后继续运转而不是原地打转的基础。
3一条反思记录必须能驱动动作记录
“检查代码逻辑”这句话听起来像一条反思,但它不是。它没有指出任何一个可定位的缺陷,没有指定任何一个可执行的动作,也没有定义任何一条可验证的预期,因此它无法驱动任何验收,也无法让闭环前进一步。一条反思记录存在的全部意义,就是能驱动动作;判断标准不是语气有多诚恳,而是记录里的每一项是否都能对应到闭环的下一个环节。
可以用一个缓存隔离案例把有效记录的结构看完整。一个多用户系统中,缓存键只由 product_id 构成。失败证据是:用户 B 读取与用户 A 相同的 product_id 时,命中了用户 A 的价格。这条证据是可复现的——只要构造两个用户访问同一商品,就能再次观察到串值,它不依赖任何关于语气或态度的判断。失败现象一旦可复现,就满足了验证器“只给可复现证据”的要求。
基于这条证据,反思器提出原因假设:缓存键只有 product_id,缺少 user_id。这个假设之所以有效,是因为它指出了一个可证伪的机制——如果假设成立,那么只要键中包含 user_id,跨用户串值就应当消失;如果补上 user_id 之后串值仍在,假设即被否定。接着是单一改动:把缓存键改为 (user_id, product_id)。只改这一处,是为了限制归因范围——复测结果可以明确归因于键结构的变化,而不是若干处修改的混合效应。最后是预期验证,它必须同时保护两个目标:跨用户访问同一商品不再相互命中(隔离性),以及同一用户的重复请求仍然命中缓存(缓存收益没有丢失)。如果只验证了隔离而忽略了命中,修复可能把缓存整个废掉。
一条高质量记录既不能只复述错误——“这里有个 bug”不增加任何信息;也不能一次列出十个可能原因——十选一的猜测不是原因假设,而是一种没有收敛的罗列,它无法指导最小改动。当原因仍不确定时,正确的动作不是先改代码,而是先设计区分性实验:例如记录实际生成的 key,直接观察缓存里到底存了什么;或者构造两个用户、同一商品的成对测试,确认串值是否稳定复现。实验的结果会把“可能的原因”收敛为一个可证伪的假设,然后才决定改哪里。
由此可以给出反思记录的完整输入与输出。输入有五项:失败现象、环境版本、原因假设、单一动作和预期验证。环境版本单独列出,是因为同一个失败在不同版本上可能无法复现,缺少版本信息的记录无法被审计和复测。输出是一份可执行且可审计的修正计划:证据指出缓存串值现象,假设给出缺 user_id 的可证伪机制,动作是把键改为复合键,预期是隔离与命中双测试同时通过。反过来说,任何缺了某一项的记录都可以直接判定为不合格——缺证据,记录只是猜测;缺假设,记录只是复述;缺动作,记录只是抱怨;缺预期验证,记录无法验收。“检查代码逻辑”之所以无效,正是因为它同时缺少了假设、动作和预期这三样东西。
| 字段 | 缓存隔离案例 | 验收作用 |
|---|---|---|
| 失败证据 | 用户 B 读取相同 product_id 时命中用户 A 的价格 | 可复现,不依赖语气判断 |
| 原因假设 | 缓存键只有 product_id,缺 user_id | 指出可证伪机制 |
| 单一改动 | 键改为 (user_id, product_id) | 限制归因范围 |
| 预期验证 | 跨用户不命中;同用户重复请求仍命中 | 同时保护隔离与缓存收益 |
4一次失败怎样变成最小修正运行示例
一次失败要变成一次可信的修正,必须能回答一个问题:怎么证明修复来自反馈,而不是恰好第二次生成走了运?答案不在修复本身写得有多漂亮,而在修复是否被外部反例约束住。缓存隔离案例把这个过程走了一遍,完整展示了从测试失败到最小补丁再到回归验证的反思闭环。
案例的输入有四样东西:v1 版本的单键缓存(键只有 product_id)、跨用户反例(用户 B 命中用户 A 的价格)、隔离测试和同用户命中保护测试。v1 的复测结果是:隔离测试 0/2 通过,同用户命中测试 2/2 通过。两组数字合起来的结论是“有缓存,但越权串值”——缓存机制本身在工作,问题只出在键的粒度上。这个初始状态很重要:它说明失败是局部性的,而不是整个缓存都坏掉了。
反思器据此提出最小修正:只把键改为 (user_id, product_id),其他一概不动。v2 复合键版本的复测结果是:隔离测试 2/2 通过,同用户命中测试 2/2 通过,因此结论是保留。这里的关键是复测同时包含失败测试和保护性测试,二者缺一不可——如果只重跑隔离测试,就无法发现修复是否弄坏了原本正常的缓存收益。
对比一个备选方案可以看清这一点。备选方案是“禁用缓存”:隔离测试 2/2 通过,但同用户命中测试 0/2 通过。若只看失败用例,复合键和禁用缓存都得到 100% 通过,两个方案在失败测试面前不可区分;一旦加入保护性测试,禁用缓存立刻暴露——它修好了隔离症状,却破坏了性能契约。只有复合键同时满足完整目标:跨用户不串值,同用户仍命中。修复因此被证明是受反馈约束的:是外部反例圈定了缺陷位置,是保护性测试排除了会破坏性能的捷径,而不是模型第二次恰好抽中了一个正确写法。
这个对比还确立了一条更一般的边界:反思质量受验收覆盖上限约束。验收里有什么测试,反思就只能对什么负责;缺失的测试无法靠批评措辞来弥补。如果当初没有写“同用户命中”这条保护性测试,那么“禁用缓存”和“复合键”都会被判定为修复成功,闭环会安静地接受一个破坏性能契约的版本。反思器再善于表达,也无法发现一个从未被检验过的缺陷。因此这个案例的规则可以概括为:只改 key 为 (user_id, product_id),复跑失败测试与保护性测试;两组均 2/2 通过则保留,任何一组不过则回退。输出的候选是 v2 复合键,或者回退到 v1;而“禁用缓存”这条看似合理的路径,恰恰是被保护性测试挡在门外的。
| 轮次 | 隔离测试 | 同用户命中测试 | 结论 |
|---|---|---|---|
| v1 | 0/2 通过 | 2/2 通过 | 有缓存但越权串值 |
| v2 复合键 | 2/2 通过 | 2/2 通过 | 保留 |
| 备选“禁用缓存” | 2/2 通过 | 0/2 通过 | 修症状但破坏性能契约 |
5怎样控制修改范围与归因最小改动
一次改五处,测试全绿,这听上去像一次漂亮的修复,但这样的结果几乎无法用于学习。设想同时更换了缓存键、TTL、序列化方式和数据库查询:测试通过后,没有任何信息能告诉你五处改动里究竟是哪一项消除了缺陷;而如果出现新回归,同样无法定位是哪一处改动引入的。一次大改动把所有的因和所有的果搅拌在一起,闭环得到的是一个“过了”的结论,却失去了归因的能力。因此修改范围的控制原则是:先应用能区分当前原因假设的最小补丁,记录 diff 和验证结果;若失败则回退并保留证据,再考虑下一个假设。每一步都小到足以把结果归因到唯一的改动上。
“最小”不等于绝对的一行修复。有些改动天然相互依赖——改键结构可能同时要求调整序列化格式,否则新键无法写入。对这类情况,正确的做法是把大改动拆成带检查点的序列:每完成一步就运行一次验证并记录结果,而不是要求一步到位。检查点的作用是把相互依赖的一组改动仍然切成可归因的片段:如果第一个检查点之后测试已经通过,就说明后续假设不再必要;如果某个检查点之后出现回归,就说明问题出在刚刚完成的那一步。序列化的改动虽然没有单行修复那么锋利,但它保留了“哪一步引起了什么变化”的证据链,仍然满足最小修改对归因的要求。
与修改范围同样重要的,是验证标准的位置。验证标准必须在循环之外受到保护。模型不得通过删除失败测试、放宽断言或把异常吞掉来制造绿色结果——这些手段都能让测试通过,但它们改变的不是候选,而是判卷标准,恰好违反了验证器独立性的约束。测试并不是永远不可修改,但当需要修改测试时,必须由独立的需求证据证明原验收本身就是错误的,而不是因为候选过不了才去改标准。换句话说,改测试的门槛和改候选的门槛不一样:候选可以因为假设被否定而反复修改,验收标准只能在有外部证据表明它写错时才能被修改,并且这种修改本身也要记录在案。
把这些约束放在一起,就得到了最小修改的输入与输出。输入包括:当前原因假设、代码 diff、改动之间的相互依赖关系、失败测试和保护性测试。输出包括:一个可回退的补丁序列,以及每一步的归因证据。执行的规则是:先改能区分假设的最小范围;失败则回退并保留结果;多项依赖则用检查点分步推进;测试通过之后,只能把收益归因到这一组受控修改之上,不能夸大到“整个系统因此变好”。归因的边界由修改的边界决定——改了什么,就只能主张什么;这既防止了把运气当成本事,也防止了把一次局部修复说成整体改进。
6反思记忆保存什么记忆
反思闭环的产物不只是修复后的候选,还有从这次失败中学到的经验。经验该存进长期记忆,但存什么、怎么存,直接决定了记忆是资产还是污染。把完整失败对话原样存入长期记忆,为什么容易污染下一次任务?因为对话里有大量只属于当次情境的内容:具体的代码片段、当时的语气、临时的猜测、被否决的假设。新任务检索到这些内容时,模型很可能把上一次的上下文细节当成这一次的事实,或者把一条特定修复当成普适规则照搬。记忆保存的目标因此不是“记住发生了什么”,而是提炼出“什么条件下、出现什么信号、可以采取什么已验证的策略、什么情况下会失效”。
可复用经验应写成五项结构:适用条件、失败模式、诊断信号、已验证策略、反例与失效条件,并附上来源、版本和过期规则。用缓存案例来说明:可迁移的经验是“多租户缓存键必须覆盖租户边界”——它保留了条件(多租户)、失败模式(跨租户串值)、诊断信号(两个用户同一商品命中同一价格)和已验证策略(键覆盖租户维度)。而“所有缓存都加 user_id”则是错误的泛化:它丢掉了“多租户”这个适用条件,会把公共数据也按用户隔离,造成不必要的缓存膨胀甚至逻辑错误。两个句子的差别在于条件边界——好的经验保存了它成立的前提,坏的经验把一次结论偷换成了普遍规则。
即使经验写得合格,检索时仍要重新核对前提。新任务检索到“多租户缓存键必须覆盖租户边界”后,第一件事是确认当前任务是否真的是多租户场景、缓存是否真的跨租户共享、串值信号是否真的出现。过去的结论只是候选解释,不是当前事实;适用条件不满足时,经验应当被弃用,而不是被强行套用。这也对应了记忆的过期规则:经验应当记录版本和来源,当环境版本变化或来源失效时,经验自动降级甚至作废,而不是无限期有效。
比记忆结构更深的一层问题是同源偏差。生成器和反思器即使是两个独立调用、两套角色提示,它们仍然来自同一个训练分布,可能共享同样的偏差——反思器看不见的盲区,往往正是生成器自己造成的盲区。因此“换一个审稿人角色”并不能真正补上独立信息:两个共享偏差的模型互相检查,得到的是同一盲点内的两次采样。正确的做法是按任务性质引入真正的独立信息源:事实任务优先引入外部来源,代码任务优先运行测试,高风险判断引入独立规则或合格人工。模型角色之间的相互批评不能替代这些外部信号——这正是“再想一遍不等于纠错”原则在记忆与偏差层面的延伸。反思记忆的输入是已验证的失败模式、适用条件、诊断信号、策略、反例、来源版本和过期规则;输出是可检索但必须重新核对前提的条件化经验,而不是可以直接照搬的结论。
7什么时候停止而不是继续反思预算
反思闭环不会因为“再修一轮”而自动变得更好。修正轮数增加时,边际收益在下降,改坏风险在上升,两者共同决定该不该继续。用一个数量级示例来看:假设有 100 个首轮失败案例,第 1 轮修好 35 个、同时把原本正确的结果改坏 4 个,净收益 31;第 2 轮再修好 10 个、改坏 6 个,净收益只有 4;第 3 轮修好 3 个、改坏 7 个,净收益变成 −4。注意一个容易被忽略的现象:总体成功率可能仍然在上升,因为每轮多少还在修好一些案例;但第三轮的边际净收益已经是负的,多跑一轮平均而言制造的新破坏比消除的失败还多。总体成功率上升掩盖了第三轮已不值得默认执行这一事实。因此停止决策不能只看累计成功数,必须按任务切片报告每一轮的边际修复率、改坏率、成本与延迟——三个维度中任何一个恶化,都应触发对继续修正的质疑。
除了边际收益转负,还有几类明确的停止信号。第一类:连续两轮没有产生新的失败证据。此时反思器已经没有任何新信息可以处理,继续修正只是在同一份信息上重采样,按照“再想一遍不等于纠错”的原则应当停止。第二类:同一个测试在两个补丁之间来回摆动——补丁 A 让测试通过,补丁 B 又让它失败,改回 A 再通过。这种来回说明根因不在补丁层,而在更底层的需求或状态建模;正确动作是回到需求和状态建模,寻找两个补丁背后的共同约束,而不是继续在 A 和 B 之间切换。第三类:验证器本身不稳定或互相冲突——同一候选在不同时刻或不同验证器下给出不同结论。此时问题出在验收环节,继续修改候选毫无意义,应当先修验收,再谈候选。第四类:达到成本、时间或风险上限。这时闭环的产出不是继续硬修,而是把已知的部分、未知的部分如实报告,并升级给人工处理。
把这些信号合并起来,停止策略的输入是:每轮修好数、改坏数、成本与延迟、新证据是否出现、验证器稳定性;输出是四种决定之一:继续、回退、报告未知或人工升级。以那个数量级示例判断:净收益依次为 31、4、−4,第三轮不应默认执行;即便单看修好数在增长,改坏数已经超过了修好数。由此得到一个反直觉但重要的结论:轮数更多不代表修正更可靠。每一轮修正都同时在做两件事——消除已知失败,引入未知破坏;当后者的速度超过前者时,最负责任的反思恰恰是停下来,把不确定性如实交出去,而不是用更多轮次制造一种“在努力”的错觉。
| 停止信号 | 动作 |
|---|---|
| 连续两轮无新失败证据 | 停止,避免同一信息重采样 |
| 同一测试在两个补丁间来回 | 回到需求/状态建模,寻找共同约束 |
| 验证器不稳定或互相冲突 | 先修验收,不继续修改候选 |
| 达到成本、时间或风险上限 | 返回已知/未知并升级人工 |
8怎样证明反思优于多采样评测
声称“反思有效”是不够的,必须证明反思优于更便宜的替代品。这里有一个关键的混淆因素:多调用一次模型本身就可能提高命中率——再采样几次,纯靠运气也能抽中更好的答案。因此,衡量反思的贡献,必须把“反馈”带来的增益从“多采样”带来的增益里隔离出来。
隔离的方法是在相同预算下做对照。预算的三个维度同时对齐:token 消耗、模型调用次数和墙钟时间。在相同的三维预算内,比较四组方案:直接单次生成;无反馈的再采样——即不引入任何失败证据,只是重复生成并择优;带外部反馈的反思——即完整的闭环;以及更强模型的单次生成。如果无反馈的再采样在同等预算下和反思闭环效果相当,那么复杂的反思框架就没有被证明的必要性——多花的那部分机制成本没有买到任何增量。反过来说,只有当带反馈的反思在相同预算下显著超过无反馈再采样时,“反馈”本身才被证明是有效的成分。同样,更强模型的单次生成是对照的另一端:如果换个更强模型一次就能达到反思闭环多轮的效果,那么反思的收益就要与“换模型”的成本重新比较。
只看最终成功率会漏掉重要的破坏面,因此评测还必须报告另外几项指标:首轮正确被改坏率——多少原本正确的答案在反思过程中被改错了;每轮边际收益——每一轮修正净修好了多少;测试覆盖——验收覆盖了多大比例的行为面;平均轮数、回退率和人工升级率——闭环实际消耗了多少轮次,多少次不得不退回原版或交给人。这些指标合起来才能回答“反思到底是净修复还是净折腾”。一个最终成功率上升但首轮正确改坏率同样上升的反思器,可能只是在把错误的位置挪动。
评测集本身的构造也有两条硬性要求。第一,保留隐藏测试:反思器在修正过程中能看到可见测试,如果评测只用可见测试,反思器会针对这些测试过拟合——它学会的是让这些特定用例变绿,而不是真正修复缺陷;隐藏测试专门用来检验修复是否可泛化。第二,包含“原答案正确”的对照案例:如果评测集里全是错误答案,改坏率根本无法被观察到;只有放入原本正确的样本,才能测出过度修改——一个看见原答案正确也忍不住动手的反思器,会在这类样本上暴露出来。于是反思评测的输入是四种同预算方案,输出是最终成功、首轮正确改坏率、边际收益、轮数、回退和升级这一组指标;隐藏测试挡住对可见验收的过拟合,原答案正确的对照样本测出过度修改。只有在这套对照和指标下仍然胜出,反思才不只是多采样换了个名字。
9把因果链连起来综合
把前面各环节串起来,反思与自我修正是一个六步的因果链,每一步都为下一步提供它唯一缺少的东西。这条链从问题出发——一个候选在外部验收下失败——一路连接到可验证的实践:要么留下一个被证据约束过的修复,要么留下一个诚实的回退或停止决定。
第一步,定义受保护验收。在候选运行之前,就要明确什么算通过、什么算回归、什么证据算数。验收同时包含失败测试与保护性测试,前者暴露缺陷,后者守住已有的正确行为;没有这一步,后面所有的“通过”都无从谈起,因为判卷标准不存在。第二步,运行候选并采集外部失败。候选交给验证器执行,得到可复现的失败证据——测试输出、编译器诊断、检索来源、环境观察或人工规则判断。这条证据是整条链里第一次真正改变信息状态的输入;没有它,后续的一切只是同一盲点内的重采样。第三步,把证据压成原因假设。反思器不是复述失败,而是从证据中提炼一个可证伪的机制,例如缓存键缺少 user_id 导致跨用户串值;如果原因尚不明确,就先做区分性实验,而不是直接动手。第四步,应用单一可回退改动。补丁要小到能把复测结果归因到唯一的改动上,并且随时可以回退;相互依赖的改动拆成带检查点的序列,而不是一次性改五处。第五步,复跑失败与保护性测试。用同一个验证器重跑原失败测试,确认失败消失;再跑保护性测试,确认没有弄坏原本正确的部分——禁用缓存的备选方案正是在这一步被挡下的。第六步,按边际收益和无进展停止。每轮比较修好数与改坏数,边际净收益转负、连续两轮没有新失败证据、补丁在测试间来回摆动、验证器自身冲突或预算耗尽,都触发停止,输出继续、回退、报告未知或人工升级。
六个步骤之间存在严格的单向依赖:验收在运行之前定义,证据在假设之前采集,假设在改动之前提出,复测在改动之后执行,停止判断基于每轮的边际结果。任何一步缺失或颠倒,链条都会断裂:没有受保护验收,就没有可信的通过;没有外部失败,就没有真反思;没有单一改动,就没有归因;没有复测,就没有验证;没有停止条件,反思就会在收益为负时继续空转。最后还有一层始终悬在链上方的检验:反思优于多采样这件事本身需要被证明,而不是被假定。只有在相同 token、调用次数与墙钟预算下,带反馈的反思显著超过无反馈再采样,且首轮正确改坏率、回退率、隐藏测试都过关时,这条六步机制的成本才被证明是值得的。因果链的正确性由每一步的证据保证,而它的必要性由这一层对照检验保证——两者合在一起,才是反思从“再想一遍”变成可验证实践的全部依据。
- Reflexion: Language Agents with Verbal Reinforcement Learning:语言反馈式修正与经验记忆
- Self-Refine: Iterative Refinement with Self-Feedback:生成—反馈—修正循环
- CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing:用外部工具反馈约束批评
- Large Language Models Cannot Self-Correct Reasoning Yet:无外部反馈自纠的边界