# 向量数据库对比

在 Clore.ai GPU 服务器上为您的 AI 应用选择合适的向量数据库。

{% hint style="info" %}
**向量数据库** 高效存储和检索高维嵌入——这是 RAG 系统、语义搜索和推荐引擎的核心基础设施。本指南比较了四个最受欢迎的开源选项。
{% endhint %}

***

## 快速决策矩阵

|               | ChromaDB   | Qdrant          | Milvus     | Weaviate          |
| ------------- | ---------- | --------------- | ---------- | ----------------- |
| **适用场景**      | 原型设计、本地开发  | 生产环境 RAG        | 十亿级搜索      | 知识图谱              |
| **部署**        | 嵌入式/服务器端   | 服务器/云端          | 服务器/云端     | 服务器/云端            |
| **可扩展性**      | 单节点        | 多节点             | 分布式        | 分布式               |
| **GitHub 星标** | 17K+       | 21K+            | 31K+       | 12K+              |
| **许可**        | Apache 2.0 | Apache 2.0      | Apache 2.0 | BSD 三条款许可         |
| **托管云**       | 否          | 是（Qdrant Cloud） | 是（Zilliz）  | 是（Weaviate Cloud） |
| **语言**        | Python     | Rust            | Go         | Go                |

***

## 概览

### ChromaDB

ChromaDB 是最简单的向量数据库——为快速原型和中小规模应用设计。它可以完全在内存中运行或持久化到磁盘。

**理念**: 零配置，最大的开发者体验。

```python
import chromadb

client = chromadb.PersistentClient(path="/data/chroma")
collection = client.create_collection("my_docs")

collection.add(
    documents=["Machine learning is great", "Deep learning uses neural networks"],
    ids=["doc1", "doc2"]
)

results = collection.query(
    query_texts=["What is AI?"],
    n_results=2
)
```

### Qdrant

Qdrant 是一个面向生产的向量搜索引擎，使用 Rust 编写。它专注于性能、过滤和运维简易性。

**理念**: 生产级性能而无复杂的运维。

```python
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

client = QdrantClient("localhost", port=6333)
client.create_collection(
    collection_name="my_collection",
    vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)

client.upsert(
    collection_name="my_collection",
    points=[
        PointStruct(id=1, vector=[...], payload={"text": "document 1"}),
    ]
)

results = client.search(
    collection_name="my_collection",
    query_vector=[...],
    limit=10,
    query_filter=Filter(must=[FieldCondition(key="category", match=MatchValue(value="tech"))])
)
```

### Milvus

Milvus 是最具可扩展性的开源向量数据库，专为十亿级部署设计。它具有分布式架构并支持 Kubernetes。

**理念**: 大规模、云原生。

```python
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType

connections.connect("default", host="localhost", port=19530)

fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
]
schema = CollectionSchema(fields)
collection = Collection("my_collection", schema)

# Insert data
collection.insert([[1, 2], embeddings, texts])
collection.create_index("embedding", {"metric_type": "COSINE", "index_type": "IVF_FLAT"})
collection.load()

results = collection.search(
    data=[query_embedding],
    anns_field="embedding",
    param={"metric_type": "COSINE", "nprobe": 10},
    limit=10
)
```

### Weaviate

Weaviate 将向量搜索与知识图谱和 GraphQL API 结合。它原生支持多模态搜索（文本、图像、音频）。

**理念**: 架构丰富、多模态、具备知识图谱能力。

```python
import weaviate

client = weaviate.Client("http://localhost:8080")

# Define schema with classes
client.schema.create_class({
    "class": "Document",
    "vectorizer": "text2vec-transformers",
    "properties": [
        {"name": "content", "dataType": ["text"]},
        {"name": "category", "dataType": ["string"]}
    ]
})

# Insert with auto-vectorization
client.data_object.create(
    {"content": "Machine learning tutorial", "category": "tech"},
    "Document"
)

# Semantic search
result = client.query.get("Document", ["content", "category"])\
    .with_near_text({"concepts": ["artificial intelligence"]})\
    .with_limit(5)\
    .do()
```

***

## 性能基准

### ANN 基准（ann-benchmarks.com，2024）

#### 1M 向量，768 维，余弦相似度

| 数据库            | QPS（1 线程） | Recall\@10 | 构建时间 | 索引大小  |
| -------------- | --------- | ---------- | ---- | ----- |
| ChromaDB（HNSW） | \~2,000   | 98.5%      | 45 秒 | 2.1GB |
| Qdrant（HNSW）   | \~8,500   | 99.1%      | 32 秒 | 1.8GB |
| Milvus（HNSW）   | \~12,000  | 98.9%      | 28 秒 | 1.9GB |
| Weaviate（HNSW） | \~6,000   | 98.7%      | 38 秒 | 2.0GB |

