这是《LLM 应用开发 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 记忆让应用能利用历史信息,但也会带来成本、隐私、权限污染和上下文失效问题。记忆管理的关键不是保存更多,而是在正确时机取出最小可用信息。
16.1 记忆类型
| 类型 | 生命周期 | 示例 |
|---|---|---|
| 工作记忆 | 当前请求 | 系统指令、当前问题 |
| 会话记忆 | 当前会话 | 最近对话、用户澄清 |
| 任务记忆 | 一个任务 | Agent 状态和工具结果 |
| 用户偏好 | 长期 | 语言、称呼、常用设置 |
| 业务档案 | 长期 | 会员等级、服务套餐 |
| 组织知识 | 长期 | 文档、规范、FAQ |
16.2 短期记忆
简单做法是带全部历史,但会很快膨胀。
system
last N turns
summarized old turns
current user message
窗口策略:
def build_messages(history, current, max_turns=10):
recent = history[-max_turns:]
old = history[:-max_turns]
summary = summarize(old) if old else ""
messages = []
if summary:
messages.append({"role": "system", "content": f"历史摘要:{summary}"})
messages.extend(recent)
messages.append({"role": "user", "content": current})
return messages
16.3 摘要记忆
摘要适合保留:
- 用户目标;
- 已确认条件;
- 关键实体;
- 已完成步骤;
- 待办事项;
- 用户偏好;
- 未解决问题。
应丢弃:
- 寒暄;
- 重复内容;
- 过期状态;
- 敏感细节;
- 工具原始大结果。
摘要结构:
{
"goal": "处理订单退款",
"confirmed": {"order_id": "A-10001", "reason": "商品破损"},
"pending": ["等待用户上传照片"],
"constraints": ["食品不支持无理由退款"]
}
16.4 长期记忆
存储模型:
{
"user_id": "u-1001",
"memory_type": "preference",
"key": "language",
"value": "中文",
"source_session": "s-88",
"confidence": 0.95,
"created_at": "2026-08-25",
"expires_at": null,
"status": "active"
}
写入来源:
- 用户显式设置;
- 多次行为统计;
- 模型抽取;
- 业务系统同步。
显式设置可靠性最高,模型抽取必须去重、纠错并允许用户管理。
16.5 记忆检索
当前问题
|-- 用户显式配置
|-- 结构化档案
|-- 相关长期记忆 top K
+-- 最近会话摘要
-> conflict resolution
-> memory context
检索要求:
- 只取与当前任务相关记忆;
- 按 tenant/user 隔离;
- 尊重过期和状态;
- 控制数量;
- 冲突时优先最新和权威来源;
- 记忆只作为参考,不覆盖业务事实。
16.6 冲突处理
| 冲突 | 策略 |
|---|---|
| 用户说现在不吃辣,档案偏好辣 | 当前明确表述优先 |
| 数据库价格与记忆不一致 | 数据库优先 |
| 新旧文档冲突 | 生效时间和版本优先 |
| 两个长期记忆冲突 | 时间、来源、频次综合 |
| 用户要求违反安全策略 | 策略优先 |
可以在上下文中说明:
用户历史偏好:偏好简洁回答。
当前请求:要求详细展开。以当前请求为准。
16.7 隐私与合规
必须回答:
- 记忆保存什么;
- 为什么保存;
- 保存多久;
- 谁能访问;
- 用户如何查看、修改、删除;
- 是否跨设备同步;
- 是否用于训练;
- 如何导出。
工程要求:
- 加密存储;
- 访问审计;
- 数据分类分级;
- 未成年人等特殊数据单独策略;
- 删除请求同步删除索引和备份;
- 生产记忆与测试环境隔离。
16.8 Agent 任务记忆
Task Checkpoint
goal
plan
completed steps
failed steps
tool artifacts
decisions
budget usage
恢复示例:
def resume_task(task):
if task.last_checkpoint:
return run_agent_from(task, task.last_checkpoint)
return run_agent_from(task, task.initial_state)
工具产物可存对象存储,上下文只放引用和摘要,需要时再读取。
16.9 记忆评测
| 指标 | 说明 |
|---|---|
| Memory Hit Rate | 有效记忆使用率 |
| Irrelevant Memory Rate | 无关记忆注入率 |
| Conflict Resolution Accuracy | 冲突处理正确率 |
| Privacy Leakage | 泄露测试通过 |
| Token Overhead | 记忆成本 |
| Retention Accuracy | 长期事实准确率 |
测试集应包含多轮指代、偏好变化、过期事实、权限切换和删除请求。
16.10 常见问题
| 现象 | 处理 |
|---|---|
| 记不住上一轮 | 会话 ID 或窗口策略 |
| 答案混入旧状态 | 标记时间和刷新事实 |
| 用户 A 看到用户 B 记忆 | 修复隔离键 |
| 成本上升 | 压缩和限制记忆数 |
| 记忆错误 | 用户可管理并重算 |
| 删除后仍出现 | 检查索引、缓存、备份 |
本章小结
记忆管理要区分会话、任务、用户偏好和业务事实,分别设计生命周期、存储结构、检索方式和冲突规则。长期记忆必须受隐私和权限约束,Agent 任务记忆要支持检查点恢复。记忆的价值在于提升连续性,而不是无限保存历史。
思考题
- 会话摘要应该保留哪些信息?
- 模型抽取的长期记忆为什么要校验?
- 数据库事实和用户记忆冲突时如何处理?
- 记忆删除需要处理哪些存储位置?
- Agent 任务记忆为什么需要检查点?