跳转至

第18章 向量数据库与索引算法


向量数据库承接 RAG 中的检索执行。Embedding 生成、答案判断、权限裁决和血缘解释仍由其他组件负责。向量库接收向量、metadata 和索引参数,在权限、延迟、召回质量和成本之间做工程折中。如果平台团队一上来只问“Milvus、Qdrant、pgvector、Weaviate 选哪个”,就已经跳过了更重要的问题:数据规模多大,查询是否需要强过滤,是否多租户,是否要求事务一致性,是否能接受索引重建窗口,是否需要和传统搜索合并。

向量库事故通常不会以“数据库坏了”的形式出现。更常见的是业务用户看到一段无权文档的影子,DataAgent 召回了过期字段,客服助手引用了旧制度,或者模型升级后同一个问题突然命中另一批 chunk。排障时团队才发现,向量记录里没有源文档版本,metadata 里缺少部门权限,索引没有绑定 embedding 模型,检索日志只保存了最终答案。系统看起来在正常返回结果,实际已经失去可解释性。这也是向量库和普通缓存的区别。缓存错了可以清掉,向量索引错了会影响召回、引用、评测和审计。一个文档解析修复后,旧 chunk 是否仍在索引里;一个字段权限变化后,旧向量是否还带着旧 ACL;一个 embedding 模型升级后,新 query 是否还在打旧索引;一个租户删除数据后,评测样本和重排缓存是否同步清理。这些问题都落在向量库生命周期里,而非单纯的 ANN 算法选择。

企业语义检索还要面对成本压力。维度越高,内存和存储越贵;top-k 越大,重排和上下文组装越重;metadata filter 越复杂,召回和延迟越难兼顾;索引副本越多,灰度和回滚越稳,但成本也会上升。HNSW、IVF、PQ、DiskANN 等路线都要放进同一张工程账单里评估:召回率、p95、内存、构建时间、删除延迟、回滚窗口和团队运维能力缺一不可。只看算法名称会遮住真正的风险,因为同一个 HNSW 配置在无过滤公开数据集上表现很好,到了带租户、部门和生效时间过滤的企业数据里,可能完全不是同一条曲线。

本章讨论向量数据库、ANN 索引、HNSW、元数据过滤、多租户权限和向量库选型。读者需要把向量库看成知识基础设施:它保存向量,也保存版本、权限、来源、过滤条件和回放证据。选型结论应来自当前规模、权限要求、运维能力和成本边界,而不是来自某个数据库的宣传指标。一个适合早期平台的向量库,未必是公开 benchmark 里最强的系统;它更可能是能稳定完成过滤、回放、删除、灰度和成本治理的组件。


18.1 向量库平台定位

企业向量库应作为平台组件管理,不能停留在某个应用的私有缓存。知识库、客服、法务、DataAgent、推荐去重都可能共享 embedding 服务和向量索引能力,但它们的权限、更新频率和质量目标不同。平台层要提供统一的写入契约、查询契约、版本契约和观测指标。DataAgent 对向量库的要求和普通知识库不同。字段、指标、SQL 示例、报表截图和业务术语经常来自不同系统,更新频率也不同;字段级权限和租户隔离要进入 metadata filter;同一个业务问题还可能同时检索语义层、历史 SQL、数据质量规则和指标血缘。因此 DataAgent 的向量库更接近语义层候选索引,按普通文档索引处理会漏掉口径、字段和权限约束。

如果这层边界没有设计清楚,事故通常不会表现成“向量库故障”,而会表现成更难追查的业务错误。一个常见路径是:某个部门的制度片段因为 metadata 缺少 department_id 被写入共享 collection,检索时又只做 post-filter,服务日志和 trace 里已经记录了无权候选;模型即使没有把内容完整说出来,候选片段也已经进入了不可见用户的排障链路。另一个路径是索引没有绑定 embedding 模型版本,模型升级后新旧向量混在一起,召回结果突然偏向历史样例,DataAgent 生成 SQL 时沿用了过期字段。平台层的职责,是把这些风险提前变成 schema、过滤、版本和观测约束。讨论选型前,先要像表18-1 一样划清向量库的职责边界,尤其要写清楚它“不负责什么”。否则团队很容易把 embedding 生成、权限系统、答案正确性和数据血缘都塞给向量库。

表18-1:向量库在企业平台中的职责。来源:本书整理。

职责 说明 不负责什么
向量索引 管理 embedding、metric、index type、namespace、版本 不负责生成 embedding
metadata 过滤 按租户、部门、权限、生效时间、文档状态过滤 不替代统一权限系统
近似检索 在延迟和召回之间折中 不保证最终答案正确
生命周期治理 重建、双写、灰度、回滚、压缩和归档 不替代数据血缘与审计
观测与成本 记录 QPS、p95、召回、过滤命中、索引大小 不解释业务语义错误

职责边界确定后,平台负责人才能做选型判断。这里关注“什么时候该建设共享平台、什么时候可以用轻量方案”,不单纯比较数据库品牌。中小规模、强 SQL/事务/元数据需求的场景,通常可以先用 pgvector 起步;当多个业务共享索引、大规模检索和高 QPS 成为主要矛盾时,再评估 Milvus、Qdrant 或 Vespa。是否建设统一向量平台,也不取决于技术偏好,而取决于多个业务是否共同需要 embedding、索引、权限、评测和回滚。单应用试点没有必要提前平台化,但一旦知识库、DataAgent 和客服助手开始共用索引能力,就要把 collection、版本和过滤字段纳入统一治理。

