向量索引与检索
向量索引与检索是 检索增强生成 RAG 系统的核心技术组件,负责在海量向量数据中快速找到与查询向量最相似的候选集。这项技术直接决定了 RAG 系统的检索效率和精度。
1. 向量检索的基本概念
1.1 相似度度量
向量检索的基础是计算向量之间的相似度或距离。常用的度量方法包括:
-
余弦相似度 (Cosine Similarity)
- 测量两个向量之间的夹角余弦值,范围为 [-1, 1]
- 对向量的绝对大小不敏感,只关注方向
- 特别适合于经过归一化的文本向量
- 计算公式:
cosine_similarity = A·B / (||A|| × ||B||)
-
欧几里得距离 (Euclidean Distance, L2)
- 测量向量在空间中的直线距离
- 对向量的绝对值敏感
- 适用于密集向量且特征值尺度相近的场景
- 计算公式:
distance = sqrt(Σ(Ai - Bi)²)
-
内积 (Inner Product, IP)
- 直接计算两个向量的点积
- 对于归一化向量,内积等价于余弦相似度
- 计算效率最高,常用于大规模检索系统
1.2 精确检索 vs 近似检索
-
精确最近邻搜索 (Exact Nearest Neighbor, ENN)
- 遍历所有向量,计算与查询向量的距离
- 保证找到真正的最近邻
- 时间复杂度 O(n×d),对大规模数据不可行
-
近似最近邻搜索 (Approximate Nearest Neighbor, ANN)
- 通过构建索引结构加速搜索
- 牺牲少量精度换取显著的速度提升
- 是生产环境中的实际选择
2. 主流向量索引算法
2.1 HNSW (Hierarchical Navigable Small World)
HNSW 是当前最流行的 ANN 算法之一,在速度和精度之间达到了优秀的平衡。
核心原理:
- 构建多层的小世界图结构
- 每层包含部分节点,越高层节点越少
- 搜索时从最高层开始,逐层向下导航
关键参数:
- M:每个节点的最大连接数(典型值:16-64)
- ef_construction:构建时的动态列表大小(典型值:200)
- ef_search:搜索时的动态列表大小(典型值:50-200)
优势:
- 查询速度快,支持增量索引
- 内存占用相对较小
- 召回率高(通常可达 95%+)
2.2 IVF (Inverted File Index)
IVF 通过聚类将向量空间划分为多个区域,搜索时只在相关区域内查找。
核心原理:
- 使用 K-means 等算法将向量聚类成 nlist 个簇
- 每个簇维护一个倒排列表
- 查询时先找到最近的 nprobe 个簇,再在其中搜索
变体:
- IVF-Flat:簇内存储原始向量
- IVF-PQ:簇内使用乘积量化压缩向量
- IVF-SQ:簇内使用标量量化压缩
关键参数:
- nlist:聚类中心数量(典型值:sqrt(n) 到 4×sqrt(n))
- nprobe:搜索时检查的簇数量(典型值:1-100)
2.3 LSH (Locality Sensitive Hashing)
LSH 通过哈希函数将相似向量映射到相同的桶中。
核心原理:
- 设计多个哈希函数,相似向量有更高概率哈希到同一桶
- 查询时只检查落入相同桶的向量
- 通过多个哈希表提高召回率
优势:
- 理论基础扎实,有性能保证
- 适合高维稀疏向量
劣势:
- 内存占用较大
- 对密集向量效果一般
3. 向量数据库选择
3.1 专用向量数据库
开源方案:
- Milvus:功能全面,支持多种索引算法,适合大规模生产部署
- Weaviate:内置语义搜索功能,支持混合搜索
- Qdrant:Rust 实现,性能优异,API 友好
- ChromaDB:轻量级,易于集成,适合原型开发
商业方案:
- Pinecone:完全托管的云服务,易用性高
- Zilliz Cloud:Milvus 的云服务版本
- Elastic Cloud:整合了向量搜索的 Elasticsearch 云服务
3.2 传统数据库的向量扩展
- PostgreSQL + pgvector:为 PostgreSQL 添加向量搜索能力
- Redis + RedisVL:基于 Redis 的向量搜索模块
- Elasticsearch + dense_vector:支持 kNN 搜索的向量字段类型
3.3 选择考虑因素
- 数据规模:百万级以下可用轻量方案,千万级以上需专用系统
- 性能要求:QPS、延迟、召回率的具体指标
- 功能需求:是否需要过滤、混合搜索、实时更新等
- 运维能力:自建还是使用托管服务
- 成本预算:开源自建 vs 商业服务的权衡
4. 优化策略
4.1 索引优化
- 参数调优:根据数据特点和业务需求调整索引参数
- 多级索引:粗召回 + 精排的两阶段架构
- 索引预热:将热点数据加载到内存
4.2 查询优化
- 批量查询:合并多个查询减少开销
- 查询缓存:缓存常见查询的结果
- 早停策略:达到足够好的结果即停止搜索
4.3 混合检索
结合多种检索策略提升效果:
- 向量检索 + 关键词检索:结合语义和精确匹配
- 多路召回:使用不同的索引或参数并行检索
- 重排序:使用更复杂的模型对召回结果重新排序
5. 监控与调试
5.1 关键指标
- 召回率 (Recall@K):检索到的相关文档比例
- 延迟 (Latency):P50、P95、P99 延迟
- 吞吐量 (QPS):每秒查询数
- 索引构建时间:新数据的索引速度
5.2 调试工具
- 可视化工具:如 Embedding Projector 可视化向量分布
- 相似度分析:分析查询向量与结果的相似度分布
- A/B 测试:对比不同索引配置的效果
通过合理选择和优化向量索引技术,可以构建高效、精准的 RAG 检索系统,为下游的生成任务提供高质量的上下文信息。