RAG 数据面与向量检索基础设施¶
RAG 不是“部署一个向量数据库”。完整数据面包括文档摄取、解析、切分、Embedding、索引、检索、过滤、Rerank、上下文组装、权限和反馈回流。Kubernetes 可以管理这些服务的生命周期,但数据一致性和检索质量需要单独设计。
1. 完整数据链路¶
数据源
文件、对象存储、数据库、Wiki、事件流
│
▼
摄取与解析
去重、OCR、结构解析、权限提取、PII 处理
│
▼
Chunk 与 Embedding
版本化切分规则、Embedding 模型、Batch 推理
│
▼
索引构建
Vector + Metadata + Keyword/Hybrid Index
│
▼
在线检索
Query Rewrite → Embed → Filter → Retrieve → Rerank
│
▼
Context Builder → LLM Gateway/Inference
│
▼
引用、反馈、质量评估和数据更新
每一步都要带版本和租户权限,才能回答某次生成使用了哪些文档和索引。
2. 控制面与数据面¶
控制面¶
- 数据源注册和权限;
- Pipeline/Job 定义;
- Embedding/Chunk 版本;
- Collection/Index 生命周期;
- 发布、回滚和别名;
- 数据保留、删除和审计;
- 质量评估和变更审批。
数据面¶
- 文档读取和解析;
- Embedding 批推理;
- 向量/关键词写入;
- 在线 Query、Filter、Rerank;
- Context 构建和缓存;
- 实时增量更新。
不要让在线 API 进程同时负责大规模重建索引。离线构建与在线读路径应解耦。
3. 数据版本¶
一次可重现的索引版本至少记录:
Source snapshot / change cursor
Parser version
Chunk strategy and parameters
Embedding model + revision + precision
Vector dimension and distance metric
Metadata schema
Index algorithm and parameters
Reranker model
Security/ACL extraction version
Build job and evidence
只记录 Collection 名称无法重现检索结果。
4. Chunk 不是纯应用参数¶
Chunk 大小、重叠和结构会影响:
- 文档覆盖和语义完整性;
- Embedding 计算量;
- 向量数量与存储;
- 检索延迟和召回;
- Rerank 成本;
- 最终 Prompt Token;
- 引用可解释性;
- 数据删除粒度。
每次 Chunk 策略变化通常需要新索引版本,不应原地混写。
5. Embedding 服务¶
Embedding 可以是:
- 在线同步服务;
- Kafka/队列驱动的异步 Worker;
- Kubernetes Job/Spark/Ray 批处理;
- 托管 API;
- GPU、CPU 或专用加速器服务。
平台指标:
- documents/chunks/tokens per second;
- Batch 大小、队列和 GPU 利用率;
- 失败、重试、毒数据和 Dead Letter;
- 模型版本和输出维度;
- 单位文档/Token 成本;
- 增量数据新鲜度。
Embedding 模型或维度变化通常需要重建整个索引,发布前要估算时间和双份容量。
6. 向量数据库选型维度¶
| 维度 | 要回答的问题 |
|---|---|
| 数据规模 | 向量数、维度、Metadata、增长和保留 |
| 查询 | Top-K、Filter、Hybrid、范围、Multi-vector |
| 一致性 | 写入后多久可见,读写一致要求 |
| 索引 | HNSW、IVF、DiskANN、量化、构建时间 |
| 扩展 | 分片、复制、重平衡和热点 |
| 存储 | 内存、NVMe、对象存储、共享存储 |
| 租户 | Collection、Partition、Payload Filter、物理隔离 |
| 运维 | Operator、备份、升级、指标和灾备 |
| 成本 | 内存占用、存储、查询 CPU/GPU、写放大 |
不要仅根据单次 ANN Benchmark 选择。Metadata Filter、增量写入、删除、备份和故障恢复往往更决定生产体验。
7. 常见实现¶
PostgreSQL + pgvector¶
适合已有 PostgreSQL 运维体系、中小规模、事务 Metadata 和向量在同一数据库的场景。优点是 SQL、权限和备份成熟;超大规模 ANN 或高并发需要仔细验证分区、索引和扩展能力。
Qdrant¶
面向向量检索,支持 Shard、Replica、Payload Filter 和分布式部署。自托管时要提前规划 Shard 数、复制、重平衡、快照和 Load Balancer;启用集群模式不会自动让已有数据完成复制。
参考:Qdrant Distributed Deployment
Milvus¶
面向大规模向量检索,采用计算、存储和协调组件分层架构。适合需要横向扩展和复杂索引的场景,但组件更多,必须评估元数据、消息/WAL、对象存储和各 Worker 的运维成本。
OpenSearch/Elasticsearch¶
适合已有搜索平台并需要 Keyword、Filter、聚合和 Vector Hybrid Search 的团队。要关注 Segment、Merge、Heap、Shard 数和向量索引的内存/磁盘成本。
选择托管服务还是自托管,取决于数据主权、延迟、成本和团队是否真正具备状态数据库运维能力。
8. Kubernetes 部署原则¶
向量数据库是状态系统。最低要求:
- StatefulSet/Operator 管理稳定身份;
- 反亲和或拓扑分散副本;
- 合适的 StorageClass、IOPS 和扩容能力;
- PDB 与真实 Quorum 一致;
- Init/Readiness/Liveness 理解数据库语义;
- 滚动升级和版本偏差有官方支持;
- 快照、逻辑备份和恢复演练;
- 管理、内部复制和客户端端口分离;
- NetworkPolicy、TLS、认证和 Secret;
- 容量、水位和 Compaction 监控。
Kubernetes 重新创建 Pod 不等于数据已经恢复或 Replica 已重新同步。
9. 分片与复制¶
Shard¶
用于横向扩展容量和查询吞吐。过少会形成热点,过多会增加 Metadata、连接和 Fan-out。
Replica¶
用于可用性和读吞吐。复制因子要结合故障域放置,多个副本落在同一节点没有节点级容灾价值。
Rebalance¶
增加节点后,数据是否自动移动取决于产品和部署方式。重平衡会消耗网络、磁盘和 CPU,必须限制速度并观察在线延迟。
Quorum¶
PDB、节点维护和副本数必须与数据库一致性协议匹配。错误的 PDB 既可能阻止所有维护,也可能允许同时驱逐过多副本。
10. 索引发布模式¶
推荐 Blue/Green:
生产别名: knowledge-current → index-v41
离线构建 index-v42
→ 完整性验证
→ 检索质量评估
→ 性能和容量验证
→ 小流量 Shadow/Canary
→ 原子切换别名到 index-v42
→ 保留 index-v41 回滚
避免在生产 Collection 中原地大规模修改 Chunk、Embedding 或 Index 参数。
11. 增量更新¶
需要处理:
- Upsert 幂等键;
- Source Cursor/Offset;
- 文档删除和权限撤销;
- 重复事件和乱序;
- Embedding 暂时失败;
- 新旧版本双写;
- 数据新鲜度 SLO;
- Poison Document 隔离;
- Schema Evolution。
删除比新增更难:原文被删除后,所有 Chunk、Embedding、Cache、索引副本和备份保留策略都要一致执行。
12. Hybrid Search 与 Rerank¶
常见路径:
Query
├── Dense Vector Search
├── Sparse/BM25 Search
└── Metadata/ACL Filter
→ Fusion
→ Reranker
→ Context Selection
Reranker 通常比向量相似度更精确,但增加模型推理、延迟和成本。应记录各阶段 Top-K、耗时和被淘汰原因,才能优化质量。
13. 权限过滤¶
RAG 最严重的基础设施风险之一是检索到用户无权读取的文档。
原则:
- ACL 在摄取时进入 Metadata,但查询时仍基于实时身份;
- Filter 必须在检索层生效,不能只在 LLM 输出后过滤;
- 租户 ID 由可信网关注入,不接受客户端任意声明;
- 权限变化和删除有新鲜度 SLO;
- Cache Key 包含租户、权限和索引版本;
- 高隔离租户使用独立 Collection/实例/集群;
- 记录某次回答实际检索的文档 ID 和版本。
14. 缓存¶
| 缓存 | Key | 失效条件 |
|---|---|---|
| 文档解析 | Source Digest + Parser Version | 源文档或解析器变化 |
| Embedding | Text Digest + Model Revision | 文本或模型变化 |
| Query Embedding | Query + Model + Tenant Policy | 模型/策略变化 |
| Retrieval Result | Query + Filter + Index Version | 索引/权限变化 |
| Rerank | Candidates + Reranker Revision | 候选/模型变化 |
| LLM Response | 完整上下文与生成配置 | 任一输入或策略变化 |
权限敏感缓存必须防止跨租户命中。
15. 备份与灾备¶
需要分别备份:
- 原始/规范化文档;
- Source Cursor 和 Pipeline 状态;
- Collection Schema 和 Index 参数;
- 向量数据与 Metadata;
- 数据库快照/WAL;
- Embedding/Chunk/Parser 版本;
- 权限映射;
- 发布别名。
如果能够从权威文档重建索引,也要测量重建时间是否满足 RTO。数十亿向量重建可能远超数据库快照恢复时间。
16. 可观测性¶
离线¶
- 摄取延迟、吞吐、失败和重试;
- 解析、Chunk、Embedding 各阶段耗时;
- Source 到 Index 的数据新鲜度;
- 索引构建时间和资源;
- 删除/权限更新积压;
- 每版本数据量和成本。
在线¶
- Query、Filter、ANN、Rerank 各阶段延迟;
- Recall/Precision/nDCG/MRR 或任务质量;
- Top-K、命中、空结果和降级;
- Shard/Replica/节点热点;
- Cache 命中;
- 最终 Context Token 和引用正确率;
- 每租户 QPS、数据量和成本。
17. 故障与降级¶
| 故障 | 可选降级 |
|---|---|
| Vector DB 不可用 | 明确失败或切只读副本,不凭空生成 |
| Reranker 超时 | 返回未 Rerank 的受控 Top-K |
| Embedding 服务故障 | 队列积压,保持旧索引 |
| 新索引质量失败 | 保持生产别名不切换 |
| 单 Shard 热点 | 限流、扩副本、重新分片 |
| 权限服务不可用 | Fail Closed,不返回可能越权文档 |
| Source 延迟 | 暴露数据新鲜度而非静默 |
| LLM 服务故障 | 检索结果仍需保护,不写入普通错误日志 |
18. 生产检查清单¶
- Source、Parser、Chunk、Embedding、Index 和 Reranker 全部版本化。
- 离线索引构建与在线查询解耦。
- 向量数据库按状态系统设计,而不是普通 Deployment。
- Shard、Replica、Quorum、PDB 和故障域相互一致。
- 新索引通过 Blue/Green 别名发布并可回滚。
- 增量更新支持幂等、删除、乱序和 Poison Data。
- ACL 在检索前执行,Cache 不会跨租户泄漏。
- 备份恢复和从源重建的实际 RTO 已测量。
- Trace 能分解 Embed、Retrieve、Rerank 和 LLM。
- 检索质量、新鲜度、延迟和成本都有 SLO。