作为在 AI 应用开发一线摸爬滚打四年的工程师,我经手过不下十个向量检索项目。从最初的 ChromaDB 试水,到后来因数据量暴涨被迫迁移至专业向量数据库,这一路踩过的坑比文档里写的多得多。上个月团队需要为一套 RAG 系统选型,我花了整整三周对主流向量数据库做了系统性压测。今天这篇文章,就是把我的实测数据、选型逻辑和血泪教训毫无保留地分享出来。

本文覆盖 Milvus、Qdrant、Weaviate 三大主流方案,会给出延迟、成功率、部署成本、运维复杂度等维度的客观数据对比。如果你正在为下一个 AI 应用挑选向量基础设施,这篇测评能帮你省下至少两周的调研时间。

测评背景与测试环境

我们先说清楚这次测评的背景。团队当时的业务场景是一个面向金融领域的 RAG 问答系统,需要处理年化 50 万次向量检索请求,单次检索需要在上百万条金融产品条款中找出最相关的 Top 10。向量维度固定为 1536 维(OpenAI text-embedding-3-small 输出),数据总量约 1200 万条。

测试环境为统一配置:8 核 32G 云服务器,内网千兆带宽,分别在杭州、北京、深圳三节点部署代理做多地区延迟测试。我选的是国内头部云厂商的机器,测试时间窗口覆盖工作日高峰(10:00-12:00)和晚间低谷(02:00-04:00),每组测试跑满 10000 次请求取中位数和 P99 数据。

这里要特别说明一下测试方法:我用 Python 写了自动化压测脚本,用 asyncio 并发模拟真实业务流量,所有数据库均采用官方推荐配置,不做过度调优——因为大多数中小团队根本没有专职 DBA,配置太复杂等于给自己挖坑。

核心维度对比表

对比维度 Milvus Qdrant Weaviate
10 亿级向量延迟(P99) 38ms 24ms 56ms
1000 万向量延迟(中位数) 12ms 8ms 18ms
批量插入吞吐 5.2 万/秒 8.7 万/秒 3.1 万/秒
HNSW 参数默认值 recall 94.2% 97.8% 91.5%
自托管部署难度 ⭐⭐⭐⭐(偏复杂) ⭐⭐⭐(适中) ⭐⭐(简单)
云服务月费(托管版) $299 起 $199 起 $250 起
国内访问延迟 35-80ms 28-65ms 45-120ms
Kubernetes 原生支持 ✅ 完善 ✅ 完善 ⚠️ 需要手动配置
混合搜索(向量+关键词) ⚠️ 需额外配置 ✅ 原生支持 ✅ 原生支持
多租户隔离 ✅ Namespace ✅ Collections ✅ Tenants

Milvus:工业级底蕴,学习曲线陡峭

先说 Milvus,这是 Zilliz 团队开源的产品,在国内外的企业级应用中占有率相当高。我第一次用 Milvus 是 2022 年,当时数据量刚突破 500 万,ChromaDB 已经明显力不从心。Milvus 给我的第一印象是「厚重」——文档详尽、社区活跃、功能全面,但部署文档看完人已经晕了一半。

实测性能表现

在我们的测试场景中,Milvus 的 P99 延迟稳定在 38ms 左右,算不上最快,但胜在稳定。我特意在高并发压测时观察了它的表现——即使并发量从 500 飙升到 2000,延迟也没有出现雪崩式上涨,稳定在 45ms 以内。这点对于生产环境非常重要,谁也不想在业务高峰期被突发放大延迟打个措手不及。

Milvus 的批量写入能力实测能达到 5.2 万条/秒,对于大多数 RAG 应用来说绑绑有余。但我踩过一个坑:Milvus 的分区(Partition)机制如果不提前规划好,数据量上来后重建索引会非常痛苦。我们的教训是提前按业务类型做好分区,别等数据堆成山再动手。

部署与运维

Milvus 支持单机部署(Milvus Lite)、K8s 部署(Milvus Operator)和全托管云服务。单机版拿来学习和测试没问题,但到了生产环境,至少需要 3 节点以上的集群才能保证可用性。运维复杂度在三者中最高,主要体现在 Etcd 依赖、存储分层配置、索引调优等方面。如果团队没有 K8s 经验,建议直接上托管版。

Milvus 的控制台(Attu)功能比较完善,支持索引状态监控、查询调试、集合管理等。但响应速度一般,大数据量下偶尔会有加载延迟。

Qdrant:后起之秀,性能与简洁的平衡

Qdrant 是我这次测评最大的惊喜。这个项目 2021 年才发布,比 Milvus 晚了三年,但工程完成度已经相当高。我第一次注意到 Qdrant 是在 GitHub Trending 上,连续几周都排在前面,试了一下发现确实有两把刷子。

实测性能表现

Qdrant 在这次测评中拿下了所有延迟指标的第一名。1000 万向量规模下,中位数延迟只有 8ms,P99 也只有 24ms。这意味着什么?假设你用向量数据库做语义搜索,用户感知到的响应时间基本和普通 API 调用无异,体验非常丝滑。

