#大模型#AI Agent#RAG

Agent 记忆压缩与整合:摘要血缘、可逆合并与损失门禁

记忆不断增长后不能靠覆盖旧摘要来省 token。本文设计固定输入快照、派生血缘、关键事实保真测试、失效传播和可逆切换。

本文要点

  • 主题聚焦:大模型、AI Agent、RAG
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年7月11日·更新于 2026年7月20日

长期协作会积累数千条事件,把全部原文塞进 Prompt 会挤掉当前任务;每隔几天让模型“总结一下并覆盖旧摘要”又会逐轮丢失否定词、数字和未完成约束。上下文工程 讨论窗口取舍,本篇只处理持久化记忆整合:摘要是可失效的派生索引,不是新的原始事实。

每次整合都绑定不可变输入快照

worker 一次读取高水位 H、当前 inputEpoch 和别名 expected tuple (parentArtifactId, sourceEpoch, coversThrough),选择 sequence <= H 的有效条目。普通尾部追加只推进 H;撤销、替代、新增冲突或信任变化才推进 inputEpoch。manifest 记录两组 fence、输入 ID 与 hash、选择规则、Prompt 和模型版本;生成完成不等于可读。

json
{
  "artifactId": "summary:user-7:000184",
  "newCoversThrough": 184,
  "inputEpoch": 27,
  "expectedAlias": {
    "parentArtifactId": "summary:user-7:000090",
    "sourceEpoch": 26,
    "coversThrough": 90
  },
  "inputIds": ["m-91", "m-103", "m-180"],
  "inputRoot": "sha256:9f5c8a7d2e3b14c6a0d981f7e4b52c368a1d0f9e7c6b4a32518d7e0c9b6a4f21",
  "selectorVersion": "v3",
  "promptVersion": "consolidate-v5",
  "modelSnapshot": "approved-model-2026-06"
}

哈希输入采用 RFC 8785 的 JSON Canonicalization Scheme 或等价固定字节协议,不能直接依赖对象字段顺序。生成结果同时输出结构化事实、未决事项、冲突引用和自然语言摘要;每个 claim 必须列出 derivedFrom,形成 W3C PROV 风格的派生图。RAG 引用溯源 的 claim-to-evidence 思路可复用,但证据是内部记忆版本。

保真门禁先检查不可损失字段

模型写得流畅不代表压缩正确。整合前把活跃约束、否定事实、精确数字、日期、实体 ID、权限范围和未解决冲突抽成 must-preserve 集合。输出经确定性解析后逐项检查;缺失、极性反转、单位变化或把冲突写成确定事实均拒绝发布。

ts
for (const fact of mustPreserve) {
  const hit = output.claims.find(c => c.key === fact.key);
  assert(hit, `missing:${fact.id}`);
  assert(canonicalValue(hit.value) === canonicalValue(fact.value));
  assert(hit.polarity === fact.polarity);
  assert(hit.derivedFrom.includes(fact.id));
}
assert(output.unresolvedConflicts.sort().join() === expectedConflicts.sort().join());

开放式事件可以用人工或模型裁判评估覆盖,但它不能替代上述精确不变量。摘要超过 token 预算时,优先把低价值事件留在冷检索层,而不是截断 JSON 或删除未决事项。编程 Agent 上下文预算 的分桶原则同样适用。

原始层、派生层和读取别名分开

摘要先写到新 artifact ID。切换事务锁定 source clock 与别名,重读每个输入版本,确认仍有效、hash 未变、没有新增冲突且 clock 仍等于 $inputEpoch,然后对 expected alias 执行三元 CAS:

sql
UPDATE memory_summary_alias
SET artifact_id = $artifact, source_epoch = $inputEpoch,
    covers_through = $newCoversThrough
WHERE subject_id = $subject
  AND artifact_id = $parentArtifactId
  AND source_epoch = $expectedSourceEpoch
  AND covers_through = $expectedCoversThrough
  AND $newCoversThrough >= covers_through;

source clock 条件可由同事务 SELECT ... FOR UPDATE 或 UPDATE 子查询保证。受影响行数不是 1 就重建;parentArtifactId + sourceEpoch + coversThrough 必须同时匹配,coverage 单调不减。检索要求 alias epoch 等于 clock;变更后摘要未重建时回退原始检索。artifact 必须带血缘,不能作为无来源新事实写回。

来源被撤销、时态版本被替代或 taint 策略升级时,沿 derivedFrom 标记所有后代 STALE,立即从可召回集合移除,再按仍有效输入重建。旧摘要可留作审计但不能参与回答。时态冲突处理 决定哪些版本有效,整合器无权自行裁决。

用变形测试证明压缩没有悄悄变义

固定样本覆盖双重否定、相近数字、单位换算、同名实体、跨项目偏好、撤销来源和互相冲突的决策。把无关事件随机插入、输入批次重新分组、worker 重试两次,must-preserve 结果和冲突集合应不变。竞态测试让 H=220 的新任务先完成切换,再让同父摘要的 H=184 旧任务完成,断言旧任务 CAS 失败且 coverage 不回退;另在候选通过门禁后、切换前撤销一个输入,断言 epoch 变化或有效性复核阻断切换。再注入生成超时、输出缺字段、写 artifact 后切别名前崩溃,半成品都不得被检索。

每天从原始层重建样本摘要,比较关键事实召回率、错误新增事实率、冲突保留率、平均 token 降幅和 stale artifact 可见数。错误新增事实率 > 0 或 stale 可见数非零属于阻断,不用平均相似度掩盖。

发布先影子生成,人工复核后按租户切别名。故障时旁路摘要、改查原始层,不能把 coverage 倒退;再用上一 selector/model 从当前有效输入构建 coverage 不低于现值的新 artifact,按同一 CAS 前向恢复。原始事件、manifest 与失败产物不删除,也不能在错误摘要上再次总结。

延伸阅读

Related

相关推荐