> For the complete documentation index, see [llms.txt](https://docs.clore.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.clore.ai/guides/guides_v2-zh/dui-bi/vector-db-comparison.md).

# 向量数据库对比

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

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

***

## 快速决策矩阵

|               | ChromaDB   | Qdrant          | Milvus     | Weaviate          |
| ------------- | ---------- | --------------- | ---------- | ----------------- |
| **最适合**       | 原型开发、本地开发  | 生产级 RAG         | 十亿级搜索      | 知识图谱              |
| **部署**        | 嵌入式/服务器    | 服务器/云           | 服务器/云      | 服务器/云             |
| **可扩展性**      | 单节点        | 多节点             | 分布式        | 分布式               |
| **GitHub 星标** | 1.7 万以上    | 2.1 万以上         | 3.1 万以上    | 12K+              |
| **许可证**       | Apache 2.0 | Apache 2.0      | Apache 2.0 | BSD 3-Clause      |
| **托管云**       | 否          | 是（Qdrant Cloud） | 是（Zilliz）  | 是（Weaviate Cloud） |
| **语言**        | Python     | Rust            | 前往         | 前往                |

***

## 概览

### ChromaDB

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

**理念**：零配置，极致开发者体验。

```python
import chromadb

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

collection.add(
    documents=["机器学习很棒", "深度学习使用神经网络"],
    ids=["doc1", "doc2"]
)

results = collection.query(
    query_texts=["什么是 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": "文档 1"}),
    ]
)

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

### 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)

# 插入数据
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")

# 定义包含类的 schema
client.schema.create_class({
    "class": "Document",
    "vectorizer": "text2vec-transformers",
    "properties": [
        {"name": "content", "dataType": ["text"]},
        {"name": "category", "dataType": ["string"]}
    ]
})

# 使用自动向量化插入
client.data_object.create(
    {"content": "机器学习教程", "category": "技术"},
    "Document"
)

# 语义搜索
result = client.query.get("Document", ["content", "category"])\
    .with_near_text({"concepts": ["人工智能"]})\
    .with_limit(5)\
    .do()
```

***

## 性能基准

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

#### 100 万向量，768 维，余弦相似度

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

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

| 数据库      | QPS     | RAM 用量    | 备注        |
| -------- | ------- | --------- | --------- |
| 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 + payload 索引） | ✅    |
| 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** 原生集成\
✅ **零配置** — 非常适合原型开发

### 缺点

❌ **规模有限** — 超过 100-200 万向量就会吃力\
❌ **无分布式模式** — 仅限单节点\
❌ **过滤有限** — 不支持前置过滤\
❌ **无量化** — 更高的内存占用\
❌ **大规模下较慢** — 基于 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 原型、<100 万向量

***

## 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、过滤搜索、100 万-1 亿向量

***

## Milvus：深度解析

### 优势

✅ **超大规模** — 已测试支持 100 亿以上向量\
✅ **分布式** — 云原生 Kubernetes 架构\
✅ **大多数索引类型** — IVF、HNSW、DiskANN、ScaNN\
✅ **GPU 加速** — GPU 驱动的索引构建\
✅ **企业特性** — RBAC、审计日志、加密\
✅ **Zilliz Cloud** — 完全托管选项

### 缺点

❌ **部署复杂** — 需要 etcd、MinIO 和 Pulsar/Kafka\
❌ **资源占用高** — 建议至少 3 个节点\
❌ **学习曲线更陡** — 需要理解更多概念\
❌ **对小规模来说过于重型** — 不要用于 <100 万向量

### 在 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 秒
```

**最适合**：大规模生产环境、1 亿以上向量、企业级部署

***

## Weaviate：深度解析

### 优势

✅ **多模态** — 文本、图像、音频、视频\
✅ **自动向量化** — 内置模型集成\
✅ **GraphQL API** — 具有图遍历的丰富查询\
✅ **模块系统** — 可插拔的向量化器和读取器\
✅ **混合搜索** — 开箱即用的 BM25 + 向量\
✅ **生成式搜索** — 通过 generate 模块内置 RAG

### 缺点

❌ **更高内存占用** — 感知 schema 的存储更大\
❌ **无 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
```

**最适合**：多模态搜索、知识图谱、生成式搜索

***

## 何时使用哪个

### 基于规模的决策

```
< 10 万向量    → ChromaDB（嵌入式）
10 万 - 1000 万        → Qdrant（最佳平衡）
1000 万 - 10 亿          → Milvus 或 Qdrant（集群）
10 亿以上               → Milvus（分布式）
```

### 基于用例的决策

| 使用场景    | 最佳选择              | 原因         |
| ------- | ----------------- | ---------- |
| RAG 原型  | ChromaDB          | 零设置，简单 API |
| 生产级 RAG | Qdrant            | 快速过滤，简单运维  |
| 语义搜索    | Qdrant 或 Milvus   | 最佳性能       |
| 多模态     | Weaviate          | 内置图像/音频支持  |
| 知识图谱    | Weaviate          | 图遍历查询      |
| 十亿级规模   | Milvus            | 分布式架构      |
| 混合搜索    | Qdrant 或 Weaviate | BM25 + 向量  |
| 企业级     | Milvus 或 Weaviate | RBAC、审计日志  |

***

## Clore.ai 上的内存需求

### RAM 估算公式

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

示例：100 万向量 × 1536 维 × 4 字节 × 1.5 = 9.2GB RAM

使用量化（Qdrant 二进制）时：
100 万 × 1536 / 8 × 1.5 = 0.29GB RAM（32 倍压缩！）
```

### 推荐服务器规格

| 数据集大小   | ChromaDB | Qdrant   | Milvus   | Weaviate |
| ------- | -------- | -------- | -------- | -------- |
| 100万向量  | 16GB RAM | 8GB RAM  | 32GB RAM | 16GB RAM |
| 1000万向量 | ❌        | 32GB RAM | 64GB RAM | 48GB RAM |
| 1亿向量    | ❌        | 128GB+   | 256GB+   | 256GB+   |

***

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

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

***

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

这四个数据库都 **免费** 可免费自托管。成本仅为 Clore.ai 服务器租赁费用：

```
示例：100万向量 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** | 快速原型，少于100万向量，最少配置   |
| **Qdrant**   | 生产级 RAG，出色的过滤能力，运维简单 |
| **Milvus**   | 十亿级规模，企业级，分布式架构      |
| **Weaviate** | 多模态、知识图谱、GraphQL 查询  |

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

***

## Clore.ai GPU 推荐

| 使用场景  | 推荐 GPU         | Clore.ai 预计成本                     |
| ----- | -------------- | --------------------------------- |
| 开发/测试 | RTX 3090（24GB） | $0.07–0.21/gpu/hr                 |
| 生产环境  | RTX 4090（24GB） | $0.14–0.42/gpu/hr                 |
| 大规模   | A100 80GB      | [裸机](https://clore.ai/bare-metal) |

> 💡 本指南中的所有示例都可以部署在 [Clore.ai](https://clore.ai/marketplace) GPU 服务器上。浏览可用 GPU 并按小时租用——无需承诺，拥有完整 root 访问权限。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-zh/dui-bi/vector-db-comparison.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