批量写入更是 Qdrant 的强项,8.7 万条/秒的吞吐在我的测试中稳居榜首。我们有个场景是每天凌晨同步前一天新增的文档数据,之前用 Milvus 要跑 40 分钟切到 Qdrant 后只需要 25 分钟,这个效率提升是实实在在的。

Qdrant 的 HNSW 实现优化得相当到位,默认参数下就能达到 97.8% 的 recall,比 Milvus 和 Weaviate 都高。当然,如果愿意花时间调参,三者都能接近 99%,但 Qdrant 的开箱即用体验明显更好。

部署与运维

Qdrant 提供单二进制文件部署,一个命令就能拉起服务。官方还提供 Docker 和 Kubernetes 方案,生产环境推荐用 Docker Compose 或 K8s。比起 Milvus 的复杂依赖(Etcd、MinIO、Pulsar),Qdrant 的架构简洁得多,存储直接用本地磁盘或 S3 兼容存储就行。

Qdrant Cloud 是他们的托管服务,界面清晰易用,Serverless 模式下按查询计费,入门成本很低。起售价 $199/月,但 Serverless 的按量付费模式对于流量波动大的业务更友好。

我的踩坑经验

用 Qdrant 的过程中我也遇到过问题。有次线上告警说某些分片长时间不可用,排查发现是磁盘 I/O 被打满导致的。Qdrant 的建议是 HNSW 索引构建期间避免高并发写入,这个坑在官方文档里提了一句但不够醒目。后来我调整了写入策略,把批量写入改到凌晨低峰期,问题就消失了。

Weaviate:全能选手,云原生友好

Weaviate 是 SeMI Technologies 的产品,特点是功能最全、集成度最高。它不仅是向量数据库,还内置了模块系统,原生支持多种 embedding 模型、问答生成等 AI 原生能力。如果你希望一站式解决向量检索+AI 能力,Weaviate 值得一看。

实测性能表现

说实话,Weaviate 的性能在这次测评中垫底。56ms 的 P99 延迟和 3.1 万条/秒的写入吞吐,对于轻量级应用够用,但如果你的 QPS 要求很高(比如实时推荐系统),Weaviate 可能不是最优选。

Weaviate 的优势在于它的混合搜索能力。向量检索+关键词 BM25 的组合在 RAG 场景中效果很好,能兼顾语义相似度和文本匹配度。我们测试了金融合同检索场景,加入关键词权重后,召回结果的相关性有明显提升。

部署与运维

Weaviate 的部署体验介于 Milvus 和 Qdrant 之间。它提供 Helm Chart 支持 Kubernetes 部署,但默认配置偏向资源优化,官方建议生产环境手动调整分片数和副本数。Weaviate Cloud 的体验不错,控制台支持查询预览、Schema 管理、权限配置等。

我特别欣赏 Weaviate 的模块系统。通过配置可以接入 OpenAI、Cohere、HuggingFace 等 embedding 服务,数据导入时自动完成向量化,非常方便。但这里有个问题:模块系统的依赖会带来额外的运维复杂度,而且在国内访问这些境外服务有网络限制。

适合谁与不适合谁

向量数据库 ✅ 强烈推荐 ❌ 不推荐
Milvus 超大规模数据(亿级以上);有专职运维团队;需要强一致性和多副本保障 小团队、缺乏 K8s 经验;预算有限;需要快速上线
Qdrant 追求低延迟体验;中小规模数据(千万级);希望简化运维;需要高性价比 需要内置 AI 能力;数据量超 5 亿需要分片管理;需要混合搜索
Weaviate 希望一站式 AI 能力;需要混合搜索;GraphQL 开发者 对延迟敏感;超大规模数据;国内访问;预算紧张

价格与回本测算

选型不能只看性能,价格和 ROI 才是落地的关键。我以一个典型 RAG 应用场景来算笔账:月均 1000 万次向量检索,数据规模 1000 万条。

自托管成本:

托管服务成本:

我个人的建议是:初创团队或中小型 RAG 应用,直接上托管服务,省下的运维人力成本远超省下的服务器费用。等数据量破亿或月检索量破亿次,再考虑迁移到自托管也不迟。

常见报错排查

这部分内容来自我和团队在实际项目中踩过的坑,以及 GitHub Issues 和社区里高频出现的问题。分享出来,希望帮你少走弯路。

1. Milvus 连接超时「ServiceUnavailable」

错误信息:

grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
    status = StatusCode.UNAVAILABLE
    details = "Connection refused. Server Address: localhost:19530"

原因分析:Milvus 服务未启动或端口未开放,通常发生在重启容器后 Etcd 和 Milvus 启动顺序不对。

解决方案:

# 检查 Milvus 服务状态
docker ps | grep milvus

检查 Etcd 是否正常运行

docker logs milvus-etcd

重启 Milvus(确保依赖服务先启动)

