程序性记忆(Procedural Memory)
程序性记忆(Procedural Memory)
学习目标
读完本章后,你将能够:
- 区分语义记忆、情景记忆与程序性记忆的用途差异
- 设计 Agent 执行历史的摘要式存储方案
- 实现保留所有输出原文的结构化摘要格式
- 评估程序性记忆在 Agent 恢复上下文场景中的作用
核心概念
三种记忆类型
记忆系统通常支持三种类型的记忆,各自服务于不同的目的:
| 类型 | 枚举值 | 用途 | 示例 |
|---|---|---|---|
| 语义记忆 | semantic_memory | 事实、偏好、知识 | ”用户喜欢 Python” |
| 情景记忆 | episodic_memory | 事件、经历 | ”用户昨天去了巴黎” |
| 程序性记忆 | procedural_memory | Agent 执行历史摘要 | ”Agent 已爬取 5 个页面,存储了 HTML 内容” |
程序性记忆的特点
程序性记忆(Procedural Memory)是 Agent 执行历史的结构化摘要,核心目标是让 Agent 在后续会话中无歧义地继续任务。其特点:
- 保留所有输出原文:Agent 的每次操作结果(返回数据、HTML 片段、JSON、错误消息)都原样记录
- 顺序编号:每个 Agent 动作按执行顺序编号
- 包含元数据:每个步骤附带关键发现、导航历史、错误信息、当前上下文
结构化摘要格式
程序性记忆的结构化格式包含两个层级:
全局元数据:
- 任务目标:Agent 要完成的总体目标
- 进度状态:当前完成百分比和已完成的里程碑
顺序 Agent 动作(编号步骤):
- Agent 动作:精确描述做了什么(点击了什么、调用了什么 API)
- 动作结果(必须原文):返回的数据、响应、HTML、JSON、错误消息
- 嵌入式元数据:
- 关键发现
- 导航历史(访问了哪些页面及其 URL)
- 错误与挑战(错误消息、堆栈跟踪、恢复尝试)
- 当前上下文(操作后的状态和下一步计划)
触发条件
程序性记忆在 agent_id 存在且消息中包含 assistant 角色时触发,使用专门的 PROCEDURAL_MEMORY_SYSTEM_PROMPT 提示词,由 LLM 对 Agent 的执行历史进行摘要。
设计优势与代价
优势
- 任务可恢复性:Agent 中断后可从摘要中精确恢复上下文
- 完整性:所有输出原文保留,不因摘要而丢失细节
- 结构化:编号步骤 + 元数据使摘要易于程序化解析
代价
- 存储量大:保留所有输出原文导致摘要体积大
- LLM 依赖:摘要质量依赖 LLM 的总结能力
- 仅限 Agent 场景:需要
agent_id和assistant角色,不适用于纯用户对话场景
陷阱与对策
| 陷阱 | 对策 |
|---|---|
| LLM 摘要时丢失关键细节 | 提示词中强调”保留所有输出原文”、“不要改写或总结” |
| 错误信息被截断 | 要求包含完整错误消息和堆栈跟踪 |
| 摘要过长超出上下文窗口 | 对过长的动作结果进行适度截断(如 300 字符限制) |