跳到主要内容

RSI 相关开源项目

七天实战

对照 7 天学会 RSI Day 7 的前沿全景。克隆仓库是为了读控制流,不是为了把生产密钥接进别人的自动改写脚本。

怎么读这些项目​

每个项目都声称能「越跑越好」。阅读时只问四件事:评估器在哪、改进对象是什么、失败了如何回退、测试集是否和搜索集分开。答不上来的仓库,不要拿它的分数当课程结论。

项目改进对象评估你该抄的部分
Reflexion语言教训,注入下一轮任务成败信号Actor / Evaluator / Self-Reflection 三角
Self-Refine同一模型的反馈与重写多为模型反馈反馈要结构化;必须外加规则分
DSPy提示词与少量示例训练集指标编译集和报告集分离
TextGrad被批评文本反传的变量下游标量损失批评引用必须落到原文
进化式代码搜索程序种群隐藏测试或科学指标变异算子小、选择压力来自测试

Reflexion​

Shinn 等人的 Reflexion 把「再试一次」拆开。Actor 按当前记忆行动,Evaluator 给出成功或失败,Self-Reflection 把失败写成第一人称教训,追加到记忆,而不是更新权重。代码题上,Evaluator 常常就是单元测试,这和本课程的规则层一致。

阅读官方实现时,标出三处:

  1. 轨迹截断:长轨迹如何裁成反思输入。裁掉断言会让反思失去证据。
  2. 记忆上限:只保留最近几条还是按任务类型分桶。无上限的记忆会把最早的错误和最近的错误混在一起。
  3. 停止:是固定试次,还是成功即停。固定试次适合论文表格,教学系统应加上平台期。

不要把 Reflexion 的口头反思直接拼进系统安全段。教训只进入「上一轮失败」槽位。

Self-Refine 与评审偏差​

Self-Refine 的循环是生成、反馈、改写,角色可以是同一个模型。实现短,适合 Day 1 的写作练习。它的系统性风险是反馈者和生成者共享偏好:都喜欢更长、更确定的语气。课程要求反馈 JSON 里的 quotes 必须是草稿子串,并且规则失败时不得被反馈分覆盖。

若你对比「有 Self-Refine」和「无 Self-Refine」,两边用同一套 R1–R5,采样次数相同。只展示改写后更长的段落,不能说明方法有效。

DSPy​

DSPy 把提示词当成带签名的程序,优化器在你给的度量上搜索指令和示例。这是外循环的编译器:搜索结束后,你部署的是一套固定程序,而不是一个永远在线改自己的进程。

使用纪律:

  • trainset 只参与优化。
  • 用来写进更新日志的数字来自从未进入优化器的 testset。
  • 度量函数优先用可执行检查。用模型当度量时,把该模型的提示词哈希写进实验配置。
  • 优化器改到的字段若包含你的拒绝策略,立即把该字段标成不可优化。

DSPy 不会替你发明回归集。没有回归集时,编译结果只说明「在你给的几十道题上度量变高了」。

TextGrad​

文本梯度用自然语言批评代替数值梯度,把批评写回提示词或中间答案。适合你已经有标量分数、希望知道「往哪改」的场景。批评文本和 Reflexion 的教训一样,必须引用原文,否则梯度是噪声。

不要同时打开 TextGrad 和人工改提示词而不记录顺序。否则下一轮提升无法归因。课程日志里的 patch_keys 就是为了留下这个顺序。

进化式搜索​

FunSearch、AlphaEvolve 一类系统在程序空间里变异、打分、保留高分个体。它们证明「搜索 + 严格评估」可以改写出人意外的程序,也证明评估预算是主成本。个人实验把种群大小限制在 4 以内,每一代只变异白名单字段,安全段不参与交叉。

选择算子只用回归通过的个体。未跑回归的高分个体不得进入下一代,否则你是在选择「最会讨好当前题」的提示词。

SWE-bench 与代码 Agent​

SWE-bench 用真实仓库问题和测试评估补丁。它提醒 RSI:代码改进的评估器应该是项目测试,不是「补丁看起来合理」。阅读相关 Agent 仓库时,区分三类补丁:

  • 只改业务代码,测试不动。
  • 改了测试使问题变容易。
  • 改了依赖或权限。

本课程门禁只自动接受第一类里回归通过的补丁。第二类是评估污染。第三类进入人工检查点。

不建议直接接上的能力​

自动改写本机其他服务、自动打开外部网络、自动提交到默认分支,都不属于七天练习。开源脚本若默认 git push 或修改全局配置,先改成干跑并打印 diff。学习目标是看懂接受和拒绝,不是把仓库交给循环。

对照阅读顺序​

  1. 用 快速开始 的规则循环作对照物。
  2. 读 Reflexion 的一次失败如何进入记忆。
  3. 读 DSPy 的度量函数如何和优化器分开。
  4. 回到 开发指南 检查自己的门禁是否更弱。

