跳到主要内容

情景与程序记忆【选修】

本节定位

长期记忆更像“稳定档案”。
但有些信息不是长期档案,也不是短期窗口,而更像:

  • 一次具体经历
  • 一套经过验证的做事流程

这就是情景记忆和程序记忆要解决的层。

一句话区分:

情景记忆是“我经历过什么”,程序记忆是“我学会怎么做”。

学习目标

  • 理解情景记忆和程序记忆的区别
  • 理解这两类记忆为什么对复杂任务特别重要
  • 通过可运行示例看懂“从经历提炼流程”的最小闭环
  • 学会判断一条信息更适合存成 episode 还是 workflow

一、情景记忆到底是什么?

1.1 它更像单次经历

例如:

  • 上周处理过一次退款争议,原因是学习进度超出阈值
  • 某次生成周报时,数据库接口超时导致任务失败

这类记忆的特点是:

  • 带时间和上下文
  • 有具体事件经过
  • 不一定总能直接复用

1.2 为什么 Agent 需要情景记忆?

因为复杂系统经常要参考过去发生过的事:

  • 用户之前遇到过什么问题
  • 上一次类似任务是怎么结束的
  • 哪类情况容易失败

这类信息不是静态档案,但对决策很有帮助。


二、程序记忆又是什么?

2.1 它更像技能和流程

例如:

  • 处理退款问题时,先查订单,再查政策,再判断资格
  • 做竞品报告时,先收集数据,再分类,再总结

这类记忆的重点不在“过去具体哪次”,
而在“以后遇到类似任务时可以沿用这套做法”。

2.2 为什么程序记忆很重要?

因为它能让 Agent 避免每次都从零规划。
很多任务其实不是完全新问题,而是:

  • 新实例 + 旧流程

这时程序记忆能显著降低推理负担。


三、两者最大的区别是什么?

3.1 情景记忆回答“发生过什么”

例子:

  • “上次生成周报时,因为日志太多导致摘要质量下降”

3.2 程序记忆回答“类似问题通常怎么处理”

例子:

  • “生成周报的一般步骤是拉数据 -> 聚类 -> 生成摘要 -> 审核”

3.3 一个类比

情景记忆像项目复盘。
程序记忆像 SOP 手册。

两者都重要,但用途不同。


四、先跑一个“经历 -> 流程”示例

下面这个例子会做两件事:

  1. 记录几次具体 episode
  2. 从 episode 中提炼出一个可复用 workflow
from dataclasses import dataclass


@dataclass
class Episode:
task_type: str
context: str
steps: list
result: str


episodes = [
Episode(
task_type="refund_case",
context="用户询问未发货订单是否能退款",
steps=["查订单状态", "查退款政策", "判断资格", "返回结论"],
result="success",
),
Episode(
task_type="refund_case",
context="用户询问学习进度超 20% 是否能退款",
steps=["查订单状态", "查退款政策", "判断资格", "返回结论"],
result="success",
),
Episode(
task_type="weekly_report",
context="周报生成任务",
steps=["拉数据", "聚类问题", "写总结"],
result="partial_failure",
),
]


def build_procedural_memory(episodes, min_support=2):
grouped = {}
for episode in episodes:
key = (episode.task_type, tuple(episode.steps))
grouped[key] = grouped.get(key, 0) + 1

workflows = {}
for (task_type, steps), count in grouped.items():
if count >= min_support:
workflows[task_type] = list(steps)
return workflows


procedural_memory = build_procedural_memory(episodes)
print("procedural_memory:", procedural_memory)

4.1 这段代码到底说明了什么?

它说明:

  • 情景记忆可以积累“具体做过的事”
  • 当重复 enough 次之后,可以抽象成程序记忆

也就是说,程序记忆往往不是凭空写出来的,
而是从反复成功的 episode 中沉淀出来。

4.2 为什么 weekly_report 没有进入程序记忆?

因为它只出现了一次,
还没有足够支持度。

这很符合现实:

  • 一次偶然成功或失败,不一定值得立刻写成标准流程

4.3 为什么这比直接手写 workflow 更有启发?

因为它展示了一个非常真实的知识沉淀过程:

  • 先做
  • 再复盘
  • 最后抽象成流程

这恰恰是很多成熟 Agent 系统演进的路径。


五、情景记忆在系统里通常怎么用?

5.1 检索相似案例

当遇到当前问题时,可以先查:

  • 以前有没有类似情况
  • 当时是怎么处理的
  • 最后结果如何

5.2 做失败复盘

如果某类任务经常失败,
情景记忆会非常适合回答:

  • 是在哪一步容易出错
  • 哪类上下文容易触发失败

5.3 作为程序记忆的训练素材

它本身也可以成为后续流程抽象的原始数据。


六、程序记忆在系统里通常怎么用?

6.1 作为 planner 的默认模板

当任务类型被识别后,系统可直接加载:

  • 默认工作流

6.2 作为技能库

很多程序记忆本质上就像:

  • 可复用技能
  • 标准处理流程
  • 任务模板

6.3 作为安全边界

程序记忆还能起到“别乱来”的作用。
例如对高风险任务,只允许系统沿用已经审核过的流程。


七、最容易踩的坑

7.1 误区一:把所有历史都叫情景记忆

不是所有历史都值得保留为 episode。
episode 更适合:

  • 有明确任务
  • 有过程
  • 有结果

的记录。

7.2 误区二:一有 episode 就自动变成程序记忆

程序记忆需要:

  • 重复性
  • 稳定性
  • 可迁移性

7.3 误区三:程序记忆写死后永远不更新

如果流程变化了,程序记忆也 باید更新。
否则它会从“经验”变成“过期经验”。


小结

这节最重要的是建立一条沉淀逻辑:

情景记忆负责保存具体经历,程序记忆负责把反复验证过的经历抽象成可复用流程。

一旦你把这条逻辑想清楚,
记忆系统就不再只是“存档”,而会开始真正帮助 Agent 学习。


练习

  1. 给示例再增加两条 weekly_report 的成功案例,让它也能沉淀出程序记忆。
  2. 想一想:哪些任务更适合查 episode,哪些任务更适合直接套 workflow?
  3. 为什么说程序记忆很像“技能库”,而不只是“历史记录”?
  4. 如果某条 workflow 已经过时,你会怎么设计更新机制?