type
Post
status
Published
date
May 20, 2026
slug
agent45
summary
tags
Agent
category
icon
password
摘要
让 Agent “自我学习”,在工程上通常不是指它在线修改大模型权重,而是让它在执行任务后,把有效经验沉淀为可检索、可审计、可复用的外部资产:记忆、规则、技能、工具用法、失败案例、测试反馈、知识库条目和策略约束。Reflexion 的核心思想就是“不更新权重”,而是让 Agent 根据任务反馈生成语言化反思,并存入 episodic memory,用于后续决策;Voyager 则把可复用能力沉淀为可检索的 executable skill library;Generative Agents 通过 memory、reflection、planning 构建持续行为一致性。(arXiv)
在生产级 Agent 系统里,自我学习能力可以概括为一句话:
Agent 每次执行任务后,不只是返回答案,还要把“这次为什么成功、为什么失败、以后遇到类似任务该怎么做”转化为长期可用的工程资产。
1. 为什么 Agent 需要“经验沉淀”,而不只是上下文窗口?
普通 Agent 的问题是:每个会话都像“失忆”。用户上一轮纠正过的命令、项目里踩过的坑、工具调用失败原因、代码库特有约定,下一次又可能重复犯错。Claude Code 文档也明确提到,每个 session 都从新的 context window 开始,因此需要
CLAUDE.md 和 Auto Memory 两类机制跨会话保留知识。(Claude API Docs)成熟 Agent 的共同方向是:把经验分层保存。Claude Code 使用
CLAUDE.md、.claude/rules/、Auto Memory、Skills 和 Hooks;OpenCode 使用 AGENTS.md、Agents/Subagents、Skills、Permissions、Compaction;OpenClaw 使用 MEMORY.md、daily notes、DREAMS.md、dreaming consolidation 和 memory-wiki。(Claude API Docs)这说明一个关键事实:
Agent 的长期能力不是来自“把所有历史都塞进 prompt”,而是来自“选择性记录、结构化沉淀、按需检索、持续纠错”。
2. “自我学习”到底学什么?
Agent 经验通常可以分成六类。
经验类型 | 示例 | 存储位置建议 | 是否每次加载 |
用户偏好 | 用户喜欢 TypeScript、回答要先给结论 | 用户级 memory / profile | 部分加载 |
项目约定 | 使用 pnpm、不允许直接 push main、API 位于 src/api | AGENTS.md / CLAUDE.md / project memory | 经常加载 |
调试经验 | 某个测试失败需要先启动 Redis | Auto Memory / daily note / debugging.md | 检索加载 |
工具经验 | 某 MCP API 参数格式、某脚本执行顺序 | tool memory / skill | 按需加载 |
流程技能 | 发布流程、数据库迁移流程、PR review 流程 | Skill / command / workflow | 按需加载 |
失败反思 | “上次误删文件,因为没先读 diff” | reflection memory / safety rule | 条件加载 |
Claude Code 的 Auto Memory 会让 Claude 在工作中保存 build commands、debugging insights、architecture notes、code style preferences、workflow habits 等信息,并按项目落到本地 memory 目录;它不是每次都保存,而是判断未来是否有用。(Claude API Docs)
OpenClaw 也采用类似分层:
MEMORY.md 保存长期、精炼、可启动加载的事实;memory/YYYY-MM-DD.md 保存 daily notes 和运行上下文;系统会周期性把 daily notes 中有价值的信息提炼回 MEMORY.md,并提醒 MEMORY.md 过大时会被截断,应把细节移回日记层。(OpenClaw)3. 参考成熟项目后的总体架构
一个具备自我学习能力的 Agent,不应该只有“执行器”,还需要“经验闭环”。
这里最重要的不是“写入向量库”,而是 写入前的判定、分类、压缩、溯源和权限控制。LangGraph 的长期记忆使用 namespace/key 组织 JSON 文档,强调按用户、组织等 namespace 分层;LlamaIndex 的 Memory 会把超出短期窗口的消息 flush 到长期 memory block,并在检索时合并短期和长期记忆。(LangChain 文档)
4. 经验沉淀的四层存储模型
生产中可以采用四层结构。
第一层:Session Trace,完整执行轨迹
保存当前任务的完整过程:
用户目标、计划、工具调用、参数、返回值、错误、重试、最终结果、测试输出、用户反馈。
这层不直接进入 prompt,而是用于审计、复盘和经验提取。
第二层:Episodic Memory,事件记忆
保存“某次任务发生了什么”:
2026-05-25:在 xxx 项目中运行npm test前必须先启动 Redis,否则 API tests 会失败。
Reflexion 使用的就是这种思路:根据反馈生成反思文本,存入 episodic memory buffer,让后续 trial 决策更好。(arXiv)
第三层:Semantic Memory,稳定知识
保存可复用、去场景化的知识:
该项目 API handler 位于src/api/handlers/。该项目统一使用 pnpm,不使用 npm。该团队 PR 前必须运行 lint + test。
Claude Code 建议把构建命令、约定、项目布局、“always do X” 这类事实放入
CLAUDE.md,并提醒指令要具体、避免冲突。(Claude API Docs)第四层:Procedural Memory / Skill,流程技能
保存“遇到某类任务时如何做”:
数据库迁移流程。线上问题排查流程。新增 API endpoint 的标准步骤。浏览器测试流程。
Claude Code 的 Skills 使用
SKILL.md,其中 YAML frontmatter 的 description 帮助 Claude 判断何时加载技能;技能还可以通过命令动态注入上下文,例如运行 git diff HEAD 后再让模型总结风险。(Claude API Docs)Letta Code 也把 Skills 定义为按需加载的参考指南,而不是永久塞进上下文;它还强调 skill 适合承载 API patterns、testing workflows、deployment procedures 等专门任务知识。(Letta Docs)
5. 从源码/配置看成熟 Agent 怎么做
5.1 Claude Code:CLAUDE.md + Auto Memory + Rules + Skills + Hooks
Claude Code 的记忆体系很有参考价值:
CLAUDE.md 用于人类写的持久指令;Auto Memory 用于 Claude 自己基于纠正和偏好写笔记;.claude/rules/ 可以把规则拆成多个文件并按路径生效,减少上下文噪声;Skills 则用于任务级、按需加载的能力。(Claude API Docs)一个典型项目可以这样组织:
CLAUDE.md 适合沉淀稳定事实:路径级规则适合降低污染:
Claude Code Hooks 则适合作为经验闭环的自动触发器。Hooks 会在 session、turn、tool call 等生命周期点执行;例如
PreToolUse 可以在工具调用前检查危险命令并阻断。(Claude API Docs)可以借鉴这个机制,在
PostToolUse 或 SessionEnd 后触发“经验提取器”:5.2 OpenCode:AGENTS.md + Agents + Skills + Permissions + Compaction
OpenCode 使用
AGENTS.md 提供项目级自定义指令,/init 会扫描仓库的重要文件,并生成或更新简洁的项目指导,包括 build/lint/test 命令、验证步骤、架构、项目约定和 gotchas;官方也建议把项目的 AGENTS.md 提交到 Git。(OpenCode)OpenCode 还支持 primary agents 和 subagents。primary agent 是主对话助手,subagent 是可被调用的专门助手;工具权限可以按 agent 配置,例如 Plan 只读,Build 可执行修改。(OpenCode)
这对“经验沉淀”的启发是:不要让一个 Agent 既负责执行、又负责反思、又负责写长期记忆。更稳妥的做法是拆成多个角色:
OpenCode 的 Skills 也是按需加载的 reusable instructions;OpenCode 文档强调 agent 能看到可用 skills,并在需要时通过 native skill tool 加载完整内容。(OpenCode)
5.3 OpenClaw:Markdown 记忆 + Daily Notes + Dreaming + Wiki
OpenClaw 的记忆设计非常直接:模型“只记得保存到磁盘上的东西”,没有隐藏状态;长期记忆在
MEMORY.md,运行上下文在 memory/YYYY-MM-DD.md,可选的 DREAMS.md 用于 dreaming sweep summaries。(OpenClaw)OpenClaw 还特别强调 action-sensitive memory:如果某条记忆会影响未来行动,就必须记录适用条件、过期条件、禁止动作、来源/owner 等,否则容易把“曾经允许”误解成“永远允许”。(OpenClaw)
这点对生产系统极其重要。经验记忆不能只写:
应该写成:
OpenClaw 的 memory-wiki 插件进一步把 durable memory 编译成带 provenance、confidence、contradictions、open questions 的知识 vault,这说明记忆系统不能只是“Markdown 堆”,还需要知识治理层。(OpenClaw)
6. 生产级自我学习系统的核心模块
6.1 Trace Logger:记录事实,不记录幻想
Trace 是经验提取的原材料。至少要记录:
字段 | 说明 |
task_id | 任务 ID |
user_goal | 用户目标 |
plan | Agent 计划 |
tool_calls | 工具名、参数、返回、耗时 |
files_changed | 修改文件 |
verification | 测试、lint、人工反馈 |
result | 成功/失败/部分成功 |
error_type | 工具失败、参数错误、理解错误、权限错误 |
timestamp | 时间 |
source_agent | 哪个 agent 产生 |
confidence | 可置信度 |
OpenClaw 社区 issue 里也提到,多 Agent 向共享 RAG 写入知识时,需要记录
agentId、workspace、sessionId、learnedFrom、createdAt 等 metadata,用于追踪哪个 Agent 贡献了哪条知识。(GitHub)6.2 Experience Extractor:从轨迹中提取经验候选
经验候选不等于立即写入长期记忆。可以让一个专门的 learner agent 生成结构化候选:
6.3 Memory Gate:判断是否值得保存
保存标准建议采用“五问法”:
未来是否会复用?是否足够稳定?是否有证据支撑?是否有明确作用域?是否存在隐私、安全或授权风险?
不满足这些条件,只进日志,不进长期记忆。
6.4 Consolidator:压缩、去重、合并、降噪
长期记忆最怕膨胀和冲突。Claude Code 文档提醒,指令冲突时模型可能随机选择,应该定期移除过时或冲突指令。(Claude API Docs)
Consolidator 的职责是:
把多条相似经验合成一条稳定规则;把临时事实留在 daily notes;把流程型经验升级成 skill;把冲突经验标记为待人工确认;把过期经验降级或删除。
6.5 Retriever:按任务动态召回
不要把所有记忆都塞进 prompt。MemGPT 的核心洞察是:上下文窗口是有限资源,可以借鉴操作系统虚拟内存,通过函数调用在上下文和外部存储之间 page in/page out。(arXiv)
所以检索策略应按任务动态选择:
当前任务 | 召回内容 |
改 API | API rules、相关代码历史、测试命令 |
修 CI | 最近失败日志、CI gotchas、部署 skill |
生成 PR | commit 规范、review checklist |
调用工具 | 工具 schema、历史失败参数、权限边界 |
跨会话继续任务 | 上次 session summary、open decisions |
7. 经验如何从“记忆”升级成“技能”?
不是所有经验都应该写入 memory。流程型、可重复执行的经验应该升级成 Skill。
判断标准:
适合 Memory | 适合 Skill |
一个事实 | 一套步骤 |
一个偏好 | 一个 workflow |
一个约定 | 一个工具使用方法 |
一个 debug insight | 一个可复用操作流程 |
常驻轻量信息 | 按需加载的大段说明 |
例如,Agent 第一次学会数据库迁移流程后,不应该只写一句“迁移要小心”,而应该创建项目级 Skill:
SKILL.md:Claude Code 的 Skills 和 OpenCode/Letta 的 Skills 都体现了同一个方向:技能是可复用行为的载体,按需加载,避免长期污染上下文。(Claude API Docs)
8. 自我学习的写入链路:示例代码
下面给一个简化版 Python 设计,展示如何把任务执行结果转成经验候选,并经过 gate 后写入不同存储。
真实生产环境里,这个
MemoryGate 不应该只靠规则,还应叠加:LLM reviewer、embedding 去重、权限策略、敏感信息扫描、人工审批、版本化 diff、回滚机制。
9. 经验沉淀和 RAG 的关系
RAG 知识库通常回答“外部世界或业务文档里有什么”;Agent 经验库回答“我以前怎么做、哪里失败、什么流程有效”。
两者可以复用同一套检索基础设施,但 metadata 必须不同。
建议把 RAG 分成三类 corpus:
Corpus | 内容 | 检索方式 |
docs | 产品文档、代码文档、规范 | semantic + keyword |
code | 代码片段、接口定义、测试 | hybrid + path filter |
experience | Agent 经验、反思、失败案例、工具用法 | semantic + metadata filter + recency |
Self-RAG 的启发是:检索不应该固定发生,而应该由模型判断是否需要检索,并对检索结果和生成内容进行反思。(arXiv)
10. 自我学习的关键难点
10.1 记忆污染
最大风险是把错误经验写进长期记忆。例如某次临时绕过测试成功了,Agent 把它记成“以后都可以跳过测试”。
解决方式:
所有经验必须带 evidence、scope、confidence、created_at、expires_at;临时经验默认不进入长期记忆;权限相关经验必须写明 action boundary;高影响记忆需要人工确认。
10.2 经验过期
技术栈、API、组织流程都会变。过期经验比没有经验更危险。
解决方式:
给 memory 增加 TTL;通过 CI/test 结果反向修正记忆;定期运行 memory doctor;被反复检索但导致失败的经验自动降权。
10.3 上下文膨胀
Claude Code、OpenClaw、LlamaIndex 都体现了一个原则:长期信息不能无脑注入上下文。Claude Code 的 path-scoped rules 只在匹配文件时加载;OpenClaw 的 daily notes 可被检索但不会每次注入;LlamaIndex 会在短期 token 超限后 flush 到长期 memory block。(Claude API Docs)
10.4 权限和安全
经验记忆不能代替安全策略。OpenClaw 文档明确说,memory 可以保存 approval context,但不能执行 policy,硬控制要靠 approval settings、sandboxing、scheduled tasks。(OpenClaw)
这意味着:
“记得用户允许我删除临时文件”不是安全边界;真正的边界应该由 permission、sandbox、hook、审批系统控制。
11. 推荐的生产级落地方案
11.1 最小可用版本
适合单 Agent 或小团队:
流程:
每次任务结束写 trace;trace 进入 extractor;extractor 生成 memory candidates;gate 判断是否保存;reviewer 检查冲突和敏感信息;写入 memory 或 skill;下次任务启动时检索相关经验。
11.2 团队版
团队版需要增加:
Git 版本化 memory;PR 审核 memory 变更;项目级和用户级隔离;多 Agent 贡献者 attribution;记忆回滚;memory eval;过期清理任务;安全扫描。
Letta Code 的 MemFS 就是一个值得参考的方向:它把 memory 组织为 git-backed filesystem,Agent 直接编辑 markdown 文件并 commit,从而保留完整版本历史;系统目录内容会加载到 system prompt,其他文件只通过 memory tree 可见,从而控制上下文成本。(Letta Docs)
12. 经验沉淀的评估指标
自我学习系统不能只看“记了多少”,要看“记得是否有用”。
指标 | 含义 |
Repeat Error Rate | 同类错误是否下降 |
Task Success Rate | 同类任务成功率是否提升 |
Memory Precision | 被召回记忆中有多少确实有用 |
Memory Harm Rate | 记忆导致错误或越权的比例 |
Staleness Rate | 被召回但已过期的记忆比例 |
Context Cost | 每次任务注入记忆消耗 token |
Human Correction Rate | 用户重复纠正次数是否下降 |
Skill Reuse Rate | 自动生成技能被复用次数 |
可以设计一个简单评测:
13. 最佳实践清单
原则 | 说明 |
先记录 trace,再提取经验 | 不要让模型凭印象写长期记忆 |
记忆必须有作用域 | user / project / team / org 分清楚 |
记忆必须有证据 | 没 evidence 的经验不要长期保存 |
长期记忆要短 | 细节放 daily notes 或 RAG |
流程升级为 skill | 不要把长流程塞进 memory |
权限不靠记忆实现 | 用 permission、sandbox、hook 做硬控制 |
定期 consolidation | 去重、合并、降权、删除过期项 |
高风险记忆人工审查 | 权限、生产环境、财务、隐私相关必须审 |
多 Agent 需要 attribution | 记录 agentId、workspace、sessionId |
记忆要可回滚 | Git、版本号、diff、审计日志必不可少 |
14. 一句话总结
让 Agent 具备自我学习和经验沉淀能力,本质上是给 Agent 增加一套“经验操作系统”:
Trace 是日志,Memory 是长期状态,Reflection 是学习算法,Skill 是可复用程序,RAG 是外部知识索引,Hook/Permission 是安全内核,Evaluation 是持续改进闭环。
Claude Code、OpenCode、OpenClaw、Letta、LangGraph、LlamaIndex 和 MemGPT/Reflexion/Voyager 这些系统给出的共同答案是:不要幻想模型自己永久变聪明,而要把每次任务产生的有效反馈,转化为可验证、可检索、可版本化、可治理的外部经验资产。
分享
