Browse this library

Chinese source article

2.1 · 文档身份、版本与删除

设计稳定身份、版本快照和删除传播, 让索引可追踪并可撤回.

View original Markdown ↗

1. 身份先于内容表示

文档 ID 表示业务对象, 版本 ID 表示某次内容状态, 片段 ID 表示版本内的可定位单元. 三者不可用一个 embedding 向量 ID 代替. 同一文档更新后业务身份不变, 版本变化; 重新切分后片段集合变化, 旧引用仍需要解析到历史版本.

稳定身份可由源系统主键与命名空间组成. 没有主键时, 规范化 URL 或受控路径可以作为来源键. 内容哈希用于去重和变化检测, 但两份内容相同的授权文档仍可能是不同业务对象.

1.1. 位置与引用

来源位置应尽量记录结构路径和字符、页码或时间区间. 仅保存片段正文无法在源更新后解释旧引用. 位置映射还支持从小片段扩展父段落, 并让引用界面显示原文上下文.

引用目标采用文档 ID、版本 ID 与位置. 如果产品只展示当前版本, 仍应保留回答产生时的版本, 否则历史回答会随源更新而改变含义.

抓取时间说明系统何时看到内容, 发布时间说明来源何时发布, 有效时间说明规则何时适用. 三者不能互换. 历史问题按有效时间检索, 新鲜度监控比较源变化与索引可见时间.

版本是回答条件的一部分, 不是后台运维字段. 当两个版本都有效于不同地区或人群时, 还需要把适用范围纳入过滤条件.

2. 增量更新

2.1. 变化检测

连接器先比较来源键、版本标记或内容哈希, 再决定新增、更新或不变. 对大型文档可以在结构块级比较, 避免重算全部 embedding. 变化检测必须覆盖元数据, 因为权限或有效时间变化可能不改变正文.

增量流程生成新的完整候选快照, 验证后原子发布. 直接原地逐片段覆盖会短暂暴露新旧混合状态, 查询难以复现.

片段、摘要、关键词、embedding 和图边都是源版本的派生物. 每个派生物保存生成器版本和输入哈希. 当切分器或 embedding 模型改变时, 系统能够判断哪些对象需要重建.

派生摘要不能脱离源版本独立存在. 如果摘要进入检索, 其引用仍应回到原文位置, 并在源删除时一起失效.

3. 删除是一条传播链

3.1. 删除状态

删除可能来自源对象消失、授权撤回、合规请求或版本替换. 软删除先阻止查询访问并保留审计记录, 物理清理随后作用于索引和缓存. 查询路径必须优先遵守失效标记.

删除传播覆盖对象存储、解析结果、片段库、倒排索引、向量索引、缓存、派生摘要和离线样本. 只删主表会留下可检索副本.

删除测试从已知文档构造高命中查询, 删除后检查所有索引和缓存均不返回结果. 随后重启服务并再次检查, 排除只在内存中过滤的实现.

权限撤回采用相同测试, 并增加不同身份请求. 删除完成的判断标准是内容无法再经任何查询路径到达生成上下文.

4. 快照发布与回滚

4.1. 发布门槛

新快照发布前检查源对象数、解析成功率、片段分布、权限字段完整性、索引数量和抽样查询. 数量突变通常提示连接器或解析器问题. 抽样需要覆盖表格、代码、长文和多语言材料.

检查通过后切换逻辑别名, 新查询记录新快照 ID. 进行中的请求继续使用启动时绑定的版本, 避免一次回答跨越快照.

回滚恢复上一个可用快照, 同时恢复其稀疏、向量和元数据索引. 若权限或合规删除已经生效, 回滚不能重新暴露被撤回内容, 因而删除清单必须独立于普通内容版本执行.

快照、运行记录和删除清单共同构成可重放基础. 后续检索评测引用快照 ID, 才能区分模型变化与语料变化.

5. 治理模型与可验证执行

