Agent 记忆.
全书目录
Agent 记忆04 / 在线阅读
本章目录
  1. 6. 检索与上下文协议
  2. 7. 一致性、故障与遗忘
  3. 8. 最小接口

第四章 检索、一致性与遗忘

6. 检索与上下文协议

6.1 可信输入

请求包含当前任务、项目、可选历史问题和 token 预算。租户、用户、成员关系和可访问命名空间从认证会话及服务端策略得到,不从模型生成的参数中直接接受。

namespace 是数据组织方式;授权必须在服务端完成,且不能只依赖提示词要求 Agent “不要越界”。[S3][S5]

6.2 检索顺序

  1. 构造允许的用户、项目、组织范围。
  2. 在允许范围内检索精确键、全文候选,以及可选语义候选。
  3. 通过权威 head 或当前 Git 投影解析记录,检查版本、撤销状态、有效期与作用条件。
  4. 对过期、冲突、缺证据或过度概括的记录降级、剔除或显式标为历史线索。
  5. 合并同源重复项,按任务相关性和证据质量排序,再按预算组装。
  6. 记录实际注入的 ID、版本、权威 revision 和检索结果原因。

存储后端不能实现授权预过滤时,使用隔离的索引/集合,或先确定允许 ID 后再检索。不能先在全租户空间召回,再把越权候选传给 LLM 排序。

排序优先考虑适用范围与事实键,其次是证据、相关性和时间。不要直接照搬厂商文章的相似度阈值、向量维度或分数加权;这些值依赖数据和 embedding 模型。[S4]

6.3 本次指令、事实与历史偏好

当前用户对本任务的明确要求可以覆盖历史默认偏好。经授权的组织政策和系统约束按应用已有优先级执行。对于事实,“用户现在这么说”是新的证据;它不自动推翻可靠的外部事实或其他主体的记录。

程序性资产通过受控 registry、版本和权限加载。普通检索结果只是带来源的历史材料,不进入高优先级系统指令区。

6.4 记忆包与拒绝采用

示例返回格式:

{
  "snapshot_revision": "rev_demo_42",
  "items": [
    {
      "memory_id": "mem_project_stream_guide",
      "version": 3,
      "type": "procedural",
      "status": "validated",
      "content": "Check deployed version and source evidence before assigning a cause.",
      "applicability": "Responses streaming diagnosis in project_demo",
      "source_refs": ["evidence/demo/reproduction.md"],
      "authority_revision": "commit_demo"
    }
  ],
  "warnings": [],
  "truncated_by_budget": false
}

组装器应允许返回空集。检索到相似案例但环境不适用时,记录 not_applicable;相互冲突且无法判断时,返回带来源的冲突说明,要求核实。不可为了填满 top-k 强行选用记忆。

初始实验可设置候选上限 20 条、注入上限 5 条、预算 1,500 tokens。它们仅是便于测量的起点,不能作为通用最佳值。

7. 一致性、故障与遗忘

7.1 一致性保证

场景建议保证
当前任务刚收到用户修正当前任务立即使用修正;与长期记忆提交结果分开报告
数据库权威记录提交后按 ID 读取强一致或携带 commit token 定向到权威存储
向量/全文索引更新最终一致;携带投影 revision,读取时重新校验权威状态
Git 规范更新合并并发布到指定 revision 后生效;运行时按 revision 刷新
删除或撤销接受后查询屏障立即阻断新的组装,派生清理可异步完成

需要 read-your-writes 时,客户端带 min_revision,检索可等待有界时间或直接补读权威记录。不能为了及时性返回未经确认的候选。

如果权威状态或撤销屏障不可访问,相关记忆不进入新上下文。普通任务可以在没有历史记忆的情况下继续。索引故障可回退到授权范围内的精确/全文读取,但不得扩大范围。

7.2 过期、修订与删除是不同操作

过期表示暂不作为当前依据;修订保留有权限的历史版本;删除依据保留策略清除可恢复内容。三者应有不同 API 结果和审计状态。

删除流程:

  1. 根据用户授权确定目标是单条记忆、原始事件、会话,还是某主体的全部数据。
  2. 事务性写入撤销屏障并递增 deletion_epoch,阻止旧任务再写入。
  3. 撤销待处理候选,清除正文、摘要、向量、全文索引、缓存、关系及派生副本。
  4. 对仍可保留的源事件添加“不再由该证据重建被删除记忆”的最小限制标识;如果请求覆盖原始数据,则一并清除。
  5. 枚举依赖该来源的能力资产和评测样本,失效或重新评审;有其他独立合法来源的记录可重新计算,而非机械全部删除。
  6. 检查备份恢复流程会重新应用撤销记录,避免旧快照复活已删除内容。

查询屏障只能阻断新的上下文构造,不能撤回已发给模型或外部系统的内容;需要停止在途任务时,调用单独的取消流程并记录结果。

Git 分支中,普通提交删除只移除当前版本,不会清除历史。敏感私有数据不应进入 Git;若已进入且要求彻底清除,需要独立的历史、镜像和备份处理,不能声称一次删除提交就完成物理遗忘。任何未完成或受外部保留限制的副本应在删除结果中明确列出。

删除请求以 (tenant_id, deletion_request_id) 幂等,重复调用返回同一作业及最新状态。各清理步骤保存检查点,重复执行删除不存在的对象视为成功,不能重复递增同一次请求的 epoch。作业状态为 accepted → running → completed;暂时失败进入 retry_wait,保留限制进入 blocked_by_retention,不可自动恢复的失败进入 failed_requires_action。后两者不得报告完整删除成功;限制解除或修复后可从检查点继续。只有所有在范围内的副本已清除或按约定完成不可恢复处理,才进入 completed,并返回逐层结果与完成证据。

7.3 保留期限建议

期限应由业务目的决定。MVP 可以把未确认候选、短期排障材料和稳定知识设为不同类别:候选短期复核,事件按隐私与排障需求保留,稳定知识定期验证。不要把“永久”设为所有类型默认值,也不要根据被检索次数自动无限续期。

8. 最小接口

以下为应用自有协议示例,不是现有厂商 API:

操作语义
POST /memory-events接收幂等来源事件,返回处理状态
POST /memory-candidates提交候选,不等于正式知识写入
POST /memory-query根据可信身份与当前任务返回记忆包
GET /memories/{id}读取有权限的当前版本与必要来源
PATCH /memories/{id}携带 expected_version 的纠正或修订
POST /memories/{id}/promotions将候选方法提交到 Git/能力资产的评审入口
DELETE /memories/{id}创建撤销屏障和异步删除作业,返回作业 ID
GET /memory-deletions/{job_id}返回各层清理状态、剩余副本与完成时间

权限失败不能暴露其他租户记录是否存在。后台作业使用服务身份和明确 scope,不能从不可信内容获得更多权限。接口返回值区分“已接收”“已提交”“已索引”“已完全清除”。