Browse this library

Chinese source article

2 · 语料处理与索引

从源对象、版本和权限出发, 构造可更新、可删除、可追踪的检索快照.

View original Markdown ↗

检索器只能在索引表达的世界里工作. 源文档缺失、表格结构丢失、标题与正文脱离、版本并存或删除未传播, 都会在候选阶段表现成“模型效果差”. 因此本章把语料快照 Ct\mathcal C_t 作为共同对象, 研究源对象如何变成带身份、位置、权限和时间的检索单元.

每个检索单元至少携带稳定文档 ID、版本 ID、片段 ID、来源位置、正文、结构路径、有效时间和访问控制. 内容哈希适合判断正文变化, 却不能单独承担业务身份; URL 可能变化, 标题也会重复. 身份模型决定增量更新、去重和引用是否可靠.

从源到快照

接入与结构恢复

接入流程通常包含抓取、解析、规范化、结构恢复、切分、元数据补全、质量检查和索引发布. 发布应形成一个可引用的快照, 而不是边写边让查询看到半成品. 蓝绿索引或版本别名可以让读流量在完整构建后切换.

失败记录要保留源对象和阶段. 把解析失败静默跳过会让覆盖率下降却不易发现. 解析成功也不等于结构正确: PDF 双栏顺序、表格单元格、列表层级和页眉噪声都会改变片段语义.

发布与血缘

每次构建记录源快照、解析器、切分器和权限策略版本. 文档、版本、片段与索引项之间保留可逆映射, 使引用能够返回原文, 更新能够找到受影响派生物. 构建完成后再切换读别名, 避免查询看到只写入一半的版本.

快照发布前检查源对象数、解析失败、片段长度分布和权限字段完整率. 抽样从片段反查原文位置, 再用内容哈希验证对应关系. 数量对得上只能说明对象没有明显丢失, 无法发现段落顺序和表格列关系错误.

切分与表示

检索粒度

切分单元承担两个相反目标. 单元较小, 检索定位更精确且上下文成本低; 单元较大, 条件、定义和论证更完整. 固定长度只是一个可复现起点. 标题层级、段落、代码块、表格和对话轮次通常提供更可靠的边界.

父子检索把召回粒度和展示粒度分开: 小片段用于匹配, 命中后扩展到父段落或相邻窗口. 这种设计必须保留稳定位置映射, 否则引用、去重和删除难以对齐.

特殊内容

表格片段要携带表头、行名、单位和脚注, 代码片段要保留符号签名、所属模块和依赖, 图片与扫描页要把 OCR 文本同坐标、页码及原图绑定. 不同媒体可以采用不同处理器, 输出仍共享文档身份、版本、权限和来源位置.

切分实验固定检索器, 比较结构边界、长度、重叠和父子扩展. 指标同时观察参考证据覆盖、重复率、上下文 token 与引用定位. 只看最终答案会让模型凭参数记忆补全缺失条件, 从而掩盖切分错误.

多索引与更新

一致的索引发布

倒排索引保存词项、频率和字段结构, 向量索引保存稠密表示, 图或结构化索引保存实体关系. 它们可以来自同一语料快照, 但更新延迟和删除语义不同. 查询记录必须注明使用了哪些版本.

索引一致性的最低要求是同一检索运行不能混用逻辑上不兼容的语料版本. 新正文进入向量索引而稀疏索引尚未更新, 或删除只作用于一侧, 都会让混合结果不可解释.

精确与近似搜索

倒排索引用词项统计处理编号和专名, 向量索引用 embedding 处理语义近邻, ANN 结构以少量召回损失换取查询速度. 评测先用精确向量搜索建立参照, 再比较 HNSW 或 IVF 等近似索引, 从而区分表示模型遗漏与近似搜索遗漏.

权限过滤会改变 ANN 可搜索集合. 某些引擎在取得近邻后执行过滤, 可见文档比例很低时可能返回不足 kk 条. 生产测试需要采用真实租户规模与过滤选择性, 同时检查召回、延迟和越权结果, 不能只在无过滤的公共语料上调参数.

更新实验要覆盖新增、正文修改、权限变化和删除四类事件. 正文未变而 ACL 改变时, 内容哈希不会触发重建, 权限事件仍须更新过滤结构与缓存. 删除完成后用原文中的唯一短语、语义改写和历史缓存键分别查询, 确认各条路径都无法把旧片段送入上下文.

回滚恢复的是一组相互兼容的语料、处理配置和索引, 不能只切换一个向量集合. 已经生效的撤权与合规删除独立于普通版本回滚: 旧 release 即使技术上可用, 只要包含已撤回内容便不能重新发布. 这条边界使可恢复性服从当前访问控制.

三类索引共享同一片段清单和发布标识, 查询记录也保存对应版本. 这样才能复算一次混合检索, 并判断候选变化来自语料、表示还是近似搜索参数.

本章的文档身份、版本与删除建立生命周期, 结构感知切分与索引说明检索单元如何形成以及怎样验证.

语料快照如何成立

身份、版本与位置

逻辑文档身份与内容版本身份要分开. document_id 表示同一份制度或手册, version_id 表示某次具体内容, chunk_id 标记该版本中的检索单元. 每个片段还应携带来源位置、内容哈希、权限、有效时间、解析器版本和切分器版本. 文档更新后可以沿用 document_id, 但 version_id 和受影响片段必须变化.

稳定身份使删除和更正能够传播到派生数据. 一次删除至少影响原文存储、稀疏索引、向量索引、重排缓存、上下文缓存与可回放 trace. 如果系统只从主库删文档, 向量索引仍可能继续返回旧片段. 删除延迟应有单独的服务目标, 并通过带唯一短语的探针验证, 不能只看后台任务显示成功.

切分改变了检索问题

切分不是把长文按固定 token 数截断. 片段要同时满足可区分、证据完整、可定位、更新局部和权限一致. 定义与限制条件, 表头与数据行, 条款与例外若被拆散, 任一片段都不足以支持答案. 把多个权限域合进同一片段则会使授权过滤失去明确边界.

结构优先切分通常先尊重标题、段落、列表、代码块、表格或记录边界, 超长单元再递归拆分. 滑窗能缓解边界遗漏, 代价是存储膨胀和重复召回. 父子检索用小片段匹配, 再扩展到带上下文的父段;扩展范围必须评测, 因为更长上下文也会引入无关条件. 结构化记录应保留主键和字段, 不必先拼成长文本.