LLMNotes

第 16 章:记忆管理

zjc 于 2026-01-16 发布

这是《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 摘要记忆

摘要适合保留:

  1. 用户目标;
  2. 已确认条件;
  3. 关键实体;
  4. 已完成步骤;
  5. 待办事项;
  6. 用户偏好;
  7. 未解决问题。

应丢弃:

  1. 寒暄;
  2. 重复内容;
  3. 过期状态;
  4. 敏感细节;
  5. 工具原始大结果。

摘要结构:

{
  "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"
}

写入来源:

  1. 用户显式设置;
  2. 多次行为统计;
  3. 模型抽取;
  4. 业务系统同步。

显式设置可靠性最高,模型抽取必须去重、纠错并允许用户管理。

16.5 记忆检索

当前问题
  |-- 用户显式配置
  |-- 结构化档案
  |-- 相关长期记忆 top K
  +-- 最近会话摘要
     -> conflict resolution
        -> memory context

检索要求:

  1. 只取与当前任务相关记忆;
  2. 按 tenant/user 隔离;
  3. 尊重过期和状态;
  4. 控制数量;
  5. 冲突时优先最新和权威来源;
  6. 记忆只作为参考,不覆盖业务事实。

16.6 冲突处理

冲突 策略
用户说现在不吃辣,档案偏好辣 当前明确表述优先
数据库价格与记忆不一致 数据库优先
新旧文档冲突 生效时间和版本优先
两个长期记忆冲突 时间、来源、频次综合
用户要求违反安全策略 策略优先

可以在上下文中说明:

用户历史偏好:偏好简洁回答。
当前请求:要求详细展开。以当前请求为准。

16.7 隐私与合规

必须回答:

  1. 记忆保存什么;
  2. 为什么保存;
  3. 保存多久;
  4. 谁能访问;
  5. 用户如何查看、修改、删除;
  6. 是否跨设备同步;
  7. 是否用于训练;
  8. 如何导出。

工程要求:

  1. 加密存储;
  2. 访问审计;
  3. 数据分类分级;
  4. 未成年人等特殊数据单独策略;
  5. 删除请求同步删除索引和备份;
  6. 生产记忆与测试环境隔离。

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 任务记忆要支持检查点恢复。记忆的价值在于提升连续性,而不是无限保存历史。

思考题

  1. 会话摘要应该保留哪些信息?
  2. 模型抽取的长期记忆为什么要校验?
  3. 数据库事实和用户记忆冲突时如何处理?
  4. 记忆删除需要处理哪些存储位置?
  5. Agent 任务记忆为什么需要检查点?