安全和成本是选型时最容易被低估的两条线。安全上,高风险场景不允许无权候选进入模型、日志或 trace,因此 pre-filter 通常比 post-filter 更稳。成本上,维度、索引类型、过滤策略、top-k 和 reranker 都会影响内存和延迟,不能只看向量库标称 QPS。最小治理要求也要提前写清:每个索引都应记录 embedding 模型版本、chunk 策略、metadata schema、构建时间、评测结果和回滚窗口。先定义平台边界,再把边界转成投入决策。没有这个顺序,团队很容易一上来讨论 Milvus 或 pgvector,却没有说清楚谁负责索引版本、权限过滤和回滚。放到图 18-1 的平台位置中看,向量库的核心接口是带着 metadata、权限、版本和指标完成可治理检索,而非简单存一条向量。

图18-1:向量库在企业 Agent 平台中的位置

图18-1:向量库在企业 Agent 平台中的位置。来源:本书自绘。Alt text:分层图中向量库位于嵌入服务之下、RAG 与知识助手之上,存储向量与元数据并对外提供带权限过滤的检索接口,标出其"可检索知识存储"职责。

平台化之后,这些能力还要能像图 18-2 那样被运维和治理界面管理。多租户、collection、索引版本、过滤字段和观测指标如果都散落在各应用配置文件里,向量库就很难成为共享平台能力。

图18-2:企业向量库多租户控制台

图18-2:企业向量库多租户控制台。来源:产品界面截图。Alt text:控制台界面展示按租户划分的集合列表、向量规模、索引类型与权限配置,体现向量库以租户为单位做隔离与配额管理。

18.2 ANN 索引算法谱系

向量检索的核心难点是规模。少量向量可以精确计算相似度;百万、千万、亿级向量就要用 Approximate Nearest Neighbor,牺牲一点召回换取可接受的延迟和成本。Milvus、Qdrant、Weaviate、Vespa、pgvector 等系统暴露的索引名称不同,但底层取舍大体围绕图索引、倒排聚类、量化压缩和磁盘索引展开。理解 ANN 时,先用表18-2 建立共同的算法语言,比直接给出唯一答案更重要。HNSW、IVF、PQ、磁盘索引和精确检索分别对应不同的内存、构建、召回和延迟取舍。

表18-2:ANN 索引算法谱系。来源:本书整理。

算法路线 直觉 优势 代价
HNSW 构建多层近邻图,查询时沿图搜索 召回和延迟表现稳定,工程生态成熟 内存占用较高,构建参数影响明显
IVF 先把向量聚类到桶,再在少量桶内搜索 大规模数据可控,适合配合压缩 需要训练聚类中心,参数不当会漏召回
PQ/SQ 量化 用低比特表示近似向量 节省内存和存储 分数精度下降,需要重排或精排补偿
DiskANN / 磁盘索引 用磁盘和缓存承载更大索引 降低内存压力 延迟抖动、冷热数据和硬件配置更敏感
精确索引 暴力或数据库原生精确距离计算 结果可解释,适合小规模 baseline 数据量大时不可扩展

企业不必在第一天追求最复杂的索引。更可靠的路线是小规模数据用精确或 HNSW 建 baseline,拿内部 query 集测 recall@k 和 p95;规模上来后再评估 IVF/PQ、分片、磁盘索引和冷热分层。索引参数不是一次性配置,它会和 embedding 模型、维度、metadata 过滤、top-k、reranker 一起变化。内部 query 集要来自真实任务,不能临时写几十个自然语言问题充数。向量库的召回错误往往只在边界问题上暴露:字段名相似但含义不同、合同条款编号相近、制度版本相互覆盖、用户问题同时带时间和权限约束。HNSW 的 ef_search 调高后召回可能改善,但 p95 和内存也会上升;IVF 的聚类桶设置不当时,热门问题看起来正常,长尾实体却会漏召回;量化压缩节省成本,却可能让相近指标或相似条款的分数顺序颠倒。这些取舍不能靠默认参数判断,必须用带标签的 query 集和失败样例回放来确认。选型讨论应从召回、内存、构建时间和延迟开始,而不应停留在算法名。图 18-3 的索引谱系把这些取舍放在同一张图里,方便团队先对齐问题,再讨论具体实现。

图18-3:ANN 索引算法谱系图

图18-3:ANN 索引算法谱系图。来源:本书自绘。Alt text:树状谱系把 ANN 索引分为基于图(HNSW)、基于量化(IVF-PQ)、基于树/哈希等分支,每个叶子标注召回、延迟、内存特征,展示索引家族关系。

18.3 主流向量库技术选型

主流向量库的差异不只在索引算法。pgvector 的优势是和 PostgreSQL 数据、事务、SQL 权限靠得近;Milvus 更偏大规模向量基础设施;Qdrant 强调 payload/filter 和服务化向量检索;Weaviate 提供 schema、向量化模块和 GraphQL/REST 能力;Vespa 更像搜索与推荐平台,适合复杂 ranking;Chroma 更适合原型和轻量开发。

表18-3 回到企业约束比较工具路线,并延续前面的职责边界和索引取舍。这里不讨论“谁最好”,而是判断谁更适合当前规模、权限模型、运维能力和 mini-platform 的演进阶段。

表18-3:主流向量库路线取舍表。来源:本书整理。

