RAG 工程化实践:RAG 索引重建与向量库同步,别让 Demo 变成生产事故

📅 2026/7/15 22:56:37
RAG 工程化实践:RAG 索引重建与向量库同步,别让 Demo 变成生产事故
最近看到大家在谈论RAG正好我也分享一下踩过的坑今天谈论一下rag比较核心的一环索引重建与向量库同步Demo 只需要跑通链路生产系统必须回答文档更新了怎么办索引失败一半怎么办用户会不会查到半成品这个问题可以先从正常链路说起。大多数 RAG 的入库链路都长这样上传文档→解析文本→切 chunk↓↓↓生成 embedding→写向量库→写关键词索引问答时再从向量库 / 关键词索引里召回 chunk。结合当前项目链路基本也是这样DocumentApplicationService.triggerIngestion → 从 MinIO 读取原始文件 → DocumentParserPort 解析文本 → DocumentIngestionDomainService 切 chunk → kb_document_chunk 保存 chunk 正文 → EmbeddingPort 生成向量 → MilvusVectorSearchAdapter 写向量 → ElasticsearchKeywordSearchAdapter 写关键词索引 → 文档状态变成 COMPLETED这套链路作为 Demo 没问题。它能说明 RAG 入库的基本过程。但如果拿它回答“文档更新后怎么重建索引如何保证向量库同步”就明显不够了。一、上述链路的问题它只解决第一次入库第一次上传文档时解析、切块、向量化、写索引都很顺。但生产里文档会更新解析策略会升级chunk 规则会变化。这个时候不是“再跑一遍”这么简单而是要处理旧索引和新索引的关系。retry 不是 rebuildDemo 里常见一个误区失败了就 retry更新了也 retry。retry上一次任务失败了继续补救。rebuild当前已有索引但我要基于新内容或新策略生成一套新索引。如果把 rebuild 做成 retry很容易出现旧索引被删了新索引又因为状态不允许或中途失败没建起来。删除旧索引后再写新索引会有空窗期删除旧 MySQL chunk 删除旧 Milvus vector 删除旧 ES document 重新切 chunk 重新 embedding 重新写索引这个做法简单但生产风险很大。一旦新索引构建失败旧索引已经没了用户就查不到内容。不删除旧索引又会新旧混查如果不删旧索引直接写新索引也会出问题。同一个知识库里可能同时存在旧 chunk 的向量、新 chunk 的向量、旧 ES 文档、新 ES 文档。如果查询只按knowledgeBaseId过滤就可能把旧内容召回。chunk 策略变化本质是索引版本变化比如原来按 800 字符切现在改成按 Markdown 标题树切。这不是参数微调而是索引结构变化。因为 chunk 的数量、边界、内容、顺序都变了embedding 输入也变了旧向量就不能再当作同一套索引使用。embedding 模型变化也必须重建比如从 1536 维模型换到bge-m31024 维模型。旧向量和新向量不能混在一起比较embedding 模型和维度必须成为索引版本的一部分。MySQL、Milvus、ES 不可能靠强事务同步MySQL chunk 写成功 Milvus 写成功一半 ES bulk 部分失败真实系统里经常出现这种半成功。如果没有版本和对账机制你很难知道当前索引到底是不是完整的。二、生产级应该怎么做真正生产级的答案不是“删除旧索引再重建”。MySQL 做真相源 Milvus / ES 做派生索引 索引版本化 新版本后台构建 构建成功后切 active_version 旧版本延迟清理 通过对账保证最终一致核心是四个词版本化蓝绿切换幂等任务对账修复我把这套方案画成了一张图1. 引入 document_revision文档不要覆盖更新而是生成版本。document_id doc_001 revision_id r1 / r2 / r3每次文档内容变化就生成新的 revision。这样系统才能知道当前检索的是文档哪个版本、这个 chunk 来自哪次文档修改、新版本有问题时能不能回滚。2. 引入 index_version索引也要有版本。index_version v1 / v2 / v3只要下面任何东西变化都应该生成新的 index_version文档内容变化必须重建chunk 切分策略变化必须重建Markdown / PDF 解析策略变化必须重建知识库树结构变化通常要重建受影响范围embedding 模型 / 维度变化必须重建不能混查也就是说重建索引不是覆盖旧索引而是构建一个新的索引版本。3. 知识库维护 active_index_version知识库应该记录当前线上生效的索引版本active_index_version v3 indexing_version v4含义是v3 正在线上服务 v4 正在后台构建查询时永远只查knowledge_base_id ? index_version active_index_version status ACTIVE这样即使 v4 还在构建用户也不会查到半成品。4. Milvus 和 ES 都要带 index_versionMilvus 里的 vector metadata 至少要带chunk_id document_id knowledge_base_id revision_id index_version statusES 文档也一样。不能只按knowledgeBaseId查只按知识库查旧向量迟早会混进来。5. 用蓝绿方式重建索引生产级重建流程应该是1创建新的 index_version例如 v4。2后台用新策略解析、切 chunk、生成 embedding。3新 chunk 写 MySQL状态 BUILDING。4新 vector 写 Milvus带 index_version v4。5新 keyword doc 写 ES带 index_version v4。6对账 MySQL / Milvus / ES 是否完整。7校验通过后把 v4 标记 ACTIVE。8原子切换 knowledge_base.active_index_version v4。9旧版本 v3 延迟清理。整个过程中线上仍然使用 v3。只有 v4 完整构建成功才切过去。这就是索引层面的蓝绿发布。6. 任务必须幂等索引任务一定会失败也一定会重试。所以同一个document_revision index_version chunk_index content_hash应该生成稳定的 chunkId / vectorId。否则每次重试都会制造一批新向量最后向量库里全是重复数据。7. 必须有对账任务不要相信日志说“写入成功”。生产里必须定期对账MySQL active chunks 数量 Milvus active vectors 数量 ES active docs 数量 缺失多少 多余多少 旧版本残留多少 hash 是否一致对账结果决定后续动作缺的补写错的重写多的删除旧版本延迟 GC这才叫保证向量库同步。三、如果是当前 Demo最低怎么补如果只是当前这个学习项目不想一开始就做完整版本化可以先补一个 Demo 级方案POST /api/documents/{id}/rebuild-index POST /api/knowledge-bases/{id}/rebuild-index但语义要说清楚**retry**失败后重试。**rebuild**重新生成索引。Demo 级 rebuild 可以先做严格删除旧 MySQL chunk 严格删除旧 Milvus vector 严格删除旧 ES doc 重新 parse / chunk / embed / index注意这里的关键是“严格删除”。如果 Milvus 或 ES 删除失败就不要继续重建。否则新旧索引会混在一起。但这个方案只是过渡版它有空窗期也没有回滚能力。真正生产级还是要走document_revision index_version active_index_version 异步 index_job 蓝绿切换 对账任务 旧版本 GC四、一句话回答那个评论如果有人问新建文档或者修改树结构后如何重建索引如何保证向量库同步我会这样回答Demo 版可以先做rebuild-index严格清理旧 chunk、旧向量、旧关键词索引再重新构建。但生产级不能靠删除旧索引来保证同步。生产级应该做版本化索引文档有document_revision索引有index_version知识库有active_index_version。新索引后台构建Milvus / ES / MySQL chunk 全部带 index_version。查询只读 active_index_version。新版本对账通过后再原子切换 active_index_version。同步不是靠 MySQL、Milvus、ES 的分布式事务而是靠 MySQL 真相源、幂等索引任务、版本隔离和对账修复。结论RAG 工程化里索引不是一次性产物而是有生命周期的资产。上传文档只是开始。真正要处理的是文档变了怎么办chunk 策略变了怎么办embedding 模型变了怎么办索引构建失败一半怎么办向量库和业务库不一致怎么办用户会不会查到半成品索引我的结论很明确小系统可以先做严格清理 rebuild。生产系统必须做版本化索引 蓝绿切换 对账任务。最后一句话向量库不是数据库向量库是索引。索引可以重建但必须有版本。同步可以最终一致但必须能对账。重建可以异步但半成品不能被查到。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】