<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>记忆 on 鬼哥的空间</title><link>https://luoli523.github.io/tags/%E8%AE%B0%E5%BF%86/</link><description>Recent content in 记忆 on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://luoli523.github.io/tags/%E8%AE%B0%E5%BF%86/index.xml" rel="self" type="application/rss+xml"/><item><title>别再调教模型了：聪明人都在设计循环</title><link>https://luoli523.github.io/p/designing-agent-loops/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://luoli523.github.io/p/designing-agent-loops/</guid><description>&lt;img src="https://luoli523.github.io/" alt="Featured image of post 别再调教模型了：聪明人都在设计循环" /&gt;&lt;p&gt;Anthropic 的工程师 Boris Cherny 有一句话被反复引用：&lt;strong&gt;「我的工作就是写循环（My job is to write loops）。」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这句话第一次听像段子，听第二遍你会发现它在描述一个范式转移。过去我们用大模型，本能是去「调教」它——改 prompt、加 few-shot、写一长串「你必须……你不能……」的规则。但当模型本身已经足够强，真正决定产出质量的，往往不再是你怎么&lt;em&gt;指挥&lt;/em&gt;它，而是你给它套了一个什么样的&lt;strong&gt;循环&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Anthropic 的 Lance Martin 最近分享了他用新一代 Claude 模型（内部代号 Fable 5，Mythos 级别）做实验的两个心得。两个都不是 prompt 技巧，而是关于怎么&lt;strong&gt;设计循环&lt;/strong&gt;。下面我把它整理成中文，并加上我自己的一些体感。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Designing loops with Fable 5" class="gallery-image" data-flex-basis="600px" data-flex-grow="250" height="832" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/designing-agent-loops/cover.webp" srcset="https://luoli523.github.io/p/designing-agent-loops/cover_hu_f3f285b3c85f4a8b.webp 800w, https://luoli523.github.io/p/designing-agent-loops/cover_hu_f6df640e5223bea7.webp 1600w, https://luoli523.github.io/p/designing-agent-loops/cover.webp 2080w" width="2080"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么是循环而不是prompt"&gt;为什么是「循环」，而不是「prompt」
&lt;/h2&gt;&lt;p&gt;先说清楚这个范式差在哪。&lt;/p&gt;
&lt;p&gt;传统用法是&lt;strong&gt;一次性&lt;/strong&gt;的：你写一个尽可能完美的 prompt，模型吐一个答案，好不好全看这一发。这本质上是在赌模型的「直觉」。&lt;/p&gt;
&lt;p&gt;循环用法是&lt;strong&gt;迭代式&lt;/strong&gt;的：你不再追求一发命中，而是给模型套一个「跑 → 拿反馈 → 自我纠正 → 再跑」的环，让它在一个评判标准（goal 或 rubric）上不断爬坡，直到达标才停。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;一次性 prompt&lt;/th&gt;
 &lt;th&gt;设计循环&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;你优化的对象&lt;/td&gt;
 &lt;td&gt;prompt 本身&lt;/td&gt;
 &lt;td&gt;环境与反馈信号&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;模型的角色&lt;/td&gt;
 &lt;td&gt;一次输出&lt;/td&gt;
 &lt;td&gt;反复试错、自我修正&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;决定质量的关键&lt;/td&gt;
 &lt;td&gt;你的措辞&lt;/td&gt;
 &lt;td&gt;评判标准设计得好不好&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;适合的任务&lt;/td&gt;
 &lt;td&gt;简单、确定性强&lt;/td&gt;
 &lt;td&gt;长程、可验证、能爬坡&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Claude Code 里的 &lt;code&gt;/goal&lt;/code&gt; 和 Claude Managed Agents（CMA）里的 Outcomes，就是把这套通用配方变成了你能直接用的原语。&lt;strong&gt;它们的本质都是：给环境注入一个反馈信号，让模型自己跟这个信号死磕。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第一招自我纠正循环"&gt;第一招：自我纠正循环