这一部分把前面的身份与生命周期规则落到权限计划、索引发布和传播实验. 共同目标是让每个派生对象都能回到源版本, 并让撤权与删除在所有读路径上得到验证.

一套可维护的治理方案既要描述正常更新, 也要规定权限服务失败、索引半成品和历史版本回滚时的行为. 下列机制采用公开标准与官方实现作为参照, 具体字段仍由系统的数据分类和保留政策决定.

3. 权限、版本与删除

3.1. 检索时执行授权

权限过滤必须作用在候选产生之前或候选读取时, 不能先取越权内容再让生成模型忽略. 若 ANN 引擎采用后过滤, 可见集合较小时可能返回少于 kk 个结果;解决办法是调整索引分区、过滤策略或探索参数, 不能临时放宽权限补足数量.

权限表达式也要版本化. 用户组变化、文档 ACL 变化和片段内容变化是不同事件. 缓存键必须包含调用者可见域或权限快照, 否则相同查询的缓存会跨用户复用. 日志与评测样本同样属于派生数据, 保留策略不能默认无限期保存越权正文.

3.2. 增删改不是同一种同步

新增文档需要解析、切分、embedding 和索引提交;修改需要识别受影响片段并撤下旧版本;删除要求各派生存储完成清除;权限变化只改 ACL 也可能需要重建过滤结构和缓存. 用一个「同步成功」状态覆盖四类事件, 线上很难知道哪些读路径已经生效.

可以给每次变更分配事件 ID, 各派生组件记录消费位点. 当稀疏索引、向量索引和缓存都越过该位点, 变更才算对读路径可见. 若系统采用最终一致, 应明确最大传播时间并在期间选择关闭结果或继续提供旧版本. 高风险文档删除通常采用失败关闭.

6. 从治理模型落到执行细节

Exit code: 0 Wall time: 0.2 seconds Output:

RAG 的第一条可靠性边界不在 embedding,而在"哪些内容以什么版本,权限和有效期进入索引".如果源文档错误,越权或已被撤回,检索再准确也只会更稳定地把问题送进生成模型.

6.1. 职责边界与对象模型

本页负责:

  • 语料准入,来源和许可记录;
  • 源对象,解析结果,片段与索引之间的血缘;
  • 文档级与片段级权限的同步和查询时执行;
  • 增量更新,软删除,硬删除,重建与回滚;
  • 语料质量和索引新鲜度的可复现检查.

本页不负责身份提供商如何认证用户,也不代替企业的数据分类,法务审批和保留策略.RAG 只消费这些上游决策,并必须证明没有在解析,切分和检索中丢掉它们.

2. 最小对象模型

不要只保存 text + embedding.一个可审计片段至少需要下面这些字段;字段名是工程模板,不是通用标准.

字段组 最低内容 用途
源身份 source_system, source_uri, source_object_id 找回权威原件
版本身份 source_version, content_hash, observed_at 区分同名对象的不同状态
有效时间 valid_from, valid_to, status 排除未来,过期,撤回或被取代内容
权限 tenant_id, principal/group/label, policy_version 查询时做安全裁剪
解析血缘 parser_name/version, parse_run_id, parent_id 定位 OCR,表格和版面错误
片段身份 chunk_id, span/page/section, chunker_version 引用原文并确定性重建
索引身份 index_name/version, embedding_model/version, indexed_at 复现检索结果
质量状态 quarantine_reason, review_status, language/type 隔离失败对象和选择处理器
数据处理 sensitivity/pii_class, processor/region, retention_policy 约束明文,派生数据和外部处理边界

W3C PROV-DM 把来源描述为实体,活动与责任主体之间的关系,可作为设计血缘字段的概念底座;它不会替你定义具体数据库 schema.W3C PROV-DM

