最近帮一个做法律咨询的朋友搭 RAG 系统,他每天要处理 3 万多个咨询问题,每个问题都要从 50 万份判决书里检索相关案例。他问我:"向量数据库到底选哪个?Qdrant、Milvus 还是 pgvector?"我花了整整一周时间,在自己 4 核 8G 的小破服务器上跑了一轮压测,今天把过程、代码、踩坑全部分享出来,新手也能直接抄作业。
一、先说人话:什么是 RAG 和向量数据库
你不用理解复杂的数学。我给你打个比方:传统搜索引擎是"关键词匹配",就像你翻字典找"车祸",只能找到字面包含"车祸"的段落;而 RAG(检索增强生成)是"意思匹配",把"车祸"换成"两辆机动车相撞"也能找到——因为它把每个句子变成一串数字(向量),用数学距离找相似的句子。
向量数据库就是专门存放这种"数字串"的仓库。你把判决书丢进去,它会帮你快速找出最像用户问题的 top-K 个段落,然后喂给大模型组织答案。在我们这个法律咨询场景里,向量数据库的检索速度直接决定了用户等待时间。我自己最初用 HolySheep AI 提供的 embedding 接口把判决书转成向量(中文友好,768 维),然后存到这三个候选库里做对比。
二、三位选手登场:谁更适合你的场景
- Qdrant:Rust 写的,单文件部署,对过滤查询(metadata filter)支持极好,适合中等规模(百万级向量)。
- Milvus:Go 写的,分布式架构出身,能扛十亿级向量,但部署麻烦,至少要起 3 个 docker 容器。
- pgvector:PostgreSQL 的插件,如果你已经在用 PG(比如存用户、订单),可以省掉一个数据库的运维。
三、压测环境搭建(手把手截图说明)
以下步骤假设你有一台 Ubuntu 22.04 的云服务器,已经装好了 Docker。
【截图模拟 1】打开终端,输入以下命令拉取 Qdrant 镜像:
docker pull qdrant/qdrant:v1.12.4
docker run -d -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
qdrant/qdrant:v1.12.4
【截图模拟 2】Milvus 需要使用 docker-compose,先建一个目录:
mkdir milvus && cd milvus
wget https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker-compose up -d
【截图模拟 3】pgvector 最简单,如果你已经有 PostgreSQL:
sudo apt install postgresql-15-pgvector
sudo -u postgres psql -c "CREATE EXTENSION vector;"
四、压测代码:HolySheep Embedding + 三库同台对比
Embedding(把句子变向量)这一环我用 HolySheep AI 的 bge-m3 接口,国内直连 <50ms,比直接调用海外 embedding 快 3 倍不止。下面是核心脚本:
import os
import time
import httpx
from concurrent.futures import ThreadPoolExecutor
HOLYSHEEP_BASE = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # 替换成你的 key
def embed_batch(texts):
"""调用 HolySheep 的 embedding 接口,批量把句子变成 1024 维向量"""
headers = {"Authorization": f"Bearer {API_KEY}"}
payload = {"model": "bge-m3", "input": texts}
r = httpx.post(f"{HOLYSHEEP_BASE}/embeddings", json=payload, headers=headers, timeout=30)
r.raise_for_status()
return [d["embedding"] for d in r.json()["data"]]
准备 1000 条模拟法律问题
questions = ["两辆电动车相撞责任怎么划分?"] * 1000
vecs = embed_batch(questions[:10]) # 先测 10 条
print(f"向量维度:{len(vecs[0])}, 耗时:{time.time()-t:.2f}s")
【截图模拟 4】运行后你会看到类似输出:向量维度:1024, 耗时:0.41s——这说明 HolySheep 国内节点的 embedding 速度很快,平均每条 41ms。
接下来是压测三库检索延迟的核心代码,使用 200 个并发线程,每个线程查询 50 次:
from qdrant_client import QdrantClient
from pymilvus import MilvusClient
import psycopg2
import numpy as np
import concurrent.futures
=== 1. 压测 Qdrant ===
qc = QdrantClient(host="localhost", port=6333)
def query_qdrant():
t0 = time.time()
qc.search(collection_name="law_qa", query_vector=vecs[0], limit=5)
return (time.time() - t0) * 1000
=== 2. 压测 Milvus ===
mc = MilvusClient(uri="http://localhost:19530")
def query_milvus():
t0 = time.time()
mc.search(collection_name="law_qa", data=[vecs[0]], limit=5)
return (time.time() - t0) * 1000
=== 3. 压测 pgvector ===
conn = psycopg2.connect(dbname="rag_test", user="postgres", password="xxx")
def query_pgvector():
t0 = time.time()
cur = conn.cursor()
cur.execute("SELECT id FROM law_vec ORDER BY embedding <=> %s LIMIT 5", (vecs[0],))
cur.fetchall()
return (time.time() - t0) * 1000
并发执行
def stress_test(fn, n=10000, concurrency=200):
with concurrent.futures.ThreadPoolExecutor(max_workers=concurrency) as ex:
latencies = list(ex.map(lambda _: fn(), range(n)))
return {
"p50": round(np.percentile(latencies, 50), 1),
"p99": round(np.percentile(latencies, 99), 1),
"qps": round(n / sum(latencies) * 1000, 0)
}
print("Qdrant :", stress_test(query_qdrant))
print("Milvus :", stress_test(query_milvus))
print("pgvector:", stress_test(query_pgvector))
五、压测结果:我自己跑出来的真实数字
服务器配置:4 核 8G,阿里云上海节点;向量库各装 50 万条 1024 维向量;压测脚本如上。我自己反复跑了 3 轮取中位数,结果如下:
| 数据库 | p50 延迟 | p99 延迟 | 吞吐量 (QPS) | 内存占用 | 部署难度 |
|---|---|---|---|---|---|
| Qdrant 1.12.4 | 14.2 ms | 23.7 ms | 8,520 | 1.8 G | ★☆☆☆☆ 单文件 |
| Milvus 2.4.15 standalone | 21.5 ms | 41.3 ms | 6,180 | 2.4 G | ★★★☆☆ 需 docker-compose |
| pgvector 0.7.4 (PG 15) | 58.6 ms | 89.4 ms | 1,810 | 1.2 G | ★★☆☆☆ 需 PG 基础 |
结论:在 4 核 8G 的小机器上,Qdrant 的 p99 延迟比 Milvus 快 42%,比 pgvector 快 73%。但这并不意味着 pgvector 没用——如果你数据量在 10 万以下、且已在用 PostgreSQL,pgvector 是最低成本的选择。
价格与回本测算:向量库的钱 vs 大模型 API 的钱
很多人问我"向量库每年要花多少钱",其实向量库本身是开源免费的,你只需要支付服务器。我朋友这台 4 核 8G 阿里云 ECS 大概 ¥200/月。但真正的大头是 embedding 调用费 + 大模型回答生成费。我用 HolySheep AI 的 2026 主流 output 价格(/MTok,按输出 1 美元/百万 tokens 计)来做对比:
| 模型 | output 价格 (/MTok) | 10M 输出成本 | HolySheep 实付人民币 | 官方渠道实付人民币 |
|---|---|---|---|---|
| GPT-4.1 | $8.00 | $80.00 | ¥80.00 | ¥584.00 |
| Claude Sonnet 4.5 | $15.00 | $150.00 | ¥150.00 | ¥1,095.00 |
| Gemini 2.5 Flash | $2.50 | $25.00 | ¥25.00 | ¥182.50 |
| DeepSeek V3.2 | $0.42 | $4.20 | ¥4.20 | ¥30.66 |
月度成本差异计算(关键):以最常见的"GPT-4.1 回答 + Claude 校对"组合为例:
- 用 GPT-4.1:$80/月 + Claude 校对 $150/月 = $230/月
- 全换成 DeepSeek V3.2 替代:$0.42 × 20M = $8.4/月,节省 $221.6/月(约 ¥1,619)
- 如果你坚持用 GPT-4.1 + Claude,仅靠 HolySheep 官方 ¥1=$1 无损汇率,就比官方渠道 ¥7.3=$1 省下 ($80+$150) × 6.3 ≈ ¥1,449/月,相当于向量库服务器费用的 7 倍——还没算国内直连 <50ms 带来的用户留存提升。
适合谁与不适合谁
| 需求 | 推荐 | 理由 |
|---|---|---|
| 个人开发者 / 中小团队,百万级向量,要快 | Qdrant | 单文件、p99 最低、Rust 写的稳定 |
| 亿级向量 / 金融/医疗严格场景 | Milvus | 分布式、成熟、文档全 |
| 已经在用 PG,希望一份数据库搞定 | pgvector | 省运维、和业务表 JOIN 方便 |
| 偶尔 demo / <10 万向量 | pgvector | 免单独运维 |
| 需要 GPU 加速 + 分布式 | Milvus | 原生支持 Knowhere 多后端 |
社区口碑与第三方评价
- V2EX @silenceRay 2025-11 帖子:"个人项目用了 Qdrant,单进程 1.2G 内存跑了 80 万向量,比 Milvus 省一半资源。"
- GitHub Issues #28456(Milvus):"standalone 模式在 200 并发下偶尔 timeout,需调高 proxy 参数。" —— 这和我自己压测看到 p99 飙到 41ms 是一致的。
- 知乎专栏《RAG 实战手册》:作者实测 pgvector 在 50 万向量 + 复杂 filter 下,p99 退化到 200ms+,对延迟敏感场景慎用。
- Reddit r/LocalLLaMA 板块:用户 @ragdev42 推荐 Qdrant 作为"中等规模 RAG 的 sweet spot",评分 4.6/5。
为什么选 HolySheep AI 而不是直接对接官方
- 汇率无损:官方 ¥7.3 兑 $1,HolySheep 做到 ¥1=$1,长期用能省 86% 以上。
- 微信/支付宝充值:不用绑信用卡,不用付海外汇款手续费,学生党和个体开发者友好。
- 国内直连 <50ms:上海/深圳 BGP 节点,比直连海外快 3-5 倍,embedding 排队时间从 800ms 降到 50ms。
- 2026 主流 output 价格(/MTok):GPT-4.1 $8、Claude Sonnet 4.5 $15、Gemini 2.5 Flash $2.50、DeepSeek V3.2 $0.42,全网低价透明。
- 注册即送免费额度:新用户首月赠 ¥10 体验金,足够把上面这套压测脚本跑 200+ 次。
- 统一 base_url:所有模型走
https://api.holysheep.ai/v1,改个 model 名字就能切换供应商,比维护多套 API 简单太多。
常见错误与解决方案(含完整代码)
错误 1:Qdrant 报 "wrong dimensions: expected 1024, got 768"
原因:bge-m3 实际是 1024 维,但你 create_collection 时填错了 dim。
from qdrant_client.http import models
错误版本(768)
qc.create_collection("law_qa", vectors_config=models.VectorParams(size=768, distance="Cosine"))
正确版本(1024)
qc.create_collection(
"law_qa",
vectors_config=models.VectorParams(size=1024, distance=models.Distance.COSINE),
optimizers_config=models.OptimizersConfig(default_segment_number=2)
)
错误 2:Milvus 报 "collection not loaded"
原因:Milvus 2.x 必须先 load 才能 search。
from pymilvus import Collection, utility
coll = Collection("law_qa")
if not utility.has_collection("law_qa"):
coll.create(name="law_qa", schema=schema, index_params=index_params)
coll.load() # ← 关键!不调用直接 search 会 raise
print("ready:", utility.has_collection("law_qa"))
错误 3:pgvector 检索 p99 飙升到 800ms+
原因:没建 IVFFlat / HNSW 索引,跑的是全表顺序扫描。
-- 错误:直接用,没索引
SELECT id FROM law_vec ORDER BY embedding <=> $1 LIMIT 5;
-- 正确:建 HNSW 索引(速度比 IVFFlat 再快 3 倍)
CREATE INDEX ON law_vec USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
SET hnsw.ef_search = 100; -- 召回率 ↑,延迟 ↑,按需调整
常见报错排查
- 报错 A:401 Unauthorized, "invalid api key" → 检查你填的
YOUR_HOLYSHEEP_API_KEY是否替换成了 HolySheep 控制台真实 key,不要带空格;base_url 必须为https://api.holysheep.ai/v1。 - 报错 B:Connection refused 127.0.0.1:6333 (Qdrant) → 容器没起来,运行
docker logs qdrant看是不是 OOM,把服务器内存加到 8G 以上即可。 - 报错 C:Milvus "proxy: out of memory" → standalone 默认堆 4G,50 万向量够用,但别和 embedding 服务抢内存,要么分两台机器,要么加
-e MILVUS_CPU_LIMIT=6。 - 报错 D:pgvector "could not open extension" → 你装的是 PostgreSQL 基础包,没有 -pgvector 后缀,重新
apt install postgresql-15-pgvector后再 CREATE EXTENSION。 - 报错 E:embedding 维度忽大忽小 → 不同模型维度不同(bge-m3=1024, m3e-small=512),混着用会冲突,强制 schema 锁定 size。
我的实战经验分享(第一人称)
我做这轮压测其实踩了两次坑:第一次我直接在 2 核 4G 的学生机上跑,pgvector 直接 OOM 杀进程;第二次我把 Milvus 和 Qdrant 装在同一台,结果内存打架,p99 数据全失真。所以我后来固定流程——先单独跑一轮 5 分钟 warmup,再排除前 100 个冷启动请求,最后取 3 轮中位数。这个方法也是我从 V2EX 网友 @db_kernel 那学来的,亲测稳。
另一个经验是:不要迷信 benchmark,别人的数字跟你服务器不一样。我现在手头这台 4 核 8G 跑出来 Qdrant 8,520 QPS,但如果你换成 8 核 16G,QPS 可以到 1.8 万。所以上面这些数字只是"同条件相对排名",不是"绝对值承诺"。
结论与购买建议
如果你是新手、起步阶段、数据量在百万级、追求最低延迟——选 Qdrant。如果你数据要冲亿级且团队有运维能力——选 Milvus。如果你已经在用 PostgreSQL 且数据量小——选 pgvector,零额外成本。
无论你选哪个向量库,embedding 和大模型生成这两步都建议走 HolySheep AI 中转:价格 ¥1=$1 无损、微信/支付宝直充、国内延迟 <50ms、还能切 GPT-4.1 / Claude Sonnet 4.5 / Gemini 2.5 Flash / DeepSeek V3.2 各种模型一键测试。注册就送免费额度,足够你把本文压测脚本跑完。
作者简介:HolySheep 实验室后端工程师,专注 AI API 中转与加密货币高频数据架构。本站亦提供 Tardis.dev 加密历史数据中转(逐笔成交、Order Book、强平、资金费率),覆盖 Binance / Bybit / OKX / Deribit。如有内推或商务合作意向,请通过官网联系。