#### 1000 万向量（可扩展性测试）

| 数据库      | QPS（每秒查询数） | 内存使用      | 说明        |
| -------- | ---------- | --------- | --------- |
| ChromaDB | \~800      | 22GB      | 在大规模时表现不佳 |
| Qdrant   | \~5,200    | 18GB      | 量化表现良好    |
| Milvus   | \~9,800    | 15GB（已索引） | 在大规模时最佳   |
| Weaviate | \~3,500    | 21GB      | 中等        |

{% hint style="info" %}
**基准是指导，不是绝对结论。** 性能受索引类型、硬件、向量维度和查询模式影响很大。务必使用您自己的数据进行基准测试。
{% endhint %}

### 过滤性能（带过滤的 ANN 搜索）

带过滤的搜索（向量相似度 + 元数据过滤）对于生产 RAG 至关重要：

| 数据库      | 过滤后 QPS | 预过滤            | 后过滤 |
| -------- | ------- | -------------- | --- |
| ChromaDB | \~500   | ❌              | ✅   |
| Qdrant   | \~6,000 | ✅（HNSW + 负载索引） | ✅   |
| Milvus   | \~8,000 | ✅              | ✅   |
| Weaviate | \~3,000 | ✅（倒排索引）        | ✅   |

**过滤搜索的获胜者**: Qdrant 和 Milvus，支持真正的预过滤而不会导致后过滤的性能下降。

***

## 功能比较

### 存储与索引

| 功能      | ChromaDB | Qdrant | Milvus | Weaviate |
| ------- | -------- | ------ | ------ | -------- |
| HNSW 索引 | ✅        | ✅      | ✅      | ✅        |
| IVF 索引  | ❌        | ❌      | ✅      | ❌        |
| DiskANN | ❌        | ✅      | ✅      | ❌        |
| 标量量化    | ❌        | ✅      | ✅      | ✅        |
| 乘积量化    | ❌        | ✅      | ✅      | ❌        |
| 二进制量化   | ❌        | ✅      | ✅      | ✅        |
| 磁盘存储    | ✅        | ✅      | ✅      | ✅        |
| Mmap    | ❌        | ✅      | ✅      | ✅        |

### 查询能力

| 功能            | ChromaDB | Qdrant | Milvus | Weaviate   |
| ------------- | -------- | ------ | ------ | ---------- |
| 向量相似度         | ✅        | ✅      | ✅      | ✅          |
| 混合搜索（BM25+向量） | ❌        | ✅      | ✅      | ✅          |
| 元数据过滤         | ✅（基础）    | ✅（丰富）  | ✅（丰富）  | ✅（GraphQL） |
| 关键词搜索         | ❌        | ✅      | ✅      | ✅          |
| 多向量搜索         | ❌        | ✅      | ✅      | ✅          |
| 稀疏向量（SPLADE）  | ❌        | ✅      | ✅      | ✅          |
| 命名向量          | ❌        | ✅      | ✅      | ✅          |

### 运维特性

| 功能              | ChromaDB | Qdrant | Milvus | Weaviate |
| --------------- | -------- | ------ | ------ | -------- |
| REST API        | ✅        | ✅      | ✅      | ✅        |
| gRPC API        | ❌        | ✅      | ✅      | ❌        |
| GraphQL API     | ❌        | ❌      | ❌      | ✅        |
| 认证              | 基础       | ✅      | ✅      | ✅        |
| 基于角色的访问控制（RBAC） | ❌        | ✅      | ✅      | ✅        |
| 横向扩展            | ❌        | ✅      | ✅      | ✅        |
| Kubernetes 支持   | ❌        | ✅      | ✅      | ✅        |
| 快照/备份           | ❌        | ✅      | ✅      | ✅        |
| 监控（Prometheus）  | ❌        | ✅      | ✅      | ✅        |

***

## ChromaDB：深入解析

### 优势

✅ **最简设置** — `pip install chromadb` 然后就完成了\
✅ **嵌入式模式** — 无需单独的服务器进程\
✅ **自动嵌入** — 内置嵌入模型\
✅ **与 LangChain/LlamaIndex** 本地集成\
✅ **零配置** — 非常适合原型开发

### 弱点

❌ **可扩展性有限** — 超过 1-2M 向量时表现不佳\
❌ **无分布式模式** — 仅单节点\
❌ **过滤能力有限** — 无预过滤\
❌ **无量化** — 更高的内存使用\
❌ **大规模时较慢** — 基于 Python 的操作

### 在 Clore.ai 上部署

