2.3 向量数据库:FAISS、Chroma、Milvus、Pinecone、Qdrant

你有了 Embedding 模型能把文字变向量,也有了 RAG 流程知道怎么用向量做检索------那向量存哪呢?普通的 MySQL 存不了高效做最近邻搜索,这就需要向量数据库登场了。本文帮你理清主流向量数据库的特点和选型逻辑,别再「选型困难症」了。

📑 目录


什么是向量数据库

一句话定义

专门为存储、索引和查询高维向量而设计的数据库。核心能力是​**近似最近邻搜索(ANN)**​------在海量向量中快速找到与查询向量最相似的 Top-K 条记录。

本质大白话

复制代码
普通数据库(MySQL):
  WHERE name = '张三'        → 精确匹配
  WHERE age > 25            → 范围查找
  WHERE content LIKE '%AI%'   → 模糊匹配
  但做不到:找出跟「机器学习」语义最近的 5 条记录

向量数据库:
  找出跟 query_vector 最相似的 5 条向量
  → 这就是 ANN(近似最近邻搜索)

类比:
MySQL = 字典(按字母顺序查)
向量数据库 = 图书馆智能推荐(你借了这本书,推荐相似的)

为什么不用传统数据库存向量?

复制代码
暴力穷举法(MySQL 存向量 + 应用层遍历比较):

数据量:100 万条向量(每条 1536 维 float32)
单次查询:需要跟 100 万条逐一算余弦相似度
计算量:1,000,000 × 1536 = 15 亿次乘加运算
延迟:约 5-15 秒 😱

向量数据库(ANN 索引):
同样的 100 万条数据
通过 IVF/HNSW 等索引算法
延迟:5-20 毫秒 ⚡(快了 1000 倍!)
代价:99.9% 的情况下结果一样(近似 ≠ 不准确)
维度 传统 SQL + 暴力扫描 向量数据库 ANN
1 万条以下 还行(<100ms) 杀鸡用牛刀
10 万条 开始卡顿(1-5s) 飞快(<10ms)
100 万条 基本不可用(>5s) 没问题(10-50ms)
1 亿条 别想了 取决于方案(50-500ms)
精度 100% 精确 >99% 近似(够用了)

主流向量数据库全面对比

数据库 类型 语言 规模上限 延迟(P99) 云托管 学习曲线 最适合场景
FAISS C++/Python 内存受限 极低 ❌ 自建 中等 原型验证/嵌入式
Chroma 库/轻量 DB Python ~100 万 ❌ 自建 平滑 开发测试/POC
Milvus 分布式 DB Go 10 亿 + ✅ Zilliz Cloud 较陡 企业级生产
Pinecone 全托管 SaaS - 无限 极低 ✅ 原生 最平滑 快速落地/不想运维
Qdrant DB/Rust Rust 亿级 很低 ✅ Qdrant Cloud 中等 性能敏感场景
Weaviate DB Go 亿级 ✅ Cloud 中等 语义搜索为主
pgvector PostgreSQL 扩展 C 百万级 自建 PG 平滑 已有 PG 的项目

FAISS:Meta 的检索效率神器

一句话定义

Facebook AI Research 出品的向量相似度搜索库。不是完整的数据库,而是一个极致高效的向量计算引擎。

适用 & 不适用

✅ 适合 ❌ 不适合
原型和实验 需要持久化存储
嵌入式/边缘设备 需要动态增删向量
已有自己的存储方案 团队没有工程能力维护
对延迟极其敏感 需要分布式部署
python 复制代码
import faiss
import numpy as np

# 1. 创建索引(IVFFlat:速度快,支持增量)
dimension = 1536  # OpenAI embedding 维度
nlist = 100     # 聚类中心数
quantizer = faiss.IndexFlatIP(dimension)  # 内积量化器
index = faiss.IVFFlat(quantizer, dimension, nlist)

# 2. 添加向量
vectors = np.random.randn(10000, dimension).astype('float32')
index.train(vectors)  # IVF 需要先训练
index.add(vectors)