2.1 稳定身份与内容身份分离

  • source_object_id 表示"逻辑上是哪份文档";
  • source_version 或对象存储的 version ID 表示"这份文档的哪一版";
  • content_hash 表示"本次实际处理的字节或规范化内容是什么";
  • chunk_id 应由源版本,解析器/切分器版本和位置共同导出,而不是只对片段文本哈希.

只按片段文本哈希会把不同租户或不同权限下的相同文字误当成一个对象;只按路径命名则无法区分覆盖写.AWS S3 Versioning 是一种官方实现示例:开启后,每次写入获得版本 ID,并可恢复覆盖或删除前的版本.它说明对象版本可由存储层提供,但并不要求 RAG 必须使用 S3.S3 Versioning 官方文档

推荐把索引写入看成带门禁的状态机:

  1. 发现:读取源对象身份,版本,修改时间和权限元数据.
  2. 准入:检查许可,数据分类,租户,地域,保留期和支持的媒体类型.
  3. 快照:固定本次处理的源版本与哈希;不要在长流水线中持续读取"最新文件".
  4. 解析:抽取正文,标题,表格,页码和结构;记录解析器版本及警告.
  5. 质量检查:空文档,乱码,重复页,OCR 低置信,错位表格进入隔离区.
  6. 切分:生成可回到原始位置的片段,并继承权限,有效期和来源.
  7. 索引:建立稀疏,稠密或结构化索引;产出不可变的索引构建清单.
  8. 验证:对样本做可逆定位,权限查询,删除传播和检索冒烟测试.
  9. 发布:用索引别名或版本指针切换;保留上一可用版本以便回滚.

任何阶段失败都不应把"半成功"的对象混入公开索引.隔离对象要有错误码,源版本和重试策略,而不是静默跳过.

3.1 隐私与派生数据不是索引后的附注

准入时应识别个人信息,秘密,受监管字段和数据主体删除要求,并决定每一类内容是允许原文索引,先脱敏再索引,只保留结构化字段,还是根本不进入检索.这个决定必须随片段继承,不能等生成后再做关键词遮盖.

embedding,稀疏/向量索引,缓存,评测集,请求 trace 和导出都是派生数据面.它们即使不含完整明文,也可能编码敏感属性,保留可链接标识或被成员/属性推断攻击,因此不能自动降为"非敏感".更正,撤回,保留期到期或数据主体删除还要传播到这些副本;日志中依法允许保留的最小审计记录应与可检索内容分开管理.

若使用外部 embedding,vectorizer,OCR,重排或生成服务,应登记处理提供方,地域,传输,保留,训练使用和删除能力.Azure AI Search FAQ 明确说明部分 vectorizer/skill 会把原始内容或查询发送到外部资源;这是一种实现警示,不是只针对 Azure 的规则.Azure AI Search FAQ

4. 权限必须进入检索计划

4.1 权限继承

源文档被切成多个片段后,每个片段都必须继承相同或更严格的访问边界.权限字段只挂在父文档,片段表却没有可执行关联,是常见泄漏点.Azure AI Search 的官方文档也特别指出:若使用切分索引,权限或敏感标签需要投影到每个 chunk 行,查询时再按调用者身份过滤.Azure 文档级访问控制

4.2 过滤时机

可选实现包括预过滤,检索过程内过滤和候选后过滤.三者不能只按速度选择:

策略 优点 主要风险
预过滤后精确搜索 授权集合明确;小集合可直接精确检索 过滤集合大时成本升高
ANN 内过滤 有机会兼顾候选数量与速度 行为依赖引擎,算法和参数
候选后过滤 实现简单 候选可能不足;更不能把未授权候选交给模型再"要求忽略"

pgvector 官方说明指出,近似索引与过滤组合时,过滤可能在索引扫描后执行,从而返回少于 kk 条;可通过提高扫描,迭代扫描,分区或部分索引等方式处理.OpenSearch 则文档化了在 HNSW/IVF 支持下的高效过滤路径.这说明过滤行为是实现相关的,不存在一个跨引擎通用结论.pgvector 官方文档;OpenSearch 向量过滤文档

