来源:抖音 @龙哥搞算法
引言:RAG 的常见陷阱
在企业构建 RAG(检索增强生成)系统时,一个常见的误区是每当知识库更新时,便对全量文档重新进行 Embedding 编码。这种全量重算的方式会导致巨大的算力消耗、高昂的成本,并引起系统延迟与服务阻塞。事实上,90% 的人在使用基础 RAG 架构时都未采用这种高效方案,而面试官真正关注的则是如何识别变化、实现局部更新以及保证服务不中断。
增量向量化的核心逻辑
增量向量化并非重新建立整个索引,而是专注于处理发生变化的数据。其核心设计包括以下四个步骤:
- 变化检测:通过对比版本号、时间及内容 Hash 值来识别哪些数据发生了变更。
- 复用未变向量:对于未发生变化的数据,直接复用已有的向量,无需重新计算。
- 局部 Embedding:仅针对新增或修改的部分进行重新切块(Chunking)和向量编码。
- 写入向量索引:将新生成的向量更新到索引中,并维护好 Chunk ID、版本号及父子关系。这种机制确保了系统在处理如“1000页文档只改了第200页”的场景时,仅重新处理对应的 Chunk,而非整篇文档。
事件驱动的流水线架构
大厂级系统通常会将此逻辑构建为事件驱动的异步流水线,以实现高效并发处理。其核心组件包括:
- 文件变化触发:系统监听文件的 create、update 或 delete 事件。
- 消息队列(MQ):将向量生成任务发送至异步队列,支持去重与重试(Dedup & Retry),解耦生产与消费环节。
- Embedding Worker:后台 Worker 从队列获取任务,执行切片和编码,维护元数据表(如 Chunk ID, version, parent)。
- 向量索引更新:任务完成后,对索引执行 insert、delete 或 rollback 操作。
- 线上检索服务:保持 stable serving,确保检索请求的稳定性。
通过这种架构,系统不仅支持局部删除和插入,还能实现高性能的异步处理。
模型升级与双索引导航
当底层 Embedding 模型发生升级时,系统仍需保证线上服务不停机。解决这一问题的关键策略是后台异步重建 + 双索引切换。
具体而言,系统在后台利用新的模型和配置重新生成索引(Index B),而线上服务继续由旧索引(Index A)提供服务。当新索引构建完成并通过校验后,系统在底层进行无缝切换。这种设计使得技术升级与线上运行互不干扰,确保了业务的连续性与高可用性。
总结
设计增量向量化系统的关键不在于重算 Embedding,而在于精准识别变化与只更新变化数据。通过精准识别变化点、构建异步流水线和采用双索引切换策略,企业可以建立起低成本、可持续且高可用的企业级 RAG 迭代体系。