深入研究RAG: 向量数据库 原理&选型

前言

大家好,这里是程序员阿亮,在上一篇我们讲解了RAG的Embedding,那么我的离线处理部分也就基本讲完了,但是,实际上,处理是讲完了,那么存储呢?

我们的向量的存储一般不存储在常规的传统数据库,而是会有特定的向量数据库来存储。

并且会有不同的搜索或者检索策略与算法。

接下来为大家讲解!

一、前置知识

1. 向量(Vector)vs. 嵌入(Embedding)

  • 向量 (Vector) :数学概念。一组有序的数字列表,例如 [0.1, 0.5, -0.9]。它本身没有意义,只是数据的数值化表示
  • 嵌入 (Embedding) :工程/算法过程。将非结构化数据(文本、图片)转换 为向量的过程。
    • 误区:"存的是 Embedding"。
    • 正解:"存的是向量,这个向量是通过 Embedding 模型生成的"。
    • 关键点 :向量数据库存储的是向量数值 ,不关心它是通过 BERT、CLIP 还是其他模型生成的,但模型的一致性至关重要(不同模型生成的向量空间不互通)。

2. 精确搜索 (KNN) vs. 近似搜索 (ANN)

  • KNN (K-Nearest Neighbors)暴力扫描 。计算查询向量与数据库中所有 向量的距离,排序后取 Top-K。
    • 优点:100% 准确。
    • 缺点:数据量过大时(如 >10 万),延迟不可接受(秒级甚至分钟级)。
  • ANN (Approximate Nearest Neighbor)策略性跳过 。通过索引结构,跳过 大部分不可能相似的向量,只计算一小部分候选集。
    • 优点:速度极快(毫秒级),支持亿级数据。
    • 缺点:牺牲少量精度(召回率可能从 100% 降到 95%~99%)。
    • 核心权衡用可接受的精度损失,换取指数级的速度提升

3. 召回率 (Recall) vs. 延迟 (Latency)

  • 召回率:ANN 找到的结果中,有多少是真正属于"精确 Top-K"的?(例如:精确前 10 名里,ANN 找到了 9 个,召回率 90%)。
  • 延迟:查询耗时。
  • 关系 :通常呈反比。想要更高召回率,就需要搜索更多候选节点,延迟必然增加。企业落地的核心调优就是寻找这两者的平衡点

二、ANN 主流算法原理

向量数据库的性能差异,本质上是索引算法的差异。以下是四大主流技术路线的原理详解。

1. 基于树的结构 (Tree-based)

  • 代表算法:KD-Tree, Ball Tree。
  • 原理:像二分查找一样,将空间不断切分。查询时根据距离判断走左枝还是右枝。
  • 现状已基本淘汰
  • 原因维度灾难。在低维空间(<20 维)效果很好,但在高维空间(>100 维,如向量数据库常见的 768 维)下,树的剪枝能力失效,退化为准暴力搜索,性能急剧下降。
  • 适用:仅适用于极低维特征检索,不推荐用于现代向量数据库。

2. 基于哈希 (Hash-based)

  • 代表算法:LSH (Locality Sensitive Hashing, 局部敏感哈希)。
  • 原理 :设计一种哈希函数,使得相似的向量有大概率哈希到同一个桶(Bucket)里。查询时只计算同桶内的向量。
  • 优点:理论上有数学保证,构建速度快,内存占用极低。
  • 缺点召回率较低,参数敏感(哈希函数数量、桶大小难调),难以支持复杂的元数据过滤。
  • 适用 :超大规模数据(十亿级)的粗筛阶段,或对精度要求不高的场景。

3. 基于聚类 (Clustering-based)

  • 代表算法IVF (Inverted File Index, 倒排文件索引)
  • 原理
    1. 训练阶段 :用 K-Means 算法将所有向量聚成 N 个簇(Cluster),每个簇有一个中心点。
    2. 查询阶段 :计算查询向量与 N 个中心点的距离,只搜索最近的 M 个簇内的向量。
  • 优点 :内存占用可控,支持磁盘卸载,构建速度较快。
    • 参数nlist (簇数量), nprobe (搜索多少个簇)。
  • 缺点 :召回率依赖 nprobe 大小,如果目标向量在簇的边缘,可能被漏掉。
  • 适用内存受限 、数据量极大、对成本敏感的场景。