4.3 失败关闭

  • 身份缺失,令牌无效,权限服务失败或权限快照未知时,不返回受保护内容;
  • 管理员调试读取必须是显式,短期,可审计的独立路径;
  • 缓存键必须包含租户,权限摘要,索引版本和策略版本;
  • 检索日志默认不复制敏感原文,只记录受控引用或经过策略处理的摘要.

6.3. 版本、更新与删除

5.1 不要原地覆盖"唯一索引"

一次发布应绑定:

corpus_snapshot
+ parser_version
+ chunker_version
+ embedding_model_version
+ sparse_analyzer_version
+ index_engine_and_parameters
+ permission_policy_version
= index_release_id

任何一项变化都可能改变候选.应建立新 release,完成回归与安全检查后再原子切换读别名;紧急回滚只切回上一 release,不在故障中临时重建.

5.2 增量更新不是自动一致

新增,修改,权限变化和删除是四类不同事件:

  • 新增:新对象进入流水线;
  • 修改:旧版本标为被取代,新版本重新解析与切分;
  • 权限变化:即使正文哈希未变,也要更新片段权限或重建相应分区;
  • 删除/撤回:先让旧片段不可检索,再按保留政策处理源和审计记录.

Azure 的索引器文档给出一个具体警示:源存储中的对象删除并不天然等于搜索索引删除,若没有从首次运行就配置删除检测,可能留下孤儿搜索文档.Azure 变更与删除检测

5.3 新旧事实冲突

不要在片段级用"后写覆盖"抹掉历史:

  1. 标记版本与有效区间;
  2. 查询默认只在当前有效版本中检索;
  3. 历史查询必须显式带时间范围;
  4. 如果多个权威源冲突,保留来源和冲突状态,交给生成层呈现差异或拒答;
  5. 法定删除与审计保留冲突时,按组织政策处理,不自行发明例外.

切分器无法修复解析错误.最低检查包括:

  • 标题层级,页码和段落顺序是否可逆定位;
  • 表格表头与单元格是否仍关联,脚注是否错误并入正文;
  • OCR 是否把数字,单位,负号,公式或代码符号识错;
  • 扫描件是否有重复页,旋转页和空白页;
  • 同一源版本是否重复摄取;
  • 文本中是否混入导航栏,cookie 横幅,隐藏提示或用户评论;
  • 语言,编码和规范化是否改变专有名词或标识符.

对高风险资料,抽样应按来源类型和解析器分层,而不是随机看几条"正常文本".

  1. 确认权威源:谁能发布,更正和撤回?抓取副本是否有合法用途?
  2. 确认身份与版本能力:源是否提供版本 ID,修改事件,删除事件和 ACL 变化?
  3. 选择隔离单位:按租户分库,分表,分区还是同索引过滤;先满足泄漏风险,再优化成本.
  4. 定义当前性:什么叫"当前有效"?允许多长索引延迟?历史问答是否支持时间旅行?
  5. 定义失败策略:权限未知,解析失败,索引落后,来源冲突时是隐藏,降级还是拒答?
  6. 定义发布与回滚:什么检查通过才切索引别名,谁能批准,保留几代?
  7. 用验证集实测:包括删除,撤权,跨租户同文,冲突版本和解析异常,不只测普通问答.

8. 典型失败模式

失败 可见症状 根因定位
僵尸片段 已删除内容仍被引用 删除事件未传播,旧索引仍服务,缓存未失效
权限漂移 撤权后仍可查询 ACL 未触发重索引,缓存键缺权限版本
新旧并存 同一政策给出两种答案 版本未标有效期,逻辑 ID 不稳定
引用不可打开 片段有文字但页码/位置错 解析或切分丢失位置血缘
索引不可复现 同配置重建结果明显不同 源快照,模型修订,随机种子或引擎版本未固定
语料投毒 特定查询总召回恶意文本 写权限过宽,来源未签名,异常重复或排序未监控
跨租户召回不足/串扰 某租户少结果或看到他人内容 共享 ANN + 过滤行为未验证,或权限字段未继承

