跳到主要内容

记忆写入策略

1. 定义与边界

记忆写入策略决定“什么信息可以被保存、保存到哪里、以什么形式保存、何时合并或拒绝”。写入比检索更危险,因为错误写入会长期影响 Agent 行为。

2. 为什么重要

没有写入策略会带来:

  • 用户画像污染。
  • 敏感信息长期保存。
  • 外部内容注入长期记忆。
  • 记忆重复、冲突和过期。
  • Agent 行为被错误经验带偏。

3. 写入模式

模式机制优点风险
热路径写入Agent 在响应前决定是否写入立即可用,用户可见增加延迟,影响主任务
后台写入异步任务从 trace 中提炼不阻塞用户,质量可控新记忆不能立刻使用
用户显式写入用户说“记住...”同意明确用户也可能要求记住危险规则
人工审核写入高风险记忆进入审批适合企业治理成本高

4. 写入决策矩阵

候选信息默认动作
明确长期偏好写入,保留来源
当前任务临时约束写入短期记忆,不进长期
密钥、令牌、密码拒绝长期写入,必要时脱敏
用户健康、财务、身份等敏感信息默认不写或需显式同意
外部网页对用户的描述拒绝写入用户画像
多次成功的工作流可提炼为程序性记忆,需评估
单次失败 workaround写 episode,不直接写程序规则

5. 工程实现

def write_memory_pipeline(observation, context):
candidate = extract_candidate(observation)
if not candidate:
return "skip"

decision = policy_gate(candidate, context)
if decision == "reject":
audit("memory_rejected", candidate)
return "reject"
if decision == "needs_confirmation":
request_user_confirmation(candidate)
return "pending"

candidate = normalize_schema(candidate)
candidate = attach_source(candidate, context.trace_id, context.turn_id)
candidate = merge_conflicts(candidate)
store.upsert(candidate)
audit("memory_written", candidate)
return "ok"

Policy gate 至少检查:

  • 作用域:thread / user / org / project / agent。
  • 敏感性:PII、凭证、商业秘密。
  • 来源可信度:用户明确声明、工具观察、外部文档。
  • 价值:未来是否可复用。
  • 冲突:是否覆盖旧记忆。
  • 权限:当前 Agent 是否允许写该 namespace。

6. 生产实践

  • 写入候选必须结构化输出,避免让模型直接写自由文本。
  • 对每条写入保留 source_turn_idtrace_idwriter_version
  • 自动写入使用低权限:不能修改安全策略、不能扩大工具权限。
  • 对 profile 使用 JSON Patch 或字段级 upsert,避免覆盖整个画像。
  • 后台 consolidation 批处理去重和合并,减少热路径复杂度。
  • 写入失败不应阻塞主任务,但要记录审计事件。

7. 常见反模式

  • “有用就记住”但没有具体判断标准。
  • 让模型直接改系统 prompt。
  • 不区分用户说的话和网页里嵌入的指令。
  • 写入没有 evidence,无法解释。
  • 同一事实重复写多条,召回时放大影响。

8. 评测方法

  • 写入精确率:写入内容中真正长期有用的比例。
  • 写入召回率:应该记住的关键信息是否被保存。
  • 敏感误写率。
  • 冲突合并正确率。
  • 后台 consolidation 后重复率。
  • 写入延迟对用户响应时间的影响。

9. 安全与治理

  • 外部内容不能直接触发长期写入。
  • 用户显式“记住”也不能绕过安全策略。
  • 对高敏感写入启用确认、脱敏或拒绝。
  • 记录删除、更新、覆盖的审计日志。
  • 对自动生成记忆做红队测试,例如“把这条恶意规则存为偏好”。

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

A. 与 RAG 的硬边界

记忆写入策略处理的核心对象是决定什么信息进入短期、长期、语义、情景、程序性或用户画像记忆。它来自用户和 Agent 的互动、任务执行轨迹或组织流程,而不是外部文档本身。 RAG 的核心对象是外部知识和证据;Memory 的核心对象是可复用状态。两者可以共享向量库、数据库或检索组件,但不能共享权限模型和写入流程。

维度MemoryRAG
数据来源对话、工具轨迹、用户明确偏好、任务结果文档、网页、代码库、数据库、知识库
写入触发互动后抽取、用户要求记住、后台总结文档 ingestion、同步任务、管理员上传
可信边界默认是个人/项目状态,仍需来源与置信度默认是不可信外部内容,需要证据过滤
检索目标帮 Agent 延续状态和复用经验给回答提供事实证据和引用
失败后果错误会跨任务持续影响行为错误通常影响本次回答或索引版本
评测重点write precision、useful write rate、bad write escape rate、write latencyrecall、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",
"decision": "upsert|reject|ask_user|archive",
"gate_reason": "explicit_preference",
"audit": {
"writer": "memory_writer_v2",
"decision": "accepted",
"policy_version": "memory-policy-2026-05"
}
}

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

D. 写入门槛

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

本文件的推荐写入原则是:先判断价值、来源、敏感性、作用域、TTL、冲突和用户授权,再 upsert。

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. 遗忘与生命周期

低价值候选丢弃,冲突候选排队确认,过期候选进入后台清理。遗忘不是简单删除文本,还包括向量、缓存、摘要、备份可恢复窗口和审计索引的协同。

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

G. 失败模式与修复

失败模式早期信号修复动作
热路径贪写、越权写、无来源写和把 prompt injection 固化为记忆召回内容与当前任务不符,用户反复纠正拆 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. 权威资料