&lt;/h2&gt;&lt;p&gt;新模型一个被反复验证的特性是——&lt;strong&gt;它特别擅长在循环里自我纠正&lt;/strong&gt;。一个设计良好的 goal 或 rubric，相当于给 Claude 运行的环境加了一个反馈源：它跑一轮、通过 goal/rubric 收集反馈、修正自己，然后继续，直到标准被满足。&lt;/p&gt;
&lt;p&gt;这里有一个&lt;strong&gt;最容易被忽略、却最关键的点：谁来当裁判。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直觉上你可能觉得，让模型自己检查自己的输出不就行了？但 Anthropic 的实验反复发现，&lt;strong&gt;模型在「自我批判」上是有系统性缺陷的&lt;/strong&gt;——它很难客观地挑自己输出的毛病（Prithvi Rajasekaran 在 Anthropic 工程博客里专门写过这个现象）。&lt;/p&gt;
&lt;p&gt;解法是：&lt;strong&gt;用一个独立的 verifier 子 agent 来打分，而不是让主 agent 自我批判。&lt;/strong&gt; 因为打分是在一个&lt;strong&gt;独立的上下文窗口&lt;/strong&gt;里完成的，不受主 agent 思路的污染，效果明显更好。CMA 的 Outcomes 就是帮你自动 spawn 一个 grader 子 agent 来做这件事。&lt;/p&gt;
&lt;p&gt;下面这张表把两种实现方式拆得很清楚——无论是 Claude Code 的 &lt;code&gt;/goal&lt;/code&gt; 还是 CMA 的 Outcomes，骨架都是一样的五件套：目标、裁判、循环、边界、退出条件。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Goal-driven loops 的两种实现对比" class="gallery-image" data-flex-basis="525px" data-flex-grow="218" height="1040" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/designing-agent-loops/goal-driven-loops.webp" srcset="https://luoli523.github.io/p/designing-agent-loops/goal-driven-loops_hu_88fa692449be2739.webp 800w, https://luoli523.github.io/p/designing-agent-loops/goal-driven-loops_hu_de19fd5bcd9d435b.webp 1600w, https://luoli523.github.io/p/designing-agent-loops/goal-driven-loops.webp 2276w" width="2276"&gt;&lt;/p&gt;
&lt;p&gt;注意「裁判（The judge）」这一行：&lt;code&gt;/goal&lt;/code&gt; 用一个独立的 grader 模型（Haiku），CMA 用一个独立的 grader 子 agent——&lt;strong&gt;两者都刻意把评判放到了主流程之外。&lt;/strong&gt; 这不是实现细节，这是这套方法能 work 的核心原因。&lt;/p&gt;
&lt;h3 id="parameter-golf一个能跑-8-小时的玩具实验"&gt;Parameter Golf：一个能跑 8 小时的玩具实验
&lt;/h3&gt;&lt;p&gt;Lance 用了一个开源的 ML 工程挑战 &lt;strong&gt;Parameter Golf&lt;/strong&gt; 来测试：在 8 张 H100 上、10 分钟内，训练出一个能塞进 16MB 的最强模型。&lt;/p&gt;
&lt;p&gt;这个挑战很像 Karpathy 的 autoresearch 项目——它考验的不是模型会不会写代码，而是一个 agent 能不能&lt;strong&gt;像研究员一样工作&lt;/strong&gt;：改训练代码（一个 &lt;code&gt;train_gpt.py&lt;/code&gt; 文件）、启动训练、轮询日志、读分数、然后决定下一个实验做什么。这是一个典型的长程、可验证、能爬坡的任务，正好是循环的主场。&lt;/p&gt;
&lt;p&gt;他给了一个有 9 条可检查标准的 rubric（比如「跑一个 baseline」「跑 20 个实验」），让 Parameter Golf 最多跑 8 小时，由 Outcomes 的 grader 确认所有标准都满足后才允许 Claude 停手。结果：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Parameter Golf：Fable 5 vs Opus 4.7" class="gallery-image" data-flex-basis="408px" data-flex-grow="170" height="1226" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/designing-agent-loops/parameter-golf.webp" srcset="https://luoli523.github.io/p/designing-agent-loops/parameter-golf_hu_c6f23f454667600d.webp 800w, https://luoli523.github.io/p/designing-agent-loops/parameter-golf_hu_2e170007532a821e.webp 1600w, https://luoli523.github.io/p/designing-agent-loops/parameter-golf.webp 2088w" width="2088"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fable 5 把训练 pipeline 优化了约 6 倍于 Opus 4.7。&lt;/strong&gt; 但比这个数字更有意思的是两个模型的&lt;strong&gt;实验风格差异&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fable 5&lt;/strong&gt; 敢下「结构性」的大注（比如改架构：&lt;code&gt;TRAIN_SEQ_LEN=2048&lt;/code&gt; 带来 −0.0179、overlapped sliding-window eval 带来 −0.0207），而且有韧性——它甚至顶着一次量化回退继续推，最后拿到了最大的一次提升。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opus 4.7&lt;/strong&gt; 第一个实验拿了个小赢，然后&lt;strong&gt;几乎所有后续实验都在复制同一个模板&lt;/strong&gt;：调一个标量、测一下、有正收益就留下。稳，但天花板低。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看图里那条蓝线（Fable 5）是怎么一个台阶一个台阶往下砸的，红线（Opus 4.7）则基本是平的——这就是「敢赌结构性改动」和「只敢调标量」的区别。&lt;strong&gt;循环给了模型试错的空间，而更强的模型会用这个空间去下更大的注。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="第二招记忆跨会话的外层循环"&gt;第二招：记忆——跨会话的外层循环
&lt;/h2&gt;&lt;p&gt;如果说自我纠正是&lt;strong&gt;单次会话内&lt;/strong&gt;的内层循环，那记忆就是&lt;strong&gt;跨会话&lt;/strong&gt;的外层循环：Claude 在一次会话里把经验写进记忆，这些记忆能在未来的会话里被取回。&lt;/p&gt;
&lt;p&gt;Lance 用 Continual Learning Bench 1.0 里的一个任务来测：给 agent 一个 SQL 数据库，让它回答一连串问题。&lt;strong&gt;每个问题是一个独立的 agent 会话&lt;/strong&gt;，会话之间靠记忆来传递经验。他用 CMA 的记忆功能给每个 agent 挂载一个可跨会话共享的文件系统。&lt;/p&gt;
&lt;p&gt;他观察到，&lt;strong&gt;有效使用记忆是有梯度的&lt;/strong&gt;，从低到高是这么一条进阶链：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;失败（fail）&lt;/strong&gt;：做错了，把它记下来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调查（investigate）&lt;/strong&gt;：在继续之前，搞清楚为什么错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证（verify）&lt;/strong&gt;：把诊断变成一个被核实过的事实&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提炼（distill）&lt;/strong&gt;：把验证结果升华成一条通用规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查阅（consult）&lt;/strong&gt;：下次直接读这条规则，而不是重新推导一遍&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;三个模型卡在了不同的台阶上，差距非常直观：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Continual Learning Bench 1.0：记忆的三模型对比" class="gallery-image" data-flex-basis="485px" data-flex-grow="202" height="1048" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/designing-agent-loops/continual-learning-bench.webp" srcset="https://luoli523.github.io/p/designing-agent-loops/continual-learning-bench_hu_a4a0f43406f74d02.webp 800w, https://luoli523.github.io/p/designing-agent-loops/continual-learning-bench_hu_c9dc94796914af41.webp 1600w, https://luoli523.github.io/p/designing-agent-loops/continual-learning-bench.webp 2120w" width="2120"&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;模型&lt;/th&gt;
 &lt;th&gt;卡在哪一步&lt;/th&gt;
 &lt;th&gt;表现&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Sonnet 4.6&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;第 1 步（失败）&lt;/td&gt;
 &lt;td&gt;记忆只是一堆失败笔记和没验证的猜测（「也许是 prc 不是 prc_usd？」），几乎不回头查阅。得分 0.330，跟无记忆的 baseline 几乎没差&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Opus 4.7&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;第 3 步（验证）&lt;/td&gt;
 &lt;td&gt;会建带不确定标记的 schema 参考（「可能是以分为单位？待验证」），但验证覆盖率低，只有 7–33%（中位数约 17%）。得分 0.700&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Fable 5&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;走完全程&lt;/td&gt;
 &lt;td&gt;最强的几次运行里验证覆盖率高达 73%（30 题里验证了 22 题），并能把学到的东西提炼成通用规则，反哺未来任务。得分 0.839&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;看右边那张收敛曲线特别有感觉：&lt;strong&gt;带记忆的实线和无记忆的虚线，差距随着问题数累积越拉越大。&lt;/strong&gt; 记忆不是「记下来」就完事了，关键在于你的 agent 能不能走完「失败 → 调查 → 验证 → 提炼 → 查阅」这条链。&lt;strong&gt;Sonnet 4.6 停在记笔记，Fable 5 在建知识库——这就是 0.330 和 0.839 的差距。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个实操提醒：如果你的模型只走到第 1 步（像 Sonnet 4.6 那样），你需要给它&lt;strong&gt;针对具体任务的记忆指令&lt;/strong&gt;来往上推。记忆这东西，模型越弱越需要你手把手教它怎么用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="我的体感这其实是在重新分配智能"&gt;我的体感：这其实是在重新分配「智能」
