60 秒回答模板

RAG 文档局部更新时,不应全量重新向量化所有文档。更好的做法是把文档解析成稳定 chunk,基于内容 hash 和版本检测变更,只对新增、修改、删除的 chunk 更新索引,并保证查询侧看到一致版本。 建立文档版本模型:每个文档要有 docId、version、更新时间、权限、解析配置和 chunk 版本。没有版本,无法判断哪些向量和元数据已经过期。 变更检测到 chunk:用段落、标题、表格或语义边界切 chunk,并计算 hash。局部更新时比较旧新版 chunk,只重新 embedding 变化部分,未变化部分复用。 索引更新要原子:新增和修改 chunk 写入新版本,删除 chunk 标记 tombstone 或从索引移除。查询侧要么读旧版本,要么读新版本,避免混合读到半更新状态。 权限和元数据同步:RAG 不只是向量。权限、时间、业务标签、来源链接和召回过滤条件也要随版本更新,否则可能召回旧权限或过期内容。 回归验证检索质量:更新后用固定 query 集检查召回、排序、答案引用和删除生效。监控 embedding 队列延迟、失败重试、索引版本滞后和过期召回比例。 最后要把方案落到可验证的指标、失败兜底和迭代闭环上。面试里不要只讲概念名词,要说明边界、取舍、数据来源、线上观测和出问题后的回滚或人工介入。

考点 版本化文档
难度 真实面经题
回答目标 展示你能设计可持续更新、可一致查询的生产级 RAG 索引链路。

深入解析

01

建立文档版本模型

每个文档要有 docId、version、更新时间、权限、解析配置和 chunk 版本。没有版本,无法判断哪些向量和元数据已经过期。

02

变更检测到 chunk

用段落、标题、表格或语义边界切 chunk,并计算 hash。局部更新时比较旧新版 chunk,只重新 embedding 变化部分,未变化部分复用。

03

索引更新要原子

新增和修改 chunk 写入新版本,删除 chunk 标记 tombstone 或从索引移除。查询侧要么读旧版本,要么读新版本,避免混合读到半更新状态。

04

权限和元数据同步

RAG 不只是向量。权限、时间、业务标签、来源链接和召回过滤条件也要随版本更新,否则可能召回旧权限或过期内容。

05

回归验证检索质量

更新后用固定 query 集检查召回、排序、答案引用和删除生效。监控 embedding 队列延迟、失败重试、索引版本滞后和过期召回比例。

易错点

  • 每次局部修改都全量向量化,成本和延迟不可控。
  • 只更新向量,不更新权限、来源和时间元数据。
  • 索引非原子更新,查询读到混合版本。
  • 删除内容只从数据库删,向量索引和缓存仍可召回。
  • 没有检索回归集,更新后质量下降才由用户发现。

面试官追问

chunk 边界变化会带来什么问题?

一个小改动可能导致后续 chunk 全部变化,降低复用率。需要稳定切分策略,尽量按标题、段落或结构块定位。

删除内容如何确保不再被召回?

需要删除向量或写 tombstone,并让查询过滤删除版本。同时验证缓存和生成上下文中没有残留旧内容。

增量更新会不会影响召回质量?

会,尤其是上下文边界变化和重叠区域变化。更新后要跑检索回归,检查关键 query 的 topK 和引用是否合理。

如何处理 embedding 失败?

失败 chunk 进入重试队列,索引版本保持旧版本可用,并暴露滞后指标。不能让部分失败污染线上检索。