跳到主要内容

RSI 入门介绍

七天实战

边学边练请访问 7 天学会 RSI 子站。子站按「执行 → 评估 → 反思 → 改进 → 再执行」安排七天课表、实验室与测验;本文是理论底座,建议对照阅读。

延伸阅读

动手见 快速开始,工程结构见 开发指南,七天课表见 从零到一。

本文要解决什么问题​

多数人把大模型当成一次性函数:写提示词、拿答案、不满意就手工再试。试几次之后,改进停留在操作者脑子里,下一次任务从零开始。RSI(Recursive Self-Improvement,递归自我改进) 把「不满意」变成系统的输入:执行产生轨迹,评估给出可复核分数,反思写成可检索教训,改进只改白名单内的策略,再执行时必须通过回归门禁。

读完本文,你应能回答:

  • RSI 改进的是策略与工件,不是在生产环境里无约束地改模型权重。
  • 五步闭环为什么必须先评估、再反思,而不能把「反思」和「打分」混成一句自由文本。
  • 内循环(同一次任务多轮改写)和外循环(跨任务积累教训库)各自改什么。
  • 与 Loop Engineering、Memory Engineering、微调分别站在哪一层。
  • 目标漂移、奖励欺骗、评估污染为什么是工程问题,而不是口号。

什么是 RSI​

递归自我改进指:系统用自己上一轮的执行结果,在受控范围内改写下一轮的提示词、工具描述、检索策略、评分量表或少量代码,并再次执行,直到达到停止条件。递归的含义是:改进程序本身也可以被同一套评估器审查。例如「改写提示词的提示词」也要接受同一回归集,否则改进器会比被改进对象更不可信。

本课程采用的工程定义有四条硬约束:

  1. 可观察:每轮保留输入、输出、工具调用、分数、反思文本和被采纳的补丁。
  2. 可度量:至少有一个不由被改进对象自己说了算的判据(测试、规则、独立评审器或人工抽检)。
  3. 可回退:补丁是版本化的;分数下降或回归失败时丢弃补丁,而不是覆盖上一版。
  4. 可停止:轮数、token 预算、分数平台期、人工检查点,至少命中一条就退出。

不满足这四条的「让模型再想想」只是重试,不是 RSI。

五步闭环​

步骤产出失败时的典型症状
执行 Execute候选答案、补丁或工具轨迹没有轨迹,只有最终一句「已完成」
评估 Evaluate分数、失败用例、规则命中只有形容词,没有可复算的扣分项
反思 Reflect错误模式、归因、下轮假设把「我应该更仔细」当成教训
改进 Refine白名单内的一处改动一轮同时改提示词、模型和测试
再执行 Re-execute新轨迹 + 与上轮可比的分数换了任务还宣称「提升了」

顺序不能对调。先反思再评估,反思没有判据,容易把幻觉写成经验。先改进再评估,你不知道改动是否值得保留。再执行必须使用同一任务规格和同一评分器版本,否则分数不可比。

内循环与外循环​

内循环服务单次任务。写作改进、修一个函数、压缩一段提示词,都属于内循环。状态放在当次上下文和本轮补丁里。停止条件通常是:测试全过、分数连续两轮提升小于阈值、或达到最大轮数。

外循环服务跨任务。内循环结束时,把「错误模式 → 修正动作 → 是否被回归集证实」写入教训库。下一道相似题目先检索教训,再执行。外循环不直接改模型权重;它改的是检索到的上下文和可复用策略模板。

Voyager 一类技能库、Reflexion 的 episodic memory、DSPy 的编译结果,都是外循环的不同载体。本课程要求外循环条目带有效性计数:被检索后若再次失败,计数下降,低到阈值就归档,避免错误教训长期污染。

改进对象白名单​

允许自动改进的对象应事先写明。教学系统默认白名单是:

  • 任务提示词中的「约束段」和「输出格式段」,不动「安全段」。
  • 工具说明里的参数示例和失败提示。
  • 评分量表的文字说明(量表权重变更必须人工审批)。
  • 单文件、单函数的代码补丁,且必须附带测试。

