RAG 学习笔记:向量数据库核心原理与实践

RAG向量数据库FAISSMilvus相似性搜索

RAG 学习笔记:向量数据库核心原理与实践

深入理解向量数据库在 RAG 系统中的关键作用,掌握主流向量数据库的选型与 FAISS 实践。

目录


一、为什么需要向量数据库?

核心原因

原因说明影响
海量向量存储RAG 系统需要处理数百万甚至数十亿向量传统数据库无法高效处理
快速相似性搜索毫秒级响应的近似最近邻查询保证用户体验
高维数据处理处理成百上千维的向量数据传统索引失效

直观理解

想象一下,当你的知识库从几百个文档增长到数百万个文档时,如何快速找到与用户问题最相关的那几个?向量数据库就像一个超级高效的图书管理员,能够在毫秒级时间内从海量”书籍”(向量)中找到最相似的那些。


📘 背景 向量数据库的核心竞争力在于 ANN(Approximate Nearest Neighbor)搜索。它不保证返回绝对最近邻,而是在精度和速度之间取折中。对于 RAG 场景来说,99% 的精度换 10 倍的速度提升是极其划算的交易——因为 LLM 本身有容错能力,不需要精确的 Top-K。

二、向量数据库 vs 传统数据库

2.1 核心差异对比

维度向量数据库传统数据库 (RDBMS)
核心数据类型高维向量 (Embeddings)结构化数据 (文本、数字、日期)
查询方式相似性搜索 (ANN)精确匹配
索引机制HNSW, IVF, LSH 等 ANN 索引B-Tree, Hash Index
主要应用场景AI 应用、RAG、推荐系统业务系统 (ERP, CRM)
数据规模轻松应对千亿级向量通常在千万到亿级行数据
性能特点高维数据检索性能极高高维数据查询性能呈指数级下降
一致性通常为最终一致性强一致性 (ACID 事务)

2.2 互补关系

向量数据库和传统数据库并非相互替代,而是互补:


💡 技巧 实际项目中,最佳实践是"传统数据库 + 向量数据库"协同工作。先用传统数据库按条件过滤(如日期范围、业务类型),将搜索空间缩小到原始数据的 1%-10%,再在缩小后的数据集上做向量搜索。这种方式结合了精确过滤和语义搜索的优势,是生产级 RAG 的标准模式。
传统数据库:存储业务元数据和结构化信息

向量数据库:处理和检索海量向量数据

三、向量数据库核心功能

3.1 主要功能

功能说明重要性
高效相似性搜索利用 ANN 索引实现毫秒级查询⭐⭐⭐⭐⭐
高维数据存储与管理优化存储高维向量⭐⭐⭐⭐
丰富的查询能力支持标量过滤、范围查询等⭐⭐⭐⭐
可扩展与高可用分布式架构,水平扩展⭐⭐⭐⭐
生态集成与 AI 框架无缝集成⭐⭐⭐

3.2 工作原理

四层架构

┌─────────────────────────────────────┐
│           接入层                     │
│  SDK / API / gRPC                   │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│           查询层                     │
│  查询解析、路由、执行               │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│           存储层                     │
│  向量存储、索引管理                 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│           基础设施层                 │
│  分布式协调、一致性                 │
└─────────────────────────────────────┘

四、FAISS 实践

4.1 FAISS 简介

FAISS(Facebook AI Similarity Search)是 Facebook 开源的高效相似性搜索库,专门为密集向量设计。

核心优势

  • ⚡ 极快的搜索速度(百万级数据毫秒级响应)
  • 💾 内存索引,部署简单
  • 🔧 支持多种索引类型
  • 🆓 完全开源免费

4.2 快速上手

import faiss
import numpy as np

# 1. 准备数据
dimension = 768  # 向量维度
num_vectors = 100000  # 向量数量
vectors = np.random.random((num_vectors, dimension)).astype('float32')

# 2. 创建索引
index = faiss.IndexFlatL2(dimension)  # L2 距离索引

# 3. 添加向量
index.add(vectors)

# 4. 搜索
query = np.random.random((1, dimension)).astype('float32')
k = 5  # 返回最近的 5 个邻居
distances, indices = index.search(query, k)

print(f"最近的 {k} 个邻居索引: {indices[0]}")
print(f"对应的距离: {distances[0]}")

4.3 索引类型选择

索引类型适用场景内存占用搜索速度精度
IndexFlatL2小规模、精确搜索100%
IndexIVFFlat中等规模、近似搜索很快95%+
IndexHNSW大规模、高并发极快98%+
IndexIVFPQ超大规模、内存受限90%+

📘 背景 FAISS 索引选择的核心原则:IndexFlatL2 适合 < 10 万规模追求 100% 精度;IndexHNSW 适合 10 万-1000 万规模且对延迟敏感的场景,精度可达 99%;IndexIVFPQ 适合 > 1000 万且内存受限的环境。注意 HNSW 需要将索引加载到内存,数据量大时内存占用可能成为瓶颈。

五、选型建议

5.1 决策树

数据量有多大?
├─ < 100 万
│  └─ 用 FAISS(内存索引,部署简单)
├─ 100 万 - 1000 万
│  ├─ 需要持久化?→ Chroma / Qdrant
│  └─ 不需要?→ FAISS
└─ > 1000 万
   ├─ 需要分布式?→ Milvus / Pinecone
   └─ 单机够用?→ FAISS + 优化

5.2 主流向量数据库对比

数据库部署方式数据规模特点适用场景
FAISS本地库百万级极快、免费原型开发、小规模
Chroma本地/容器百万级简单易用快速原型
Qdrant单机/分布式千万级高性能、Rust中等规模生产
Milvus分布式十亿级云原生、高可用大规模生产
PineconeSaaS十亿级全托管、零运维企业级应用

结语

向量数据库是 RAG 系统的”记忆库”,选择合适的方案直接影响系统的性能和成本。对于大多数项目,FAISS 是最实用的起点;当数据量增长到千万级以上时,再考虑专业向量数据库。

关键要点:小规模用 FAISS,中等规模用 Qdrant/Chroma,大规模用 Milvus/Pinecone。根据实际需求选择,不要过度设计。