方案 优势 代价 适用场景 mini-platform 选择
pgvector 和 PostgreSQL 结合紧密,SQL、事务、权限和元数据管理简单 超大规模和复杂 ANN 能力不如专门向量库 中小规模知识库、DataAgent 字段检索、团队已有 PostgreSQL 默认 baseline,适合 Project 13 起步
Milvus 面向大规模向量检索,索引类型和分布式能力丰富 运维组件更多,治理成本较高 大规模知识库、多业务共享向量平台 作为大规模候选进入 benchmark
Qdrant payload filtering 和服务化 API 友好,易做多租户过滤 需要额外管理数据库与业务系统的一致性 多租户 RAG、权限过滤强的场景 作为服务化候选进入 benchmark
Weaviate schema、模块化向量化、检索 API 完整 与既有数据平台集成需要评估 快速构建语义搜索和知识应用 作为产品化候选调研
Vespa 搜索、推荐、ranking 表达力强 学习曲线和部署复杂度高 大规模搜索推荐、复杂排序、多阶段 ranking 作为高级搜索平台候选

选型时不要只问“支持 HNSW 吗”。还要追问:metadata filter 在 ANN 前后如何执行,过滤会不会严重降低召回;索引重建能否不停服;租户隔离是 namespace、collection、partition 还是业务字段;备份恢复是否覆盖向量和 metadata;查询日志能否追溯到用户、索引版本和候选列表。对企业平台来说,轻量方案和专用向量库之间没有固定答案。早期如果数据量不大、团队已有 PostgreSQL 运维经验,pgvector 往往能更快把事务、权限和备份纳入同一套体系;当索引规模、写入吞吐、多业务隔离和重建窗口成为主要矛盾时,专用向量库才会显示优势。选型评审应要求候选方案跑同一批数据、同一批 query、同一套 filter 和同一套回滚流程,不能拿各自最漂亮的演示结果对比。

还有一个容易忽略的问题:向量库和企业现有搜索系统的关系。很多公司已经有 Elasticsearch、OpenSearch、OLAP 搜索或数据目录检索,向量库不一定要替代它们。更常见的路线是混合检索:关键词检索负责编号、字段、专有名词和精确条件,向量检索负责语义相似和模糊表达,reranker 再统一排序。若团队直接把所有检索迁到向量库,短期看起来架构简单,长期会在精确匹配、权限过滤和可解释性上付出代价。

混合检索的工程难点在合并结果。BM25 找到的是精确词和编号,向量召回找到的是语义近邻,数据目录可能返回字段和指标对象。平台需要统一候选 ID、来源、分数、权限和证据片段,再交给 reranker 或规则排序。否则前端看到的是几路结果拼接,Trace 里也解释不清某个证据为什么排在前面。向量库选型时,要看它能否和这些已有系统组成稳定链路,单库召回只是其中一个指标。因此,向量库选型要和检索链路一起评估。一个方案即使单独 recall 很高,如果难以接入 BM25、数据目录、权限服务和引用校验,也未必适合企业平台。反过来,一个轻量方案只要能稳定支撑混合检索、metadata filter、版本化和回滚,早期就足够使用。

18.4 元数据过滤与多租户权限

向量库中的 metadata 是企业检索的安全边界之一。Qdrant 文档把 filtering 放在向量搜索概念里,Azure AI Search 支持向量搜索和过滤组合,这说明企业搜索需要把“相似度最近”和“是否允许看到”一起处理。同一个 query 在不同用户、部门、租户、时间点下应返回不同候选。metadata 设计可以扩展,但表18-4 里的最小字段集合不能缺少租户、权限、来源、版本和索引治理信息;否则向量库很快会变成无法审计的共享缓存。

表18-4:metadata 字段设计。来源:本书整理。

字段 用途 示例
tenant_id 租户隔离 tenant-a
acl 角色或部门权限 finance_manager
source_type 文档、字段、工单、图片 policy
source_version 文档版本 v3
effective_at 生效时间过滤 2026-01-01
index_version 索引治理 kb-hr-v7

权限过滤有三种常见策略。Pre-filter 在向量搜索前过滤候选集合,安全性强,但过滤太窄可能影响 ANN 召回。Post-filter 在检索后过滤,召回稳定,但可能让模型或服务看到无权候选。Hybrid filter 把租户、密级等硬边界前置,把状态、时间等软条件后置。高风险场景应优先 pre-filter,宁可召回少一些,也不要泄露候选。这里要看候选何时被系统看见。post-filter 如果只在返回给 LLM 前执行,应用层也许看不到无权内容,但检索服务、重排服务、trace、错误日志和离线评测样本可能已经接触过这些候选。金融、法务、人力和跨租户场景中,硬边界应进入检索条件本身,至少要保证无权向量不会进入后续排序和日志。对状态、时间、标签这类软条件,可以根据召回质量做 hybrid filter,但要记录每次查询实际使用了哪些过滤字段,避免排障时只看到一个 top-k 结果。

过滤策略还会改变产品体验。权限过滤后候选为空时,系统不能简单回答“没有找到相关内容”,因为真实含义可能是“当前权限下没有可见证据”。对于 DataAgent,这两种提示会引导用户采取完全不同的动作:前者让用户换问法,后者让用户申请权限或切换数据域。向量库返回的结果里应包含过滤命中、被过滤计数和空结果原因,前端和 Runtime 才能给出正确恢复路径。图 18-4 中 pre-filter、post-filter 和 hybrid filter 的差异,最好让安全和平台团队一起确认:哪些边界必须在检索前生效,哪些条件可以在召回后参与排序和过滤。