6.6. 更新、删除与权限传播实验

建立一个最小测试集:两个租户,四个文档,每文档两个版本,并包含一份撤回文档和一份 ACL 改变但正文不变的文档.

9.1 固定输入

  • 源对象字节,版本 ID,内容哈希;
  • ACL 和策略版本;
  • 解析器,切分器,embedding,稀疏分析器和索引参数;
  • 预期可见文档集合与查询答案.

9.2 运行顺序

  1. 构建 release A,验证两个租户互不可见;
  2. 修改一份文档,构建或增量更新到 B,确认旧片段退出当前检索;
  3. 撤销一名用户权限但不修改正文,确认缓存与索引都拒绝旧访问;
  4. 删除一份源对象,确认索引,重排候选,引用缓存和答案缓存均无该版本;
  5. 回滚到 A,只验证技术回滚能力;如果 A 包含已依法删除或已撤权内容,不允许作为生产回滚目标;
  6. 从 manifest 重建 B,并比较文档数,片段 ID,哈希,抽样检索和权限矩阵.

9.3 验收记录

至少记录传播延迟分布,孤儿片段数,权限错误数,隔离对象数,重建差异和失败关闭行为.不要只写"同步成功".

参考文献 +

6.9. 删除、回滚与跨存储收敛

设租户 T 有文档 D 的版本 v1 和 v2, v2 当前有效, 两版各产生三个片段, 同时写入对象存储、元数据表、倒排索引、向量索引和答案缓存. 删除事件 e17e_{17} 到达后, 元数据层先把 D 标成不可检索, 查询过滤立即失败关闭; 后台再删除六个片段向量、倒排 posting、解析产物和相关缓存. 每个消费者记录位点, 当最慢组件越过 e17e_{17} 后, 删除才达到完整传播状态.

验证使用三类探针. 精确探针查询 v2 的唯一编号, 语义探针改写其中一条事实, 缓存探针重放删除前命中过的请求. 三类都不得把 D 送入上下文. 随后重启检索服务再次执行, 排除只依赖内存失效标记. 再从索引清单抽取 D 的片段 ID, 检查每个派生存储均无活动对象, 允许保留的最小审计事件与正文分离.

此时若普通内容发布需要从 release B 回滚到 A, 而 A 仍含 D, 发布控制器必须把删除覆盖层继续应用于 A. 技术上可读取的旧索引不等于合规可发布的索引. 权限撤回采用同样原则: ACL 最新状态独立于内容 release, 回滚不能恢复已经失效的访问关系.

传播延迟用事件时间线计算. 若元数据失效为 0.2 秒, 倒排删除 3 秒, 向量删除 8 秒, 缓存失效 1 秒, 完整传播延迟为 8 秒; 用户可见阻断若依赖元数据预过滤, 则为 0.2 秒. 两个指标同时报告, 前者描述派生物清理, 后者描述暴露窗口. 高风险删除要求用户可见阻断同步完成, 后台物理清理可以在明确时限内最终一致.

更新也需要同类走查. v3 写入时先构建新片段并通过引用反查、权限矩阵和冒烟查询, 再原子切换当前版本. v2 随后退出当前检索, 但历史日期查询仍可在授权与保留政策允许时访问. 如果 v3 构建失败, 当前指针保持 v2, 不让一半新片段与一半旧片段组成临时版本.

源变更表示为不可变事件 e=(id,object,version,type,policy,time)e=(id,object,version,type,policy,time). 新增、正文修改、权限变化、撤回和删除使用不同类型. 每个消费者以事件 ID 幂等处理, 保存每对象最高版本和删除墓碑. 若删除事件 42 先于更新事件 41 到达, 41 不能让已删除版本复活.

