RAG 学习笔记:向量数据库核心原理与实践
RAG向量数据库FAISSMilvus相似性搜索
RAG 学习笔记:向量数据库核心原理与实践
前言
向量数据库是 RAG 系统的”知识库”,负责存储和检索海量高维向量。本文将深入探讨向量数据库的核心原理、主流产品对比,以及 FAISS 的实践应用。
一、为什么需要向量数据库?
核心原因
| 原因 | 说明 | 影响 |
|---|---|---|
| 海量向量存储 | RAG 系统需要处理数百万甚至数十亿向量 | 传统数据库无法高效处理 |
| 快速相似性搜索 | 毫秒级响应的近似最近邻查询 | 保证用户体验 |
| 高维数据处理 | 处理成百上千维的向量数据 | 传统索引失效 |
直观理解
想象一下,当你的知识库从几百个文档增长到数百万个文档时,如何快速找到与用户问题最相关的那几个?向量数据库就像一个超级高效的图书管理员,能够在毫秒级时间内从海量”书籍”(向量)中找到最相似的那些。
二、向量数据库 vs 传统数据库
2.1 核心差异对比
| 维度 | 向量数据库 | 传统数据库 (RDBMS) |
|---|---|---|
| 核心数据类型 | 高维向量 (Embeddings) | 结构化数据 (文本、数字、日期) |
| 查询方式 | 相似性搜索 (ANN) | 精确匹配 |
| 索引机制 | HNSW, IVF, LSH 等 ANN 索引 | B-Tree, Hash Index |
| 主要应用场景 | AI 应用、RAG、推荐系统 | 业务系统 (ERP, CRM) |
| 数据规模 | 轻松应对千亿级向量 | 通常在千万到亿级行数据 |
| 性能特点 | 高维数据检索性能极高 | 高维数据查询性能呈指数级下降 |
| 一致性 | 通常为最终一致性 | 强一致性 (ACID 事务) |
2.2 互补关系
向量数据库和传统数据库并非相互替代,而是互补:
传统数据库:存储业务元数据和结构化信息
↕
向量数据库:处理和检索海量向量数据
三、向量数据库核心功能
3.1 主要功能
| 功能 | 说明 | 重要性 |
|---|---|---|
| 高效相似性搜索 | 利用 ANN 索引实现毫秒级查询 | ⭐⭐⭐⭐⭐ |
| 高维数据存储与管理 | 优化存储高维向量 | ⭐⭐⭐⭐ |
| 丰富的查询能力 | 支持标量过滤、范围查询等 | ⭐⭐⭐⭐ |
| 可扩展与高可用 | 分布式架构,水平扩展 | ⭐⭐⭐⭐ |
| 生态集成 | 与 AI 框架无缝集成 | ⭐⭐⭐ |
3.2 工作原理
四层架构:
服务层:客户端连接、监控、安全管理
↓
查询层:处理查询请求、混合查询、查询优化
↓
索引层:维护索引算法(HNSW、LSH、PQ等)
↓
存储层:存储向量数据和元数据、分布式存储
3.3 主要技术手段
| 技术类型 | 代表算法 | 原理 | 特点 |
|---|---|---|---|
| 基于树的方法 | Annoy | 随机投影树 | 对数复杂度搜索 |
| 基于哈希的方法 | LSH | 局部敏感哈希 | 相似向量映射到同一桶 |
| 基于图的方法 | HNSW | 分层可导航小世界图 | 快速搜索,高召回率 |
| 基于量化的方法 | Faiss IVF/PQ | 聚类和量化压缩 | 压缩向量,节省内存 |
四、主流向量数据库介绍
4.1 产品对比
| 产品 | 类型 | 特点 | 适用场景 | 推荐指数 |
|---|---|---|---|---|
| Pinecone | 云服务 | Serverless、自动扩展、99.95% SLA | 企业级生产环境 | ⭐⭐⭐⭐⭐ |
| Milvus | 开源 | 分布式、GPU 加速、亿级向量 | 大规模部署、高性能 | ⭐⭐⭐⭐⭐ |
| Qdrant | 开源 | Rust 开发、高性能、二进制量化 | 性能敏感应用 | ⭐⭐⭐⭐ |
| Weaviate | 开源 | GraphQL、AI 模块、多模态 | AI 开发、多模态 | ⭐⭐⭐⭐ |
| Chroma | 开源 | 轻量级、零配置、本地优先 | 原型开发、小规模应用 | ⭐⭐⭐ |
4.2 选择建议
选择决策树:
├─ 新手入门/小型项目?
│ └─ 是 → ChromaDB 或 FAISS
├─ 生产环境/大规模应用?
│ ├─ 需要云服务 → Pinecone
│ └─ 需要自建 → Milvus 或 Weaviate
├─ 性能敏感?
│ └─ 是 → Qdrant
└─ 快速原型?
└─ 是 → ChromaDB
五、FAISS 实践
5.1 FAISS 简介
FAISS (Facebook AI Similarity Search) 是 Facebook AI Research 开发的高性能库,专门用于高效的相似性搜索和密集向量聚类。
核心特点:
- ✅ 轻量级,无需运行数据库服务
- ✅ 将索引保存为本地文件
- ✅ 与 LangChain/LlamaIndex 紧密集成
- ✅ 适合快速原型设计和中小型应用
5.2 环境准备
# 安装 FAISS (CPU 版本)
pip install faiss-cpu
# 如果有 GPU,安装 GPU 版本
pip install faiss-gpu
5.3 基础示例
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_core.documents import Document
# 1. 示例文本和嵌入模型
texts = [
"张三是法外狂徒",
"FAISS是一个用于高效相似性搜索和密集向量聚类的库。",
"LangChain是一个用于开发由语言模型驱动的应用程序的框架。"
]
docs = [Document(page_content=t) for t in texts]
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
# 2. 创建向量存储并保存到本地
vectorstore = FAISS.from_documents(docs, embeddings)
local_faiss_path = "./faiss_index_store"
vectorstore.save_local(local_faiss_path)
print(f"FAISS index has been saved to {local_faiss_path}")
# 3. 加载索引并执行查询
loaded_vectorstore = FAISS.load_local(
local_faiss_path,
embeddings,
allow_dangerous_deserialization=True
)
# 相似性搜索
query = "FAISS是做什么的?"
results = loaded_vectorstore.similarity_search(query, k=1)
print(f"\n查询: '{query}'")
print("相似度最高的文档:")
for doc in results:
print(f"- {doc.page_content}")
5.4 运行结果
FAISS index has been saved to ./faiss_index_store
查询: 'FAISS是做什么的?'
相似度最高的文档:
- FAISS是一个用于高效相似性搜索和密集向量聚类的库。
六、FAISS 索引创建流程
6.1 核心方法调用链
from_documents (封装层)
↓ 提取文本和元数据
from_texts (向量化入口)
↓ 调用 embedding.embed_documents(texts)
__from (构建索引框架)
↓ 初始化空 FAISS 索引
__add (填充数据)
↓ 添加向量、存储文档、建立映射
完成索引创建
6.2 关键步骤详解
| 步骤 | 方法 | 功能 |
|---|---|---|
| 1. 文本提取 | from_documents | 从 Document 对象提取文本和元数据 |
| 2. 向量化 | from_texts | 批量将文本转换为向量 |
| 3. 初始化索引 | __from | 创建空的 FAISS 索引结构 |
| 4. 添加向量 | __add | 将向量添加到索引中 |
| 5. 存储文档 | __add | 将文本和元数据存入 docstore |
| 6. 建立映射 | __add | 建立 FAISS ID 到文档 ID 的映射 |
七、实践要点
7.1 最佳实践
| 实践 | 说明 | 重要性 |
|---|---|---|
| 模型一致性 | 索引和查询使用同一个 Embedding 模型 | ⭐⭐⭐⭐⭐ |
| 批量插入 | 批量插入数据提升效率 | ⭐⭐⭐⭐ |
| 索引持久化 | 定期保存索引到磁盘 | ⭐⭐⭐⭐ |
| 合理设置 k 值 | 根据需求设置返回结果数量 | ⭐⭐⭐ |
7.2 常见问题
❌ 问题 1:加载索引失败
- 解决:确保使用相同的 Embedding 模型
❌ 问题 2:内存不足
- 解决:使用 IVF 索引或量化技术
❌ 问题 3:查询速度慢
- 解决:优化索引参数或使用 GPU 加速
八、学习收获
核心认知
- 向量数据库是 RAG 的核心组件:负责存储和检索海量高维向量
- 选型需权衡:在性能、规模、成本、易用性之间找到平衡
- FAISS 适合快速原型:轻量级、易用、与主流框架集成良好
下一步计划
- 实践使用 Milvus 构建生产级向量检索系统
- 对比不同向量数据库的性能
- 学习向量索引优化技术
- 探索分布式向量数据库部署
结语
向量数据库是连接 Embedding 模型和 LLM 的桥梁,选择合适的向量数据库对构建高性能 RAG 系统至关重要。建议从 FAISS 或 ChromaDB 开始实践,逐步过渡到生产级的 Milvus 或 Pinecone。
关键要点:向量数据库的核心是高效的相似性搜索,选型时需考虑数据规模、性能需求、运维成本等因素。