图18-4:metadata filter 与多租户权限边界

图18-4:metadata filter 与多租户权限边界。来源:本书自绘。Alt text:检索请求带租户与权限标签进入向量库,过滤条件在 ANN 搜索阶段一同生效(而非先召回后过滤),箭头标出无权数据在检索时即被排除。

18.5 索引生命周期治理

索引生命周期比建库更重要。Embedding 模型升级、chunk 策略变化、文档解析修复、权限字段变化、索引参数调整,都会让索引需要重建。平台要把索引当成版本化资产,不能当成一次性缓存。索引生命周期需要按表18-5 拆成阶段管理,这样“重建索引”才会从一次性运维动作变成可评估、可灰度、可回滚的发布流程。

表18-5:索引生命周期阶段。来源:本书整理。

阶段 关键动作 质量门禁
构建 编码文档、写入向量、写入 metadata、记录 lineage 维度、metric、model version 一致
离线评测 用 query 集测 recall、MRR、filter hit、latency 不低于 baseline,失败样例可解释
双写灰度 新旧索引同时接收更新,shadow query 对比 候选差异、权限差异可追踪
切流 小流量到全量逐步切换 p95、错误率、引用命中率稳定
回滚 保留旧索引和旧模型服务 回滚命令和数据快照可用
归档 下线旧索引,保留审计信息 查询日志和版本元数据可追溯

向量库 benchmark 不能只测查询延迟。构建时间、双写成本、切流风险和回滚窗口同样是企业选型指标。索引治理还要处理“数据已经变了,索引还没变”的灰区。权限字段变更后,旧索引里的 chunk 可能仍带着旧 ACL;文档解析器修复表格错误后,旧 chunk 仍然保留错误行列;embedding 模型升级后,相同 query 在新旧索引上的候选排序可能不同。生产系统不能把这些变化都解释成用户问题或模型波动,而要把 source hash、parser version、chunk strategy、embedding model、index parameter 和 ACL schema 写进索引版本。这样出现问题时,团队才能回答是文档源变了、解析变了、向量变了,还是过滤条件变了。生命周期治理还要给“部分重建”留接口。企业知识库很少能停机全量重建:某个部门上传新制度、某个合同模板修订、某个字段权限变化,都只影响一部分 source。平台应支持按 source、tenant、collection 或 index_version 局部重建,并在双写期间比较新旧候选差异。没有局部重建能力,团队要么长期容忍旧索引,要么频繁做高风险全量切换。

局部重建还要和删除语义配合。用户删除一份文档,不代表只从对象存储里删文件;对应 chunk、向量、倒排索引、reranker 缓存、评测样本和报告引用都可能继续存在。权限撤回也是同样问题:业务系统里角色已经变化,旧向量仍带着旧 ACL,就会在检索时制造灰区。向量库接口需要把 delete_by_sourcedelete_by_aclrebuild_by_source 做成平台能力,不能让每个应用自己清理。mini-platform 的 infra/vectorstore/ 目前保留最小接口骨架:upsert(chunks, embeddings, metadata)search(query_embedding, filters, top_k)delete_by_source(source_id)build_index(index_version)evaluate(index_version, query_set)。先把接口稳定下来,再适配 pgvector、Qdrant 或 Milvus。

18.6 工程实践:嵌入模型微调 + 向量库 benchmark

Ch17 讨论微调和重排,本章把它和向量库放进同一个 benchmark。企业需要评估的是组合效果:某个 embedding 模型配某个索引类型,在某个 metadata filter 下,能否以可接受成本召回正确证据。

experiment: vectorstore_benchmark
query_set: data/eval/enterprise_queries.jsonl
models:
  - name: bge-m3-baseline
  - name: bge-m3-finetuned
stores:
  - provider: pgvector
    index: hnsw
  - provider: qdrant
    index: hnsw
metrics:
  quality: [recall@10, mrr@10, ndcg@10]
  system: [p50_latency_ms, p95_latency_ms, qps, index_size_mb]
  governance: [filter_hit_rate, acl_violation_count, rebuild_time_min]

图 18-5 中的向量库 benchmark 报告也要沿用这个思路:质量指标、系统指标和治理指标要放在同一页。企业选型需要同时看 recall,也要看延迟、过滤、重建和回滚。

benchmark 还要覆盖写入和更新路径。很多向量库在静态数据集上表现很好,一旦遇到高频增量写入、批量删除、权限字段更新和低峰重建,延迟和召回都会变化。企业选型时应把“白天读、夜间重建、实时写入、紧急删除”这类运行节奏放进测试脚本。否则上线后才发现索引构建占满资源,RAG 查询在业务高峰期抖动,运维团队只能临时扩容。

图18-5:向量库 benchmark 报告总览

图18-5:向量库 benchmark 报告总览。来源:本书自绘。Alt text:报告页对比多个向量库在召回率、P95 延迟、写入吞吐、内存占用上的指标曲线,并标注不同索引参数下的取舍点。

18.7 向量检索的运行回放

向量库上线后,平台要能回放一次检索为什么返回这些候选。回放材料至少包括 query 文本、embedding 模型版本、索引版本、过滤条件、top-k、reranker 版本和最终被引用的 chunk。若只保存最终答案,团队无法判断错误来自向量召回、元数据过滤、重排还是回答生成。多租户过滤尤其要进入回放。企业检索常见事故应按召回了用户无权访问的候选,随后在日志、prompt 或调试界面泄露理解,不能停留在完全查不到。向量库应把权限过滤作为查询条件的一部分记录下来,而非在结果返回后由应用层临时删除。这样第38章的 Trace 才能证明无权内容没有进入模型上下文。