# 3. 搜索 Top-K
query = np.random.randn(1, dimension).astype('float32')
k = 5
D, I = index.search(query, k)  # D=距离, I=索引ID
print(f"Top-{k} 结果 ID: {I[0]}")

Chroma:开发测试首选

一句话定义

最友好的开源嵌入数据库,专为开发者体验设计。pip install chromadb 就能用,零配置启动。

python 复制代码
import chromadb

# 1. 启动客户端(默认内存模式)
client = chromadb.Client()

# 2. 创建 Collection(类似「表」)
collection = client.create_collection(name="my_docs")

# 3. 添加文档(自动处理 Embedding 或传入已有向量)
collection.add(
    documents=["这是一篇关于 RAG 的文章", "另一篇关于 Agent 的文章"],
    metadatas=[{"source": "blog"}, {"source": "paper"}],
    ids=["doc1", "doc2"]
)

# 4. 查询
results = collection.query(
    query_texts=["什么是 RAG 技术"],
    n_results=2
)
print(results)
# [{'ids': ['doc1'], 'distances': [0.23]}]

Chroma 选型判断

复制代码
选 Chroma 如果你:
✅ 正在做 POC / 原型验证
✅ 团队只有 1-2 个人
✅ 数据量 < 100 万条
✅ 想要最快的上手速度

别选 Chroma 如果你:
❌ 需要生产环境高可用
❌ 数据量超过百万级
❌ 需要复杂的权限和多租户
❌ 需要 GPU 加速索引

Milvus:企业级生产之选

一句话定义

全球最受欢迎的开源向量数据库,专为大规模生产环境设计。支持十亿级向量、分布式部署、多种索引类型。

核心优势

复制代码
Milvus 的杀手特性:

1. 规模:单集群支持 10亿+ 向量
2. 多种索引:FLAT/IVF/HNSW/DiskANN/GPU索引
3. 混合搜索:向量 + 标量过滤一站式
4. 云原生:Kubernetes 一键部署
5. 多租户:Database/Collection 隔离
6. 生态丰富:Python/Java/Go/Node SDK 全覆盖
python 复制代码
from pymilvus import MilvusClient, Collection, FieldSchema, CollectionSchema, DataType

client = MilvusClient(uri="<http://localhost:19530>")

# 定义 Schema(字段+索引)
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
    FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=64),
]
schema = CollectionSchema(fields, description="RAG knowledge base")
collection = Collection(name="docs", schema=schema)

# 创建 HNSW 索引(高性能近似搜索)
index_params = {
    "metric_type": "COSINE",
    "index_type": "HNSW",
    "params": {"M": 16, "efConstruction": 200}
}
collection.create_index(field_name="embedding", index_params=index_params)

# 搜索(支持过滤!)
results = collection.search(
    data=[query_embedding],
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"ef": 128}},
    limit=5,
    expr='category == "tech"'  # 标量过滤!
)

Pinecone:全托管云原生

一句话定义

唯一的纯托管的向量数据库服务。不需要装任何东西,注册就能用。适合不想碰基础设施的团队。

Pinecone 的取舍

✅ 优点 ❌ 不足
零运维 数据不在自己手里(合规风险)
弹性扩容 价格随规模增长较快
一行代码集成 开源替代品越来越强
自动备份/容灾 定制化程度有限
出色的开发者体验 中国区网络访问可能有延迟
python 复制代码
import pinecone

# 初始化
pc = pinecone.Pinecone(api_key="your-key")

# 创建 Index(如果不存在)
if "rag-kb" not in pc.list_indexes().names():
    pc.create_index(
        name="rag-kb",
        dimension=1536,
        metric="cosine",
        spec=pinecone.ServerlessSpec(cloud="aws", region="us-east-1")
    )

index = pc.Index("rag-kb")

# 上传和查询
index.upsert(vectors=[
    ("vec1", [0.1, 0.2, ...], {"text": "关于RAG..."}),
    ("vec2", [0.3, 0.4, ...], {"text": "关于Agent..."}),
])
results = index.query(vector=query_vector, top_k=5)

Qdrant:Rust 写的高性能选手

一句话定义

