最近帮一个做法律咨询的朋友搭 RAG 系统,他每天要处理 3 万多个咨询问题,每个问题都要从 50 万份判决书里检索相关案例。他问我:"向量数据库到底选哪个?Qdrant、Milvus 还是 pgvector?"我花了整整一周时间,在自己 4 核 8G 的小破服务器上跑了一轮压测,今天把过程、代码、踩坑全部分享出来,新手也能直接抄作业。

一、先说人话:什么是 RAG 和向量数据库

你不用理解复杂的数学。我给你打个比方:传统搜索引擎是"关键词匹配",就像你翻字典找"车祸",只能找到字面包含"车祸"的段落;而 RAG(检索增强生成)是"意思匹配",把"车祸"换成"两辆机动车相撞"也能找到——因为它把每个句子变成一串数字(向量),用数学距离找相似的句子。

向量数据库就是专门存放这种"数字串"的仓库。你把判决书丢进去,它会帮你快速找出最像用户问题的 top-K 个段落,然后喂给大模型组织答案。在我们这个法律咨询场景里,向量数据库的检索速度直接决定了用户等待时间。我自己最初用 HolySheep AI 提供的 embedding 接口把判决书转成向量(中文友好,768 维),然后存到这三个候选库里做对比。

二、三位选手登场:谁更适合你的场景

三、压测环境搭建(手把手截图说明)

以下步骤假设你有一台 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 轮取中位数,结果如下:

表 1:50 万向量 / 200 并发下的延迟与吞吐对比(数据来源:本人实测 2025-12-19)
数据库p50 延迟p99 延迟吞吐量 (QPS)内存占用部署难度
Qdrant 1.12.414.2 ms23.7 ms8,5201.8 G★☆☆☆☆ 单文件
Milvus 2.4.15 standalone21.5 ms41.3 ms6,1802.4 G★★★☆☆ 需 docker-compose
pgvector 0.7.4 (PG 15)58.6 ms89.4 ms1,8101.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 计)来做对比:

表 2:相同 10M 月度输出下,不同大模型在 HolySheep 上的成本对比
模型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 校对"组合为例:

适合谁与不适合谁

表 3:三种向量库适用人群速查表
需求推荐理由
个人开发者 / 中小团队,百万级向量,要快Qdrant单文件、p99 最低、Rust 写的稳定
亿级向量 / 金融/医疗严格场景Milvus分布式、成熟、文档全
已经在用 PG,希望一份数据库搞定pgvector省运维、和业务表 JOIN 方便
偶尔 demo / <10 万向量pgvector免单独运维
需要 GPU 加速 + 分布式Milvus原生支持 Knowhere 多后端

社区口碑与第三方评价

为什么选 HolySheep AI 而不是直接对接官方

常见错误与解决方案(含完整代码)

错误 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;  -- 召回率 ↑,延迟 ↑,按需调整

常见报错排查

我的实战经验分享(第一人称)

我做这轮压测其实踩了两次坑:第一次我直接在 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,获取首月赠额度

作者简介:HolySheep 实验室后端工程师,专注 AI API 中转与加密货币高频数据架构。本站亦提供 Tardis.dev 加密历史数据中转(逐笔成交、Order Book、强平、资金费率),覆盖 Binance / Bybit / OKX / Deribit。如有内推或商务合作意向,请通过官网联系。