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 加速

八、学习收获

核心认知

  1. 向量数据库是 RAG 的核心组件:负责存储和检索海量高维向量
  2. 选型需权衡:在性能、规模、成本、易用性之间找到平衡
  3. FAISS 适合快速原型:轻量级、易用、与主流框架集成良好

下一步计划

  • 实践使用 Milvus 构建生产级向量检索系统
  • 对比不同向量数据库的性能
  • 学习向量索引优化技术
  • 探索分布式向量数据库部署

结语

向量数据库是连接 Embedding 模型和 LLM 的桥梁,选择合适的向量数据库对构建高性能 RAG 系统至关重要。建议从 FAISS 或 ChromaDB 开始实践,逐步过渡到生产级的 Milvus 或 Pinecone。

关键要点:向量数据库的核心是高效的相似性搜索,选型时需考虑数据规模、性能需求、运维成本等因素。