用 Rust 编写的高性能向量数据库,主打过滤搜索(带条件的向量检索),在需要复杂过滤的生产场景表现突出。

Qdrant 的独特优势

  • 强大的过滤条件:支持嵌套布尔条件、Payload 索引
  • HNSW 硬件优化:利用 SIMD 指令集加速
  • 丰富的数据类型:支持整数/浮点/字符串/Geo 等 Payload
  • Docker 一键部署docker run -p 6333:6333 qdrant/qdrant

选型决策树

复制代码
需要向量数据库?
│
├─ 只是做个 POC/原型?
│   └─→ Chroma(最快上手)或 FAISS(最灵活)
│
├─ 生产环境?
│   ├─ 数据量 < 100万?
│   │   ├─ 已有 PostgreSQL → pgvector(省事)
│   │   └─ 没有 PG → Chroma 持久化 或 Qdrant
│   │
│   ├─ 数据量 100万-1亿?
│   │   ├─ 有运维团队 → Milvus(功能最全)
│   │   ├─ 想省事 → Pinecone(全托管)
│   │   └─ 追求性能 → Qdrant(Rust 加持)
│   │
│   └─ 数据量 > 1亿?
│       └─→ Milvus 分布式 或 Qdrant 集群
│
└─ 数据必须在内网/私有化?
    └─→ Milvus / Qdrant(开源自建唯一靠谱选项)

❌ 常见误区

  • ❌ 向量数据库万能 --- 它只解决向量检索,全文检索/图检索/时序数据还需要别的工具
  • ❌ 越贵越好 --- 很多场景 FAISS + 文件存储就够用了
  • ❌ 选了就不能换 --- 各家的导入导出工具链已经很成熟了

📊 本节知识地图

复制代码
┌──────────────────────────────────────────────────────┐
│              向量数据库选型全景                     │
│                                                      │
│   按场景选:                                          │
│                                                      │
│  POC/原型          小规模生产        大规模生产       │
│  ┌──────┐        ┌──────────┐     ┌──────────────┐  │
│  │Chroma│        │ pgvector │     │   Milvus     │  │
│  │FAISS │        │ Qdrant   │     │   Qdrant集群  │  │
│  └──────┘        │Chroma持久 │     └──────────────┘  │
│                   └──────────┘                       │
│                                                      │
│  不想运维:                                         │
│  ┌──────────────┐                                   │
│  │   Pinecone   │  (全托管,付费)                 │
│  └──────────────┘                                   │
│                                                      │
│  核心:先看规模 → 再看团队 → 最后看预算            │
└──────────────────────────────────────────────────────┘

🔗 关联推荐

  • 📖 2.1 向量基础 → Embedding 和相似度的概念是前提
  • 📖 2.2 RAG 体系 → 向量数据库是 RAG 检索环节的核心组件
  • 🔜 6.3 部署方式 → Docker/私有化部署的具体操作
  • 🔜 9.3 企业级知识库 → 向量数据库的实际落地案例
相关推荐
情绪总是阴雨天~2 小时前
基于 Docker 的 Milvus + Redis 本地开发环境部署完全指南
redis·docker·milvus
寻道码路5 小时前
LangChain4j Java AI 应用开发实战(十二):向量数据Chroma/Qdrant/Milvus实践对比
java·人工智能·ai·milvus
xsc6996756 小时前
Milvus实战:快速上手向量数据库
数据库·milvus
kong@react1 天前
milvus(向量数据库)docker容器(升级1.0)
数据库·docker·milvus
darkdragonking2 天前
OpenEuler 22.03 ,以docker ce 安装 Milvus 及可视化工具
docker·容器·milvus
Stick_ZYZ3 天前
从项目启动到 Milvus 向量检索,我把 RAG 项目链路又打通了一层
java·人工智能·经验分享·ai·milvus
AIMath~3 天前
MongoDB数据库,MySQL数据库,Redis数据库,Milvus数据库对比分析与和核心总结
数据库·mysql·mongodb·milvus
不爱洗脚的小滕4 天前
【RAG】Milvus 混合检索参数调优:ef / candidate_k / final_k 详解
网络·langchain·milvus·rag