你有了 Embedding 模型能把文字变向量,也有了 RAG 流程知道怎么用向量做检索------那向量存哪呢?普通的 MySQL 存不了高效做最近邻搜索,这就需要向量数据库登场了。本文帮你理清主流向量数据库的特点和选型逻辑,别再「选型困难症」了。
📑 目录
- 什么是向量数据库
- 为什么不用传统数据库存向量
- 主流向量数据库全面对比
- [FAISS:Meta 的检索效率神器](#FAISS:Meta 的检索效率神器)
- Chroma:开发测试首选
- Milvus:企业级生产之选
- Pinecone:全托管云原生
- [Qdrant:Rust 写的高性能选手](#Qdrant:Rust 写的高性能选手)
- 选型决策树
什么是向量数据库
一句话定义
专门为存储、索引和查询高维向量而设计的数据库。核心能力是**近似最近邻搜索(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 企业级知识库 → 向量数据库的实际落地案例