1. 失败到行为改变的六步
一个查询工单状态的工具,接口返回结构从"状态加摘要"改成了"状态码加消息数组"。模型的旧理解没变,连续三次把状态码当状态文本读,任务三次失败。
拆开看这条失败接下来会发生什么。
记录。 三次运行的轨迹被存下来:每次调了什么、参数是什么、返回是什么、模型据此做了什么。
判定。 每条轨迹被判定为失败,并带上证据位置——第几步、哪次调用、返回的哪一段与预期不符。
提炼。 三条轨迹放在一起,共性浮出来:不是模型不会读,是返回结构变了而它不知道。这是一个可以复用的判断:调用该工具前先核对返回结构。
选载体。 这条判断放哪?它不是硬约束(拦不住也不需要拦),不依赖每次都要查证的事实(结构变动本身是事实,但"要核对"是原则)。所以进知识文档一条"该工具返回结构在某日变更",同时进 Skill 的一条例外条款。
发布。 提案过检查:在一批未参与提炼的任务上验证,保留集没有回退。
下次命中。 下一次遇到这个工具,模型先核对结构,然后才读。
六步里,第 6 步最难验证——产物写出来了、分数也可能涨了,但涨的原因未必是它。这一步是整个闭环里最容易被当成"已经成立"的一步。
2. 闭环的四个环节与缺失后果
把上面六步收一下,会看到四个必要环节。
持续进化(Recursive Self-Improvement,下称 RSI)不是「让模型改自己」,它是一个闭环。闭环由四个环节构成,缺任何一环都会退化成一种可识别的失效形态。
| 环节 | 做什么 | 缺了会退化成 |
|---|---|---|
| 信号 | 判断这次运行成功还是失败、为什么 | 盲改:不知道改什么,只能凭感觉调 |
| 判断 | 决定改什么载体、改动多大 | 乱改:改动落在错的层,修一处坏三处 |
| 动作 | 生成提案并发布 | 只记录:有结论但没有行为改变 |
| 验证 | 用未参与提炼的任务检验 | 自我强化:越改越自信,越改越偏 |
四个环节的顺序也重要。信号不成立时,后面三环全部无效——这一点在实践中经常被忽略,团队往往直接从「判断」开始(讨论该改提示词还是改工具),而前提「我们知道这次为什么失败」根本没建立。
3. 信号环节:三层验证与七维展开
三层验证说明「从哪一层拿信号」。具体到一次运行,还要决定评哪些维度。
判断一次运行为什么成功或失败,要依次回答三个问题。
事情是否办成了。 结果验证读测试结果、数据库状态、接口返回。Coding Agent 可以跑测试、类型检查、基准;替用户办退款的 Agent 可以查订单状态与实际退款金额。这类信号来自环境的真实状态,比模型对自己行为的描述可靠,应优先建立。
是否以允许的方式办成。 过程验证检查业务规则、权限、动作序列。删掉失败的测试也能让测试通过;口头承诺「七天内退款」也可能得到暂时满意的反馈。这一层区分「结果达成」与「结果以允许的路径达成」。
是否让用户舒服。 质量验证评表达、耐心、是否抓住重点。这些维度不影响事情办成与否,但影响体验。可用量表加模型评分,要求逐项给分并引用轨迹证据。
三层的可靠性与成本都递增。第一层可以用代码判定,第二层需要策略库,第三层只能靠评分模型。工程上的顺序应当是从下往上建,因为上层依赖下层的结论——如果结果层没建好,质量层的分数没有解释力。
七层展开成七个可逐项评分的维度:
| 维度 | 所属层 | 验证问题 |
|---|---|---|
| 任务结果 | 结果层 | 核心诉求是否解决 |
| 规则遵从 | 过程层 | 是否违反政策、权限或必要流程 |
| 隐私范围 | 过程层 | 是否泄露不应提供的信息 |
| 事实可靠性 | 跨两层 | 陈述是否有知识或工具结果支持 |
| 承诺与行动一致 | 过程层 | 声称完成的操作是否真实发生 |
| 表达质量 | 质量层 | 是否自然简洁,避免模板化 |
| 合规变通 | 质量层 | 原方案不可行时是否找到允许的替代 |
事实可靠性横跨两层,原因是它能被拆开:能与工具返回逐一比对的部分由代码核验,其余交给量表。这个拆分避免了「整项都由模型判」的偏差。
承诺与行动一致单独成维,因为它与任务结果是两件事。环境状态全对、但告诉用户的金额错了,结果这一维通过,这一维失败。不分开就发现不了这类失败。
3.1 验证结论的四项必需内容
只给一个总分的验证器无法指导更新。它说不清该改知识、改提示词、改程序还是改参数。
| 项 | 内容 | 缺了会怎样 |
|---|---|---|
| 结论 | 成功、部分成功、失败 | 只有二分时,部分成功案例被误判 |
| 逐维度判断 | 每个检查项各自的结论 | 无法定位该改哪一层 |
| 证据位置 | 第几轮、哪次工具调用 | 无法复核,也无法做失败归因 |
| 失败类型 | 分类标签 | 无法聚合同类失败,只能逐条看 |
还要允许一件事:证据不足时拒绝评分。与其把低置信度结论当作事实固化,不如把该案例排除在学习集之外。
4. 判断环节:四种更新载体
信号说明「应当改变」,没说明「改在哪里」。四种载体的适用面不同。
知识文档承载事实、经验规律、例外与来源。更新快、可追溯、可按需检索。失效模式是依赖检索命中——写进去了但没被取回,等于没写。
提示词与 Skill承载能用自然语言说清的判断原则,含例外与优先级。可解释、作用范围可控。失效模式是膨胀与互相冲突——规则越多越难同时满足。
程序与框架承载可解析、可验证的硬约束:权限、路径、格式、必须成对的操作。可测试、执行稳定、成本低。失效模式是开发维护成本高,且僵化——把需要判断的事写成代码,模型失去变通空间。
模型参数承载高维感知、生成风格、隐式策略。泛化强、推理开销低。失效模式是更新与回归成本最高,且容易灾难性遗忘。
选错载体的两种典型表现:把硬约束写成原则(拦不住),把判断原则写成代码(僵化)。
判据是「这条改动能否用一句话说清,且能被代码验证」。能被代码验证的进程序层;只能靠判断的进提示词层;需要查证的进知识层。
同一能力常常要拆到多个载体。以「遇到测试失败时先查环境再重试」为例:判断「这次是不是环境问题」需要领域知识(进知识文档),需要判断原则(进 Skill 的例外条款),而「必须按这个顺序」如果可以被代码强制,就写进工具的执行顺序。
4.1 拆分的判断过程
拆到多个载体不是随意切分,有一个可执行的顺序。
第一步,问这条改动能否被代码验证。 能,进程序层。例如「提交前必须跑测试」可以被钩子强制,「写入只能落在某个目录」可以被路径检查强制。这类内容放进提示词是浪费——提示词只能劝阻,代码能拦住。
第二步,问它是否需要查证具体事实。 需要,进知识层。例如「这个接口在测试环境超时」是一条事实,它的有效期取决于环境,只能存在知识文档里并带采集时间。
第三步,剩下的是判断原则。 进提示词或 Skill。这一类的特征是:它不能被机械验证,但能用语言说清,且需要模型在具体情境里判断适用与否。
三步之后还有一类漏网:既不能被代码验证、也不依赖具体事实、又说不清的原则。这类内容的正确归宿是暂时不写——它还没有被理解到可以固化的程度。强行写下来会变成一条无法执行也无法反驳的规则,后续没人敢删。
4.2 载体选择的错误代价
选错载体的代价不对称。
| 错误 | 后果 | 可恢复性 |
|---|---|---|
| 硬约束写成原则 | 拦不住,事故照常发生 | 低——事故已经发生 |
| 判断原则写成代码 | 模型失去变通空间,遇到例外就卡住 | 中——能改但要发版 |
| 事实写成原则 | 事实变化后规则变成错的 | 中——要有人发现 |
| 原则写成事实 | 被当成不可讨论的定论 | 低——后续没人敢改 |
第一行与第四行后果最重,因为它们的错误会在事后才显现,且已经造成了损害。
第一行的典型例子:把「不许删除生产数据库」写成一条提示词。它挡不住一次错误的工具调用。正确位置是权限层。
第四行的典型例子:把「我们倾向于用短函数」这个偏好写成「函数不得超过 20 行」。它从一条可讨论的倾向变成了硬规则,遇到确实需要长函数的场景时会引发无意义的返工。
5. 判断环节:五个搜索尺度
除了「改哪个载体」,还有一条正交的轴:优化的对象是产物本身,还是产生产物的方法。
从内到外:单条规则或记忆、结构化上下文、工作流、框架代码、优化器代码。
| 尺度 | 改什么 | 验证成本 | 可归因性 |
|---|---|---|---|
| 单条规则 | 一句话 | 一次回放 | 高 |
| 结构化上下文 | 条目组织 | 一组回放 | 高 |
| 工作流 | 节点与分支 | 一个任务族 | 中 |
| 框架代码 | 存储与检索 | 全量回归 | 低 |
| 优化器代码 | 探索策略 | 元评估 | 最低 |
越往外,单次验证越贵,可归因性越差,但改进的杠杆越大。
一条实用的判断:如果内层改得动,就不要往外走。外层搜索的收益通常被它的验证成本吃掉。
5.1 五个尺度的验证成本怎么算
验证成本可以用「需要跑多少次」来估。
| 尺度 | 单次验证要跑 | 一组候选的规模 | 总运行数 |
|---|---|---|---|
| 单条规则 | 1 条回放 | 十到几十条规则 | 十到几十 |
| 结构化上下文 | 5 到 10 条回放 | 三到五种组织方式 | 几十 |
| 工作流 | 一个任务族(20 到 50 条) | 三到五个变体 | 百级 |
| 框架代码 | 全量回归(200 条以上) | 每次一到两个变体 | 千级 |
| 优化器代码 | 元评估(要跑前面所有层) | 每个策略都要跑一遍 | 万级 |
这张表解释了为什么外层搜索在实践中很少做:不是不值得,是跑不起。
第三行开始出现一个新问题:任务族内部有方差。20 条任务上提升 5 个百分点,可能全来自其中 2 条难任务的偶然通过。要区分,需要重复多次,成本再乘三到五倍。
第五行更麻烦:优化器的好坏要经过「生成候选、验证候选、发布」这一整条链才显现。一次评估的周期可能是几小时到几天。
这也是回放机制的价值所在——它把前四行的成本降到接近零,只留下第五行的成本。
外层搜索绕不开一个问题:每个候选策略都要重新跑 Agent 与评估器。一个缓解办法是把已完成的发现过程保存成可回放的树。根节点是初始状态,每个子节点保存从某个历史状态继续尝试后的工作区快照、候选产物、评估诊断与分数。候选策略与在线时用同一套接口,逐步选择要展开的叶节点或从根节点开新分支;离线阶段只揭示已记录的结果,不必重跑。
这条机制成立需要两个条件:在线与离线使用相同的决策接口;只向策略揭示当前已展开的子树,不能偷看未来。它能比较分支、顺序、并行批次与停止时机,但不能证明在旧树上得分更高的策略能迁移到新任务。
6. 动作环节:为什么必须双循环
四种载体与五个尺度只有进入同一个循环才成为持续进化。稳妥的结构是两个循环。
在线循环只完成任务并记录证据,不直接改写正式版本。这是硬约束:一次偶发成功、一次网络故障、一次恶意输入,都不应该立刻改变长期能力。
离线循环聚合轨迹、诊断根因、生成提案、过发布检查、发布新版本。
两个循环通过版本化的经验库与评估集连接。评估集在这里承担发布检查的职责——没有它,离线循环无法判断一个提案是否值得上线。
把记录与整理分开还有一层好处:离线可以用更大的批量与更便宜的模型,因为它不在关键路径上。
一个直接的量化:一个团队每天产生 200 条任务轨迹,其中约 15% 失败(30 条)。如果在线上每次失败都触发一次提炼,就是每天 30 次额外的模型调用;如果改成每天一次批量提炼,成本降到个位数调用,且能看到同类失败的共性——单条失败看不出模式,30 条一起看就能看出「这一类都在同一个工具上出错」。
6.1 离线循环的五步
离线循环不是一个整体动作,它有五个可分离的步骤。
触发。 四种条件任一满足:时间间隔到达、新增已评价轨迹数量到达阈值、存储容量接近上限、错误频率上升。前置条件是确认当前没有高优先级在线任务——整理不能占用服务用户的资源。
定向。 读取正式知识、提示词、Skill 目录及其版本,了解已有能力,以及哪些部分不可修改。
定向常被省略,代价很大:不定向的整理会重复提炼已有内容,同一个结论被写成第二条规则,两条并存,后续无法判断哪条有效。
采集与整合。 从近期已评价轨迹中找新信号,合并重复,标记冲突与适用条件,优先生成局部补丁。
「优先局部补丁」的意思是:能改一句话就不重写一整条,能改一条就不重排整个目录。局部补丁的验证成本低、回滚容易、审阅快。
验证与审批。 在迁移集、保留集与安全集上评估待验证版本,高风险写入等待人工批准。
三个集合的分工:迁移集检验「新规则能否用在类似但不完全相同的场景」;保留集检验「有没有把原来能做的做坏」;安全集检验「有没有引入新的风险行为」。三者都要,因为失效方向不同——只跑保留集会漏掉「新规则根本没用」,只跑迁移集会漏掉「修了这个坏了那个」。
修剪与索引。 更新检索索引,把长期不用或被推翻的能力标记过期、归档或删除,保留来源与回滚版本。
这一步是唯一会减少内容的步骤。缺了它,知识量单调增长而检索准确率单调下降。
7. 动作环节的隔离:三项
收益判定处理「这个提案该不该上线」。还有一类问题处理「一次错误的输入如何变成长期能力」:网页、邮件与工具输出里的注入内容若被提炼成经验,会跨会话反复生效;自动搜索到的恶意依赖若被封装成工具,影响会从一次沙盒运行扩散到所有后续任务。
三项隔离分别对应三条路径。
证据与指令隔离。 原始网页、工具输出及其模型摘要都属于不可信证据,不能当作指令执行,也不能直接纳入长期能力。
有一点要划清:模型归纳只是把输入转成便于处理的形状,它达不到净化的效果。一段被归纳过的注入文本仍然是注入。
可执行的规则有三条:按固定结构提取主张、原文位置与采集时间;保留原文与来源;提取出的字符串绝不作为指令执行。模型给出的置信度只是未经验证的估计,不能作为批准依据——把它当依据等于让被审查者自己决定是否通过审查。
待验证与正式能力隔离。 新知识、提示词、Skill、程序与参数都先进入不可服务真实流量的待验证区。新生成的代码与外部依赖还要额外经过沙盒、权限检查、供应链扫描与行为测试。
这道隔离的价值在于它把验证变成了物理约束,不再依赖流程约定。只要待验证区不可服务真实流量,验证不通过的东西就不可能生效——不需要任何人记得去检查。
安全机制不可自我修改。 业务 Agent 可以改提示词、Skill、知识库、工具,但不能改批准自身更新的验证器、测试用例、发布判据、审计日志与稳定版本备份。
理由很直接:如果它可以改,那么只需降低判据或删除失败用例,就能把退化伪装成进步。判定「什么算安全机制」的标准是:任何参与判断「这次更新能不能上线」的东西,包括判据本身、判据用的数据、判据产生的记录。
三项里第三项最重要。前两项防止外部内容进入,这一项防止系统自己拆掉防线。
8. 验证环节与收益判定
一个提案值不值得上线,可以写成一个判定:
其中 \(\Delta_{\mathrm{r}}\) 是保留集上的增益,\(c_{\mathrm{u}}\) 是更新成本(一次额外的模型调用、一次人工审核),\(c_{\mathrm{g}}\) 是回退风险的折算成本。
只接受 \(g > 0\) 且保留集无回退的提案。
三个算例。
算例一,正增益正成本。 一条新规则让保留集通过率从 61% 升到 63%(\(\Delta_r = 0.02\)),代价是每次任务多一次检索调用(\(c_u \approx 0.005\) 折算),回退风险低(\(c_g \approx 0.002\))。\(g = 0.013 > 0\),接受。
算例二,零增益负成本。 把一段提示词从恒定类移到匹配类,保留集通过率不变(\(\Delta_r = 0\)),但每轮省下 3 KB(\(c_u\) 为负,约 \(-0.004\))。\(g = 0.006 > 0\),接受。
这个算例说明第二项常被忽略:一个提案即使增益为零,如果它降低了长期成本,同样有意义。
算例三,正增益但保留集回退。 总分提升 2 个百分点,但某一任务族下降 8 个百分点。\(\Delta_r\) 为正,但硬规则拒绝——保留集上任何一项指标退化的一律拒绝,不管总增益多少。
这条规则牺牲了「用一项退化换两项提升」的可能性,但它把回退风险压到零。第 3 个算例在实际评审里最难坚持,因为总分是正的,拒绝它需要额外解释。
9. 闭环成立的四项能力
「持续进化」常被当成一个整体判断。拆开看,它至少包含四个能力,缺任何一个都不成立。
| 能力 | 含义 | 失效表现 |
|---|---|---|
| 记住 | 把这次的经验留下来 | 每次任务从零开始 |
| 迁移 | 把经验用到相似但不同的场景 | 只在完全相同的任务上有效 |
| 更新 | 用新规则覆盖或淘汰旧规则 | 继续使用已废止的规则 |
| 保持 | 更新后不破坏原有能力 | 修了一处坏了三处 |
四种失效的检测方式不同:第一种看有没有写入;第二种看跨场景表现;第三种要读内容,看是否还引用已被推翻的东西;第四种看保留集。
第三种最容易被跳过,因为它不看分数看不出来。一条可操作的做法:定期抽一条已废止的规则,看系统是否还会引用它。
第四种只在有更新时才需要看。一个从不更新的系统不会有保持问题,因为它没有变化。
10. 闭环的三种失效
三种失效对应四个环节的不同缺法。
只追加不淘汰。 对应「判断」环节只看增益、不看替代关系。症状是规则越来越多、互相冲突,模型在不同规则间摇摆。
一个可识别的信号:规则总数单调上升,但通过率趋于平台。这说明新增规则带来的增益被规则冲突吃掉了。修法:每次提案必须声明它替代或废除了哪些旧内容。
摘要代际漂移。 对应「信号」环节只读摘要、不读原始证据。症状是几轮整理后,早期的重要限定条件消失。
识别方式是抽一条三个月前的规则,追它的来源:如果能追到原始轨迹,说明没有漂移;如果只能追到上一版摘要,说明已经漂了。修法:定期整理必须读原始材料。
把探索性讨论固化为规则。 对应「判断」环节没有区分「讨论过」与「验证过」。症状是某次对话里的方案比较被写成「必须这样做」。
识别方式看证据类型标签。修法:提案必须带证据类型,只有「验证过」的才能进正式规则。
11. 闭环不成立的条件
三条判据,任何一条成立就应当放弃自动进化。
评价信号来得很慢或不唯一。 开放式研究、战略规划、复杂产品设计属于这一类。此时 Agent 可能把流程执行得很完整,却只是稳定地产出「像成果的东西」。自动进化会把这种稳定当成进步。
没有可回滚的发布机制。 如果一次错误的更新无法撤销,自动化的收益不值得承担风险。回滚能力的缺失通常意味着整个发布流程需要先建。
失败案例无法被稳定记录。 如果系统只记得成功,归纳必然有偏。这一条对应的正是「认识论过度乐观」的成因。
三条之外还有一条弱判据:如果改动的实际执行者是人(例如每次更新都要人工改一段提示词),那么「自进化」只是把人的工作换了个说法。此时更值得优化的是人的工作效率,建一套自动管线的收益有限。
12. 四个环节的检查顺序
给一套 RSI 系统做体检,按环节顺序查。
第一,信号是否成立。 查失败案例有没有被记录。这一项不过,后面都不用做。
第二,判断是否有依据。 查每个提案是否带证据类型与影响面。没有依据的提案等于随机改动。
第三,动作是否闭环。 查提案到发布的路径是否完整,有没有「生成了但没人审」的堆积。
第四,验证是否独立。 查保留集有多久没被用于决策。被用了就不再独立。
四项的顺序不能换。跳过第一项直接看第四项,会得到「指标很好」但实际无效的结论——因为进化的方向从一开始就是错的。