```bash
# 客户端/服务器 模式
docker run -d \
  --name chromadb \
  -p 8000:8000 \
  -v $(pwd)/chroma-data:/chroma/chroma \
  chromadb/chroma:latest

# 测试
curl http://localhost:8000/api/v1/heartbeat
```

**适用场景**: Jupyter 笔记本、快速 RAG 原型，<1M 向量

***

## Qdrant：深入解析

### 优势

✅ **最佳过滤** — 真正的预过滤向量搜索\
✅ **Rust 性能** — 极快、低延迟\
✅ **量化** — 二进制/标量可将内存降低 4-32×\
✅ **稀疏向量** — 混合的密集+稀疏搜索\
✅ **简单运维** — 单个二进制文件，无依赖\
✅ **文档完善** — 优秀的指南和示例

### 弱点

❌ **免费层为单写入者** 在免费层中（无分布式写入）\
❌ **生态较小** 比 Milvus 差\
❌ **无 GraphQL** — 仅 REST/gRPC

### 在 Clore.ai 上部署

```bash
# 简单部署
docker run -d \
  --name qdrant \
  -p 6333:6333 \
  -p 6334:6334 \
  -v $(pwd)/qdrant-storage:/qdrant/storage \
  qdrant/qdrant:latest

# 启用认证 时
docker run -d \
  --name qdrant \
  -p 6333:6333 \
  -e QDRANT__SERVICE__API_KEY=your-secret-key \
  -v $(pwd)/qdrant-storage:/qdrant/storage \
  qdrant/qdrant:latest

# 测试
curl http://localhost:6333/health
```

**适用场景**: 生产级 RAG、带过滤的搜索、1-100M 向量

***

## Milvus：深入解析

### 优势

✅ **大规模** — 已测试到 100 亿+ 向量\
✅ **分布式** — 云原生的 Kubernetes 架构\
✅ **最多的索引类型** — IVF、HNSW、DiskANN、ScaNN\
✅ **GPU 加速** — GPU 加速的索引构建\
✅ **企业功能** — RBAC、审计日志、加密\
✅ **Zilliz Cloud** — 完全托管选项

### 弱点

❌ **复杂部署** — 需要 etcd、MinIO 和 Pulsar/Kafka\
❌ **资源消耗大** — 建议至少 3 个节点\
❌ **学习曲线比竞争对手更陡峭** — 需要更多概念来理解 **对小规模来说是过度设计** — 不要用于 <1M 向量的场景

### 在 Clore.ai 上的部署（独立部署）

```yaml
# Milvus 独立部署的 docker-compose.yml
version: "3.8"
services:
  etcd：
    image: quay.io/coreos/etcd:v3.5.5
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
    command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls=http://0.0.0.0:2379

  minio:
    image: minio/minio:RELEASE.2023-03-13T19-46-17Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    command: minio server /minio_data --console-address ":9001"

  milvus:
    image: milvusdb/milvus:v2.4.0
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - etcd
      - minio
```

```bash
docker compose up -d
# 完全启动大约需要 ~60 秒
```

**适用场景**: 大规模生产，100M+ 向量，企业级部署

***

## Weaviate：深入解析

### 优势

✅ **多模态** — 文本、图像、音频、视频\
✅ **自动向量化** — 内置模型集成\
✅ **GraphQL API** — 通过图遍历提供丰富的查询能力\
✅ **模块化系统** — 可插件化的向量化器和读取器\
✅ **混合检索** — 原生支持 BM25 + 向量 **生成式搜索** — 内置的带生成模块的 RAG

### 弱点

❌ **内存占用更高** — 模式感知存储占用更大\
❌ **无 gRPC** — 仅 GraphQL（在高 QPS 下较慢）\
❌ **复杂的 schema** — 需要提前定义类\
❌ **在极端规模下较慢** 比 Milvus 慢

### 在 Clore.ai 上部署

```bash
# 简单部署
docker run -d \
  --name weaviate \
  -p 8080:8080 \
  -p 50051:50051 \
  -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
  -e PERSISTENCE_DATA_PATH=/var/lib/weaviate \
  -e DEFAULT_VECTORIZER_MODULE=none \
  -e CLUSTER_HOSTNAME=node1 \
  -v $(pwd)/weaviate-data:/var/lib/weaviate \
  cr.weaviate.io/semitechnologies/weaviate:1.25.0

# 使用 transformer 向量化器 时
docker run -d \
  --name weaviate \
  -p 8080:8080 \
  -e DEFAULT_VECTORIZER_MODULE=text2vec-transformers \
  -e TRANSFORMERS_INFERENCE_API=http://t2v-transformers:8080 \
  cr.weaviate.io/semitechnologies/weaviate:1.25.0
```

**适用场景**: 多模态搜索、知识图谱、生成式搜索

