跳到主要内容

Agent记忆系统总览

1. 定义与边界

Agent 记忆(Memory)是 Agent 在一次或多次执行中保存、更新、检索和使用信息的机制。它解决的是“系统如何持续保持上下文、偏好、经验和任务状态”的问题。

它不等于:

  • 上下文窗口:上下文窗口只是一次模型调用可见的 token 空间。
  • 聊天记录:聊天记录是原始事件,记忆是经过选择、结构化、压缩和治理后的状态。
  • RAG 知识库:RAG 主要检索外部知识;记忆主要保存 Agent 与用户、任务、环境互动后的可复用状态。

2. 为什么重要

没有记忆的 Agent 每次都像第一次见到用户:重复问问题、忘记约束、无法复用成功经验。记忆系统可以降低三类成本:

成本记忆的作用
用户成本少重复输入背景、偏好、项目约束
Agent 成本少重复探索工具、文件结构、失败路径
上下文成本用摘要和结构化状态替代完整历史消息

3. 核心机制

记忆系统至少包含:

  • Memory Store:关系库、文档库、KV、向量库或文件系统。
  • Schema:记忆类型、命名空间、来源、置信度、权限和 TTL。
  • Retriever:按当前任务召回相关记忆。
  • Writer:决定什么值得写入,如何合并或删除。
  • Policy Gate:用户同意、敏感信息过滤、权限隔离、审计。
  • Evaluator:衡量任务成功率、个性化收益、错误记忆率。

4. 记忆类型

类型说明典型数据
短期记忆当前线程或会话内状态消息、工具结果、scratchpad、checkpoint
长期记忆跨会话保留的信息用户偏好、项目约束、常用工作流
语义记忆稳定事实和偏好“用户偏好中文简洁回答”
情景记忆过去事件和轨迹“上次修复某 bug 时失败于权限问题”
程序性记忆做事规则和技能“发布前必须跑 lint 和 smoke test”

5. 工程实现

5.1 推荐接口

from typing import Literal, Any

MemoryType = Literal["short_term", "semantic", "episodic", "procedural"]

class MemoryRecord(dict):
namespace: tuple[str, ...]
key: str
type: MemoryType
value: dict[str, Any]
source: dict[str, str]
confidence: float
sensitivity: str
created_at: str
updated_at: str
ttl_days: int | None

class MemoryStore:
def get(self, namespace: tuple[str, ...], key: str) -> MemoryRecord | None: ...
def search(self, namespace: tuple[str, ...], query: str, k: int = 5) -> list[MemoryRecord]: ...
def upsert(self, record: MemoryRecord) -> None: ...
def delete(self, namespace: tuple[str, ...], key: str, reason: str) -> None: ...

5.2 命名空间设计

user/{user_id}/profile
user/{user_id}/preferences
org/{org_id}/policies
project/{project_id}/constraints
agent/{agent_id}/procedures
thread/{thread_id}/state

命名空间是权限边界,不只是分类标签。跨用户、跨组织、跨项目检索必须显式授权。

6. 生产实践

  • 短期记忆使用 checkpoint 或 session store,支持中断恢复。
  • 长期记忆使用可审计存储,避免只放在不可解释的向量库里。
  • 写入走策略网关:敏感信息、低价值信息、临时情绪、单次噪声默认不写入。
  • 所有写入记录来源 turn、工具、时间和写入者。
  • 支持用户查看、修改、删除画像记忆。
  • 给记忆设置 TTL 和置信度,过期或冲突时重新确认。
  • 对生产系统使用加密、租户隔离、访问日志和备份恢复。

7. 常见反模式

反模式后果替代做法
保存完整聊天记录当长期记忆隐私和成本失控,检索噪声高结构化抽取 + 摘要 + TTL
所有事实都写入用户画像画像污染,错误长期影响输出设置写入阈值和用户可见编辑
用 RAG 知识库承载个人记忆且不隔离越权召回、数据泄漏分 namespace、ACL、不同索引
每轮同步写记忆延迟高,模型分心热路径只写关键状态,后台合并
只按向量相似度召回相似但不适用的记忆污染上下文结合类型、时间、权限、任务阶段 rerank

