元数据、幂等更新与删除传播
同一文档可能重试上传、内容更新或权限变化。内容相同不等于授权相同;幂等的含义是在同一业务身份与版本下重复处理,不产生重复活动片段。
以下内存例子演示先准备、再发布。内容哈希仅作版本标记;活动指针只有准备成功才变动。
python
from hashlib import sha256
versions, active = {}, {}
def ingest(tenant, doc_id, text, fail=False):
key = (tenant, doc_id)
version = sha256(text.encode()).hexdigest()
candidate = [line for line in text.splitlines() if line.strip()]
if fail:
raise RuntimeError('parser unavailable')
versions[(key, version)] = candidate
active[key] = version
return version
v1 = ingest('A','policy','old rule')
assert ingest('A','policy','old rule') == v1
try:
ingest('A','policy','new rule', fail=True)
except RuntimeError:
pass
assert active[('A','policy')] == v1
v2 = ingest('A','policy','new rule')
assert versions[(('A','policy'), active[('A','policy')])] == ['new rule']
assert v2 != v1
print('publish after prepare passed')真实发布需要事务或比较并交换,检查预期旧版本;这个单线程字典不能证明并发原子性。摄取任务还要记录解析器、切分器、embedding修订、ACL版本和来源更新时间。只靠文本哈希跳过会漏掉“内容不变,权限已撤销”的变化。
删除不能只清理原文件。沿血缘图找到文本片段、向量、父节点、图关系、社区摘要、缓存答案与评估快照,按保留策略撤销查询访问,再异步物理清除。删除传播失败时应有可重试任务和待清理状态。权限在查询时再验证,使物理清理延迟不等于泄漏窗口。
旧系统常把解析、切分、向量写入放在一个循环中,半途失败会留下半份文档。维护时先增加摄取批次与发布状态,再改变解析器;新旧输出用固定样本比对,保留旧产物可回滚。更好的解析模型若改了段落边界,所有依赖chunk_id的引用与缓存也要迁移。
练习
基于正文数据结构删除A的policy活动指针,要求查询不可见;历史versions仍保留时,说明访问层为何必须先查active。
完成后查看本章答案。
返回完整学习路线。