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 | 分布式 | 十亿级 | 云原生、高可用 | 大规模生产 |
| Pinecone | SaaS | 十亿级 | 全托管、零运维 | 企业级应用 |
结语
向量数据库是 RAG 系统的”记忆库”,选择合适的方案直接影响系统的性能和成本。对于大多数项目,FAISS 是最实用的起点;当数据量增长到千万级以上时,再考虑专业向量数据库。
关键要点:小规模用 FAISS,中等规模用 Qdrant/Chroma,大规模用 Milvus/Pinecone。根据实际需求选择,不要过度设计。