第 9 课 上下文工程:管理记忆
管理模型在任意时刻知道什么。
预计 24 分钟 · 系列:从 0 到 1 设计一个 Agent
本课要点
- 决定什么值得记住,什么只属于当前会话
- 设计蒸馏、整合与注入的记忆循环
- 用评估与护栏,让记忆可靠地服务当前任务
1. 为什么记忆很重要
智能体正在从“响应式的助手”演变为“有适应力的协作者”。记忆管理的核心,是管理模型在任意时刻“知道什么”——即存储什么、召回什么、注入什么。
有记忆
用户视角
被理解的体验,带来信任与愉悦。
企业视角
交互沉淀为更高信号的行为信息,帮助改善服务、留存与需求洞察。
记忆也可以帮助客服、客户经理与旅行顾问理解用户。不同类型的智能体需要不同节奏的记忆:人生教练的记忆变化更快,IT 故障排除更需要稳定、可预测的状态。
2. Agent 记忆的架构决策
“记忆没有放之四海而皆准的方案。设计从使用场景出发。”
2.1 检索式记忆 vs 状态式记忆
检索式记忆
从历史文档中查找相关信息
状态式记忆
维护当前连贯的用户状态
| 对比维度 | 检索式记忆 | 状态式记忆 |
|---|---|---|
| 数据形态 | 松散关联的文档 | 结构化字段与当前状态 |
| 更新方式 | 查找相关片段 | 显式更新与冲突规则 |
| 使用特点 | 依赖检索质量 | 一致应用有效状态 |
本课差旅案例采用状态式设计:会员、座位、预算与行程约束需要跨任务保持一致。检索也可与状态更新组合使用。
2.2 记忆的形态
“如果是人类代理,他会主动记住什么来完成任务?”
结构化记忆
seat: aisle
meal: vegetarian
member_tier: gold身份档案会员
偏好
约束
参与校验、过滤与工具参数
非结构化记忆
保留背景、情境与推理线索
不包含所有内部字段
只包含必要字段
结构化字段从可信来源同步,笔记补充灵活信息。本课案例只从用户显式表达中提取候选记忆。
2.3 记忆作用域
按作用域分离记忆,降低噪声,让演化更安全。如果它默认应该影响未来的行程,存为全局;如果只是当前需要,保留为会话级。
用户级记忆 · 跨会话默认值
相对稳定,影响未来的多次行程
会话级记忆 · 当前暂存区
临时、情境性的,通常只在本次会话中生效
有效偏好示例
本次覆盖,不改写长期默认值。
2.4 记忆生命周期
持续区分哪些是持久的、哪些是情境性的。记忆设计应当随系统的学习而演进。
稳定性
验证稳定后,可结构化
漂移
1000 美元预算
1500 美元预算
2000 美元
保留时间,关注较新信息
上下文变异
保留情境、置信度或有效期
一次会话做笔记,会话之后再整合
三个记忆管理阶段,连接一个持续循环注入
根据记忆注入上下文推理 / 交互
理解需求、生成回应蒸馏
会话级候选记忆更新全局记忆
写入长期记忆清零
清理临时信息冲突解决
按规则处理去重
合并相似内容整合
筛选合格记忆蒸馏:从用户明确表达中捕获新信号,可操作的信号,先写入会话暂存区。也可在会话结束后,从可观测执行记录中提取。
整合:把会话级候选记忆合入全局记忆,处理冲突与过时信息。
注入:在运行前,把当前任务相关的记忆放入上下文。
整合工作台
| 原始笔记(Before) | 决策(Decision) | 整合结果(After) |
|---|---|---|
| 喜欢靠过道 偏好过道座位 | 语义去重 | 通常偏好靠过道 |
| 旧:偏好早班 新:以后优先晚班 | 明确变更,按规则更新 | 优先晚班 |
| 这次靠窗休息 | 仅本次,不晋升 | 保留在会话级记忆不写入全局记忆 |
!整合最容易出错的地方:过度修剪、提升噪声、引入矛盾,都可能污染后续决策。
3. 构建一个记忆系统:八个设计步骤
从状态对象到会话后整合,把架构决策落成一条可运行的记忆流水线。以下是差旅助手案例的实现方式。
3.1 定义状态对象
建立明确的事实来源,不把内部系统的所有字段都暴露给模型。
- 姓名:张三
- 常旅客级别:金卡
- 偏好:靠过道
- 更喜欢高铁出行
- 倾向早班机
- 2026-09-09 更新
- 本次预算不超过 2000 美元
- 希望靠窗
- 2026-09-09 10:24
- 2026-08-12 上海 → 北京
- 2026-07-03 深圳 → 武汉
- 2026-06-18 北京 → 杭州
3.2 实时记忆蒸馏
让模型通过专用工具保存记忆。工具说明本身,就是捕获质量的关键。
保存记忆笔记
- 用户明确表达
- 可用于日后
- 抽象字段
3.3 修剪会话
只保留最近 N 个用户轮次。修剪后设置标志,下一轮重新注入必要的会话记忆。
更早的对话轮次超出上下文窗口
上下文窗口 (保留最近 3 个轮次)
后续对话新一轮
3.4 记忆注入与优先级规则
记忆默认为参考,不能覆盖用户当下的业务意图。影响重大且无法判断时,聚焦澄清。
这是本次会话的临时偏好,不会自动更新全局记忆。
3.5 渲染状态
将结构化数据与精选记忆渲染为清晰的文本格式,便于模型使用。
结构化档案 → YAML frontmatter
seat_preference: aisle meal: vegetarian
记忆笔记 → Markdown 列表
- 确定性渲染
- 精选相关条目
- 保留时间信息
3.6 用 Hooks 编排自动化
事件触发,在需要时注入会话记忆,避免重复注入。
3.7 组装智能体
每次运行根据最新状态生成提示词。记忆内容以清晰分隔块包装,作为数据使用。
3.8 会话后记忆整合
对会话产生的候选记忆进行清洗、合并和更新,形成更稳定的长期记忆。
4. 记忆评估
记忆系统是一条提取、整合与注入的流水线。评估应覆盖端到端,并关注时间的变化:过去的记忆只应在相关时帮助当前任务。
“我通常总是想要靠过道的座位。”
“这次出差我想要靠窗。”
“下次还是帮我订靠过道吧。”
评估维度与关注点
蒸馏 · 捕获质量
- 精确率
- 召回率
- 敏感写入拦截
注入 · 使用质量
- 时效正确性
- 是否影响当前意图
- Token 效率
整合 · 更新质量
- 去重质量
- 冲突解决
- 是否引入新事实
让测试覆盖真实失败方式
5. 记忆护栏
记忆会进入模型上下文。错误或恶意内容一旦被反复使用,就可能持续影响后续判断。
系统规则与记忆的边界
用户记忆不会成为系统规则,也不会替代模型的原始指令。
5.1 蒸馏检查
限制可写字段,拦截敏感内容与指令伪装。
5.2 整合检查
不添加源记忆中不存在的事实,按明确规则处理冲突、重复与失效。
5.3 注入检查
筛选相关、有效的记忆,使用清晰的数据边界。分隔符有帮助,但不能单独保证安全。
6. 结论与下一步
记忆能解锁强大的个性化能力,但高度依赖用例。并非每个智能体在第一天就需要长期记忆。最好的记忆系统是"精准"的:针对特定工作流或用例,为不同类型的信息选择恰当的表示方式(结构化字段 vs 笔记),并明确智能体"能记住什么、不能记住什么"。
持续迭代,基于真实结果改进
随着系统成熟,微调可以进一步提升记忆质量:更准确地判断什么才算"持久性"信息、更可靠地整合(避免幻觉与越界)、以及在冲突记忆存在时更聪明地判断何时该提出澄清问题。
总结:记忆系统通过可量化地迭代变好,而非通过前置的复杂性。从简单开始,严格评估,审慎演化。
7. 案例演示:差旅助手智能体
把档案、会话记忆、长期记忆和整合任务串进一次完整的差旅服务。以下为教学用虚构案例。
7.1 完整差旅服务的六个阶段
从一次用户请求开始,经历记忆的捕获、使用、修剪与整合,形成跨会话的持续体验。
会话开始前
读取已有的状态对象,了解用户的默认偏好。
- profile:素食
- 全局:通常靠过道
新会话开始
档案与精选的全局记忆被注入,构成本轮上下文。
→ 本轮上下文
会话进行中
从用户表达中提取记忆候选,并暂存到会话区。
帮我安排下周出差。
这次想靠窗休息;
以后短途优先高铁。
上下文被修剪
当对话变长时,修剪旧消息,并重新注入必要的会话记忆。
会话结束
对暂存的记忆进行筛选、整合,决定哪些写入长期记忆。
异步整合
短途优先高铁整合为长期记忆本次靠窗:不晋升仅本次会话下一次运行
使用更新后的状态对象,提供更贴合的服务。
- 通常靠过道
- 短途优先高铁
7.2 同一句话,分成两种不同寿命的记忆
同一个用户表达中,既有只在本次生效的临时偏好,也有适合沉淀为长期记忆的稳定偏好。
| 用户表达 | 本次会话 | 下一次会话 |
|---|---|---|
| 这次想靠窗休息 | 覆盖座位默认值 | 不沿用本次例外 |
| 以后短途优先高铁 | 写入候选并确认适用范围 | 整合后作为长期默认 |
| 原有:通常靠过道 | 被本次覆盖,仍保留 | 仍是适用行程的默认值 |
7.3 把案例映射回设计步骤
这个案例覆盖了课程中的核心设计环节,展示各步骤如何在一次完整的任务中协同工作。
| 状态对象与作用域 | 案例中的阶段 |
|---|---|
| 状态对象与作用域 | 会话开始前 |
| 注入、渲染与 Hooks | 新会话与修剪之后 |
| 蒸馏与整合 | 对话进行中与会话结束 |
长期记忆提供默认理解,会话记忆承接当前变化。两者通过清晰的捕获、暂存与整合流程协作,既能保持本轮连贯,也能跨会话持续理解用户。