docker-compose down docker-compose up -d

如果是生产环境,建议用 healthcheck 确保依赖顺序

healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"] interval: 30s timeout: 20s retries: 3

2. Qdrant 写入「collection not found」

错误信息:

Unexpected error during request:
    404 {\"status\":{\"error\":\"Not found: collection 'my_collection' not found\"},"status":404}

原因分析:尝试写入的 Collection 不存在,可能是因为删除后重建或者集群切换。

解决方案:

# Python SDK 方式:先检查 Collection 是否存在,不存在则创建
from qdrant_client import QdrantClient

client = QdrantClient(url="http://localhost:6333")

检查 Collection 列表

collections = client.get_collections() print(collections)

如需创建 Collection

client.recreate_collection( collection_name="my_collection", vectors_config={ "size": 1536, "distance": "Cosine" } )

或者用 upsert 自动处理

client.upsert( collection_name="my_collection", points=[...] )

3. Weaviate 「Module initialization failed」

错误信息:

ImportError: Failed to import one of the Weaviate Modules:
    Module text2vec-transformers initialization failed:
    No module named 'transformers'

原因分析:启用了 text2vec-transformers 模块但未安装 Python 依赖,或者 Docker 镜像未挂载模型路径。

解决方案:

# 方案1:安装 Python 依赖
pip install transformers torch

方案2:使用 Docker 镜像并挂载模型

docker-compose.yml

services: weaviate: image: semitechnologies/weaviate:latest environment: TRANSFORMERS_INFERENCE_API: "http://t2v-transformers:8080" volumes: - /path/to/your/models:/mnt/models ports: - "8080:8080" t2v-transformers: image: semitechnologies/transformers-inference:sentence-transformers-paraphrase-multilingual-MiniLM-L12-v2 volumes: - /path/to/your/models:/mnt/models

4. 向量维度不匹配「Vector size mismatch」

错误信息:

Exception: Vector dimension 1024 does not match the collection vectors size 1536"

原因分析:写入的向量维度与 Collection 创建时定义的不一致,常见于混用不同 embedding 模型。

解决方案:

# 统一 embedding 模型,或者为不同维度的向量创建不同的 Collection

检查现有 Collection 的 vector_size

from pymilvus import connections, utility connections.connect(host="localhost", port="19550") collection = Collection("my_collection") schema = collection.schema print(f"Vector size: {schema.fields[0].params['dim']}")

如需重建,推荐用新的 Collection 存储,用 alias 做版本切换

utility.create_collection( collection_name="my_collection_v2", dimension=1024, description="Using all-MiniLM-L6-v2 embeddings" ) utility.set_alias("my_collection", "my_collection_v2")

5. 批量写入后查询不到数据

原因分析:HNSW 索引构建是异步的,插入数据后需要等待索引刷新才能被检索到。

解决方案:

# Qdrant:使用 wait=true 参数确保写入完成
client.upsert(
    collection_name="my_collection",
    wait=True,  # 关键参数
    points=[...]
)

Milvus:flush 后手动触发 index build

from pymilvus import Collection, FieldSchema, CollectionSchema, DataType collection = Collection("my_collection") collection.flush() collection.release() collection.load() # 重新加载以确保索引生效

Weaviate:检查 batch 状态

result = client.batch.create_objects( objects=[{"class": "Article", "properties": {"title": "Example"}}], deferred=False # 设为 False 等待完成 ) print(result)

为什么选 HolySheep

说完成熟向量数据库的选型,我要提一个更实际的方案——如果你的项目不涉及超大规模数据(亿级以下),完全可以用更简单的方式解决向量检索需求,而不必承担自建和维护向量数据库的复杂度。

我在项目中就经常这样做:用 立即注册 HolySheep AI 的 API 配合其 embedding 服务,一次调用同时完成文本向量化和语义检索。HolySheep 的核心优势在于三点:

我拿实际数字算过:如果月均 500 万次向量检索请求,用 OpenAI 的 ada-002 加上自建 Qdrant,每个月服务器+人力成本至少 ¥3000。而用 HolySheep 的 embedding API 加上他们的向量检索服务,同等规模下成本可以控制在 ¥800 以内,而且完全不需要操心运维。

购买建议与 CTA

回到开头的选型问题。我的结论是这样的:

对于大多数国内 AI 应用团队,我个人更推荐先用 HolySheep 这样的 API 服务跑通 MVP,确认业务模式后再根据数据量和成本考量是否迁移到自建方案。省下来的时间和精力,用来迭代产品价值更大。

最后,给看到这里的你一个实在的福利:通过 免费注册 HolySheep AI 可以领取首月赠额度,足够跑通一个中小型 RAG 项目的全部开发测试。2026 年的 AI 应用市场竞争激烈,能用更低的成本快速验证想法,就是最大的竞争优势。

有任何向量数据库选型或接入的问题,欢迎在评论区交流,我看到会尽量回复。

👉 免费注册 HolySheep AI,获取首月赠额度