核心结论 :Agent 每跑一次任务都会产生「经验」------哪一步成功了、哪一步踩坑了、用户纠正了什么------但如果不存下来,下次还是从零开始 ,这就是「金鱼脑」。动态存储运行时经验,核心是四个动作:① 存什么 (一条经验 = 场景 + 动作 + 结果 + 反思四要素);② 什么时候存 (任务成功、任务失败、人工纠正、偏好出现四个触发点);③ 怎么提炼 (多面向蒸馏:成功模式、失败触发、对比洞察,而不是把原始日志一股脑存进去);④ 怎么复用 (按场景检索,命中才注入上下文)。此外还要管好记忆生命周期(去重、合并、淘汰),否则经验库会变成垃圾堆。做完这四件事,Agent 才能从「每次都从头学」进化成「越用越顺手」。
目录
-
- 一句话结论
-
- 为什么 Agent 需要「存经验」:从金鱼脑到专家库
-
- 存什么:一条经验的四要素结构
-
- 什么时候存:四个触发时机
-
- 怎么提炼:多面向蒸馏(成功 / 失败 / 对比)
-
- 怎么存:结构化 + 场景索引
-
- 怎么复用:场景感知检索与注入
-
- 怎么维护:去重、合并与淘汰
-
- 完整可运行代码:一个运行时经验库
-
- 对照表:症状 → 原因 → 解法
-
- 判断收尾
1. 一句话结论
先建立一个直觉 🎭:Agent 存经验,就像「老师傅带徒弟时记笔记」 ------今天这个活儿怎么干成的、哪个坑差点踩进去,随手记一笔;下次遇到类似活儿,翻一眼笔记就少走弯路。不记笔记的师傅,干了十年还是干十年;记笔记的师傅,干一年顶三年。
所以整套机制就四步:
- 存什么:场景 + 动作 + 结果 + 反思(四要素)。
- 何时存:成功、失败、被纠正、偏好出现。
- 怎么提炼:蒸馏出「可复用的一句话」,不是存原始日志。
- 怎么用:按场景检索,命中才注入。
一句话:动态存储经验 = 把「这次怎么做的」压缩成「下次能用的规则」,按场景存好、按场景取用。
2. 为什么 Agent 需要「存经验」:从金鱼脑到专家库
先看「不存经验」的代价:
- 重复踩坑:同一个错误,今天犯了、明天还犯,因为没人告诉它「上次就是这么错的」。
- 重复摸索:同一个任务,每次都从零试错,明明上次已经找到最优路径。
- 学不会偏好:用户已经纠正过「不要用表格、要用列表」,下次照旧用表格,用户抓狂。
用类比 🎭:这就是「金鱼脑」------七秒记忆,永远活在当下。而存了经验的 Agent 是「专家库」------它记得「上次这种任务用 A 方案更快」「用户不喜欢输出太长」。
💡 我在Agent规则管理:让 Memory 做索引、让 Skill 存规则------上下文上限实测与分工方案里讲过「规则存哪」,本文聚焦「经验怎么在运行时动态产生并沉淀」------两者是「静态规则」与「动态经验」的关系。
3. 存什么:一条经验的四要素结构
关键认知:经验不能存原始日志,要存「结构化的一条」。一条好经验包含四要素:
| 要素 | 含义 | 示例 |
|---|---|---|
| 场景(context) | 什么情况下触发的 | 「用户要求处理 PDF 表格」 |
| 动作(action) | 做了什么 | 「调用 pdf-extract 脚本」 |
| 结果(result) | 成功还是失败 | 「成功,3 秒完成」 |
| 反思(reflection) | 为什么成/为什么败,下次怎么做 | 「PDF 超过 50 页要先分页,否则超时」 |
- 只有「动作 + 结果」是日志,加上「场景 + 反思」才是经验。
- 反思是灵魂:没有反思的经验,下次检索到了也不知道怎么用。
用类比 🎭:这就像「病例」------医生记的不是「今天看了个病人」(日志),而是「45 岁男性、胸痛、用 A 药有效」(结构化经验),下次遇到同类症状才有参考价值。
4. 什么时候存:四个触发时机
经验不是「每轮都存」,要在关键时刻捕获。四个触发点:
① 任务成功时 :记录「这次怎么成的」------成功路径是宝贵经验。 ② 任务失败时 :记录「哪里错的、为什么错」------失败教训比成功更值钱。 ③ 人工纠正时 :用户改了 Agent 的输出------这是「最权威的经验」,一定要存。 ④ 偏好出现时:用户表达喜好(「以后都用简洁风格」)------存成偏好经验。
用类比 🎭:这就像「行车记录仪」 ------不是 24 小时全程录像(太占空间),而是在「急刹、碰撞、异常」时自动存一段(关键事件)。经验存储同理:在「有信息量」的时刻存,而不是全量存。
⚠️ 常见错误:把「每轮对话」全存进去------结果是几百条无差别日志,检索时全是噪音。存「事件」,不存「流水账」。
5. 怎么提炼:多面向蒸馏(成功 / 失败 / 对比)
存进去之前要先「提炼」,业界叫多面向蒸馏(multi-faceted distillation):
- 成功模式:这次为什么成功?把成功路径抽象成一条规则。
- 失败触发:这次为什么失败?是工具选错、参数错、还是理解错?
- 对比洞察:如果同一个任务试了两种方案,记录「A 比 B 好在哪」。
ReMe 框架(Remember Me, Refine Me)把这事总结成一套记忆生命周期:蒸馏 → 场景自适应复用 → 记忆演进。
提炼的价值在于「压缩」:
- 原始日志可能有 50 行,提炼后是一句「PDF 超 50 页要先分页」。
- 这句话可复用、可检索、可注入------而 50 行日志只能占地方。
用类比 🎭:这就像「从错题本提炼错题规律」 ------不是把每道错题抄一遍,而是总结出「我总在立体几何上丢分,下次先画图」。规律比原题有用。
参考资料:
- Remember Me, Refine Me: A Dynamic Procedural Memory Framework for Experience-Driven Agent Evolution -- arXiv ⭐值得阅读
- Reflexion:语言强化学习与反思记忆 -- AI Insight ⭐值得阅读
6. 怎么存:结构化 + 场景索引
提炼完,落地存储要解决「怎么存得好找」:
- 结构化存储:按第 3 节的四要素存成 JSON / 表记录,而不是一段自由文本。
- 场景索引(scenario-aware indexing):给每条经验打「场景标签」(如「pdf / 表格 / 长文档」),方便按场景检索。
- 多种后端 :小规模用文件(如
experience.jsonl);大规模用向量库(按语义检索)或数据库。
为什么必须「场景索引」?
- 经验的价值在于「下次遇到类似场景」才用得上。
- 如果只按「时间」存,检索时只能按时间翻------找到的都是「最近的经验」,不是「相关的经验」。
💡 存储的判据:能不能在「新任务来时,快速找到相关经验」。存得再全,检索不到等于没存。
7. 怎么复用:场景感知检索与注入
存了不用等于白存。复用分两步:
① 场景感知检索:新任务来了,按任务特征去经验库检索 top-k 相关经验。
- 小规模:按标签匹配(任务含「PDF」→ 召回 pdf 相关经验)。
- 大规模:向量检索(语义相似)。
- 关键:只召回相关的,不把整个经验库注入(否则上下文又爆了,见本专栏《Agent 上下文太长怎么办》)。
② 注入上下文:把召回到的经验拼成一段「过往经验」提示,放在任务描述前面。
- 格式示例:「【经验】处理 PDF 超 50 页时:先分页再解析,否则会超时。」
- 只注入「提炼后的一句话」,不注入原始日志。
用类比 🎭:这就像「考前翻错题本」------不是把整本练习册重读一遍(检索全量),而是翻到「这次考试相关的几道错题」(场景检索),看一眼规律就够。
8. 怎么维护:去重、合并与淘汰
经验库最怕「越存越乱」。三个维护动作:
- 去重(deduplication):同一个经验反复出现,只留一条(或合并成「出现 N 次」)。
- 合并(consolidation):多条相似经验合并成一条更高层的抽象(如「PDF 处理要分页」「PDF 解析要限时」→ 合并成「PDF 处理:分页 + 限时」)。
- 淘汰(eviction):过时、错误、长期未命中的经验,定期清理。
ReMe 把这三件事归进「记忆生命周期管理」------记忆不是只增不减,而是要像生物一样新陈代谢。
用类比 🎭:这就像「衣柜换季」------只进不出,衣柜迟早爆炸;定期扔旧衣服(淘汰)、把类似的叠一起(合并)、避免重复买同款(去重),衣柜才能一直好用。
9. 完整可运行代码:一个运行时经验库
下面是一段复制粘贴就能跑的 Python 代码,实现完整的经验闭环:记录四要素 → 去重 → 按场景检索 → 注入上下文。运行无需第三方库。
python
import json
class ExperienceStore:
"""运行时经验库:记录、去重、检索、注入"""
def __init__(self):
self.experiences = [] # 经验列表(四要素)
def record(self, context, action, result, reflection):
"""记录一条经验(四要素),自带去重"""
exp = {
"scenario": context, # 场景:什么时候触发
"action": action, # 动作:做了什么
"result": result, # 结果:成功/失败
"reflection": reflection, # 反思:为什么、下次怎么做
}
# 去重:场景+反思相同则视为同一条,不重复存
for e in self.experiences:
if e["scenario"] == context and e["reflection"] == reflection:
return False # 已存在,跳过
self.experiences.append(exp)
return True
def retrieve(self, task, top_k=2):
"""场景检索:按任务关键词匹配场景标签,返回相关经验"""
hits = []
for e in self.experiences:
# 简化检索:任务词命中场景即算相关(真实场景用向量检索)
if any(word in e["scenario"] for word in task.split()):
hits.append(e)
return hits[:top_k] # 只返回 top-k,避免注入过多
def inject(self, task):
"""注入:把检索到的经验拼成上下文提示"""
hits = self.retrieve(task)
if not hits:
return "(无相关经验)"
lines = ["【过往经验】"]
for e in hits:
lines.append(f"- 场景[{e['scenario']}] {e['action']} → {e['result']};"
f"反思:{e['reflection']}")
return "\n".join(lines)
if __name__ == "__main__":
store = ExperienceStore()
# 记录三条经验(成功、失败、被纠正各一)
store.record("处理 PDF 表格", "直接解析", "失败:超时",
"PDF 超 50 页要先分页,否则超时")
store.record("处理 PDF 表格", "先分页再解析", "成功:3 秒完成",
"分页是长 PDF 的关键")
store.record("生成周报", "用表格输出", "被用户纠正",
"该用户偏好列表,不喜欢表格")
store.record("处理 PDF 表格", "先分页再解析", "成功:3 秒完成",
"分页是长 PDF 的关键") # 重复,会被去重
print("经验总数(去重后):", len(store.experiences)) # 应为 3
# 新任务来了:按场景检索并注入
task = "帮我处理这个 PDF 表格"
print(store.inject(task))
怎么读这段代码 :record() 存的是第 3 节的「四要素」,并做了第 8 节的「去重」(第 5 条重复记录被跳过);retrieve() 是第 7 节的「场景检索」------按任务关键词匹配场景,且只取 top-k(避免全量注入撑爆上下文);inject() 把经验拼成一句句可读提示,正对应第 7 节「注入上下文」。跑一遍你会看到:4 条记录去重成 3 条,新任务只召回了 PDF 相关的经验------这就是「存得下、找得到、用得省」。
10. 对照表:症状 → 原因 → 解法
| 症状 | 原因 | 解法 |
|---|---|---|
| 同一个错误反复犯 | 失败经验没存下来 | 任务失败时记录「失败触发 + 反思」 |
| 同类任务每次从零摸索 | 成功路径没沉淀 | 任务成功时记录「成功模式」 |
| 用户纠正过,下次又犯 | 人工纠正没入库 | 被纠正时立刻存成经验 |
| 经验库越存越大、检索全是噪音 | 全量存流水账、没提炼 | 多面向蒸馏,存「一句话规律」 |
| 存了很多但用不上 | 没场景索引,检索不到 | 打场景标签,按场景检索 |
| 经验互相矛盾、越来越乱 | 只增不减、没维护 | 去重 + 合并 + 定期淘汰 |
11. 判断收尾
什么时候该建经验库 :你的 Agent 会重复处理同类任务 (多轮、跨会话、有稳定业务场景),且你希望它「越用越顺手」------这时经验存储是提升自动化的核心杠杆。什么时候可以不做 :Agent 只做一次性、各不相同的任务,或每次都有足够上下文从零推理------这时存经验收益很低,反而增加维护负担。判断标准只有一条:同类任务会不会重复出现------会,就值得沉淀;不会,就别为「可能用得上」建一套系统。
本专栏《AI-Agent 工具》从 Agent 记忆、上下文、工具调用一路讲到知识挂载、经验沉淀与评测,每篇配可直接运行的代码,持续更新。想在做 Agent 产品时少踩坑,可在专栏页订阅。
参考资料(综合):