Skip to content

元数据、幂等更新与删除传播 ​

同一文档可能重试上传、内容更新或权限变化。内容相同不等于授权相同;幂等的含义是在同一业务身份与版本下重复处理,不产生重复活动片段。

以下内存例子演示先准备、再发布。内容哈希仅作版本标记;活动指针只有准备成功才变动。

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。

完成后查看本章答案。

返回完整学习路线。

用心记录每一步成长