本质 = Voyager(Minecraft 课程探索 + skill 积累)+ Reflexion(verifier 反馈写 memory),搬到 GUI 软件操作(FreeCAD / 视频编辑器 / WPS)。novelty 在于:① 独立 verifier 不共享 actor 的 memory(减少 correlated error);② BRS 先并行广覆盖、DRS 再顺序深挖的两阶段课程;③ 完全无需标注数据、无需微调权重,靠 context 里的 memory text 适应全新软件,开源模型打败 GPT-6 Astra。
论文大量使用抽象词。下表以 FreeCAD 任务("建一个带圆柱销的底座")为例,把每个词钉到具体对象上。
| 论文术语 | 论文说它是什么 | 具体是什么(FreeCAD 为例) |
|---|---|---|
| Environment | 智能体操作的环境 | FreeCAD 软件程序——打开后有零件树、3D viewport、Python 控制台 |
| Memory | 持久化的知识库 | 一段存盘的文本,里面写着:"建圆柱销:pin = Part.makeCylinder(5, 18); pin.translate(v);倒角会让布尔减法失败,先做形状再加倒角" |
| Actor agent | 执行动作的 LLM | GLM-5.3,根据任务描述 + memory,写 Python 代码操作 FreeCAD(Part.Box()、FreeCADGui.runCommand('PartDesign_Pocket')) |
| Verifier agent | 独立判断结果的 LLM | Kimi-K3,看 FreeCAD 渲染截图,对比参考图,判断"圆柱销位置是否匹配、底座尺寸是否正确";不共享 actor 的 memory |
| Curriculum agent | 决定练什么的 LLM | Kimi-K3,看 memory 里还没覆盖哪些特征,生成"本次练习:chamfer + fillet 组合 + 布尔减法" |
| BRS | Broad Recursive Self-exploration | 并行跑 8 个不同方向的 FreeCAD 练习(孔洞、倒角、圆角、约束、布尔…),广度优先积累 memory |
| DRS | Deep Recursive Self-exploration | 顺序跑 5 次针对目标任务的更难变体(换参数、加约束、改几何),逐步填补 memory 里的失败原因 |
| RSI round | 一轮自我改进 | BRS(8 并行)→ DRS(5 顺序)→ 冻结 memory → 用冻结 memory 跑真实测试 |
| Code-based action | 用代码操控软件 | Actor 输出 Python:doc = App.open(path); obj = doc.addObject('Part::Box', 'Box'); obj.Length = 30.0 ... |
| Causal relationship | memory 中记录的因果规则 | "先加布尔减法、再加倒角" → "倒角不会破坏孔形状";而反过来就会失败 |
系统由三个 LLM 角色驱动,彼此分工明确:
| 角色 | 用的模型 | 职责 | 能看 memory 吗 |
|---|---|---|---|
| Curriculum agent | Kimi-K3 | 分析 memory 缺口,决定"下一批练什么",生成练习任务描述 | 能(读 memory,找未覆盖技能) |
| Actor agent | GLM-5.3 | 读取 memory + 任务描述,写 Python/Bash 代码操作软件,执行后把新知识/失败教训写入 memory | 能(读写) |
| Verifier agent | Kimi-K3 | 独立检查软件输出(截图/文件),给出 pass/fail + 失败原因 | 否(故意隔离,避免 actor 的错误信念污染验证) |
flowchart LR
C["Curriculum"]
A["Actor"]
V["Verifier"]
M[("Memory")]
Env["Environment"]
C -->|"task prompt"| A
A -->|"Python code"| Env
Env -->|"screenshot"| V
V -->|"fail + reason"| A
A -->|"update"| M
M -->|"retrieve"| A
M -->|"gap analysis"| C
BRS(Broad Recursive Self-exploration)的目标是让 memory 覆盖软件的各个基础功能,而不是反复练同一个角落。
具体做法:curriculum agent 生成 8 个方向不同的练习任务(比如 FreeCAD 里分别对应:孔洞 / 倒角 / 圆角 / 布尔减 / 阵列 / 约束求解 / 导出 / 外壳厚度),actor 并行执行这 8 个任务,失败→verifier 给原因→actor 重试→写入 memory。
直观理解:像在新软件里把 tutorial 全部刷一遍,每道 tutorial 专攻一个功能点。
BRS 结束后 memory 里有大量"怎么做 X"的代码片段和注意事项,但不一定覆盖真实测试任务的具体难点。
DRS(Deep Recursive Self-exploration)的目标是把 memory 里与目标任务最相关的知识做深。
具体做法:curriculum agent 生成与真实测试任务相似但稍简单/稍变形的练习题(比如"建圆柱销,但直径/高度参数不同"),actor 顺序执行,每次失败后 verifier 给出具体哪个特征判断错了,actor 更新 memory 里对应的因果规则,再试更难的变体。
直观理解:像高考前刷目标题型的梯度变式,从易到难逐步排除盲点。
DRS 与 BRS 的区别:BRS = 并行+广度;DRS = 顺序+深度,且练习任务与真实测试高度相关。
memory 不是向量数据库也不是模型权重,就是一段结构化文本,actor 每轮运行结束后 append 或修改。格式示例:
[FreeCAD 操作手册 - 圆柱销建模]
成功代码模板:
pin = Part.makeCylinder(radius=5, height=18)
pin.Placement.Base = FreeCAD.Vector(x, y, z)
Part.show(pin)
关键因果规则:
- 先做布尔减法 (Part.cut) 再加倒角 (Part.chamfer),反过来会导致几何错误
- 如果 anchor 失败,检查坐标系是否以底面为原点而非中心
失败教训 (DRS cycle 2):
- Part.makeCylinder 的第二个参数是高度,不是半径;曾经搞反导致孔太深
这段文本在推理时直接 prefix 到 actor 的 context 里,不更新模型参数。
| 步骤 | 谁做 | 输入 | 输出 |
|---|---|---|---|
| BRS 1:生成 8 练习任务 | Curriculum | 软件描述 + 当前 memory | 8 个覆盖不同功能的任务描述 |
| BRS 2:并行执行 | Actor × 8 | memory + 各练习任务 | 8 份代码执行 + 软件输出截图 |
| BRS 3:验证 + 反思 | Verifier + Actor | 截图 + 预期结果 | 失败原因 → actor 重试 → memory 更新 |
| DRS 1:生成目标变体 | Curriculum | BRS 后 memory + 真实测试任务描述 | 5 个从易到难的目标任务变体 |
| DRS 2-N:顺序执行→验证→更新 | Actor → Verifier → Actor | memory + 当前变体 | 每轮 memory 变得更精准 |
| 冻结 memory | 系统 | DRS 最终 memory | 只读 memory snapshot |
| 测试:memory reuse | Actor(只读 memory) | 真实测试任务 + 冻结 memory | 任务输出(用于计分) |
在不更新任何模型权重的前提下,用三个 LLM 的协作循环(出题→写代码→独立判卷)把一个文本 memory 从空白训练到"足够覆盖测试任务",使开源模型在新软件上超越闭源前沿模型。
RSIAgent 使用开源模型 Kimi-K3 + GLM-5.3;GPT-6 Astra 和 GPT-5.6 均为直接推理(无探索阶段)。ALE 上同样领先:RSIAgent 84.82% vs GPT-6 Astra 82.26%。
两阶段缺一不可:BRS 只有广度没有深度,在目标任务上仍有盲点;DRS 跳过广度探索直接细化,memory 底子太薄效果最差。完整 RSI 差距最大。
| 失败类型 | 占比 | 具体问题 |
|---|---|---|
| 探索方向偏移 | 75% | BRS/DRS 生成的练习任务与真实测试要求的技能不够对齐(练了倒角,测试考的是布尔差集加约束) |
| 验证不完整 | 50% | verifier 只看视觉相似度,忽略文件格式/数值精度等隐式要求,导致"看起来对但分数低" |
| memory 规则失真 | 66.7% | actor 把从一道具体练习题学来的代码片段写成过于通用的规则,在不同参数下失效(规则过拟合或过泛化) |