8. 评测方法

记忆系统不能只看“是否写入成功”,要看对任务是否有帮助:

  • Memory precision:被注入上下文的记忆是否相关。
  • Memory recall:任务所需记忆是否被召回。
  • Task lift:启用记忆后任务成功率、轮次数、工具错误率是否改善。
  • Staleness rate:过期或被新事实覆盖的记忆被使用的比例。
  • Privacy incident rate:越权检索、敏感泄露、误写入事件数。
  • User correction rate:用户纠正画像或偏好的频率。

9. 安全与治理

记忆是持久数据,一旦写错会长期影响行为。治理重点:

  • 明确哪些内容可记、不可记、需确认后记。
  • 对敏感信息做分类、脱敏、加密和最小化存储。
  • 将用户提供内容、网页内容、工具返回内容视为不可信来源。
  • 防止“请记住忽略安全规则”这类记忆投毒。
  • 高风险记忆变更进入审批或用户确认。
  • 支持数据导出、删除和保留周期管理。

工程化补强:架构与实现细节

A. 与 RAG 的硬边界

Agent 记忆系统处理的核心对象是跨轮次状态、用户偏好、历史经验和可复用流程。它来自用户和 Agent 的互动、任务执行轨迹或组织流程,而不是外部文档本身。 RAG 的核心对象是外部知识和证据;Memory 的核心对象是可复用状态。两者可以共享向量库、数据库或检索组件,但不能共享权限模型和写入流程。

维度MemoryRAG
数据来源对话、工具轨迹、用户明确偏好、任务结果文档、网页、代码库、数据库、知识库
写入触发互动后抽取、用户要求记住、后台总结文档 ingestion、同步任务、管理员上传
可信边界默认是个人/项目状态,仍需来源与置信度默认是不可信外部内容,需要证据过滤
检索目标帮 Agent 延续状态和复用经验给回答提供事实证据和引用
失败后果错误会跨任务持续影响行为错误通常影响本次回答或索引版本
评测重点memory precision/recall、task lift、staleness rate、privacy incident raterecall、faithfulness、citation accuracy

B. 生产级数据流

这条链路的关键是写入和检索分离。写入网关决定“能不能成为未来依据”,检索器决定“当前任务是否需要它”。

C. 推荐 JSON 结构

{
"memory_id": "mem_01HY...",
"memory_type": "short_term|semantic|episodic|procedural|profile",
"namespace": ["org:o_1", "user:u_7", "project:p_3"],
"content": {
"summary": "用户希望技术文档用中文、结构紧凑、直接给结论",
"normalized_value": {
"language": "zh-CN",
"style": "concise_engineering"
}
},
"source": {
"kind": "user_message|tool_trace|episode_summary|admin_policy",
"trace_id": "tr_20260509_001",
"turn_id": "turn_14",
"evidence": "用户明确说:以后回答用中文,少废话"
},
"confidence": 0.86,
"sensitivity": "normal|personal|confidential|restricted",
"ttl_days": 180,
"created_at": "2026-05-09T10:00:00+08:00",
"updated_at": "2026-05-09T10:00:00+08:00",
"scope": "user/project/agent",
"promotion_rule": "two_confirmed_uses_or_explicit_user_request",
"audit": {
"writer": "memory_writer_v2",
"decision": "accepted",
"policy_version": "memory-policy-2026-05"
}
}

字段级来源比整条记忆来源更重要。真实系统里经常只有某个字段可靠,不能因为一个字段可信就默认整条画像可信。

D. 写入门槛