若开源实现的分数更高但说不清测试集边界,以你自己日志里的失败集合为准。

把开源循环映射到五块组件​

读代码时画一张表,不要先看 README 的总分数。

Reflexion 的 Actor 对应执行器,环境反馈或单元测试对应评估器,口头反思对应反思器。很多示例没有独立门禁,失败后直接把反思塞进下一轮。你应在外面加一层:反思缺少可引用的测试名时不注入。Self-Refine 通常没有回归集,补上你自己的三道固定题再谈提升。DSPy 的优化器相当于外循环改进器,度量函数是评估器;把签名里的安全字段放进 assert 不参与优化的参数。TextGrad 的变量是改进对象,损失是评估器;若损失来自同一个被优化的模型,标成高风险,不能单独门禁。进化搜索的个体是策略,选择算子必须调用你的回归函数,而不是只看当前谜题的分数。

阅读记录模板​

每读一个仓库,用同一模板写半页,避免只收藏链接。

  • 仓库与提交哈希。
  • 评估器是测试、规则还是模型。
  • 改进对象的文件路径。
  • 回退是否存在;不存在则写「无」。
  • 搜索集与报告集是否同一目录。
  • 哪一段值得移植到你的调度器,哪一段不要移植。

模板写不满就说明还没读到控制流。分数表格不能代替这六行。

和本课程脚本的差异实验​

选 Reflexion 或 Self-Refine 的一个最小例子,用你的 R1–R5 替换它的成功判断,跑两轮。记录:原仓库认为成功的轮次,在规则下是否仍失败。若原仓库成功而规则失败,把它写进笔记的「口径差异」,不要平均两个分数。口径不同的数字不能相减。

这个实验的目的不是证明开源项目错了,而是让你看见「成功」一词在不同代码里指不同的函数。课程统一用失败集合。

对照笔记:Reflexion 一次失败如何进记忆​

以带单元测试的函数题为例。Actor 第一次提交的实现在空列表上抛出异常。Evaluator 的失败证据是测试名 test_empty 和断言文本,不是模型的自我评价。Self-Reflection 若写成「我应该更小心边界」,丢弃。合格反思是「test_empty:空输入应返回 0 而不是抛异常」。这条字符串进入记忆的条件是测试名真的出现在轨迹里。下一轮 Actor 的提示词只增加记忆槽,不改系统安全段。若第二次测试通过,记忆条的 helps 加一;若换了另一种异常,helps 不加,并新增一条以新测试名为键的教训,而不是覆盖旧条。

这个流程能在不克隆大仓库的情况下用你的脚本演出来:把测试名当成 R 编号即可。克隆官方仓库是为了核对他们有没有做「测试名必须出现」这道过滤。没有这道过滤,就不要把他们的记忆模块原样接进你的调度器。

对照笔记:DSPy 度量与优化器​

把签名想成函数声明,把优化器想成外循环。你给度量函数十道题,优化器改指令和示例。第十一道题如果也在这十道里,你就没有报告集。练习时亲手把题分成两份文件:train.jsonl 与 report.jsonl。优化器的输入路径只允许前者。报告脚本只允许后者。用文件权限或只读参数做错开,而不是靠约定。跑完后打开优化出的指令,搜索「忽略测试」「跳过校验」等字样。出现则整次编译作废,并把该字段标成不可优化。

不要把 DSPy 的训练集分数写进毕业说明的第 5 行。第 5 行只写报告集上的失败集合。

对照笔记:文本批评当梯度​

批评文本要能在草稿里找到。例如批评说「第二句丢掉了 15 分钟」,草稿第二句确实没有这四个字,批评才有效。批评说「语气不够专业」,没有子串可对,丢掉。有效批评一次只改 constraints 的一句,然后重跑规则。若规则失败集没变,这条梯度记为无效,不要叠加下一条批评。叠加会让你无法知道哪句批评起了作用。

什么时候停在文档、什么时候打开上游代码​

文档和 README 足够回答「改进对象是什么」。只有在你要移植某段过滤逻辑时才打开源码,并且只读负责记忆写入或度量计算的那个文件。不要从上游的示例脚本开始改你的主分支。把要移植的十行抄到你的实验目录,配上你的规则测试,通过后再考虑合并。合并时保持安全段文件独立。

用校验脚本重放上游例子​

从 Reflexion 或 Self-Refine 的示例里拿一轮输入输出,手工填一行 jsonl:失败证据能对应测试名或引用子串,则 lesson 可视为 grounded;不能对应,则这行的 accepted 必须为假。再用 check_trace 跑这行。若上游仓库把这一轮标成成功而脚本报违规,把差异写进对照笔记的「口径」一栏,不要改脚本去迎合上游的成功定义。

DSPy 的一次编译结束时,额外记录报告集文件的哈希。哈希不在日志标准字段里,可以放 note,但不要把报告集分数写进 score 覆盖规则分。规则分仍来自你的 R 编号。