默认黑名单是:评估器的通过阈值、回归集的删改、密钥与权限、系统提示中的拒绝策略、以及任何扩大网络或文件系统权限的改动。黑名单被尝试修改时,记为安全事件并停止本轮,而不是「再试一次」。

历史脉络(工程视角)​

1965 年 I. J. Good 提出:一台足够强的机器可以设计出更强的机器,能力可能快速上升。这是 RSI 思想的源头,但它描述的是能力爆炸的可能性,不是今天可落地的训练配方。工程上更有用的是后来几条可复现的路线:

  • Gödel machine(Schmidhuber):只有当证明表明改写自身能提高期望效用时才允许改写。现实系统很少能给出这种证明,但它留下了「改进必须先过证明或验证」的纪律。今天的回归门禁是这纪律的弱化、可执行版本。
  • Reflexion(Shinn 等):Actor 执行,Evaluator 判断,Self-Reflection 把失败写成语言教训,注入下一轮。不更新权重。适合有明确成败的任务,例如带测试的代码题。
  • Self-Refine:同一模型生成、反馈、再生成。优点是实现短;缺点是反馈者和生成者共享偏见,必须用外部测试或第二个评审器抽查。
  • Voyager:在开放环境里把成功技能写成可检索代码,长期积累。提醒我们外循环的单位是「可复用技能」,不是聊天记录。
  • PromptBreeder / 提示词种群:变异和选择作用在提示词上,选择压力来自任务分数。多样性是燃料,也是成本来源。
  • DSPy:把提示词和少量示例当作程序参数,用优化器在训练集上搜索。它把「手调提示词」变成可复跑的编译。编译集必须和最终报告的测试集分开。
  • TextGrad / 文本梯度:用批评文本模拟梯度,反传到提示词或中间变量。批评文本同样要被事实约束。
  • ADAS、进化式搜索(FunSearch、AlphaEvolve 一类):在程序或智能体结构空间里搜索。搜索空间一大,评估预算和防过拟合就变成主问题。

这些工作都不是许可证,允许系统在无人看管时改自己的目标。课程把它们当成模式库:何时用语言反思,何时用测试,何时用种群,何时必须停下来等人。

和相邻课程的分工​

课程核心问题RSI 不重复的部分
Loop Engineering单轮 Agent 循环:规划、行动、观察、停止RSI 关注多轮之间策略如何被接受或回退
Memory Engineering记忆分层、写入与检索RSI 规定哪些教训允许写入,以及如何因再次失败而降权
微调用梯度更新权重RSI 默认不更新权重;权重更新是另一条成本更高的回路
评测基准、指标、统计RSI 把评测嵌进每一轮,并防止指标被改进器钻空子
REA在信息缺失时重建模型RSI 用轨迹重建「为什么这轮失败」,对象是自己的策略

把 RSI 做成「再包一层 ReAct」会丢掉门禁。把 RSI 做成「把对话存进向量库」会丢掉归因。把 RSI 做成「每晚微调」会在没有回归集时放大错误。

三个必须提前讲清的失败模式​

奖励欺骗(reward hacking):分数上升,人工抽查质量停滞。常见原因是评审器偏好更长、更礼貌、更像范文的文本,生成器就堆砌这些特征。缓解不是再加一句「请诚实」,而是:规则分与评审分分开、保留人工金标、分数上升时强制抽检。

评估污染:改进器看过了用来宣布胜利的那批题,或反思文本里夹带了测试用例。训练式优化(DSPy 编译)和报告用的测试集必须拆开。反思允许引用失败断言的名称,不允许引用隐藏测试的期望输出。

目标漂移:多轮改写后,任务从「修复空指针」变成「重构整个模块并改 API」。白名单和差异审查用来限制漂移。若补丁触及黑名单路径,直接拒绝。

一个最小心智模型​

下面的伪代码只表达控制流,不是框架 API。下一篇会把它收成可运行的教学循环。

def rsi_once(task, policy, memory, budget):
trace = execute(task, policy, memory.retrieve(task))
score, failures = evaluate(task, trace) # 测试优先,评审器其次
if stop(score, budget):
return policy, score
lesson = reflect(trace, failures) # 必须引用失败证据
if not lesson.grounded:
return policy, score # 拒绝无证据的反思
candidate = refine(policy, lesson) # 只改白名单字段
if not regression_pass(candidate):
memory.add(lesson, accepted=False)
return policy, score
memory.add(lesson, accepted=True)
return candidate, score

