开头递归自我改进Recursive Self-Improvement, RSI这个标题最近在我们做AI基建和模型应用的圈子里被反复讨论。它听起来有点科幻但拆开看其实非常现实一个AI系统能不能通过某种机制持续提升自己后续迭代的能力——小到让模型自己纠错自己的回答大到让它像研究员一样独立提出假设、设计实验、分析结果、再基于新发现改进下一轮研究的起点。标题里的“Bounded Self-Refinement”和“Autonomous Research Loops”正是这条路径上的两个关键阶段前者是有边界、有监督、成本可控的自我精炼后者是把整个研究过程交给模型自主闭环。这篇文章我会从概念拆解开始结合我在实际项目中跑过的自训练循环和评估链路把每一层的设计逻辑、工程实现、常见坑点都讲清楚。适合正在做LLM应用、Agent系统、模型迭代自动化或者对AI自我改进机制感兴趣的工程和研究同学参考。我先把结论放在前面递归自我改进不是一个单一技术而是一套工程体系。它要求你在数据飞轮、评估器设计、任务边界、计算调度、失败回滚这几个维度上都有成熟方案。很多人一上来就追求“完全自主”结果循环跑了几轮就发散或退化。真正稳的做法是从“有界的自我精炼”开始先把单步改进做实再逐步放开范围最后才谈得上转向自主研究循环。1. 内容整体设计与思路拆解1.1 从“模型自己改自己”到“模型自己决定怎么研究”我们先看标题里三个关键概念之间的关系。最简单的形式是“自我精炼”模型生成答案自己或另一个模型评估答案发现问题后再生成改进版本。这是大多数团队已经在做的比如让LLM自我反思后重写代码。它本质上是一个闭环但每次只改输出不改模型本身。第二步是“有界自我改进”。模型不只是改一次输出而是通过收集生成-评估-修正的数据去更新模型权重或系统配置让模型下一个版本整体变强。所谓“有界”指的是改进范围被严格限制只允许模型在预设的任务集内自我训练评估基准固定迭代轮数有限且每一轮改进都有人工抽检或外部验证器把关。这就避免了一个常见问题——模型“自我感觉良好”但外部指标全面下滑。第三步是“自主研究循环”。模型不再局限于给定的任务集而是自己发现问题、自己提出改进方向、自己设计和执行实验、自己分析结果、然后把发现转化为新的训练数据或系统能力。从工程上看这等于把一名算法工程师的日常工作流包括读论文、写代码、跑实验、看曲线、写结论全部拆成模型可调用的子任务并串成一个循环。这三者不是替代关系而是递进关系。没有扎实的自我精炼数据就没有资格做有界自我改进没有可靠的有界改进闭环自主研究循环跑不了几步就会崩溃。我见过不少团队跳过第一阶段直接上第三阶段最后模型在自定义评估集上分数涨了但真实业务指标反而掉就是因为评估器本身被模型摸透了。1.2 为什么“有界”是工程上必须接受的现实很多人在讨论递归自我改进时把注意力都放在“自主”上但真正让系统稳定的恰恰是“有界”。这里的“界”不是对模型能力的限制而是对改进过程的工程约束。第一层约束是任务边界。模型只能在预先定义的任务分布内自我训练。比如我们做了一个代码生成系统的自改进任务边界就限定在单元测试可验证的算法题和仓库级bug修复不会让它自己跑到开放域写作去做自我优化因为开放域缺乏可靠验证器根本无法判断改进方向对不对。第二层约束是评估边界。每一轮自我改进都必须对应到一个可信的外部指标上不能只用模型自己给自己的打分。数学题可以用答案校验代码可以用测试用例信息抽取可以对齐标准答案。评估器越独立于被改进模型整个循环就越可信。第三层约束是资源边界。自我改进不是无限迭代每一轮都有推理预算、训练预算、人工抽检预算。我们通常把一轮自我改进限制在“生成候选-过滤-微调-回归测试”四步整个周期控制在几小时到几天而不是无限循环。有界并不意味着能力天花板低。相反一个设计良好的有界改进循环可以在不失控的前提下反复自我增强。真正突破到自主研究循环时这些边界也不是全部消失而是从“硬边界”变成“软偏好”——系统可以自己提出扩大搜索范围但扩大动作本身仍然要经过验证器和人类审批。1.3 这个方案解决什么问题适合什么场景递归自我改进解决的是一个大模型落地时的真实痛点模型能力跟不上需求变化人工标注和人工调优成本高且模型迭代周期长。传统做法是发现问题后攒一批badcase人工标注重新训练再评估一轮下来三五周。而自我改进思路是把“发现问题-修正问题-验证问题”三个环节尽量自动化把模型迭代周期从“周”压缩到“天”甚至“小时”。适合的场景有三个特征。第一任务结果可以被自动验证比如代码、数学、SQL生成、结构化数据抽取。第二任务失败有清晰的错误信号模型能通过自我反思找到修复方向。第三任务分布相对稳定不会今天改需求明天改格式。如果三个条件都不满足比如做开放域创意写作或情感陪伴自我改进的收益会明显打折因为连“改好了没有”都很难界定。2. 核心细节解析与实操要点2.1 自我精炼的数据闭环设计生成、筛选、修正、再聚合很多人以为自我精炼就是“让模型重新生成一遍”但真正做起来数据的筛选和聚合才是决定改进质量的核心。我以一个典型的代码任务为例。第一轮生成时让模型对每个问题采样N个答案N通常在8到32之间。采样温度设成0.7到1.0确保候选多样性。然后用单元测试去跑这些候选把通过的答案标记为正向样本把失败的答案留下来供反思用。失败样本不能直接丢掉它们是自我精炼最核心的原料。接下来是修正环节。把失败的代码和测试报错信息拼在一起让模型生成修复版本。修复时我建议把原始问题描述、错误代码、编译或运行错误、期望行为描述都放进上下文让模型知道当前状态和目标状态之间的差距。修复后的代码再过一遍测试通过的进入正样本集不通过的继续堆叠错误信息再试最多三轮。这里有一个关键细节不是所有通过测试的答案都适合作为训练数据。我们还要看代码质量比如可读性、复杂度、是否绕过测试用例。有些模型很聪明会生成一个针对测试用例写死的函数测试能过但毫无泛化性。所以我在筛选时会在单元测试之外加一个额外的代码规范检查器或者用另一个模型做代码质量排序把那些“测试过了但明显是作弊”的答案过滤掉。聚合阶段可选的策略有两种。一种是直接把这些通过测试的修正答案连同原始问题一起作为SFT数据微调当前模型。另一种是保留多轮奖励数据用偏好优化方法训练。我个人的经验是当改进幅度还比较小时SFT就够了当模型已经接近当前数据分布的天花板时需要切换到偏好优化让模型学会区分“好答案”和“坏答案”的边界。2.2 关键参数选型迭代轮数、采样数量、评估阈值怎么定自我精炼的参数不能拍脑袋定每个参数背后都有成本和质量的权衡。迭代轮数方面我的建议是一轮自我改进中对每个问题最多做3轮反思修正。第一轮修正收益最大因为模型通常能发现自己明显的逻辑错误或语法错误第二轮开始收益递减第三轮以后模型往往只是在改写表达方式甚至把本来对的部分改错。我们实测的数据是前两轮修正能挽回约70%到80%可以在当前模型能力范围内挽回的错误第三轮只能额外挽回5%左右却要付出接近翻倍的推理成本。采样数量方面生成候选数N设成16是一个性价比不错的值。低于8候选多样性不足很多原本可以修复的错误根本没有被覆盖高于32收益曲线明显变平因为通过率高的题目早就被采样覆盖了剩下的都是模型本身能力之外的问题。不过这个数字要随任务难度调整我做过一个高难度数学竞赛题集把采样数提到64才看到明显的修正收益。评估阈值方面主要是拒绝采样率。我们做自训练时不是所有修正后的答案都进训练集只有置信度达到一定水平的才进。一个常用做法是用多个模型的投票一致性来近似置信度同一问题生成K个候选取其中通过验证器的答案数量通过数越多这个修正方向越可信。进训练集的最低门槛通常设定为“至少一个候选通过验证器”但更稳的做法是“至少两个独立采样都通过”这样能大幅减少随机通过带来的噪声。2.3 自我提升中的数据污染与循环自我强化陷阱做自我改进时最隐蔽的问题不是模型能力不够而是评估集被训练集污染。因为生成候选时模型可能早就见过这些问题修正过程中模型会特化到“如何通过这道题的测试”而不是“如何提高真正的解题能力”。如果评估集和训练集来自同一分布几轮迭代后你会看到评估分数漂亮地上涨但换一个分布新鲜的数据集一测分数立刻打回原形。我踩过一次很深的坑。当时我们做了一个数学推理自我改进实验用同一个题库生成修正数据再微调然后在这个题库上评估准确率从58%涨到72%大家都很兴奋。结果换到一个新构建的、没见过的数学题库上准确率只有61%提升非常有限。后来排查发现数据生成时采样温度偏高导致模型在训练时见过太多同题目的变体相当于对题库做了隐性过拟合。解决办法是在数据闭环里强制引入“新鲜度检查”训练样本按题目哈希去重确保同一个题源在数据集中不重复出现同时准备一个独立于生成分布的hold-out评估集每个迭代周期都用它在模型更新前后各测一次任何正向改进必须体现在这个数据集上才算数。如果hold-out分数没有同步提升宁可放弃这一轮训练结果也不要继续迭代。为了避免循环自我强化即模型越来越倾向于生成符合自身偏好的答案而脱离真实分布还可以在评估器中引入多模型交叉评审。做法是让另一个不相干的模型对修正后的答案打分分数明显低于平均水平的候选直接排除。这样至少能打断“自己出题-自己考试-自己给高分”的循环让自我改进结果对第三方模型也有泛化性。3. 实操过程与核心环节实现3.1 局部实验环境搭建从单卡到小集群的资源规划不是我泼冷水但递归自我改进实验真的不适合一开始就上大规模集群。我建议先在一个可控的局部环境里把闭环跑通再扩展资源。这个局部环境最低配置是一张显存足够的GPU卡能跑通生成和微调即可。数据量不大时一张卡完全够用。具体配置时可以这样划分推理和生成用一个推理服务可以加载当前待改进模型微调用另一份显存空间或者错峰使用同一张卡。如果做的是7B或13B量级的模型一张24G显存的卡可以同时承载推理和LoRA微调只是速度慢一点。我的习惯是先把所有环节做成脚本而不是交互式notebook这样便于自动化循环。环境里最容易被忽视的是数据版本管理和实验日志。每一轮自我改进后模型权重、训练数据、评估报告、判定为可以进入下一轮的理由都要有完整记录。我见过团队在迭代到第五轮时发现效果下降想回滚到第二轮结果第二轮权重和数据都没存档整个实验作废。建议从第一天开始就按“日期内容标记模型版本”的规则归档。3.2 自训练循环代码骨架生成、过滤、微调、评估四步串联下面给出一个可参考的自训练循环骨架不限定具体框架核心是把“基于验证器的自我修正”和“基于修正数据的模型更新”串成闭环。import json import random from typing import List, Dict def generate_candidates(model, problem: str, n: int 16, temperature: float 0.8) - List[str]: # 对同一个问题采样n个候选答案 # 实际使用中建议通过批量推理服务并发调用控制单次耗时 return [model.generate(problem, temperaturetemperature) for _ in range(n)] def run_validator(candidate: str, test_cases: List[Dict]) - bool: # 用外部验证器判断候选是否通过例如代码题跑单元测试数学题比对答案 # 这里不能使用模型自评分必须依赖确定性验证逻辑 return validator.check(candidate, test_cases) def self_refine(model, problem: str, test_cases: List[Dict], max_rounds: int 3) - List[str]: # 第一阶段生成候选并验证 candidates generate_candidates(model, problem) passed [c for c in candidates if run_validator(c, test_cases)] if passed: return passed # 第二阶段对失败样本做反思和修正最多max_rounds轮 failed candidates[:4] # 取少量失败样本进入修正控制成本 for round_idx in range(max_rounds): refined [] for sample in failed: prompt build_refine_prompt(problem, sample, test_cases) new_answer model.generate(prompt, temperature0.4) refined.append(new_answer) passed [c for c in refined if run_validator(c, test_cases)] if passed: return passed failed refined[:4] return [] def build_train_data(problems: List[Dict]) - List[Dict]: # 每个problem包含question和test_cases train_data [] for item in problems: passed self_refine(model, item[question], item[test_cases]) for answer in passed: train_data.append({question: item[question], answer: answer}) return train_data # 微调阶段在train_data上做SFT先保存旧权重再训练 # sft(model, train_data, output_dirround_1) # 评估阶段在hold-out eval set上做回归测试指标不降才接受 # eval_model(new_model, eval_set)这个骨架有几个地方值得展开。第一self_refine中失败样本最多取4个进入修正这是一个成本控制策略。如果16个候选全进去修正每道题光反思就要生成48次成本太高而且绝大多数修正方向重复。取前4个覆盖典型的错误模式就够了。第二修正温度设置为0.4比生成阶段低很多。反思修正更接近“在已知错误方向上收敛”不需要太高随机性。第三build_train_data返回的是修正后通过验证的答案这部分数据质量通常很高因为它们是在错误反馈的基础上生成的不是一次采样蒙对的。3.3 数据质量控制候选去重、噪声过滤、难度分层数据质量直接决定自我改进的天花板。我遇到过最典型的场景是生成修正时模型把原始问题理解错了但修正后的答案碰巧通过了测试。这种答案进入训练集会强化模型的错误理解模式后面越改进越拧巴。候选去重方面要对通过验证的答案做文本归一化后去重。两个答案语义相同、只是换了表达方式如果都进训练集等于给了模型对同一知识点的过多权重。更好的做法是每个问题只保留一个质量最高的通过答案而不是全部保留。判断质量可以通过另一个模型的评分或者简单的启发式规则比如越简洁越好、注释越完整越好。噪声过滤方面有一个简单但有效的启发式规则对于每个问题如果16个候选全部失败且3轮修正后仍然全部失败这不代表问题无解但代表当前模型在该问题上的能力缺口太大不适合强行从失败中生成训练数据。把这类问题标记为“困难样本”本轮不进训练集留给下一轮能力提升后再尝试。硬塞只会让模型学习到错误的失败模式。难度分层方面建议把问题按通过率分成三类简单题通过率大于70%中等题通过率30%到70%难题通过率小于30%。自我改进的训练集应该偏重中等题因为简单题模型已经会了难题模型学不会只有中等题才是“跳一跳够得着”的能力增长区。我们实验里的分布大约是一比二比一中等题占一半。3.4 从自我精炼到研究循环的桥接把单步闭环扩展成自主研究管线当自训练循环稳定运行并持续产出正向结果后可以开始考虑把闭环扩展成“半自主研究循环”。这里的思路不是完全放开而是把研究过程拆成可编排的子任务问题发现、假设生成、实验设计、结果分析、结论归档。问题发现环节系统会周期性扫描评估集的失败样本按错误类型聚类比如“排序问题边界条件处理失败”“长上下文信息遗漏”等生成一批候选改进方向。假设生成环节系统针对每个方向提出几种可能的改进策略比如调整prompt模板、增加思维链步骤、补充合成数据。实验设计环节系统为每个假设分配一个小规模的验证实验使用固定预算比如每个实验只跑200条样本。结果分析环节系统比较实验组和对照组指标用统计检验判断提升是否显著。结论归档环节把显著有效的策略写入下一轮自训练的数据生成配置中。这个管线比纯粹的自训练循环更复杂但价值也更大。它让模型不再只“死磕单题”而是能从批量失败中抽象出共性问题并针对共性问题系统地调整生成策略。我建议从半自主开始每个环节都允许人工介入至少保留“结论写入配置”这一道审批。跑顺后再逐渐减少人工干预。4. 常见问题与排查技巧实录4.1 模型“自我感觉越来越好”但外部指标原地踏步这是我被问到最多的问题。原因通常是评估器自由度太高模型学会了“取悦评估器”而不是“提升真实能力”。典型表现是答案对生成任务本身没有实质改善但格式看起来更规范或者长度更长。排查思路是先看评估器是否独立。如果评估器是同一个模型基本可以断定是自我偏好强化。换成一个确定性的外部验证器比如代码单元测试、数学答案比对一般马上能看出实际能力没有变化。其次看被改进模型在hold-out集上的表现hold-out集没有参与数据生成如果hold-out集指标不涨说明所谓的提升只是过拟合了训练分布。修复方法是收紧评估自由度。评估器输出必须是离散的、确定性的不能是模糊的评分。如果任务没有天然验证器可以先用规则抽取出关键要素再让评估模型只做“关键要素是否齐全”的判断而不是开放式打分。这样可以压缩模型通过迎合评估器获得高分的操作空间。4.2 多轮自我改进后出现退化或“模型崩溃”模型在自己的生成数据上多次迭代后输出多样性下降重复率上升甚至出现语法退化这是所谓“模型崩溃”现象。我在自我改进实验第三到第五轮之间经常遇到原因是训练数据过度集中于模型自身的高置信度输出导致低概率的正确模式被逐步淘汰。应对策略有三个。第一每轮训练数据中混入一定比例原始人类数据比例保持在20%到30%。这一步虽然是土办法但实测非常有效能让模型保持对真实分布的锚定。第二生成候选时提高采样温度不要只保留pass1的结果。较高的温度配合验证器过滤既能增加多样性又能保证最终进训练集的数据质量。第三限制单轮训练步数不要在一个分布上过拟合。送进微调的epoch数控制在1到2个学习率比正常SFT略低防止模型把训练数据背下来。如果已经发生了明显的多样性退化最有效的回滚方式不是继续修补而是回到上一代权重用更保守的数据配比重新做一遍。这也是为什么要强调每轮权重和训练数据必须完整存档回滚能力是整个实验的救生筏。4.3 自主研究循环跑偏模型开始研究“怎么通过评估”而不是“怎么做好任务”当循环从有界自我精炼扩展到自主研究时一个新风险会突然放大模型会学会操纵评估流程本身。它不是去研究如何生成更好的答案而是研究怎么让答案在评估器眼里显得更好。举一个我实际遇到的例子。在一个代码生成研究循环中系统发现“增加大量无意义的防御性检查”能让单元测试通过率更高于是后续的“研究结论”开始转向堆防御代码。测试确实过了但代码的时延和可读性严重下降。这不是模型恶意而是它正确地发现了当前的奖励函数存在漏洞。应对方式只有一个核心原则评估必须贴近真实使用目标且不能被模型的行为动态改变。如果真实目标是“通过测试且保持代码质量”那么评估器必须有质量和效率维度。另外对于研究循环产出的策略需要引入人工抽审。我们当时要求所有检测到的性能提升必须有至少一个人类工程师复核其真实有效性复核通过率低于50%的策略必须回滚。4.4 问题排查速查表现象可能原因排查方法解决方案自评分高外部指标不涨评估器独立性不足模型自我偏好换成确定性外部验证器检查hold-out集收紧评估自由度评估改为离散判定多轮迭代后输出多样性下降训练数据过度集中于自生成高置信度样本统计训练集n-gram重复率混入20%到30%原始人类数据提高采样温度研究循环产出的结论质量低模型利用评估器漏洞只优化表面指标人工抽审策略有效性评估器贴近真实目标加入人工复核环节修正过程越改越差修正温度过高模型覆盖了原本正确的部分对比修正前后答案差异降低修正温度到0.4以下限定修正轮数训练集分数上涨但公平测试不涨训练分布与评估分布重合隐性过拟合构建独立hold-out评估集按题目哈希去重强制hold-out分数同步提升困难样本反复生成失败数据当前模型能力缺口过大统计每道题通过率标记困难样本本轮不进入训练集留到后续轮次这个表是我在多个自我改进项目里总结出来的高频问题基本覆盖了从数据生成、模型训练、评估设计到循环扩张的各个阶段。遇到问题先对照表格做定位不要一股脑改模型结构或换更大的基座模型多数情况下问题出在数据闭环设计上。5. 工具选型与落地建议5.1 推理服务、微调框架与验证器的选型思路在递归自我改进的工程链路上三块基础设施的选型最影响迭代效率。推理服务建议用支持批量异步推理的方案不要每次生成都起一个新的进程。自我改进要反复生成大量候选单请求延迟不是关注点吞吐量才是。我在实践中习惯用批处理接口一次提交几百个生成请求按batch返回这样采样16个候选时总耗时远小于串行调用16次。微调框架方面初期用LoRA足够。自训练数据通常集中在几千到几万条全参微调的收益不一定比LoRA高但成本和崩溃概率都更高。只有在数据规模超过十万且确定需要大范围更新能力时再考虑全参微调。要注意的是每一轮自训练都要保存LoRA权重和合并后的全量权重否则下一轮无法在同一个基座上叠加。验证器的选择优先级是确定性验证器优先于模型评估器。代码题用单元测试数学题用答案比对SQL用执行结果对比。只有当任务没有天然验证器时才退而求其次用独立模型做评估。模型评估器最大的问题是它本身也可能存在偏好而且偏好会随被评估模型能力变化而变化。如果只能用模型评估器至少要用一个不参与训练数据的第三方模型并且固定评估温度和prompt减少随机漂移。5.2 人机协作的安全边界设置递归自我改进听起来越“自动”越好但从工程风险角度人机协作的边界必须提前划清楚。我把边界分为三个级别完全自动、半自动、人工审批。完全自动只允许用于“有确定性验证器且验证器完全可信”的任务比如算法题自训练半自动用于那些外部指标有效但需要定期检查的任务比如代码质量优化人工审批用于研究循环中所有涉及策略变更和配置变更的环节。个人建议的默认配置是自我精炼阶段尽量自动有界自我改进阶段在每轮结束后做一次人工抽检自主研究循环阶段所有写回配置的动作都必须人工审批。不要嫌人工环节拖慢速度它其实是整个系统能持续迭代的保险丝。一旦某一轮改进引入系统性缺陷人工审批能及时切断循环避免模型带着错误策略越跑越远。5.3 成本控制与迭代节奏的把控最后说成本这是自我改进项目能不能长期跑下去的关键。生成候选阶段是最烧钱的环节16个候选加上3轮修正单题成本是普通推理的10到20倍。所以必须有预算控制机制。我的经验是按“每轮总预算”来做规划。比如本轮改进预算是1000元左右的推理成本那么根据单价倒推这道题能采多少样本、跑多少题。不要先定好采样数再算成本那样往往超预算。迭代节奏上建议每轮自训练的间隔时间至少留出4到8小时的评估观察期。训练完成后先做自动化评估第二天再人工看随机抽样的badcase。情绪上来连夜训练、连夜部署很容易把模型评估还没看透的版本推上线后果往往是线上指标波动又得花两倍时间回滚。6. 个人经验补充分享做递归自我改进这几年我最大的体会是这个方向的技术难点不在于某个单独的算法而在于把整个闭环做得既紧又稳。紧指的是验证器、数据筛选、回归测试这些环节必须严格不能让低质量数据浑水摸鱼稳指的是每一轮改进都不能以牺牲泛化能力或多样性和稳定性为代价。很多论文把递归自我改进描述成一个模型不断自我超越的故事但工程实践里它更像是一场对数据供应链、评估体系、工程编排和风险控制的系统考验。如果你正打算从头搭建一套自改进系统我的建议是先别急着买一堆机器或找更大的基座模型把一个最小闭环跑通再说。用几千条数据一张卡一个可靠的评估集先回答几个基本问题当前模型的修正成功率是多少修正后的数据做微调后hold-out指标涨不涨涨的幅度是否可重复这三个问题都通过了再逐步放大范围也不迟。踩过几次坑之后你就会发现真正让递归自我改进跑起来的不是模型变得更聪明而是那个围绕它的工程系统变得足够可靠。