回放记录还要保留“被过滤掉的计数”,不能只保存最终候选。比如一次查询在权限过滤前有 80 个候选,过滤后只剩 3 个,用户看到的答案质量差,根因可能是权限过窄、metadata 写错,或者文档没有入库。没有过滤前后的数量和原因,团队会误以为 embedding 模型召回差。对 DataAgent 来说,这个差异会影响澄清策略:系统应该提示“当前权限下证据不足”,避免生成一个看似完整的答案。索引重建也要留版本。文档切分、embedding 模型、维度、归一化策略和元数据 schema 任一变化,都会改变召回结果。生产环境应支持新旧索引并行一段时间,用同一组 query 比较召回差异,再决定切流。否则一次看似普通的重建,可能让 RAG 和 DataAgent 同时出现质量波动。

版本迁移期间还要处理写入一致性。用户在灰度窗口上传新文档,旧索引和新索引是否都写入;某份文档在灰度期间被撤回,两个索引是否都删除;评测用的是哪个索引版本,线上回答又用了哪个版本。这些问题不写清楚,灰度就会变成“随机命中新旧数据”。较稳妥的做法是用组合版本记录 embedding、chunk、parser、metadata schema 和索引参数,并把写入、查询和评测都绑定到组合版本。

18.8 索引选型的生产判断

向量索引选型不能只看 benchmark 排名。企业场景更关心索引能否在数据持续更新、权限过滤、多租户隔离和低峰重建中保持稳定。HNSW、IVF、DiskANN 等索引路线各有适用条件,但最终要落到数据规模、更新频率、过滤复杂度、召回要求和运维能力。一个在公开数据集上召回率很高的索引,如果无法支持高频增量更新,放到企业知识库里可能反而不合适。

评估索引时要把过滤条件纳入测试。企业检索通常先受租户、部门、权限、文档类型、时间范围和业务域约束,然后才在可见候选中比较相似度。若索引库对元数据过滤支持较弱,就会出现两种坏结果:先过滤再检索导致召回不足,先检索再过滤导致结果被权限过滤清空。测试时应使用真实权限分布和文档分布,而非只用平均查询。索引生命周期也影响选型。增量写入、批量删除、重建、压缩、冷热分层和备份恢复都要提前验证。尤其是删除,不能只从业务库删除文档,还要处理向量索引、倒排索引、缓存和摘要。向量库是 RAG 链路的一部分,不是独立存储产品。索引选型如果没有和第20章的证据链、第27章的 Memory、以及第38章的 Trace 连接,后续很难解释一次检索为什么返回这些内容。

18.9 向量检索的质量回放

向量检索质量不能只通过人工感觉判断。一次检索结果应该能回放查询文本、query rewrite、embedding 模型版本、索引版本、过滤条件、召回候选、rerank 分数和最终进入上下文的片段。若回答错误,团队需要知道是文档没有入库、chunk 切分不当、向量召回漏掉、rerank 排错,还是上下文组装时被截断。没有这些中间证据,RAG 调优就会退化成反复改切分长度和 top_k。质量回放还要服务版本比较。更换 embedding 模型、调整 chunk 策略或重建索引后,同一批查询的召回集合会变化。平台应当比较旧版本和新版本的命中文档、片段位置、证据覆盖率和回答质量,而非只看平均相似度。对高风险知识库,还要抽查被新版本排除的旧证据,判断它们是噪声还是被错误丢弃。

这一节的重点是把向量数据库从“黑盒检索组件”变成“可诊断的知识基础设施”。Agent 平台依赖它提供事实证据,用户也会基于这些证据做业务判断。只要检索证据不可回放,后续生成层再稳,也无法建立可信回答。质量回放也能减少无效调参。没有回放时,团队遇到错误回答往往先改 prompt、加 top-k 或换模型;有了回放后,可能会发现正确文档根本没有入库,或者进入了候选但被权限过滤,或者进入上下文前被摘要阶段截断。不同根因对应不同修复动作。把这些证据固定下来,RAG 调优才会从经验尝试变成工程诊断。

18.10 向量库的容量与成本治理

向量库上线后,容量增长通常比团队预期更快。文档版本、切分副本、多模型 embedding、多租户索引、评测样本和缓存都会占用存储。若没有治理,团队会在召回质量下降或成本突然升高时才开始清理。更稳妥的方式是从一开始就记录每个向量的来源、版本、租户、业务域、过期策略和引用状态。成本治理不能简单删除低频文档。低频文档可能是关键合规证据,也可能只在事故复盘时使用。平台应把内容分成热知识、温知识和冷证据:热知识进入在线索引,温知识可以降低副本或使用较慢索引,冷证据保留原文和元数据,在需要时再进入检索链路。这样既能控制成本,也不会破坏证据完整性。向量库治理还要和文档生命周期连接。文档撤回、权限变化、合同到期、政策替换时,索引也要同步更新。只更新业务库而忘记向量索引,是 RAG 系统常见的安全和质量风险。向量库在平台里应按数据基础设施治理,发布、回滚、审计和删除都要有明确接口,不能被当作应用侧附属缓存。