&lt;/h2&gt;&lt;p&gt;整理完这两个实验，我自己最大的感受是：&lt;strong&gt;Agent 工程正在从「怎么问」转向「怎么搭环境」。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;过去一年我自己用 Claude Code 的体验也印证了这点。早期我花大量时间打磨 prompt，恨不得把每一步都写死。但模型一强，这套做法的边际收益就崩了——你写的规则越细，反而越限制它。真正让产出质变的，是另外两件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;给它一个可验证的目标&lt;/strong&gt;，然后闭嘴让它自己跑。&lt;code&gt;/goal&lt;/code&gt; 这类原语的价值就在这——你定义「什么叫做完了」，剩下的交给循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;让它管理自己的上下文&lt;/strong&gt;，包括往记忆里写、从记忆里读。你不需要每次都把背景重新喂一遍。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lance 那句话我很认同：&lt;strong&gt;与其直接 prompt 和 steer 模型，不如设计循环，让模型自己根据环境反馈做自我纠正（比如 &lt;code&gt;/goal&lt;/code&gt; 或 Outcomes），并管理自己的上下文（比如记忆）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;换个角度说，你作为工程师的「智能」，正在从「写在 prompt 里」迁移到「写在循环结构里」。前者是一次性的指令，后者是可复利的系统。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="takeaway下次构建-agent先问自己四个问题"&gt;Takeaway：下次构建 Agent，先问自己四个问题
&lt;/h2&gt;&lt;p&gt;如果你也想用循环的思路构建 agent，把下面四个问题贴在显示器上：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;目标可验证吗？&lt;/strong&gt; 能不能写出一个 rubric / goal，让一个独立的裁判明确判断「做完了没有」？如果不能，先把任务拆到能验证为止。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;裁判独立吗？&lt;/strong&gt; 千万别让主 agent 自我批判。用一个独立的 grader 模型或子 agent，在干净的上下文里打分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环有边界吗？&lt;/strong&gt; &lt;code&gt;max_iterations&lt;/code&gt;、时间上限、退出条件——别让它无限跑。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆走完链路了吗？&lt;/strong&gt; 检查你的 agent 是停在「记笔记」，还是真的在「失败 → 调查 → 验证 → 提炼 → 查阅」。停在第一步的记忆约等于没有。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;想上手的话，可以直接问最新版的 Claude Code——它能用内置的 &lt;code&gt;/claude-api&lt;/code&gt; skill 告诉你 Fable 5 的 prompting 最佳实践、&lt;code&gt;/goal&lt;/code&gt;、Claude Managed Agents 这些 API 特性怎么用。&lt;/p&gt;
&lt;p&gt;说到底，&lt;strong&gt;写 prompt 是在赌一次直觉，设计循环是在搭一套能自我改进的系统。&lt;/strong&gt; 模型越强，后者的回报越高。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;原推文：&lt;a class="link" href="https://x.com/RLanceMartin/status/2064397389189071163" target="_blank" rel="noopener"
 &gt;Lance Martin (@RLanceMartin) — Designing loops with Fable 5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parameter Golf：开源 ML 工程挑战（16MB 模型，10 分钟，8×H100）&lt;/li&gt;
&lt;li&gt;Continual Learning Bench 1.0：跨会话记忆基准&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>