***

## 何时使用哪个

### 基于规模的决策

```
< 100K 向量    → ChromaDB（嵌入式）
100K - 10M        → Qdrant（最好平衡）
10M - 1B          → Milvus 或 Qdrant（集群）
1B+               → Milvus（分布式）
```

### 基于用例的决策

| 在 Clore.ai 上的预估费用 | 最佳选择              | 为什么        |
| ----------------- | ----------------- | ---------- |
| RAG 原型            | ChromaDB          | 零配置、简单 API |
| 生产环境 RAG          | Qdrant            | 快速过滤、简单运维  |
| 语义搜索              | Qdrant 或 Milvus   | 最佳性能       |
| 多模态               | Weaviate          | 内置图像/音频支持  |
| 知识图谱              | Weaviate          | 图遍历查询      |
| 十亿级规模             | Milvus            | 分布式架构      |
| 混合检索              | Qdrant 或 Weaviate | BM25 + 向量  |
| 企业级               | Milvus 或 Weaviate | RBAC、审计日志  |

***

## Clore.ai 上的内存需求

### 内存估算公式

```
所需内存 ≈（向量数量 × 维度 × 4 字节）× 1.5（开销）

示例：1M 向量 × 1536 维 × 4 字节 × 1.5 = 9.2GB 内存

使用量化（Qdrant 二进制）：
1M × 1536 / 8 × 1.5 = 0.29GB 内存（32× 压缩！）
```

### 推荐的服务器规格

| 数据集大小   | ChromaDB | Qdrant  | Milvus  | Weaviate |
| ------- | -------- | ------- | ------- | -------- |
| 1M 向量   | 16GB 内存  | 8GB 内存  | 32GB 内存 | 16GB 内存  |
| 10M 向量  | ❌        | 32GB 内存 | 64GB 内存 | 48GB 内存  |
| 100M 向量 | ❌        | 128GB+  | 256GB+  | 256GB+   |

***

## 快速比较：Docker 启动时间

| 数据库      | `docker run` 到就绪 | 依赖项          |
| -------- | ---------------- | ------------ |
| ChromaDB | 约 5 秒            | 无            |
| Qdrant   | 约 3 秒            | 无            |
| Milvus   | \~60 秒           | etcd + MinIO |
| Weaviate | \~15 秒           | 无（独立）        |

***

## 定价（在 Clore.ai 上自托管）

所有四个数据库都是 **免费** 来自行托管。成本仅为 Clore.ai 服务器租赁：

```
示例：1M 向量的 RAG 系统
- Qdrant：8GB 内存服务器 ~ $0.10/小时
- ChromaDB：16GB 内存服务器 ~ $0.15/小时  
- Weaviate：16GB 内存服务器 ~ $0.15/小时
- Milvus：32GB 内存服务器 ~ $0.30/小时（+ etcd/minio 的额外开销）
```

***

## 有用的链接

* [ChromaDB 文档](https://docs.trychroma.com)
* [Qdrant 文档](https://qdrant.tech/documentation)
* [Milvus 文档](https://milvus.io/docs)
* [Weaviate 文档](https://weaviate.io/developers/weaviate)
* [ANN 基准](https://ann-benchmarks.com)
* [由 Qdrant 提供的向量数据库基准](https://qdrant.tech/benchmarks)

***

## 总结

| 从……开始...     | 如果您需要...            |
| ------------ | ------------------- |
| **ChromaDB** | 快速原型，<1M 向量，最小设置    |
| **Qdrant**   | 生产级 RAG、出色的过滤、简易运维  |
| **Milvus**   | 十亿级、企业级、分布式架构       |
| **Weaviate** | 多模态、知识图谱、GraphQL 查询 |

对于在 Clore.ai 上的大多数生产 RAG 应用， **Qdrant** 在性能、功能和运维简易性之间提供最佳平衡。对于大规模或企业级需求， **Milvus** 是行业标准。

***

## Clore.ai 的 GPU 建议

| 在 Clore.ai 上的预估费用 | 开发/测试             | RTX 3090（24GB） |
| ----------------- | ----------------- | -------------- |
| \~$0.12/每 GPU/每小时 | 生产                | RTX 4090（24GB） |
| \~$0.70/每 GPU/每小时 | 大规模               | A100 80GB      |
| \~$1.20/每 GPU/每小时 | 💡 本指南中的所有示例均可部署在 | Clore.ai       |

> GPU 服务器上。浏览可用 GPU 并按小时租用 — 无需承诺，提供完整的 root 访问权限。 [Clore.ai](https://clore.ai/marketplace) GPU 服务器。浏览可用 GPU 并按小时租用 — 无需承诺，提供完整的 root 访问权限。