4. 基于图 (Graph-based) 当前主流

  • 代表算法HNSW (Hierarchical Navigable Small World, 分层小世界图)
  • 原理
    1. 建图:将向量视为节点,相似向量之间连边。
    2. 分层:建立多层图。顶层稀疏(长距离连接,类似"高速公路"),底层稠密(短距离连接,类似"小区道路")。
    3. 导航:查询从顶层入口进入,快速定位到大致区域,然后逐层向下,在底层精细搜索。
  • 优点当前综合性能最强。查询速度极快,召回率极高(通常 >98%)。
  • 缺点内存占用大(需要存储图结构),构建索引速度慢,删除数据复杂(图结构破坏需重建)。
  • 适用对延迟敏感 、内存充足、追求高精度的生产环境。

三、主流向量数据库选型

不同数据库选择的算法决定了其性能特征和适用场景。

数据库 核心索引算法支持 算法策略特点 典型应用场景
pgvector IVFFlat , HNSW 保守稳健。早期仅支持 IVF,0.5.0+ 支持 HNSW。依赖 Postgres 内存管理。 中小规模数据、已有 PG 架构、强一致性要求场景。
Milvus IVF, HNSW, ANNOY, PQ, SCANN 大而全。支持几乎所有主流算法,可针对不同 Collection 配置不同索引。 企业级大规模数据、多模态、需要灵活调优的场景。
Qdrant HNSW (默认), Payload Index 极致性能 。专注 HNSW 优化,特别强化了向量 + 元数据过滤的性能(过滤后检索)。 实时检索、复杂过滤条件、推荐系统。
Pinecone 专有索引 (Pod 架构) 黑盒托管。不暴露具体算法,底层基于 HNSW+ 量化优化。按 Pod 大小计费。 零运维需求、快速上线、预算充足的云原生场景。
Elasticsearch HNSW , Int8 Quantization 混合检索 。8.0+ 版本引入向量,强项在于向量 + 全文检索 (BM25) 的混合能力。 日志分析 + 向量搜索、电商搜索(关键词 + 语义)。
Weaviate HNSW 对象存储。将向量作为对象属性,支持 GraphQL 查询,强调语义理解。 知识图谱、语义搜索应用。

重点解析:pgvector 的算法选择

  • IVFFlat(聚类)
    • 适合:数据量较大(>10 万),构建索引速度要求快,内存有限。
    • 缺点 :查询速度不如 HNSW,需要调优 listsprobes
  • HNSW(图)
    • 适合:对查询延迟要求高(<10ms),内存充足。
    • 缺点:构建索引慢,内存占用高(每个向量需额外存储边信息)。
    • 现状 :pgvector 0.5.0 后 HNSW 成为生产环境首选,但需注意 Postgres 的 maintenance_work_mem 配置,否则建索引易失败。

重点解析:Milvus 的算法选择

  • 灵活性:Milvus 允许你在创建集合时指定索引类型。
  • IVF_PQ:当数据量达到亿级,内存无法容纳全量 HNSW 时,Milvus 会自动推荐或用户可手动选择 IVF_PQ,通过量化压缩数据,换取磁盘存储能力。
  • DiskANN:支持将索引存储在磁盘上,通过内存映射访问,解决内存瓶颈。

四、选型决策体系

选型不应只看"谁最快",而应看"谁最适合你的约束条件"。

1. 数据规模维度

  • < 100 万向量pgvectorQdrant。单机足以应付,pgvector 运维成本最低。
  • 100 万 ~ 1 亿向量MilvusQdrant 集群。需要独立的向量服务,考虑内存成本。
  • > 1 亿向量Milvus 分布式Pinecone。必须考虑分片、量化压缩、磁盘索引。

2. 查询延迟要求

  • < 10msHNSW 索引 (Qdrant, Milvus-HNSW, pgvector-HNSW)。必须全内存。
  • 10ms ~ 100msIVF 索引磁盘索引。可接受少量精度损失换取成本降低。
  • > 100ms:批量离线分析场景,算法选择不敏感。

3. 过滤能力需求

  • 强过滤 (如:向量相似 AND 时间>2023 AND 类别=IT):Qdrantpgvector
    • 原理:Qdrant 的 Payload 索引和 pgvector 的 SQL WHERE 子句能在检索前/中高效过滤。
    • 避坑:Milvus 早期版本过滤性能较弱(先检索后过滤),新版已优化,但复杂 SQL 仍不如 PG 原生。
  • 弱过滤:Pinecone 或 基础 Milvus。

4. 运维与成本

  • 零运维/高预算Pinecone。按用量付费,无需关心索引参数。
  • 有运维团队/控成本Milvus/Qdrant 自建。需承担服务器成本及人力成本。
  • 复用现有基建pgvector。无需新组件,利用现有 PG 备份/监控体系。

五、落地考虑的关键问题

