RSIAgent
源码与论文技术学习文档
以论文证据为主线,对照源码解释方法、实现、实验结果与可复现边界。
01论文定义与核心机制
论文关注新数字环境中的适应:预训练模型可能缺少某个软件环境的具体操作规律、隐藏约束与失败模式。RSIAgent 不通过更新模型权重解决,而是让 Agent 在环境中获得经验、验证结果并把环境特定知识保存在持久记忆中。
| 概念 | 在这个项目里的具体含义 |
|---|---|
| Recursive Self-improvement | 新记忆影响下一轮任务选择与执行;新执行产生证据,继续修订记忆。 |
| Training-free | 没有模型权重训练环节;仍需要模型调用、VM、探索时间和存储。 |
| Multi-agent | Actor、Verifier、Curriculum 有独立上下文与权限;角色可以使用同一模型,模型相同不代表共享会话。 |
| Code-as-policy | 一次动作可是一段 Python 或 Bash 程序,也支持视觉观察、条件启用的提问与完成声明。 |
| Causal knowledge | 带适用条件的操作规律、约束和失败解释;当前核心实现以文件和提示词组织,没有强制的因果图数据结构。 |
| Frozen memory | 评估使用固定的宿主机记忆快照,关闭学习和回写,并检查文件树哈希。 |
用两个表达式区分执行与学习
aₜ ∼ πθ( · | q, hₜ, M )
这是论文动作策略的写法:q 是任务,hₜ 是本次交互历史,M 是跨任务保留的记忆,θ 是固定的模型参数。改变 M,会改变模型在相同任务下可利用的上下文。
Mₖ₊₁ = UActor(Mₖ, τₖ, vₖ)
第二式是便于理解源码的抽象,并非论文新增的优化公式:原 Actor 依据轨迹 τₖ 和有效验证结果 vₖ 修订记忆;宿主在完整学习边界接纳这一版本。这里没有梯度更新。
对已有 Agent 开发经验的人,最值得学习的部分是经验提交边界、独立验证、状态机与可追溯运行记录。把模型换强只是其中一个变量;这个仓库展示了如何组织模型外部的运行系统。
依据:README.md · docs/ARCHITECTURE.md · explore/charter.py · 论文第 3 页
02三个角色与四类状态
| 角色 | 可以看到什么 | 负责什么 | 边界 |
|---|---|---|---|
| Actor 执行者 | 任务、环境观察、自己的执行上下文、记忆 | 生成动作;经验证后提炼并修订自己的经验 | 执行期随手修改的文件不直接成为正式记忆 |
| Verifier 验证者 | 任务要求、候选产物、可观察的环境证据 | 调查并提交 PASS / FAIL;目标路径支持 UNVERIFIED | 隐藏 Actor 私有推理、记忆和工作材料;不代写学习经验 |
| Curriculum 课程规划者 | 目标、已完成练习结果、学习诊断、可用记忆副本 | 决定练什么、继续练习还是返回目标 | 不裁定候选正确性,不提交正式记忆 |
| Host harness 宿主编排器 | 配置、角色产物、哈希、环境与运行记录 | 调度、隔离、提交、恢复与最终评分 | 正式评分不进入探索和学习角色的上下文 |
不要把所有东西都塞进一个对话历史
| 状态 | 生命周期 | 为什么分开 |
|---|---|---|
| Actor interaction history | 一次执行及随后同一 Actor 的学习阶段 | 保留产生经验的上下文;新的目标尝试重新创建 Actor。 |
| VerifierSession | 同一次目标尝试中的多轮候选检查 | 能跟踪修订,但每次检查仍要获取新证据;不同项目不共享这一会话。 |
| Curriculum context | 同一探索 lineage / 任务演进链 | 记住练习方向与收益,减少重复选题。 |
| Canonical memory | 跨尝试、跨阶段持久化 | 只有完整学习更新可被提交;最终生成冻结版本。 |
一个具体收益:验证者不需要相信执行者“我已经修好了”的描述,而是打开实际文件、读取持久状态或检查画面。上下文隔离降低同一个错误解释在多个角色之间直接传递的机会,但模型仍可能产生相似错误。
依据:core/verifier.py · core/self_evolving_loop.py · explore/unified_evolution.py · 论文第 20 页
03从入口到冻结评估的完整流程
论文有两个探索阶段;代码把最终记忆复用也单独编排,所以运行时是三个 Phase。官方基线已经包含 Actor–Verifier 机制,比较“有无 RSI”时不能把基线误认为只调用一次模型。
流程示意。BRS 自身可以继续下一波;DRS 的练习循环返回目标尝试。图中不把“预算用尽”“停滞”画成成功,它们需要分别记录。
| 源码入口 | 作用 |
|---|---|
| run_osworld.build_plan() | 为 108 个任务生成 baseline / RSI 批处理计划;RSI 各任务拥有自己的协议与目标方向。 |
| load_protocol() | 验证阶段配置、预算、任务集合、研究设计和停止策略。 |
| execute_phase1() | 启动广度探索,记录阶段产物和记忆快照。 |
| execute_phase2() | 按开发任务推进深度探索,校验继承记忆和终止状态。 |
| execute_phase3() | 复制冻结记忆,启动最终任务执行,检查回写边界。 |
04BRS:并行工作,顺序学习
evolve_parallel_phase1() 是最值得逐行阅读的模块之一。Curriculum 一次发布一波项目和输入材料;宿主保存当前记忆快照,所有分支从这一版本出发。每个分支在自己的环境中执行并取得有效验证结果。
snapshot = copy(canonical_memory)
projects = curriculum.author_wave(target, snapshot, previous_outcomes)
branches = parallel_execute_and_verify(projects, snapshot)
require_all_branches_have_grounded_verdicts(branches)
for branch in curriculum_authored_order(branches):
restore_latest_memory_to(branch.environment)
resume_same_actor_context(branch)
distill(branch.verdict, branch.evidence)
reconcile_entire_memory()
validate_and_commit_memory()
# 只有整波结束,才判断是否继续下一波或到达预算边界。为什么不能直接合并四个目录?
假设 A 学到了新的导出命令,B 发现旧命令在某版本失效。若简单合并文件,同名文件可能覆盖,冲突规则可能同时存在。当前实现让 B 的原 Actor 读取 A 已提交的新记忆,再依据 B 的执行证据修订整个记忆库。合并的对象是知识含义,不只是文件差异。
| 细节 | 源码行为及含义 |
|---|---|
| 同波不可相互借用经验 | 每个分支拿到同一 pre-wave memory;兄弟分支的结果不会提前改变它的执行。 |
| 有效 FAIL 也能学习 | 有效失败提供边界条件;基础设施异常、未完成或隔离分支不能冒充有效结果。 |
| 异常分支阻挡整波提交 | 完成所有 future 后检查错误;存在分支错误时,不因其他分支先完成而提交部分波次。 |
| 8 个项目是名义边界 | 预算只在完整波次之间检查,因此实际项目数可以超过 8;不是固定两波、每波必须四个。 |
| parallelism=4 | 限制同时运行的分支数;课程发布的波次宽度可以不同。 |
| ALE 释放空闲 VM | park_verified_branches=True 可先保存候选与 Actor 上下文,学习提交时再恢复候选。 |
依据:explore/phase1_wave.py · explore/phase1_wave.py · benchmarks/ale/learning.py
05DRS:把失败和脆弱成功变成练习
默认 DRS 先实际尝试目标。Actor 得到明确的 PASS 或 FAIL 后,在原上下文中学习;Curriculum 再根据结果、学习诊断和当前记忆选择后续项目。练习完成后必须重新尝试目标,先前的 PASS 不能证明新记忆下的目标仍然成功。
| 输入或决策 | 接下来发生什么 |
|---|---|
| PASS + curriculum_review | 完成学习,再询问 Curriculum 是否还有值得做的练习;没有新练习时可结束。 |
| PASS + verifier_pass | 完成学习后停止这一 DRS 生命周期。 |
| FAIL | 同一 Actor 学习失败证据,Curriculum 选择定向练习,然后重置环境并创建新 Actor。 |
| UNVERIFIED | 未建立成功或失败证据;不会写成学习样本,外层协议拒绝用它推进阶段。 |
| Curriculum 选择了新练习 | 逐个练习、验证和提交记忆;完成后需要新的目标尝试。 |
| STALLED | 按状态进行最后一次新目标尝试或保留已经有效的 PASS;记录具体终止原因,不能统一标成“收敛成功”。 |
| 网络、VM、存储异常 | 按基础设施异常处理,保留可恢复证据,不伪造任务 FAIL。 |
交互示例:相同的 PASS,会走向不同的后续状态
依据状态机编写的教学演示,未调用模型或虚拟机。
run_self_evolving_loop() 通过 Hooks 将环境、执行、验证、学习和探索拆开。它不接收官方评估分数。要理解实际行为,应同时读调用方的 Hook 配置:通用数据类中部分布尔值默认为 false,而 Phase 2 入口会按照协议开启 PASS 学习与课程判断。
依据:core/self_evolving_loop.py · benchmarks/osworld/phase2.py · tests/test_self_evolving_loop.py · tests/test_phase2_stop_policy.py
06记忆的文件协议与上下文管理
dict[str, bytes]、~/.memory/、提交与哈希协议属于当前实现。持久化对象到底是什么?
宿主侧核心对象是 dict[str, bytes],即相对路径到文件字节的映射;客体侧放在 ~/.memory/。文件可以是说明、操作手册、脚本或失败记录。没有强制 Schema、索引文件名、文件数量或记忆长度。
| 机制 | 落实方式 | 学习价值 |
|---|---|---|
| 记忆传入 | push_memory() 将目录打包,经分块 base64 传入客体 | 学习状态与 VM 生命周期解耦。 |
| 自主检索 | memory_preamble() 只暴露完整文件名和大小清单,正文由 Actor 自己读取 | 不用把全量记忆塞入每次提示词;当前路径没有强制 embedding / top-k 检索器。 |
| 重新检索时机 | 验证反馈、上下文压缩、恢复中断、动作停滞时给出提醒 | 提醒不选文件、不排序、不替 Actor 总结内容。 |
| 经验提炼 | 原 Actor 结合终局验证报告判断哪些程序、条件和教训值得保留 | 保留经验的来源上下文。 |
| 整体协调 | 检查全库中的矛盾、过期假设和过度推广,允许修订、删除或保持不变 | 防止新结论只追加、旧错误一直存活。 |
| 学习诊断 | 另写 learning_diagnosis.md 交给 Curriculum | 跨角色传递结论与不确定性,不传递 Actor 的私有推理全文。 |
| 正式提交 | 边界检查、journal 快照、原子安装、文件树哈希 | 可追踪记忆版本及所属运行;机制不等于保证内容正确。 |
一次完整学习不是“总结聊天记录”
# 教学抽象:示例文件结构由工程设计者选择,仓库不强制。
{
"playbooks/video_export.md": b"...",
"failures/unsupported_filter.md": b"...",
"scripts/check_render.py": b"..."
}
# 学习边界
restore(canonical_memory) # 撤销工作期随手改动
resume(original_actor_history)
distill(verdict, verifier_report)
reconcile_all_claim_files()
write_learning_diagnosis() # 适用的 DRS 学习路径
candidate = pull_memory()
validate_boundary(candidate)
journal(candidate)
atomic_install(candidate)“因果知识”的合理读法是:在已观察的条件 C 下,动作 A 导致了结果 O,并保留反例与不确定性。验证者证明产物是否符合要求,并不会自动证明失败原因。因果解释仍由 Actor 依据轨迹判断,需要对比实验才能增强可信度。
依据:explore/charter.py · explore/charter.py · explore/target_learning.py · explore/practice_loop.py · core/loop.py · explore/memory_hash.py
07Actor 如何把模型输出变成程序执行
program/look/ask/done 等为当前代码实现。core/actor.py 定义动作结构与解析;core/loop.py 驱动模型调用、动作执行、观察返回和验证。模型输出的是回复正文中的 JSON,运行时解析后分派;原生 API function call 不是这条动作通道的默认协议。
| 动作 | 用途 | 执行后返回 |
|---|---|---|
program | 执行完整 Python / Bash 程序;可读文件、操作应用、调用脚本 | 程序输出、退出状态、执行元数据。 |
look | 观察截图或图像并提出具体视觉问题 | 视觉模型或原生视觉路径提供观察。 |
ask | 配置了用户通道时获取缺失信息 | 用户或基准用户模拟器的回复;不是总能使用。 |
done | Actor 提交完成声明与检查 | 触发后续完成门禁 / 独立验证,不等于官方任务满分。 |
{"program":{"lang":"bash","code":"ls -lah ~/.memory"}}
{"look":{"path":"/tmp/candidate.png","question":"连接线是否接到正确的图形边缘?"}}
{"done":{"checks":[{"desc":"产物存在且可读","probe":"test -s /tmp/result.txt"}]}}默认配置中 Actor 使用 GLM-5.3,视觉读取由 Kimi-K3 协助,Verifier 和 Curriculum 也使用 Kimi-K3 的独立上下文。因此把结果归因于“某个单模型提升多少”会遗漏视觉与验证角色的贡献。配置还允许停滞触发角色交换,分析实验时需要把这些运行设置纳入记录。
工程判断:程序动作适合复杂桌面软件,因为一次程序能操作结构化文件、检查应用状态,再用实际应用验证画面。但应用名称、可编辑格式、导出产物和操作约束仍是任务的一部分;程序成功退出只证明程序运行结束。
依据:core/actor.py · core/loop.py · core/loop.py · config/osworld/baseline.yaml · config/roles/actor.yaml
08独立验证为何需要环境隔离
如果验证者通过测试意外修改了文件,再去检查这个文件,就可能把自己修好的结果当成 Actor 的成果。仓库用环境机制保护候选,并给验证者独立的会话与可持续的私有工作区。
| 执行模式 | 实现方式 | 适用性与限制 |
|---|---|---|
effect_isolated | Linux namespaces 隔离进程、网络、IPC;候选文件系统只读;私有 scratch 可写 | 适合文件分析与独立测试,但访问 Actor 的实时服务和 GUI 受限。 |
rollback_mirror | 保存完整 QEMU 检查点,在候选现场检查;结束后恢复检查点 | 默认 OSWorld 配置采用此模式,可检查 GUI、进程与本地服务;VM 外远程服务的修改无法随 QEMU 一起回滚。 |
AgenticVerifierExecutor 负责执行边界;VerifierSession 保存本次目标尝试的验证上下文及 scratch。验证报告直接发布给宿主,不先写入客体文件让 Actor 任意替换。Actor 的私有路径如 /home/user/.memory 与工作目录按配置隐藏。
判断必须保留三种含义
- PASS:要求有证据支持候选满足任务条件。
- FAIL:有证据显示实质要求被违反;也能形成有价值的失败经验。
- UNVERIFIED:重要结论尚无充分证据或证据冲突;目标路径需要继续补证,不能当成成功或学习失败。
Verifier 本身仍是模型;隔离能保护证据来源与产物,不能保证它正确理解需求。这也是论文报告“本地验证通过,但正式评分仍不完整”的原因之一。
依据:core/verifier_runtime.py · core/verifier_runtime.py · core/verifier.py · env/qemu_rollback.py · config/osworld/baseline.yaml · 论文第 21 页
09冻结、评分与任务隔离的真实边界
target_conditioned_adaptation、held_out_generalization、memory lock 与 silent audit 是公开 runner 对研究边界的工程化约束,不能反向解释成论文所有实验都采用同一模式。默认研究设计是针对目标的适应
公开 runner 提供的示例协议包含 target_conditioned_adaptation 等研究设计选项;在这种配置里,开发与评估任务可以围绕同一目标展开。这个事实用于理解源码实验控制,不应直接扩展成“论文所有结果都属于 held-out 泛化”或相反结论。论文结果应按各自附录与 reporting scope 阅读。
| 研究模式 | 源码约束 | 能回答的问题 |
|---|---|---|
target_conditioned_adaptation | 开发与评估任务集合必须相同 | 知道目标并允许练习后,冻结的经验能否帮助重新完成目标? |
held_out_generalization | 开发与评估任务集合不得重叠;方向文件不得直接命名 held-out 任务 | 在任务集合分离的协议下,经验能否迁移?名称检查本身不等于完全语义去泄漏。 |
冻结首先保护宿主正式记忆
Phase 3 写入 memory_lock.json,标注关闭回写与课程。每次任务后检查宿主记忆树哈希。记忆被复制到 VM 中,Actor 的客体本地工作改动不回写。不能仅凭“frozen”推断所有客体记忆文件都被操作系统挂成只读。
两个容易忽视的源码细节
benchmarks/osworld/task.py 中,push_memory() 返回 false 时只记录 memory-OFF 警告并继续执行。memory_record 在此前基于宿主快照建立,Phase 3 后续检查也主要验证宿主哈希与记录。静态代码显示,这条路径可能让“配置了记忆”与“客体成功收到记忆”不一致。没有实际触发这个故障,不能据此认定历史实验发生过。
复现时建议把传入失败改为阻断运行,并记录客体接收清单与哈希;修改后的实验要使用新版本与新运行名。
silent_audit() 基于 8 个英文词的 shingle 与宿主题目语料比对,并允许已授权目标的例外。它能发现部分直接复制,但无法覆盖改写、结构化编码或所有语义泄漏。
依据:config/osworld/rsi.example.json · benchmarks/osworld/pipeline.py · benchmarks/osworld/pipeline.py · benchmarks/osworld/task.py · explore/commit.py
10论文实验结果与报告范围
下表为作者论文报告的聚合结果。Partial 是任务部分得分的均值,Binary / Full credit 是获得满分的任务比例;差值使用百分点。这里展示的是作者 manuscript 中的统计口径,而不是本次 review 重新执行得到的独立复现实验。
| 基准 / 指标 | 同框架,无 RSI | 有 RSI | 差值 |
|---|---|---|---|
| OSWorld · Partial | 71.97% | 78.98% | +7.01 |
| OSWorld · Binary | 37.80% | 42.68% | +4.88 |
| ALE · Partial | 83.75% | 84.82% | +1.07 |
| ALE · Binary | 49.25% | 50.75% | +1.50 |
| 报告范围 | 需要保留的限定 |
|---|---|
| OSWorld 的分母 | 论文汇总 82 个离线任务;公开批处理入口列出 108 个任务,不能把二者混用。 |
| OSWorld RSI 列 | 41 个任务使用已报告 RSI 分数,另 41 个保留原基线;包括回退与记录的重试。T082 的设置失败在历史聚合中记为零。 |
| ALE RSI 列 | 67 个任务中 19 个使用 RSI 列结果、48 个沿用基线;包括修正评分、带公开标签迁移限定的 ECG 和无 BRS 的 Tax Form 变体。 |
| 外部模型比较 | 多数外部成绩取自技术报告或榜单,框架、预算未统一;不能把跨系统比较写成同配置对照实验。 |
| “超过 GPT-6” | 只对应论文表中指定指标与范围;ALE Binary 50.75% 低于该表 GPT-6 Astra 的 52.24%。 |
| 四任务阶段消融 | 挑选了曾出现改善的任务;Full RSI 使用两次历史评估均值,deep-only 最多两个课程练习且课程不直接读取记忆,与当前默认协议不同。 |
四任务报告中 Full RSI、仅 BRS、仅 DRS 的平均部分得分分别为 74.54%、65.52%、56.50%。它支持继续研究“先广后深”的组合,但小样本选择、重复次数和预算不对称限制了结论强度。
论文另有 40 个游戏开发任务实验。当前公开仓库的主要入口是 OSWorld 与 ALE;在已检查的当前树中没有相应游戏实验入口,因此不能声称一条现成命令能复现论文全部实验。
依据:论文表 1 · 附录 C.3–C.4 · 附录 C.5 与 D · docs/PAPER.md · README.md
11用两个案例理解经验如何影响结果
T049:失败纠正了需求解释
演示文稿修复任务要求保留元素尺寸和外观。第一次 DRS 误把它理解成“盒子位置也不能移动”,只修箭头,结果布局仍错误。失败经验促使后续练习区分“保持尺寸”和“恢复位置”,并学习怎样借助完整元素或参考图确定坐标。
| 可观察项 | 无记忆运行 | 冻结记忆运行 |
|---|---|---|
| 任务部分得分 | 0.40 | 0.80 |
| Slide 3 贡献 | 0.00 | 0.40 |
| Slide 2 贡献 | 0.00 | 0.00 |
| Actor 迭代数 | 35 | 19 |
案例可支持的解释:记忆纠正的是动作前的解释规则,随后才影响坐标计算。最终内部 PASS 仍未带来满分,说明验证覆盖仍可能不完整。这里的迭代减少也不能忽略前期探索成本。
T044:相似视觉效果,不代表相同应用语义
视频案例中,两次输出都去除了顶部水印并保留画面比例。无记忆运行使用通用裁切/补边滤镜;记忆运行采用 Shotcut 原生裁切表示。正式评分同时读取导出视频和工程结构,所以仅看画面不足以解释得分。
| 可观察项 | 无记忆运行 | 冻结记忆运行 |
|---|---|---|
| 任务部分得分 | 0.40 | 1.00 |
| 裁切顶部像素 | 100 | 76 |
| 工程滤镜 | 通用 crop / pad | 原生 crop,Center 关闭 |
| Actor 迭代数 | 26 | 42 |
案例可支持的解释:可复用经验应涵盖指定软件的原生操作、工程格式和验证方法;这次改进增加了完成质量,并没有减少执行迭代。不能把记忆作用统一描述成“更快”。
案例阅读中的两个额外限定
T065 的得分变化还伴随当前日期澄清,不宜只归因于记忆。论文的若干案例在 DRS 中已经练过目标,说明的是已知目标的经验复用。案例中的错误分析与元件得分来自作者保存的运行产物,本次没有重新评分这些产物。
依据:T049:附录 E.3 · T049:表 A7 · T044:附录 E.5 · T065 限定
12按调用关系阅读源码
| 顺序 | 文件 / 函数 | 阅读时要回答的问题 |
|---|---|---|
| 1 | config/osworld/rsi.example.json | 运行属于目标适应还是 held-out 泛化?模型、预算与停止策略是什么? |
| 2 | run_osworld.py | 一项任务如何生成 baseline、三阶段命令与输出目录? |
| 3 | benchmarks/osworld/pipeline.py | 各阶段什么时候允许推进?协议与记忆哈希如何验证? |
| 4 | explore/phase1_wave.py | 并发分支共享哪份记忆?失败波次何时阻断?提交为什么串行? |
| 5 | core/self_evolving_loop.py | PASS、FAIL、UNVERIFIED、STALLED 分别如何转移? |
| 6 | benchmarks/osworld/phase2.py | 抽象 Hooks 怎样连接真实 VM、Actor、Verifier 与 Curriculum? |
| 7 | core/actor.py / core/loop.py | JSON 怎样变成程序?观察怎样回到上下文?何时进入验证? |
| 8 | core/verifier_runtime.py | 隐藏私有路径、保护候选与恢复 scratch 的执行机制是什么? |
| 9 | explore/target_learning.py / explore/charter.py | 同一 Actor 如何学习、协调记忆并给出课程诊断? |
| 10 | benchmarks/osworld/task.py | 记忆如何传入?正式评分在什么位置发生?错误如何处理? |
| 11 | benchmarks/ale/learning.py | 同一探索内核如何适配另一套环境供应与评分流程? |
测试文件可以当作边界说明书
重点看 test_self_evolving_loop.py、test_phase1_wave_authoring.py、test_verifier_isolation.py、test_phase2_stop_policy.py、test_memory_retrieval_lifecycle.py。例如已有测试明确要求:一次 PASS 后若开展新练习,再次目标失败就不能沿用旧 PASS;UNVERIFIED 不进入记忆学习。
有些注释还保留历史实验名称与旧模块描述。判断当前行为时依次看公开入口 → 生效配置 → 调用点 → 实际分支 → 对应测试,不要仅靠注释里的“默认值”或历史路由名称。
依据:tests/test_self_evolving_loop.py · tests/test_phase1_wave_authoring.py · tests/test_verifier_isolation.py · tests/test_memory_retrieval_lifecycle.py
13复现路径:从协议检查到单任务
以下命令依据当前仓库文档整理,未在本次分析中启动正式实验。参考环境是 Python 3.12、uv、Linux、Docker 与 /dev/kvm,并需要模型 API、固定版本基准、VM 镜像及任务资产。默认方案通过 API 调用模型;桌面 VM 与软件环境是另一组资源需求。
git clone https://github.com/AetherLabsAI/RSIAgent.git
cd RSIAgent
git checkout a9e56263f6deaa493496ad6b155fe24bf131bc12
cp .env.example .env
# 在 .env 中填入自己的 OPENROUTER_API_KEY
git clone --branch v2026.08.08 https://github.com/xlang-ai/OSWorld-V2.git ../OSWorld-V2
cd ../OSWorld-V2
uv sync --frozen
uv pip install --python .venv/bin/python -r ../RSIAgent/requirements.txt
source .venv/bin/activate
cd ../RSIAgentpython tools/prepare_osworld_v2_release.py
python tools/build_p2_corpus.py
python tools/exam_fence.py build
python tools/smoke_osworld.py --output results/smoke/osworld
# 查看完整任务计划,不启动 VM / 模型,也不写输出
python run_osworld.py --arm both --name learning_batch_01 --dry-run先用仓库的单任务协议学习生命周期;根目录批处理默认会面向完整任务列表。示例协议已经是 task_080,无需臆造一个根入口不支持的 --task 参数。
cp config/osworld/rsi.example.json config/osworld/rsi.learning.json
# 编辑 rsi.learning.json:
# 1. run_name 改为唯一名称,如 learning_task080_01
# 2. 保留 task_080 与其方向文件,或同步修改三处目标信息
# 3. 保留明确的 study_design 与 phase2.stop_policy
bash scripts/run_rsi.sh config/osworld/rsi.learning.json
# 查看入口支持的检查选项
python -m benchmarks.osworld.pipeline --help| 要观察的产物 | 应核对的内容 |
|---|---|
results/recursive_improvement/<run_name>/phase1/result.json | 阶段终态、探索项目和冻结记忆路径。 |
phase1/curriculum/wave_NNN/ | 课程发布的项目、材料和波次决策。 |
phase2/result.json | 停止策略、目标 verdict、练习量、最终记忆树哈希。 |
phase3/memory_lock.json | 冻结版本、writeback=false、curriculum_enabled=false。 |
phase3/result.json | 官方分数与来源路径;继续沿记录定位具体候选和评分。 |
并发参数要区分两层:根命令的 --concurrency 控制独立任务链;BRS 的 parallelism 控制单个任务链内部的分支。两者一起增加会放大同时运行的 VM 数量。
默认目标 Actor 单次调用 watchdog 为 36,000 秒,练习与课程配置为 86,400 秒。它们是单次运行上限,不是完整项目的成本估算或整个探索链的总时限。当前材料不足以给出可信的美元预算。
依据:README.md · docs/OPERATIONS.md · scripts/run_rsi.sh · config/roles/target.yaml · config/roles/actor.yaml
14迁移到自研 Agent:最小可行实现
以下是基于源码的工程设计建议,不是仓库已经提供的 Java SDK。已有 Java Agent 系统可以先迁移角色边界和记忆生命周期,再决定是否接入完整桌面环境。
| Java 侧接口 | 职责 | 对应的仓库思想 |
|---|---|---|
EnvironmentAdapter | reset、execute、observe、snapshot、restore | VM 与候选保护边界。 |
ActorSession | 运行任务;保留同一次经验的上下文供学习使用 | experience-owned learning。 |
VerifierSession | 独立要求检查、证据收集与明确 verdict | VerifierSession + 隔离 executor。 |
CurriculumSession | 根据结果和诊断决定下一个项目或停止 | 课程会话持续,权限限定为选经验。 |
MemoryRepository | 不可变快照、原子提交、版本与证据索引 | canonical memory、journal、tree hash。 |
RunLedger | 记录阶段、模型配置、候选版本、状态和成本 | 每个产物可追溯到一条运行链。 |
enum Verdict { PASS, FAIL, UNVERIFIED }
enum CurriculumDecision { PRACTICE, READY, STALLED }
record MemoryVersion(String id, String treeHash) {}
record Verification(Verdict verdict, String evidenceRef) {}
interface MemoryRepository {
MemoryVersion snapshot();
MemoryVersion commit(String expectedParentId, MemoryDraft draft);
}
// 建议:提交前比较父版本;冲突时重新协调,不采用最后写入覆盖。
// BRS 的多个 Actor 可并行执行,学习提交放入同一串行队列。一个适合第一版的练习环境
选择一个可重置的表格或文档处理沙盒:任务是修复含公式、格式和导出要求的文件。BRS 分别探索公式、引用、格式与导出;DRS 针对某个失败补充边界样例;最终使用冻结记忆完成另一个预先保留的任务。文件可直接检查,环境成本比多应用桌面基准更容易控制。
最小实验要保存四组信息
- 效果:任务通过率、部分得分、回退任务及错误类别。
- 成本:探索和评估分别统计 token、工具次数、VM 时间和墙钟时间。
- 验证质量:内部 PASS 对应的外部失败率;UNVERIFIED 的原因分布。
- 记忆使用:读取过哪些版本、哪些条目影响动作、修订过哪些错误规则。
先比较同一 Actor–Verifier 框架的空记忆与冻结记忆,在相同测试集、模型与预算下重复运行。之后再比较仅 BRS、仅 DRS 和组合。这样才能回答你的业务到底从哪一层得到收益。
15适用场景、失败模式与改进优先级
| 场景 | 为什么适合 / 不适合 |
|---|---|
| 稳定的企业内部软件流程 | 同一软件、版本和任务族反复出现,前期探索成本可以摊销。 |
| 文档、音视频、CAD 等复杂产物 | 可以同时检查结构、渲染结果与原生工程,经验具有操作价值。 |
| 可重置的仿真与测试环境 | 能够构造练习、保留候选、独立验证并恢复状态。 |
| 一次性、简单、低重复请求 | 探索开销可能超过任务本身价值。 |
| 无法回滚的线上业务写操作 | 学习与验证探测可能改变真实外部状态,需要先建立可控测试环境。 |
| 需求不完整且无法获取缺失信息 | 再多练习也不能产生真实未知事实,错误猜测反而可能写成规则。 |
错误如何被放大
练习没有触及真正难点 → 验证遗漏关键要求 → Actor 把局部接受理解为通用规则 → 下一轮更确信错误。这个链条说明,记忆量增加和模型调用增加都不必然提高质量。
| 优先级 | 建议 | 针对的具体问题 |
|---|---|---|
| 1 | 记忆传入失败立即阻断;增加客体哈希回执 | 防止评估记录写着有记忆,执行却没有收到。 |
| 2 | 把条件、证据来源、反例和未知项附在重要记忆条目中 | 降低一次局部验证被推广成普遍规则的概率;这是扩展建议,仓库不强制 Schema。 |
| 3 | 固定预算与停止策略,重复试验,保存所有尝试 | 避免只展示最优 checkpoint 或最成功的重试。 |
| 4 | 使用独立任务 / 版本做迁移测试 | 区分已知目标适应、同类任务迁移与跨环境泛化。 |
| 5 | 对高价值产物补充确定性检查器 | 降低模型验证者漏检,仍保留视觉和语义检查。 |
| 6 | 记忆与软件版本绑定,失配时重新验证 | 防止旧软件经验长期污染新环境。 |
源码层面的成熟度判断:项目有清晰的状态边界、隔离机制、运行证据与恢复模块,适合研究复杂 Agent 的编排实现。它仍依赖特定基准环境、长时间模型调用和操作性恢复流程;当前发布包含的是运行框架,不能等同于已封装好的通用生产 Agent 平台。
依据:docs/ARCHITECTURE.md · docs/OPERATIONS.md · docs/RELEASE.md · 失败模式分析 · 限制
16学习路线与自测
| 学习轮次 | 要做的事 | 完成标志 |
|---|---|---|
| 第一轮 · 架构 | 读角色表、三阶段流程、self_evolving_loop | 能解释 PASS / FAIL / UNVERIFIED 与停止策略。 |
| 第二轮 · 记忆 | 跟踪一波 BRS 的快照、验证、提炼、协调、提交 | 能指出哪个 Actor、在何时、对哪个版本写入经验。 |
| 第三轮 · 证据 | 读 verifier_runtime 与冻结评估路径 | 能区分候选保护、隐私隔离、记忆冻结和官方评分隔离。 |
| 第四轮 · 实现 | 在可重置文件沙盒实现最小三角色循环 | 能复现一次错误经验被修正并影响后续动作。 |
| 第五轮 · 实验 | 固定模型、预算和测试集做消融 | 用结果和成本判断价值,保留失败与回退。 |
为什么不能让 Curriculum 直接修改正式记忆?
它没有经历完整执行上下文。让原 Actor 基于自己的动作与验证证据学习,可以把经验归属和记忆写权限保持一致。Curriculum 通过学习诊断选择后续验证假设的练习。
为什么失败项目也值得写入记忆?
失败揭示错误解释、适用条件或无效操作。前提是失败经过验证,且记忆保留“不成功”的性质;基础设施错误不能冒充任务知识。
RSIAgent 的 memory 是向量数据库吗?
已检查的核心路径使用文件目录与 Actor 自主读取。你可以扩展向量检索,但需要说明检索排序、版本管理与漏召回如何影响行为。
怎样证明你实现的记忆机制有效?
在相同 Actor–Verifier 框架下,固定模型、工具与评估任务,比较空记忆和冻结记忆;重复运行并计入探索成本,再用未参与探索的任务检验迁移。
为什么内部 PASS 不能直接作为最终业务成功?
它是验证者基于当前证据的判断。需求遗漏、错误解释和测试覆盖不足仍会导致假阳性,需要独立验收信号和可检查产物。
17版本、依据与分析范围
论文:RSIAgent: Autonomous Exploration for Recursive Self-improvement in New Environments,arXiv:2609.15364v1,2026-09-14。方法与实验结论以论文及作者公开的 paper reporting notes 为准。
源码基准:原文档固定到 a9e56263f6deaa493496ad6b155fe24bf131bc12(2026-09-16)。本次证据 review 另外对照公开仓库 README.md 与 docs/PAPER.md 对论文阶段映射、结果聚合与报告范围的说明。
证据纪律:论文直接主张、源码实现细节、作者案例与本文工程建议分别标注。未在本次 review 中重新运行付费模型、完整 VM benchmark 或官方评分,因此不把作者报告数字写成独立复现结果。
- arXiv v1 PDF:研究方法、结果、附录与案例。
- README.md:安装、公开入口、报告范围。
- docs/ARCHITECTURE.md:角色权限、阶段与提交边界。
- docs/PAPER.md:论文统计口径、历史变体、消融限定。
- docs/OPERATIONS.md:运行时限、并发与恢复方式。
- docs/RELEASE.md:来源记录与作者已报告的发布验证;不作为本次测试结果。
- explore/phase1_wave.py:广度探索与有序提交。
- core/self_evolving_loop.py:目标尝试和自演进状态机。
- explore/charter.py:角色与学习提示词。
- core/verifier_runtime.py:验证隔离机制。
- benchmarks/osworld/pipeline.py:三阶段协议与记忆完整性检查。
- benchmarks/osworld/task.py:记忆加载、执行与封闭评分。
链接固定在分析提交版本。数值标注为作者报告;源码行为与工程建议分别叙述。正文没有把静态检查等同于运行验证。