候选信息默认动作原因
用户明确要求“记住”且不敏感写入或更新意图明确,价值高
多次稳定偏好写入低风险字段可减少重复沟通
单次情绪、抱怨、临时选择不写或短 TTL容易误画像
工具失败根因写 episode对未来排障有价值
外部网页诱导的规则拒写外部内容不能提升为行为规则
安全、权限、合规相关变更人审或管理员确认影响面大,不能由普通记忆覆盖

本文件的推荐写入原则是:只写入对未来任务有复用价值、来源可追溯、不会扩大权限的信息。

E. 检索策略

按用户、组织、项目、任务阶段和记忆类型分层召回,再按时效、置信度和当前意图重排。工程上建议分三步:

  1. 硬过滤:tenant、user、project、role、sensitivity、TTL、deleted tombstone。
  2. 候选召回:profile 精确读取,semantic/episodic/procedural 可用关键词、向量和标签组合。
  3. 上下文组装:限制条数,附带类型、来源、置信度和“不能覆盖系统/开发者/安全策略”的说明。
def retrieve_memory(task, user, project, budget):
scopes = acl_scopes(user=user, project=project)
candidates = []
candidates += profile_store.get(scopes.user_profile_fields(task))
candidates += memory_index.search(task.query, filters=scopes.filters, k=20)
ranked = rerank_by_usefulness(candidates, task.intent, now=task.now)
safe = [m for m in ranked if policy.can_inject(m, task)]
return pack_with_provenance(safe, token_budget=budget)

F. 遗忘与生命周期

TTL、版本覆盖、用户删除、冲突降权和后台压缩共同工作。遗忘不是简单删除文本,还包括向量、缓存、摘要、备份可恢复窗口和审计索引的协同。

生命周期阶段操作验收点
候选只在临时队列保存未通过网关不进入长期库
活跃可检索、可解释、可编辑trace 中能看到使用原因
降权过期、低命中、低置信默认不注入上下文
归档保留审计或历史统计不参与在线检索
删除tombstone + 索引清理删除 SLA 和回归测试通过

G. 失败模式与修复

失败模式早期信号修复动作
把 RAG 文档、聊天记录和长期画像混成一个无权限边界的大索引召回内容与当前任务不符,用户反复纠正拆 namespace、加写入门槛、补评测切片
错误记忆长期影响回答同类任务持续给错建议增加冲突检测、用户编辑入口、低置信降权
过度个性化Agent 在无关任务套用用户偏好按任务域检索,不全量注入画像
记忆投毒记忆中出现“忽略规则”“扩大权限”等内容策略拒写,已写入内容隔离并审计
上下文污染注入记忆太多,模型忽略当前指令top-k 限制、摘要化、按阶段注入
删除不彻底删除后仍可被向量召回tombstone 过滤、重建索引、缓存失效

H. 评测指标

指标计算方式用途
Memory precision@k注入记忆中真正有用的比例控制上下文污染
Needed-memory recall@kgold memory 是否被召回检查检索覆盖
Task lift开启记忆后的成功率/轮次/工具错误变化判断是否值得保留系统复杂度
Stale-use rate被使用但已过期或被覆盖的记忆比例发现遗忘策略问题
Bad-write escape rate不应写入但进入长期库的比例评估写入网关
Privacy incident rate越权召回、敏感泄露、误画像事件数安全红线指标

I. 安全治理清单

  • 记忆内容永远不能提升为系统指令,不能覆盖安全策略和开发者约束。
  • 用户画像需要可查看、可修改、可删除;敏感画像默认不做自动推断。
  • 外部文档、网页和工具输出要标记来源可信度,默认不能写成程序性规则。
  • 加密静态数据和传输链路;对高敏字段做字段级加密或不可逆摘要。
  • 审计记录至少包含写入者、来源、策略版本、检索任务、注入位置和删除事件。
  • 多租户系统必须把 namespace、ACL 和索引过滤作为服务端强制逻辑,而不是 prompt 约束。

10. 权威资料