在企业生产环境落地向量数据库,技术原理只是基础,以下工程化问题往往决定项目成败。

1. 数据一致性难题(Dual-Write Problem)

  • 问题:业务数据在 MySQL/PG,向量数据在向量库。当业务数据更新/删除时,如何保证向量库同步?
  • 风险
    • 数据不一致:用户删除了文档,向量库还能搜到(泄露风险)。
    • 双写失败:写成功业务库,写失败向量库,导致数据丢失。
  • 解决方案
    • 方案 A(CDC 同步) :使用 Canal/Flink CDC 监听业务库 Binlog,异步同步到向量库。推荐,解耦且可靠。
    • 方案 B(事务消息):本地消息表 + 定时补偿任务。
    • 方案 C(pgvector 优势) :直接使用 pgvector,向量与业务数据在同一事务中,天然强一致,无同步问题。

2. 召回率监控与"黄金数据集"

  • 问题:如何知道向量搜索变差了?(例如 Embedding 模型升级、索引参数误配)。
  • 风险:线上无报错,但用户搜不到想要的东西,业务 silently fail。
  • 解决方案
    • 构建黄金数据集(Golden Dataset):准备 100-500 个典型查询及其期望的标准答案。
    • 自动化测试:每次变更(模型升级、索引重建)前,跑一遍黄金集,计算召回率(Recall@K)。
    • 阈值告警:召回率下跌超过 5% 禁止上线。

3. 内存成本与索引重建

  • 问题:HNSW 索引常驻内存。数据量增长导致内存爆炸,成本不可控。
  • 风险:OOM(内存溢出)导致数据库宕机。
  • 解决方案
    • 量化压缩:启用 PQ/SQ 量化,将 float32 转为 int8,内存减少 75%。
    • 冷热分离:热点数据用 HNSW(内存),冷数据用 IVF(磁盘)。
    • 重建策略 :向量索引删除数据性能差(尤其是 HNSW)。通常策略是标记删除(软删除),定期后台重建索引。

4. Embedding 模型漂移(Model Drift)

  • 问题 :半年后,Embedding 模型升级了(如从 BERT 升级到 BGE)。新模型生成的向量与旧向量不在同一空间,无法计算距离。
  • 风险:历史数据失效,需全量重刷。
  • 解决方案
    • 版本管理 :在向量表中记录 model_version 字段。
    • 多版本共存 :支持多列向量(embedding_v1, embedding_v2),逐步迁移查询流量。
    • 避免频繁变更:选定模型后,除非效果显著下降,否则尽量保持稳定。

5. 安全与隐私合规

  • 问题:向量是否包含敏感信息?向量能否被反推还原原文?
  • 风险:合规审计不通过,数据泄露。
  • 解决方案
    • 脱敏嵌入:在生成向量前,先移除 PII(个人敏感信息)。
    • 权限隔离:向量数据库的权限控制需与业务系统对齐(如 pgvector 可复用 PG 的 Row Level Security)。
    • 不可逆性评估:确认所选 Embedding 模型的理论不可逆性,避免存储可还原的特征向量。

6. 冷启动与流量洪峰

  • 问题:服务重启后,索引需加载到内存;或突发流量导致查询队列堆积。
  • 解决方案
    • 预热机制:启动时预先加载热点索引页。
    • 限流降级:在应用层对向量检索接口做 QPS 限流,避免拖垮整个数据库。
    • 缓存层:对高频查询的向量结果(Query Embedding 可缓存)进行 Redis 缓存。

总结

那么今天关于向量数据库的解释就到此为止!下一集就是我们的线上的检索、增强了!

相关推荐
xqqxqxxq21 分钟前
MySQL 数据类型笔记
数据库·笔记·mysql
Logintern0944 分钟前
理解MySQL数据库的“事务与锁”
数据库·mysql
朱容zr3331331 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
麻瓜code1 小时前
【Redis 】数据类型、持久化与过期删除
数据库·redis·缓存
空杆推不起1 小时前
穿透 Flink CDC 表层用法:数据库日志捕获机制、Flink Source 运行时、端到端一致性底层原理详解
大数据·数据库·flink
朱容zr3331332 小时前
请解释“回表”的概念。
java·前端·数据库
大黄说说2 小时前
EF Core 避坑指南:查询慢、循环查询、并发更新问题如何解决
java·服务器·数据库
城管不管2 小时前
重生——第五次面试2026.8.1一面
java·数据库·后端·ai·面试·职场和发展·agent
ocean'2 小时前
防火墙策略路由
linux·服务器·数据库
纪念 2292 小时前
数据库基础
数据库·笔记·学习方法