容量治理最终也会影响召回质量。为了省成本盲目压缩向量、合并索引或降低副本,可能让低频但关键的文档更难被召回。平台应把成本调整纳入回归评测,确认压缩前后关键问题仍能命中证据。这样成本优化才不会悄悄牺牲可信回答。成本治理还要给业务一个可解释的选择。高频知识库可以使用更高副本、更快索引和 reranker;低频归档证据可以保留原文、metadata 和冷索引,在需要时再进入在线检索;临时项目知识可以设置过期时间,到期后转入归档或删除。平台需要把成本、响应速度和证据完整性变成可讨论的策略,并把每次策略调整纳入评测和发布记录。因此,向量库的运维指标不应只看存储和 QPS,还要看索引版本、召回覆盖、删除延迟和权限过滤后的空结果比例。这些指标能更早暴露知识基础设施的问题。

18.11 索引发布与删除一致性

向量索引的发布不应被视为后台运维动作。它会改变 RAG、DataAgent、Memory 和知识助手看到的候选证据,也会改变评测样本的命中路径。一个成熟的发布流程至少要记录四类版本:文档解析版本、chunk 策略版本、embedding 模型版本和索引参数版本。只有这些版本被组合起来,团队才能解释一次召回变化到底来自文档、切分、向量表示,还是索引搜索策略。

发布前要准备固定的回放集。回放集不只包含高频问答,还要包含长尾实体、权限边界、旧制度、新制度、同名指标、相似合同条款和已知失败样例。新索引构建完成后,平台应同时运行旧索引和新索引,对比候选文档、候选顺序、过滤前后数量、引用覆盖率和 p95 延迟。差异不一定代表新版本错误,但差异必须能解释。比如新索引召回了更新版本的制度,旧索引召回了历史制度,这是预期变化;如果新索引把某个受限部门的材料排到前列,就要检查 ACL schema、过滤时机和日志脱敏。

删除一致性比发布更容易被忽视。用户撤回文档、合同到期、员工离职、权限角色变更或租户删除数据时,平台必须同时处理原文、chunk、向量、关键词索引、reranker 缓存、评测样本和报告引用。只删除对象存储里的 PDF,旧向量仍可能在检索中出现;只删除向量,旧摘要或旧评测样本仍可能影响后续回答。删除接口应支持按 source、tenant、ACL、index_version 和 retention policy 执行,并在 Trace 中留下删除事件。这样安全审计才能确认敏感材料已经退出在线检索链路。

回滚也要有业务语义。旧索引保留一段时间用于事故恢复,但旧索引可能包含旧权限、旧制度或旧解析错误。平台回滚时不能只切回旧 collection,还要确认旧版本是否仍满足当前权限和合规要求。若回滚会恢复已撤回材料,系统应允许局部回滚:保留旧索引参数和旧 embedding 服务,但应用最新 ACL 与删除清单。这个能力比单纯保留一份快照更难实现,却能避免“为恢复质量而恢复风险”的问题。

对早期平台来说,索引发布可以从较小的治理面开始:每次构建生成发布记录,每次切流绑定回放报告,每次删除生成可审计事件,每次回滚记录影响范围。只要这四类记录稳定存在,后续再接入更复杂的向量库、分片策略和冷热分层,平台仍然能保持证据可解释。

18.12 检索事故的归因分层

向量库事故复盘要先分层归因。第一层看知识是否存在:文档是否入库、解析是否成功、chunk 是否保留关键结构。第二层看可见性:租户、部门、密级、时间范围和文档状态是否把候选正确纳入或排除。第三层看召回与排序:embedding、索引参数、hybrid 检索和 reranker 是否把正确片段推到可用位置。第四层看上下文组装:最终给模型的片段是否包含关键条件,是否被低价值材料挤出窗口。第五层才看生成:模型是否忠实使用了证据。

这种分层能避免把所有问题都推给向量模型。用户投诉引用了旧制度,根因可能是文档生命周期;DataAgent 漏掉字段定义,可能是 chunk 切分或 metadata 错误;普通员工看到无权材料,可能是过滤时机和日志脱敏问题。每次事故都应留下分层标签和修复动作,后续评测集按这些标签组织。这样下一次重建索引、调整 chunk 或更换 reranker 时,团队可以看到具体失败类型是否减少,而不是只看平均 recall。

18.13 知识入库后的质量复盘

知识入库完成后,平台还要复盘解析质量、引用质量和权限质量。很多知识库问题不会在导入当天暴露,而是在用户提出具体问题时出现:段落被切断,表格标题和表体分离,OCR 把金额或日期识别错,扫描件页码丢失,附件版本混在一起,或者无权文档进入候选结果。若复盘只看“导入成功多少文件”,知识工程会停在搬运阶段,无法支撑 RAG、Agent 和 DataAgent 的证据链。

复盘材料应从失败问答和人工修正中收集。用户指出引用不对、人工改选文档、回答缺少页码、审批人要求补来源、RAG 生成了无法追溯的结论,这些都应回到知识库治理。每个样本要记录文档版本、解析器版本、chunk id、页码、标题层级、表格结构、权限标签和修复动作。这样团队才能判断问题来自 OCR、版面解析、chunk 策略、metadata、权限过滤,还是业务文档本身缺少结构。

知识工程还要有发布节奏。新文档类型、新 OCR 模型、新 chunk 规则、新权限字段进入生产前,应先用一组代表性文档回放:制度 PDF、扫描合同、财务表格、图片型报告、邮件附件和多版本文档。回放通过后,再逐步扩大到更多知识域。这样第18章的知识库治理才能和第16章 embedding、第20章 RAG、第38章 Trace、第39章 Eval 连接起来。知识库承担后续智能链路的证据来源,需要保持可引用、可解释、可修复。

