Agent 如何动态存储运行时经验:从反思沉淀到场景化复用的完整闭环

0 阅读11分钟

核心结论:Agent 每跑一次任务都会产生「经验」——哪一步成功了、哪一步踩坑了、用户纠正了什么——但如果不存下来,下次还是从零开始,这就是「金鱼脑」。动态存储运行时经验,核心是四个动作:① 存什么(一条经验 = 场景 + 动作 + 结果 + 反思四要素);② 什么时候存(任务成功、任务失败、人工纠正、偏好出现四个触发点);③ 怎么提炼(多面向蒸馏:成功模式、失败触发、对比洞察,而不是把原始日志一股脑存进去);④ 怎么复用(按场景检索,命中才注入上下文)。此外还要管好记忆生命周期(去重、合并、淘汰),否则经验库会变成垃圾堆。做完这四件事,Agent 才能从「每次都从头学」进化成「越用越顺手」。

目录

    1. 一句话结论
    1. 为什么 Agent 需要「存经验」:从金鱼脑到专家库
    1. 存什么:一条经验的四要素结构
    1. 什么时候存:四个触发时机
    1. 怎么提炼:多面向蒸馏(成功 / 失败 / 对比)
    1. 怎么存:结构化 + 场景索引
    1. 怎么复用:场景感知检索与注入
    1. 怎么维护:去重、合并与淘汰
    1. 完整可运行代码:一个运行时经验库
    1. 对照表:症状 → 原因 → 解法
    1. 判断收尾

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 行日志只能占地方。

用类比 🎭:这就像「从错题本提炼错题规律」——不是把每道错题抄一遍,而是总结出「我总在立体几何上丢分,下次先画图」。规律比原题有用。

参考资料:

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 代码,实现完整的经验闭环:记录四要素 → 去重 → 按场景检索 → 注入上下文。运行无需第三方库。

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 产品时少踩坑,可在专栏页订阅。

参考资料(综合):