evaluate 不调用被改进的同一段提示词来给自己打满分。refine 返回补丁而不是整段不可审查的新系统提示。regression_pass 使用固定的小回归集,集合本身不在改进白名单里。

安全边界(学习阶段就要遵守)​

  • 实验在沙箱目录和假数据上跑。不给改进循环生产库凭证。
  • 人工检查点放在:第一次改评分量表、第一次改工具权限、连续三轮分数上升但抽检下降。
  • 日志保留补丁 diff 和评分器版本号。没有版本号的分数不能拿来比较。
  • 自我改进的演示文案可以激进,权限不能激进。课程不教授绕过安全策略、扩大系统权限或隐藏改进痕迹的做法。

阅读地图​

建议顺序:本文 → 快速开始跑通一轮 → 从零到一排个人七天计划 → 开发指南实现门禁 → 最佳实践处理奖励欺骗。GitHub 对照和 FAQ 在实现卡住时查阅。

自测​

  1. 用自己的话区分「重试」和「RSI」,并指出四条硬约束里你当前项目缺哪一条。
  2. 为一个写作任务写下白名单和黑名单各三条。
  3. 解释为什么 Self-Refine 必须配外部判据。
  4. 画出内循环和外循环,标出教训写入和降权的位置。
  5. 举一个奖励欺骗的具体例子:指标是什么,真实质量为什么没变。

下一步:快速开始,或打开 七天子站 完成 Day 1。

轨迹里到底记什么​

一轮 RSI 的原始材料不是「模型说它思考了什么」,而是可复核的轨迹。教学实现至少记录这些字段:

字段例子用途
task_idspec-login-01和回归集对齐
policy_revconstraints@3知道哪一版策略产生了输出
scorer_versionrules-r1r5-v1分数能否与上周比较
tool_calls空,或检索了哪条教训区分「没检索」和「检索了但没用」
output_hashsha256 前 12 位防止日志和产物对不上
failures["R3"]反思的唯一合法证据
human_spotchecknull / pass / fail分数上升时的抽检

缺 failures 的成功轮次仍然要记,因为外循环需要知道哪条教训「被检索且随后通过」。只有失败没有成功,教训库会过度悲观。

停止条件怎么写才不会停不下来​

停止不是「感觉好了」。建议同时配置,命中任一即停:

  1. 成功停止:规则失败集为空,且评审分不低于下限。
  2. 平台期停止:连续两轮分数差小于 1,且失败集合不变。
  3. 预算停止:轮数或 token 达到上限。上限是实验设计的一部分,事先写进协议,不要跑到「再来一轮也许就好」。
  4. 安全停止:补丁触及黑名单、反思无法引用证据、回归出现新失败。
  5. 人工停止:抽检失败,或任务文本在两轮之间被改进器改写。

平台期停止尤其重要。没有它,系统会为了 0.1 分不断改写,把随机波动当成进步。比较分数前先固定温度或改为贪心解码;做不到时,用同一策略重复采样三次,取失败集合的并集,而不是取最高分。

规格、策略、评分器三者不要搅在一起​

  • 规格描述任务要什么,实验期间只读。
  • 策略描述怎么做,白名单字段可改。
  • 评分器描述怎么判,版本化,不随策略一起改。

常见事故是把评分细则写进策略的约束段,改进器就会改评分细则来「变容易」。快速开始里的 R1–R5 放在代码常量而不是 constraints,就是为了物理隔离。若评分量表必须用自然语言给评审模型看,把量表文件的哈希记进日志,哈希变化则本轮作废。

一个写作任务的完整数值例子​

规格:「把 120 字产品介绍改成面向开发者的四句说明,保留全部数字。」

轮次失败分数采纳的改动
1漏掉「99.9%」、出现「等等」4不采纳,只产生教训
2数字保留,仍有「等等」6约束段增加「禁止含糊列举」
3无规则失败10回归三题无新增失败,采纳

