知识库更新了,向量索引怎么增量更新?删除的文档怎么办?
谁在问:工程向二面;运维过线上知识库的面试官必问
口语化问法
- 文档改了之后,你们怎么同步到索引里?
- 删掉的文档还能被检索出来吗?
- 更新的时候会不会出现检索不到的空窗期?
考察意图
这题问的是「上过线」而不是「跑通过」。 demo 阶段的 RAG 全量重建就行,一旦真跑在业务上,文档天天变、旧内容必须立刻失效、更新期间不能停服——这些问题一个都躲不掉。三个观察点:① 知不知道向量库的删除是软删除;② 有没有更新期间的一致性方案;③ 有没有意识到「答案引用了已删除的文档」是合规风险。
参考答案
60 分答案(及格线)
新增:直接 upsert,HNSW 支持增量插入。 更新:本质是删旧 + 插新。要注意向量和原文的对齐,否则会出现「检索到了但取不到原文」。 删除:多数向量库是软删除——图结构不好真删,一般打标记跳过,空间不会立刻释放。删除比例高了会让图结构劣化、召回下降,需要定期 compact 或重建索引。
实践上常用 文档ID + chunk序号 作为稳定主键,更新时按文档 ID 批量删除旧 chunk 再写入新 chunk。
90 分答案(有生产经验的回答)
补四层:
用版本号避免更新空窗(关键):如果先删后插,中间那段时间用户检索不到内容。正确做法是给每个 chunk 打版本号或时间戳作为元数据:先写入新版本,检索时按元数据过滤只取最新版本,再异步清理旧版本。这样任何时刻都有一份完整可用的数据。
变更检测要做在上游:不要每次全量重跑。用文件哈希或修改时间判断哪些文档真的变了;文档内变更还可以做 chunk 级别的哈希对比,只重算变化的那几块——这能把日常更新的 embedding 成本降一个数量级。
删除的合规维度(很多人漏):文档被删除通常意味着「这份内容不该再被引用」——可能是过期政策、下架产品、甚至是隐私删除请求。所以软删除不够,要确保:① 检索层立即过滤掉(元数据标记,不等 compact);② 已生成的缓存答案要失效;③ 有审计记录。在 toB 场景,「答案引用了一份已删除的文件」是事故不是瑕疵。
什么时候必须全量重建:换 embedding 模型、改分块策略、改索引参数(M/ef_construction)、软删除比例过高导致召回劣化。重建时用双索引 + 灰度切换:新索引在旁边建好,验证召回率不低于旧索引后再切读流量,保留旧索引一段时间以便回滚。
追问链
怎么知道哪些文档需要更新?
期望上游做变更检测:文件哈希 /mtime比对、业务系统的变更事件(CDC、消息队列)、定时全量扫描做兜底对账 —— 事件驱动 + 定期对账双保险,因为事件会丢信号只说「定时全量重跑」→ 没做过成本优化;提「事件驱动 + 对账兜底」→ 做过数据同步一个文档改了一句话,要重算整个文档的向量吗?
期望不用 ——chunk级哈希对比,只重算变化的那几块。但有边界效应:语义 / 滑动窗口切分下改一句话会让后续所有 chunk 边界偏移,只能整篇重切;按标题结构切分稳定得多,这是结构感知切分的隐藏好处信号能想到「边界偏移」这个细节 → 真做过增量更新软删除积累多了具体会怎样?怎么监控?
期望图连通性劣化 → 召回下降、查询变慢,存储也不释放。监控两条:软删除占比(超 20–30% 告警)+ 评测集上定期跑recall看有没有缓慢下滑;处理靠compact或低峰期重建。这种劣化是渐进无声的信号说得出「渐进劣化、必须主动监控」→ 运维过真实系统更新过程中用户正好在查询,会读到不一致的数据吗?
期望会 —— 新chunk写了一半,检索到新旧混合的内容。三条解法:版本号过滤(只看完整的某一版)、别名 / 指针原子切换(新版全就绪后再切)、pgvector这类支持事务的库直接用事务 —— 这正是 pgvector 的真实优势场景信号能把它连回「向量库选型时事务一致性为什么重要」→ 知识成体系客户要求「文档删除后 5 分钟内不能再被检索到」,你怎么保证?
期望分层给顺序:① 检索层元数据黑名单立即过滤,秒级生效、不等物理删除 → ② 语义缓存与答案缓存同步失效 → ③ 物理删除异步执行 → ④ 删完自动跑一次针对该文档的检索测试,确认返回为空并留审计日志。给的是可验证的保证,不是「我们会删掉」信号只答「调用删除接口」→ 不知道软删除的存在;给出「黑名单立即生效 + 缓存失效 + 删后验证」→ 扛得住合规要求
评分要点
- 知道更新 = 删旧 + 插新,且要保证向量与原文对齐
- 知道向量库多为软删除,空间不立即释放
- 知道软删除积累会导致召回下降,需要 compact 或重建
- 能给出避免更新空窗的方案(版本号/时间戳过滤)
- 有变更检测机制,不是每次全量重跑
- 加分:意识到删除的合规维度(缓存失效、审计)
- 加分:知道全量重建的触发条件和双索引灰度切换
- 加分:知道分块策略会影响增量更新的成本(边界偏移)