大多数循环 Agent 都有健忘症。每个周期都从零开始,所以它们会重复尝试同一个修复方法三次,因为没有任何东西记得它已经失败过了。
一个有学习能力的 Agent 会保存一本日志:每次尝试后,它都会写下自己试了什么、是否成功,然后在下次尝试前阅读这本日志。
只需设置一次,循环就不会再重复自己。每个周期都从上一个周期学到的东西开始,而不是从零开始。
以下是完整的设置步骤👇
在深入之前,我每天在 Telegram 频道分享关于 AI 和 Vibe Coding 的笔记:https://t.me/zodchixquant🧠

为什么循环会重复自己
普通的循环会反复运行同一个 Agent 处理同一个问题,但 Agent 的记忆会在周期之间重置。它不知道周期 2 已经尝试了周期 4 正准备尝试的事情。
于是它原地打转:换同一个库、回退、再换回去,浪费 Token 重新发现死胡同。循环在运行,却没有学习。
解决方案是跨周期持续存在的记忆:一本 Agent 在每个周期都会写入和读取的日志。

文件 1:日志
这就是记忆。一个纯文本文件,Agent 只追加内容,从不覆盖。创建 .claude/loop-journal.md:
1# 循环日志2仅追加。每次尝试:尝试了什么、结果、教训。34## 任务:修复失败的结账测试56### 尝试 17尝试了:给 fetchCart 调用添加了 await。8结果:仍然失败,同样的错误。9教训:竞态条件不在 fetchCart 中。需要向上游查看购物车状态。1011### 尝试 212尝试了:对购物车选择器进行了记忆化。13结果:现在失败的方式不同了,购物车在首次渲染时是 undefined。14教训:记忆化改变了时机。真正的问题是初始状态。
日志故意设计得非常简单。每个条目有三行:尝试了什么、发生了什么、以及下次的教训。
“教训”行是关键,它能阻止下一个周期重复相同的尝试。
文件 2:学习循环
这是编排器,也是让循环学习的核心规则:先读取日志。
将以下内容放入 .claude/commands/learn-loop.md:
1---2description: 运行一个任务循环,每个周期从日志中学习3argument-hint: <task>4allowed-tools: Read, Write, Edit, Glob, Grep, Bash5model: sonnet6---78任务:$ARGUMENTS910每个周期:111. 完整读取 .claude/loop-journal.md。注意哪些已经尝试过、学到了什么。绝不重复失败的尝试。122. 形成一个日志未排除的新假设。133. 进行修改。运行检查。144. 追加到日志:你尝试了什么、结果、教训。155. 如果通过:停止,总结有效的方法。如果失败:回到步骤 1。166. 最多 6 个周期。1718规则:每个周期都必须尝试日志中未出现过的方法。19如果想不到新方法,就说明并停止。这不是失败,20而是日志告诉你该找人类介入了。
步骤 1 是整个文章的核心。通过强制 Agent 在行动前先读取自己的历史,每个周期都建立在上一周期的基础上,而不是重新开始。循环积累知识,而不是空转。
文件 3:强制写入
Agent 会在日志记录非强制时跳过它,所以让它自动化。这个钩子提醒 Agent 在每次编辑后记录。添加到 .claude/settings.json:
1{2 "hooks": {3 "PostToolUse": [4 {5 "matcher": "Edit|Write",6 "hooks": [7 { "type": "command", "command": "test -f .claude/loop-journal.md && echo '提醒:在下一个周期前,请将此尝试及其结果记录到 loop-journal.md 中。'" }8 ]9 }10 ]11 }12}
这只是一个提示,不是强制,但很有效。每次修改后,Agent 都会收到提醒,记录它刚刚做了什么,这样日志就能保持最新。边做边写的日志才是准确的。
靠记忆写出来的日志是虚构的。
你实际会看到的
你只需输入一行:
1/learn-loop 应用优惠券后结账总金额错误
然后每个周期都基于上一个周期:
1周期 12 日志:空3 尝试了:在应用优惠券后重新计算总金额。失败,少了税费。4 记录了:优惠券在税费之前应用,应该之后应用。56周期 27 日志:周期 1 说优惠券应在税费之后8 尝试了:将优惠券移到税费之后。失败,大额优惠券导致负数。9 记录了:折扣没有下限。需要限制为商品总金额。1011周期 312 日志:2 条教训,均已应用13 尝试了:将折扣上限设为商品总金额。通过。14153 个周期完成,0 次重复。日志保存以备下次使用。
注意周期 2 没有重复周期 1 的错误,日志排除了它。而且日志会持续存在,所以下次出现优惠券相关的错误时,Agent 会从已经学到的所有知识开始。
升级:跨所有任务的记忆
到目前为止,日志只在一个任务内学习。更大的收益是让记忆跨越所有任务,这样 Agent 就不会在每个新功能上犯同一类错误。
再添加一个永久文件 .claude/lessons.md,用来保存值得永远保留的模式:
1# 教训(永久)2Agent 通过艰难方式学到的模式。在任何任务之前阅读。34## 本代码库5- 数据库中日期始终使用 UTC,仅在 UI 层使用本地时间。6- 测试中认证中间件运行两次,每个文件只模拟一次。7- 永远不要信任缓存后的用户对象,它会滞后一个请求。89## 通用反应10- 单独测试通过但组合测试失败 = 共享状态。11- 重构后出现 "undefined is not a function" = 导出的对象被移动了。12- 金钱计算:使用整数分,永远不要使用浮点数。每次都是。
然后在循环命令的顶部附近添加一行:
10. 在做任何事情之前先读取 .claude/lessons.md。这些是2 从以往任务中学到的永久规则。预先应用它们。
现在,当循环发现某条教训不是一次性问题时,Agent 会将其从任务日志提升到 lessons.md。
下一个任务,即使几周后,也会直接利用这些内置知识。
日志是短期记忆,lessons.md 是长期记忆:这就是“学习一个任务”的 Agent 与“学习整个代码库”的 Agent 之间的区别。
如何写出真正有用的教训
模糊的教训比没有更糟,因为它只会增加噪音,而不会阻止重复。格式决定了日志是让下一个循环更智能,还是只是更长。
糟糕的教训:
1日期有点问题。
好的教训:
1尝试了:直接比较时间戳。失败,时区导致偏差。2教训:数据库存储 UTC,输入是本地时间。在比较前先转换。3症状:在日期测试中发现相差几小时。
好的教训包含三样东西:尝试了什么、真正的原因、以及下次能识别出这个问题的症状。
第三部分让它变得可复用。当三周后 Agent 看到“日期测试中相差几小时”,它会直接跳到时区修复。
只有未来某个周期能通过模式匹配利用的教训,才值得写下来。
常见错误
覆盖日志。 如果每个周期都替换文件而不是追加,就会丢失历史记录,循环再次遗忘。始终只追加。全部价值就在于积累。
记录了尝试,但没有记录教训。 “尝试了 X,失败了”告诉下一个周期发生了什么,但没有告诉它应该做什么不同。“教训”行才是防止重复的关键。没有它,日志只是日记,不是指南。
让日志无限制增长。 30 次尝试后,日志本身会膨胀上下文。一旦任务解决,将其条目归档到单独的文件中,并清空活跃日志重新开始。
在最后而不是开始读取日志。 有些 Agent 勤于记录,但只在卡住时才检查日志。每个周期都必须先读取,否则记忆毫无作用。
从不将教训提升到永久。 如果所有内容都留在任务日志中,Agent 在每个新功能上都会重新学习代码库的特性。将重复出现的模式提升到 lessons.md,否则你就在为学习同一件事两次而付费。
12 分钟设置
2 分钟:创建 .claude/loop-journal.md,使用三行条目格式。
2 分钟:创建 .claude/lessons.md,用于永久性的跨任务模式。
3 分钟:在 .claude/commands/learn-loop.md 中创建学习循环,包含“先读取教训”步骤。
2 分钟:在 settings.json 中添加日志记录提醒钩子。
3 分钟:对一个真正的错误运行 /learn-loop,观察每个周期如何跳过上一个周期已排除的方法。
Agent 并没有变得更聪明。它只是不再遗忘。一个会记忆的循环,胜过每个周期都在重复的循环。
感谢阅读!
我每天在 Telegram 频道分享关于 AI、金融和 Vibe Coding 的笔记:https://t.me/zodchixquant