权限变化即使正文哈希不变也生成事件. 缓存、倒排过滤字段和向量分区都要消费. 只按内容哈希去重会漏掉 ACL 更新, 因此状态至少同时比较内容身份与策略身份. 事件日志保留对象 ID、类型和结果即可证明传播, 无需永久复制已删除正文.

设元数据 M、稀疏索引 S、向量索引 V、缓存 C 的完成时间分别为 tM,tS,tV,tCt_M,t_S,t_V,t_C, 完整收敛时间为 max⁡(tM,tS,tV,tC)−te\max(t_M,t_S,t_V,t_C)-t_e. 若读路径先检查 M 的失效标记, 用户暴露窗口接近 tM−tet_M-t_e; 绕过 M 的缓存会把窗口延长到 tC−tet_C-t_e. 两项必须分别监控.

仪表盘记录消费者位点、最老未完成事件年龄、孤儿片段、权限矩阵错误和缓存失效失败. P50 很低不能掩盖 P99 长尾. 删除验证使用唯一词项、语义改写和旧缓存键三类探针, 重启服务后再跑一遍, 排除只在内存中失效.

重建实验从同一 manifest 生成新索引, 比较对象集合、片段身份、哈希、ACL、有效区间和抽样查询. ANN 图字节可以因并行构建不同, 逻辑资产、exact 结果和 ANN 指标必须处于容差内. 灾难恢复后先应用最新删除与权限事件, 通过探针后才开放流量.

7.3. 双写期间的版本可见性

从索引 A 迁移到 B 时, 直接对两边双写并让查询任意读取会产生混合版本. 更稳妥的协议为每批变更分配单调序号 ww, A 与 B 分别报告已应用水位 wA,wBw_A,w_B. 只对外声明 wvisible=min⁡(wA,wB)w_{visible}=\min(w_A,w_B) 之前的数据完成双写. 影子读可以查询 B 的更高水位做验证, 正式读仍绑定明确 release 与水位.

切换条件包含资产对账和查询对账. 资产对账比较逻辑文档、活动版本、片段 ID、ACL 和删除墓碑; 查询对账在固定问题集上比较候选差异. ANN 排名允许在质量容差内不同, 越权、已删除和错误版本差异为零容忍. 达到条件后原子切换读别名, A 保留短期回退能力.

切换后仍双写一段观察期. 若 B 故障, 回退到 A 前先确认 A 已消费观察期内的权限与删除事件. 假设 A 水位 120、B 水位 127, 事件 124 是撤权, 直接回 A 会恢复访问. 发布控制器必须先把 A 推进到至少 127, 或在读路径叠加 121–127 的安全覆盖层.

文档 D 的 v1 有效区间 [1,10)[1,10), v2 为 [10,20)[10,20), v3 为 [20,∞)[20,\infty). 查询时间 τ=15\tau=15 只能选择 v2, 当前查询选择 v3. 若 v3 在时刻 22 被撤回且 v2 没有重新生效, 当前集合为空, 不能自动回退到 v2. “最新未删除”与“当前有效”是不同规则.

一次更新在 12:00:00 产生, 元数据 12:00:01 完成, 稀疏索引 12:00:04, 向量索引 12:00:09, 缓存 12:00:03. 完整收敛为 9 秒. 12:00:05 的混合检索若没有 release 绑定, 会从稀疏侧看见新版、向量侧看见旧版; 绑定旧 release 可保持一致, 绑定新 release 则应等待两索引都就绪.

删除走相反顺序: 先在权威元数据写墓碑并让所有查询失败关闭, 再清理派生物. 假设墓碑 0.1 秒可见、物理向量删除 30 秒完成, 用户暴露窗口是 0.1 秒, 完整清理 30 秒. 监控分别记录, 避免把后台清理延迟误当成持续泄露, 也避免只看用户路径而忘记派生副本.