18.14 知识库目录与责任分工

知识库治理需要目录。目录记录每个知识域的 owner、文档来源、更新频率、解析策略、权限标签、引用格式、质量样本和下线条件。没有目录时,知识库会变成不断堆积的文件集合,RAG 和 Agent 只能从结果里猜测材料是否可信。目录不必一开始很复杂,但要能回答三个问题:这份知识由谁负责,什么时候更新,出了引用问题找谁修。

责任分工也要写清。业务团队负责材料真实性和更新节奏,数据或知识工程团队负责解析、chunk、metadata 和索引,安全团队负责权限标签和外发边界,平台团队负责检索、引用、Trace 和评测回流。若这些责任混在一起,常见结果是文档有人上传、没人维护,检索有人使用、没人解释,错误有人发现、没人修复。

知识库目录还要支持下线。过期制度、旧合同模板、废弃产品手册、已替换的流程说明,都不应长期留在在线索引里。下线时要检查历史报告和 Trace 是否仍需引用,必要时保留静态归档,同时阻止新 Agent 继续使用。这样知识库既能沉淀经验,也能避免过期资料污染后续回答。

18.15 向量库变更的灰度窗口

向量库变更需要灰度窗口。索引算法、embedding 版本、分片策略、metadata 字段、过滤顺序和混合检索权重都会改变候选集合。变更看起来只是基础设施调整,用户感受到的却是“资料找不准”或“引用变了”。因此,灰度时要同时保留旧索引和新索引,对同一批 query 比较候选、分数、过滤结果、进入上下文的片段和最终引用。

灰度窗口还要保护权限。新索引可能正确召回更多文档,也可能把无权限候选推到更靠前的位置,虽然最终被过滤掉,但已经暴露出策略顺序的风险。平台应记录被过滤候选和原因,特别是高分但无权限的结果。若这类结果增多,需要检查 metadata 写入、租户隔离和过滤执行位置,而不是只看最终回答是否泄漏。

早期向量库灰度可以按知识库或租户切流。先用影子查询记录差异,再让内部用户或低风险知识库进入新索引,最后扩大范围。旧索引保留到新版本稳定后再归档,并记录哪些历史 Trace 仍依赖旧索引。这样向量库变更才有回滚路径,也能让检索质量变化被解释。

18.16 索引分片与租户隔离的运行校验

向量库的多租户隔离不能只依赖应用层过滤。知识库规模扩大后,平台通常会按租户、知识域、权限等级、语言、文档类型或 embedding 版本做分片。分片能降低查询成本,也能减少误召回,但它会引入新的运行风险:路由选错分片、metadata 写入不完整、过滤顺序变化、索引重建漏掉某个租户、删除请求只清理了主索引却没有清理副本。这些问题在功能测试里不一定出现,生产里却会直接影响权限和引用可信度。

运行校验要同时检查召回和隔离。平台可以为每个租户准备允许样本、拒绝样本和边界样本。允许样本确认正确材料能被召回,拒绝样本确认其他租户或无权限文档不会进入候选,边界样本检查共享知识、集团制度、跨部门项目和临时授权材料。测试结果要覆盖最终答案、候选集合、过滤原因、重排结果和进入上下文的片段。若无权限文档经常出现在高分候选里,即使最终被过滤,也说明分片或 metadata 策略需要复核。

分片策略还要和删除、迁移、重建联动。租户迁移到新索引时,旧索引要有清理计划;文档删除时,主索引、缓存、reranker 样本和历史引用都要标记;embedding 模型升级时,新旧分片不能混合比较分数。对高风险知识库,重建期间可以保留只读旧索引,同时让新索引走影子查询。这样用户继续得到稳定回答,平台也能观察新索引是否改变权限命中和引用质量。

早期可以把隔离校验接入发布门禁。每次新增租户、调整分片规则、升级 embedding 或重建索引,都跑一组租户隔离样本,输出召回、过滤和上下文差异。这个门禁不会替代安全评审,但能把向量库的权限风险从“上线后看有没有泄漏”提前到“发布前看候选是否已经异常”。这才符合企业知识检索的风险边界。

18.17 检索缓存与索引版本证据

向量检索进入生产后,缓存会影响证据解释。用户连续追问时,系统可能复用上一轮召回结果;高频知识问答中,平台可能缓存 TopK 文档片段;报告生成时,多个段落可能共享同一组检索结果。缓存能降低延迟和成本,但如果没有索引版本、过滤条件和权限上下文,后续复盘就无法判断回答引用的是哪一版知识。

检索缓存至少要记录查询文本、改写后的检索 query、嵌入模型版本、索引版本、租户过滤、元数据过滤、TopK 结果、得分、生成时间和失效条件。若知识库重新分块、重新嵌入或删除文档,旧缓存应按版本失效;若用户权限变化,缓存也不能继续复用。对于高风险知识问答,缓存结果还应记录是否经过人工复核或报告发布。这样缓存不会把旧文档片段当作新证据继续传播。

缓存策略要和索引生命周期配合。索引灰度期间,平台可能同时存在旧索引和新索引;如果缓存没有版本标签,用户会在同一会话中看到两个索引的混合结果。删除文档时也要处理缓存,否则已删除内容仍可能被回答引用。平台应让 Retriever、Generator 和 Trace 都能看到 index_versioncache_source,让回答层知道当前证据来自实时检索、同会话缓存还是历史 artifact。