第 2 轮分数上升但未全过,仍然可以采纳约束补丁,因为失败集是真子集且回归未变差。第 3 轮若回归题里「导出 CSV」突然丢掉字段名,则第 3 轮补丁丢弃,保留第 2 轮策略。这就是「局部变好、全局变坏」时的回退,比把三轮输出平均一下更可解释。

谁来当评估者​

优先级从高到低:

  1. 可执行检查:测试、schema、数字是否原样出现、禁止词。
  2. 独立评审模型:系统提示与被改进策略隔离,输出 JSON 分数和引用句。
  3. 人工抽检:不每轮都做,但在分数大涨、连续平台期、或第一次改工具说明时必做。

被改进模型的自评只能当假设,不能当门禁。Self-Refine 论文式的反馈有用,是因为它便宜、能指出表面问题;它不能替代第 1 层。课程实验若只有第 3 层,样本量必须小,并事先写好量表,避免每轮临时换标准。

和「自动科研」「自动编程」叙事的距离​

公开演示里,搜索式系统会改大量程序并报告基准提升。那些系统的关键成本在评估:每次候选都要跑测试、做统计、防数据泄漏。个人学习如果跳过评估直接模仿「让 Agent 改自己的仓库」,得到的是不可复现的 diff。本课程要求你先在一个函数说明或一道带测试的小题上跑通门禁,再扩大改进对象。扩大时新增的是白名单条目和回归题,不是希望。

术语对照​

中文英文在本课程中的含义
递归自我改进Recursive Self-Improvement用上一轮证据改下一轮策略并再执行
轨迹Trajectory可复核的执行记录,不是内心独白
教训Lesson带失败编号的归因,可被拒绝
补丁Patch白名单字段上的差异
回归门禁Regression gate固定题上不允许新增失败
奖励欺骗Reward hacking指标上升但任务质量没有
内循环Inner loop单任务多轮
外循环Outer loop跨任务教训库

结语​

RSI 在工程上是一套带版本的试错:失败要能指向规则,改动要能 diff,退步要能回滚。当你能指着日志说明「第 2 轮为什么接受、第 3 轮为什么拒绝」,而不是只展示一份更长的答案,你就已经离开了「多试几次提示词」的阶段。接下来用 快速开始 把规则跑通,再按 从零到一 把七天拆开。

规格漂移的具体形态​

规格漂移不是抽象风险。写作任务里,第一轮要求「保留全部数字」,第三轮策略的约束段被改成「突出重点数字即可」,输出开始丢掉 99.9% 和 120 字。规则如果只检查「有没有数字」而不检查「原数字是否都在」,分数仍可能上升。因此规则要写成可机械核对的集合:从规格抽出数字列表,输出缺少其中任一项即失败。改进器可以读到「缺少 99.9%」这条失败,不能读到一份替它写好的满分范文。

代码任务里的漂移是改公共 API。补丁若新增导出符号或修改函数签名,即使单测新文件通过,也算规格变化。门禁用 diff 的路径和符号表做判断,不靠模型承诺「我保持了兼容」。

预算怎么分给评估而不是生成​

经验上,评估调用的预算不少于生成。一轮里生成一次、规则检查一次、必要时评审一次、回归三题各生成一次,才知道补丁是否安全。省掉回归生成,等于把成本藏到下一道真实任务。教学实验把这个比例写进笔记:若回归调用占不到总调用的一半,结论里不要写「系统稳定改进」。

token 预算按轮封顶。教训文本超过 400 字就要求反思器先压缩成「编号 + 一个动作」,再进入下一轮。压缩也要经过证据检查,不能把编号压掉。

字段一览(后文不再改名)​

后续所有篇章使用同一套日志字段:round、task_id、policy_rev、scorer_version、failures、score、accepted、regression_new、safety_hash。看到新名字时,以这一清单为准改笔记,而不是各写各的。failures 为空列表表示规则通过。regression_new 为真时 accepted 必须为假。safety_hash 在整个实验中应只有一个取值;出现第二个取值就停止并人工看 diff。

把清单和 开发指南 里的校验脚本对上之后,入门阶段就可以结束。讲不清这些字段的实验,不进入种群和多角色。