删除批次采用清单核销. 清单列出源版本及其所有片段、embedding、posting、摘要、缓存键和评测副本, 每项返回删除或合法保留原因. 数量校验之外, 从原文抽取唯一短语与语义改写做黑盒查询. 白盒核销与黑盒探针同时通过, 才标记事件完成.

内容写入 B 成功、ACL 写入失败时, B 可能把新片段按默认公开处理. 正确事务边界应让缺少 ACL 的对象留在隔离状态, 不进入可查询别名. 反过来, ACL 先收紧而内容更新失败, 保守结果是少召回, 不能沿用旧权限提高可用性.

缓存双写也容易遗漏版本. 查询文本相同但 release、租户或策略版本不同, 缓存键必须不同. 切换 B 后命中 A 的答案缓存会引用旧片段, 即使两套索引本身完全正确. 灰度实验因此同时清点查询、embedding、重排和答案缓存的版本字段.

7.6. 版本可见性的读写矩阵

对新增、修改、撤权、删除四类事件分别定义读路径. 新增在所有必要索引完成前可以暂不可见; 修改保持旧版可见, 直到新版完整发布; 撤权与删除先阻断读取, 再异步清理. 这种不对称来自风险: 新内容晚出现影响新鲜度, 受限内容继续出现会造成泄露.

矩阵还覆盖故障. 元数据可用而向量服务失败时, 可以降级到受同一权限过滤约束的稀疏检索; 权限服务失败时不得使用缓存的宽权限结果; 删除队列积压时继续依赖权威墓碑阻断. 每条降级路径都记录使用的 release、水位和策略版本.

可复算测试建立两个租户、两个用户组、四份文档和每份两个版本. 文档 A 正文更新, B 只改 ACL, C 删除, D 未来日期才生效. 依次执行事件后, 为每个身份列出期望可见的 (document,version) 集合. 测试分别查询唯一词、语义释义与空查询列表, 避免只有精确探针通过.

若租户甲在事件前可见 A1、B1、C1, 事件后应见 A2, 不见 B1、C1, D2 尚未生效. 租户乙可能仍见 B1, 说明 ACL 变化按身份生效而非全局删除. 实际集合与期望集合做差, 多出的元素是泄露, 缺少的元素是可用性错误, 两者不能用一个准确率相互抵消.

传播实验重复执行同一事件并打乱非因果事件顺序, 验证幂等与每对象版本序. 随后从备份恢复到较早 release, 重放事件日志到目标水位. 恢复结果与正常构建在逻辑资产、权限矩阵和查询结果上相同, 才证明恢复流程没有绕过删除与撤权.

长期保留还要处理密钥轮换和加密删除. 如果派生备份无法逐对象物理删除, 可以通过销毁对象级加密密钥使内容不可恢复, 但适用性取决于组织政策和备份设计. 系统文档应明确哪些副本支持即时删除、哪些遵循到期淘汰, 并让用户可见阻断始终先完成.

引用服务同样消费版本事件. 历史回答引用 v1 时, 页面可以在保留政策允许下展示当时版本, 或标明来源已撤回; 当前回答不能继续选择 v1. 如果内容依法删除, 历史引用只保留不可逆标识和删除状态, 不通过引用入口恢复正文.

对账任务按 release 生成 manifest: 每个活动文档列出版本、片段数、索引项数和权限摘要. 元数据有三个片段而向量索引只有两个属于缺失, 向量索引多出旧片段属于孤儿. 对账差异进入隔离和修复队列, 在安全字段缺失时默认不可见.

最终验收把白盒状态与黑盒行为对应. 位点、清单和数量证明内部传播过程, 身份矩阵、时间查询、唯一短语和语义改写证明外部读取行为. 任一侧单独通过都不足以证明生命周期正确: 记录可能显示成功但查询仍命中缓存, 查询暂时不命中也可能只是召回偶然失败.

两类检查使用同一事件 ID 和 release 标识关联, 失败可以回到具体消费者与读路径.

结果可被重复验证.