早期可以先对核心知识库启用检索证据记录。每次缓存命中都写入 Trace,并保留可回放的索引版本和文档引用。这样第18章的向量库治理会连接到第20章 RAG 证据链和第38章 Trace,而不是把缓存当作纯性能优化。

18.18 向量索引变更的线上灰度

向量索引变更会影响用户看到的证据。更换 embedding 模型、调整 chunk、改变 metadata 过滤、增加 hybrid 权重、重建索引或更新 reranker,都可能让召回候选发生变化。若平台一次性替换全量索引,线上答案变化很难解释。索引变更应像模型变更一样灰度发布,保留旧索引和新索引的对照样本。

灰度时要比较证据而不只比较答案。平台应记录旧索引召回的文档、新索引召回的文档、交集、差异、引用覆盖、权限过滤和最终回答变化。若新索引让答案更完整,但丢掉了某些高风险制度条款,不能直接发布;若新索引召回更广,却增加了无关候选,生成阶段可能更容易混淆。索引评估要同时看召回、精度、引用可用性和成本。

早期可以维护 shadow retrieval。真实请求仍使用旧索引回答,同时后台用新索引检索并记录差异。差异进入评测样本和人工抽检。等关键样本通过后,再按租户、知识域或任务类型切换。这样向量索引变更会变成可解释的发布动作,而不是一次不可回放的重建。

18.19 向量索引的线上健康信号

向量索引进入生产后,新增能力不能只看功能是否可用,还要看运行证据能否被不同角色复用。平台需要把召回样本、过滤命中、延迟、索引版本、删除回执和缓存命中记录成稳定字段,并和发布单、Trace、评测样本以及事故记录关联起来。这样一次线上问题发生后,团队可以沿着同一组事实判断影响范围、责任归属和修复顺序,而不是在模型日志、业务日志和人工说明之间来回拼接。

这类证据还要服务相邻章节的能力。它和第16章嵌入模型、第20章 RAG 和第21章知识工程相连:上游能力提供输入假设,下游能力使用执行结果,治理能力负责保存证据和复审结论。若这些材料没有统一编号和版本,章节里讨论的工程能力在生产中会被拆散。业务 owner 只能看到用户投诉,平台 owner 只能看到系统错误,安全或合规团队只能看到事后说明,最后很难判断问题到底来自数据、模型、工具、流程还是组织责任。

生产环境中常见的风险包括召回下降被当成模型问题、删除只影响主库、租户过滤在缓存层失效。这些问题在演示阶段不明显,因为演示通常只覆盖成功路径;上线后,用户会带来边界问题、重复请求、权限变化和长时间运行状态。平台团队应把失败样本纳入发布节奏,记录哪些样本需要阻断发布,哪些样本可以通过降级处理,哪些样本需要业务 owner 接受剩余风险。

向量库运营应同时看质量、权限和生命周期,不能只看吞吐与延迟。这份记录不需要复杂,但要包含时间、版本、owner、样本、处置动作和下次复查条件。没有这些字段,复盘会停留在口头经验;有了这些字段,平台才能把一次问题转成后续发布、评测和培训材料。

早期平台可以从少量高风险场景开始。先选择调用量高、业务影响大或涉及敏感数据的路径,要求每次变更都留下证据包,再逐步推广到普通场景。这样章节里的能力不会停留在概念层,而会成为可运行、可解释、可退回的工程系统。

18.20 索引退役前的影响扫描

向量索引退役前要做影响扫描。一个旧索引可能已经不再服务主路径,却仍被某些低频 Agent、评测样本、历史报告或灰度租户引用。直接删除会让问题在很晚之后才暴露。平台应先扫描调用日志、配置、缓存、评测集和文档链接,确认哪些路径仍依赖旧索引。

影响扫描还要说明替代路径。若新索引使用不同嵌入模型,召回样本要重新跑;若元数据字段改变,权限过滤样本要重新验收;若历史 artifact 需要解释旧答案,旧索引版本和构建参数应保留在审计记录中。早期可以把索引退役做成小型发布流程,保证知识检索能力可以收缩,也能解释历史结果。

本章小结

向量库的价值不在存放向量本身,而在于把语义候选检索做成可扩展、可治理、可回滚的平台能力。HNSW、IVF、PQ 等算法路线要和召回、成本、延迟一起评估;metadata 过滤、多租户权限、索引版本、重建和 benchmark 也要放进同一套生命周期。向量库负责候选检索,不负责 embedding 生成,也不负责最终业务判断。ANN 参数需要和 embedding 模型、维度、过滤策略、top-k、reranker 一起调优。高风险场景中,metadata filter 是权限边界的一部分,通常应优先采用 pre-filter。索引版本是生产资产。模型、chunk 策略或权限过滤方式变化时,应通过重建、双写或灰度完成迁移,而非把新旧向量混在同一个空间里。

参考文献

  • pgvector: https://github.com/pgvector/pgvector

  • Milvus Index Documentation: https://milvus.io/docs/index.md

  • Qdrant Filtering: https://qdrant.tech/documentation/search/filtering/

  • Weaviate Documentation: https://weaviate.io/developers/weaviate

  • Vespa Approximate Nearest Neighbor Search: https://docs.vespa.ai/en/nearest-neighbor-search.html

  • Azure AI Search Vector Search: https://learn.microsoft.com/en-us/azure/search/vector-search-overview