向量数据库与检索:Embedding、ANN 索引与 RAG 检索链路
大语言模型的知识截止于训练数据,且无法记住企业私有文档。检索增强生成(RAG)通过”先检索、后生成”弥补这一缺陷,而检索的核心基础设施正是向量数据库。把文本、图片、音频编码为稠密向量(Embedding),再用近似最近邻(ANN)算法在海量向量中快速找到语义相近者,是现代 AI 应用的事实标准。本文拆解其中的关键原理与工程选型。
Embedding 与余弦相似度
Embedding 是把离散对象映射到低维连续向量的表示:语义相近的对象在向量空间中距离更近。给定两个向量 a、b,衡量相似度最常用的是余弦相似度:
cosine(a, b) = (a · b) / (‖a‖ × ‖b‖)
取值范围为 [-1, 1],越接近 1 越相似。实践中常先对向量做 L2 归一化,使余弦相似度等价于内积,从而可用高效的矩阵运算加速。值得注意,内积(dot product)与欧氏距离(L2)也是常见度量,选择哪种取决于 Embedding 模型的训练约定——许多文本模型(如 OpenAI text-embedding、bge 系列)默认用归一化后的余弦。
精确检索与近似检索
暴力检索(遍历全量计算距离,取 Top-K)保证最优,但复杂度 O(N·d) 在百万、十亿级数据上不可接受。因此工业界普遍采用近似最近邻(Approximate Nearest Neighbor, ANN):以可控的召回率(Recall)损失换取数量级的速度提升。召回率指”返回结果中包含真实最近邻的比例”,是评估 ANN 质量的核心指标。
HNSW:分层可导航小世界图
HNSW(Malkov & Yashunin, 2018)是当前最流行的 ANN 图索引之一。它构建多层图结构:顶层稀疏、节点少、用于快速跳跃;底层稠密、覆盖全部数据。搜索时从顶层入口出发,在每层贪心地向更近的邻居移动,逐层细化,类似跳表(skip list)。其优点是高召回下查询极快、实现成熟(被 FAISS、Milvus、Weaviate 等广泛采用);代价是建图需要较多内存,且索引为内存态、写入更新成本较高。
FAISS:Facebook 的相似度搜索库
FAISS(Johnson, Douze & Jégou)是向量检索的底层引擎事实标准,核心贡献在于高效的 IVF(倒排文件)+ PQ(乘积量化)方案:先用粗量化器把向量聚类分桶,查询时只扫描最近的若干桶;桶内用乘积量化把向量压缩为紧凑编码,以非对称距离计算(ADC)近似匹配。GPU 版 FAISS 可在单卡上对十亿级向量做近实时检索。许多向量数据库(包括部分云服务的底层)直接构建在 FAISS 之上。
import faiss
import numpy as np
dim = 768
index = faiss.IndexFlatIP(dim) # 精确内积索引(演示用)
xb = np.random.rand(10000, dim).astype("float32")
faiss.normalize_L2(xb)
index.add(xb)
xq = np.random.rand(5, dim).astype("float32")
faiss.normalize_L2(xq)
D, I = index.search(xq, k=10) # 返回距离与索引
主流向量数据库对比
- Milvus:开源、云原生、可水平扩展,支持 HNSW/IVF/DiskANN 等多种索引,适合超大规模与高并发生产;
- Pinecone:全托管 Serverless 云服务,免运维、弹性伸缩,适合不愿自建基础设施的团队;
- pgvector:PostgreSQL 扩展,把向量检索直接放进关系数据库,便于与业务表联合查询、事务一致,适合中小规模与已有 PG 栈;
- Chroma:轻量、开发者友好,常以嵌入式(in-process)方式运行,适合原型与原地 RAG 应用。
选型要点:数据规模(千级用 Chroma/pgvector,亿级选 Milvus/Pinecone)、是否需要与业务库强一致(pgvector)、运维人力(托管 vs 自建)、以及是否要混合检索(向量 + 关键词/元数据过滤)。
RAG 中的检索链路
一个典型的 RAG 检索链路包含:
- 切分(Chunking):把文档按语义/长度切块,块过大稀释信号、过小丢失上下文;
- 向量化:用 Embedding 模型编码每个块并写入库;
- 查询改写与向量化:对用户问题做改写/扩展,提升召回;
- 检索:ANN 取 Top-K 候选,常叠加元数据过滤(时间、权限、来源);
- 重排(Re-rank):用交叉编码器(cross-encoder)对候选精排,提升精度;
- 拼接与生成:把命中内容注入提示词,交给 LLM 作答并附引用。
常见的”召回不足”问题,往往不是向量库慢,而是切分策略、Embedding 选型或缺少重排环节。混合检索(向量 + BM25 关键词)通常比纯向量更稳健,尤其对专有名词、编号类查询。
小结
向量检索把”语义相近”变为可计算的几何距离,余弦相似度与 ANN 索引(HNSW、FAISS/IVF-PQ)是其两大支柱。Milvus、Pinecone、pgvector、Chroma 各有定位,选型取决于规模、一致性与运维约束。在 RAG 中,检索链路的质量(切分、Embedding、重排、混合检索)直接决定生成的上限。
参考与延伸阅读
- Malkov, Y. A. & Yashunin, D. A. Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs. arXiv:1603.09320 (2018).
- Johnson, J., Douze, M. & Jégou, H. Billion-scale similarity search with GPUs (FAISS). arXiv:1702.08734 (2017).
- Milvus 文档: https://milvus.io/docs
- Pinecone 文档: https://docs.pinecone.io/
- pgvector 仓库: https://github.com/pgvector/pgvector
- Chroma 文档: https://docs.trychroma.com/