|Agentic AI Group
智能体工程课程
2026 版
高阶8 学时更新:2026-07-26

09|AI Agent Memory

构建可写入、可检索、可冲突处理、可遗忘且尊重隐私的智能体记忆系统。

前置知识
  • 理解会话状态、向量检索和权限控制
  • 完成 RAG 与 Tool 章节
学习成果
  • 能区分工作、语义、情景和程序记忆
  • 能设计记忆写入、检索、更新、冲突与遗忘策略
  • 能评估记忆命中率、帮助度、污染率和隐私风险
Agent Memory 类型与生命周期
图 9-1:记忆不是无限保存聊天记录,而是有选择地写入、检索、更新和遗忘。

1. 记忆类型

1.1 工作记忆(短期)

保存当前线程的消息、任务状态、文件和中间结果。通常通过 Checkpoint 持久化,任务结束后可压缩或清理。

1.2 语义记忆

保存稳定事实,例如用户偏好的输出格式、组织术语和项目规则。事实需带来源、时间、置信度和作用域。

1.3 情景记忆

保存“发生过什么”:任务、采取的动作、结果和反馈。它适合经验检索,但不能把一次偶然成功直接当成通用规则。

1.4 程序记忆

保存“如何做”:操作步骤、Skill、Prompt 或策略。程序记忆应像代码一样版本化、测试和审核。

记忆典型作用域更新频率示例
工作单线程高频当前任务清单
语义用户/组织中低频用户偏好表格输出
情景用户/任务类型中频上次工单失败原因
程序团队/系统低频发票审核流程 v3

2. 写入与检索策略

2.1 不是所有信息都值得记住

写入前判断:

  • 与未来任务是否相关;
  • 是否稳定,还是一次性状态;
  • 是否得到用户授权;
  • 是否包含敏感信息;
  • 是否可从权威数据源重新获取;
  • 是否可能与已有记忆冲突。

2.2 记忆记录 Schema

from dataclasses import dataclass
from datetime import datetime

@dataclass
class Memory:
    key: str
    value: str
    namespace: tuple[str, ...]
    kind: str
    source: str
    confidence: float
    created_at: datetime
    expires_at: datetime | None = None

Namespace 可按组织、用户、项目和记忆类型分层。LangGraph 的长期记忆也采用 Namespace 与 Key 组织 JSON 文档。

2.3 检索评分

可综合语义相关度、时间新鲜度、置信度和任务价值:

score = 0.50 × relevance + 0.20 × freshness + 0.20 × confidence + 0.10 × utility

权重应通过实际任务评估,而不是固定照搬。

2.4 热路径与后台写入

  • 热路径:Agent 回答前立即写入,实时但增加延迟;
  • 后台写入:任务完成后抽取记忆,延迟低但可能错过即时使用;
  • 高风险事实:由规则或人工确认后写入。

3. 压缩、冲突与遗忘

3.1 对话压缩

长对话可保留:用户目标、已确认事实、未完成任务、关键工具结果和约束。闲聊和重复内容可删除。摘要必须保留来源消息 ID,必要时回溯原文。

3.2 冲突处理

当新记忆与旧记忆冲突时:

  1. 不直接覆盖;
  2. 比较来源权威性、时间和置信度;
  3. 标记冲突;
  4. 必要时向用户确认;
  5. 保留历史版本和变更原因。

3.3 遗忘策略

  • TTL 到期;
  • 用户主动删除;
  • 来源失效;
  • 长期未使用且低价值;
  • 新事实明确取代旧事实;
  • 法规或组织策略要求删除。

3.4 本地记忆实现

完整文件:examples/09_memory.py

from dataclasses import dataclass, field
from time import time

@dataclass
class Item:
    key: str
    value: str
    tags: set[str] = field(default_factory=set)
    confidence: float = 1.0
    created_at: float = field(default_factory=time)
    expires_at: float | None = None

class MemoryStore:
    def __init__(self):
        self.items: dict[str, Item] = {}

    def put(self, item: Item) -> None:
        if item.confidence < 0 or item.confidence > 1:
            raise ValueError("confidence 必须在 0~1")
        self.items[item.key] = item

    def search(self, query_tags: set[str]) -> list[Item]:
        now = time()
        valid = [x for x in self.items.values()
                 if x.expires_at is None or x.expires_at > now]
        return sorted(
            valid,
            key=lambda x: (len(x.tags & query_tags), x.confidence, x.created_at),
            reverse=True,
        )

    def forget(self, key: str) -> bool:
        return self.items.pop(key, None) is not None

4. 隐私、安全与评估

4.1 隐私原则

  • 明示哪些内容会被长期保存;
  • 默认不保存密码、Token、身份证、医疗诊断等敏感内容;
  • 用户可查看、更正和删除个人记忆;
  • 不同用户、组织和项目严格隔离;
  • 记忆进入 Prompt 前再次做权限检查;
  • 日志只记录记忆 ID,不复制完整敏感内容。

4.2 评估指标

指标含义
Memory Precision检索出的记忆中真正有帮助的比例
Memory Recall应使用的记忆是否被找到
Helpfulness Lift使用记忆后任务成功率提升
Pollution Rate错误或无关记忆影响回答的比例
Conflict Resolution冲突记忆被正确处理的比例
Deletion Compliance删除请求是否在所有存储中生效

5. 应用案例:个性化学习教练

5.1 可记忆内容

  • 学习目标和截止日期;
  • 已完成章节;
  • 经多次验证的薄弱知识点;
  • 用户明确偏好的讲解方式;
  • 测验结果和改进趋势。

5.2 不应自动记忆

  • 一次性情绪表达;
  • 未经确认的个人属性;
  • 密码、密钥和身份号码;
  • 模型推测的健康、政治或敏感身份信息;
  • 可随时从课程系统获取的临时状态。

5.3 实验

构造 20 轮学习对话,比较“无记忆、全历史、选择性记忆”三种方案的正确率、Token、延迟和污染率。要求至少制造一个旧偏好与新偏好冲突的案例。

5.4 工程复现:可删除的用户记忆

cd repository/enterprise-agent-lab
python -m unittest discover -s tests -v
python -m app.cli --question "设备 P-100 的处理依据是什么?" --user employee-001

阅读 app/memory.pyapp/agent.py 的写入位置。新增记忆测试时使用临时目录,覆盖 namespace 隔离、TTL 过期、旧值/新值冲突和删除;不要用真实身份或敏感偏好。对“无记忆、完整历史、选择性记忆”运行同一 20 轮数据集,测正确率、Token、延迟和污染率。

生产部署需要事务存储、租户级密钥、访问/删除 API、备份删除传播和保留期任务;项目 DEPLOY.md 只是服务基线。验收必须证明用户 A 读不到用户 B、删除后主存储/索引/缓存均不可检索、过期记忆不进入 Prompt,并提交数据保留表。

6. 可靠参考资料