Weaviate(AI 原生向量数据库)
开源 AI 原生向量数据库,内置向量化模块和生成模块,支持多模态搜索与混合检索。
基于 Rust 的高性能向量搜索引擎,以过滤优先设计和极致性能著称,适合 RAG 和语义搜索场景。
内容摘要
Qdrant(读作 "quadrant")是一个用 Rust 从零构建的**向量搜索引擎(Vector Search Engine)**,专门用来存储和检索高维向量数据。简单说:你有一堆文本/图片/音频经过 Embedding 模型转成的向量,需要快速找出「跟某个向量最像的那些」,Qdrant 就是干这件事的。
Qdrant(读作 "quadrant")是一个用 Rust 从零构建的向量搜索引擎(Vector Search Engine),专门用来存储和检索高维向量数据。简单说:你有一堆文本/图片/音频经过 Embedding 模型转成的向量,需要快速找出「跟某个向量最像的那些」,Qdrant 就是干这件事的。
与其他向量数据库最大的区别在于:Qdrant 采用**过滤优先(Filter-First)**设计——搜索向量的同时就在处理元数据过滤条件,而不是先搜出来再过滤。这意味着即使你加了一堆筛选条件(价格范围、日期、标签等),搜索速度也不会断崖式下降。
典型使用场景:RAG 系统的知识库检索、电商语义搜索、推荐系统、多模态搜索。
| 要素 | 作用 |
|---|---|
| Collection(集合) | 向量数据的容器,创建时指定向量维度和距离度量方式 |
| Point(点) | 集合中的最小数据单元,由 ID + 向量 + Payload(元数据)三部分组成 |
| HNSW 索引 | 底层的近似最近邻搜索算法,通过分层图结构实现高效检索 |
| Payload 过滤 | 对元数据施加条件(AND/OR/NOT、范围、地理位置等),在搜索阶段并行执行 |
Collection 是数据组织的最高层级。每个集合对应一个独立的向量空间,创建时需要指定两个关键参数:向量维度(size)和距离度量方式(distance)。同一个集合内的所有向量必须维度相同。
一个 Qdrant 实例可以管理多个集合,适合按业务线或租户隔离数据。
Point 是集合中的基本数据单位,由三部分组成:
Payload 是 Qdrant 过滤能力的基础——你存进去的每个字段都可以在查询时作为过滤条件。
HNSW(Hierarchical Navigable Small World,分层可导航小世界图)是 Qdrant 的核心搜索算法。它把向量组织成一个多层图结构:顶层稀疏、底层稠密。搜索时从顶层快速定位大致区域,逐层下降到底层找到精确的最近邻。
两个关键调优参数:
m:每个节点的连接数,越大精度越高但内存越多ef_construct:构建索引时的搜索范围,越大索引质量越好但构建越慢Qdrant 的招牌能力。支持的过滤条件包括:
category == "AI"price >= 100 AND price <= 500must(AND)、should(OR)、must_not(NOT)与「先搜后过」的方案不同,Qdrant 在 HNSW 图遍历的过程中就同步执行过滤(Filterable HNSW),所以加了过滤条件后性能衰减很小。
搜索引擎同时调用 HNSW 索引和过滤引擎,两者并行工作后合并结果,这就是「过滤优先」设计的核心。
安装依赖:
# 启动 Qdrant 服务(Docker 方式,推荐)
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant
# 安装 Python 客户端
pip install qdrant-client numpy
如需使用 Qdrant Cloud 托管服务,前往 https://cloud.qdrant.io/ 注册获取 API Key。
最小可运行示例(基于 qdrant-client==1.13.3 验证,截至 2026-03):
from qdrant_client import QdrantClient
from qdrant_client.models import (
Distance, VectorParams, PointStruct,
Filter, FieldCondition, MatchValue, Range
)
import numpy as np
# 1. 连接 Qdrant(内存模式,无需启动服务器,适合本地测试)
client = QdrantClient(":memory:")
# 2. 创建集合:384 维向量,余弦相似度
client.create_collection(
collection_name="docs",
vectors_config=VectorParams(size=384, distance=Distance.COSINE)
)
# 3. 插入数据:向量 + 元数据
points = [
PointStruct(id=1, vector=np.random.rand(384).tolist(),
payload={"title": "RAG 入门指南", "category": "AI", "year": 2024}),
PointStruct(id=2, vector=np.random.rand(384).tolist(),
payload={"title": "Docker 部署手册", "category": "DevOps", "year": 2023}),
PointStruct(id=3, vector=np.random.rand(384).tolist(),
payload={"title": "LLM 微调实战", "category": "AI", "year": 2025}),
PointStruct(id=4, vector=np.random.rand(384).tolist(),
payload={"title": "K8s 集群运维", "category": "DevOps", "year": 2024}),
PointStruct(id=5, vector=np.random.rand(384).tolist(),
payload={"title": "向量数据库选型", "category": "AI", "year": 2025}),
]
client.upsert(collection_name="docs", points=points)
# 4. 基础向量搜索(不带过滤)
query_vector = np.random.rand(384).tolist()
results = client.search(
collection_name="docs",
query_vector=query_vector,
limit=3
)
print("--- 基础搜索 Top 3 ---")
for r in results:
print(f" ID={r.id}, 分数={r.score:.4f}, 标题={r.payload['title']}")
# 5. 带过滤的向量搜索:只看 AI 类别 + 2024 年及以后
results = client.search(
collection_name="docs",
query_vector=query_vector,
query_filter=Filter(
must=[
FieldCondition(key="category", match=MatchValue(value="AI")),
FieldCondition(key="year", range=Range(gte=2024))
]
),
limit=3
)
print("\n--- 过滤搜索(AI + 2024年起)---")
for r in results:
print(f" ID={r.id}, 分数={r.score:.4f}, {r.payload}")
预期输出:
--- 基础搜索 Top 3 ---
ID=3, 分数=0.5842, 标题=LLM 微调实战
ID=1, 分数=0.5631, 标题=RAG 入门指南
ID=5, 分数=0.5487, 标题=向量数据库选型
--- 过滤搜索(AI + 2024年起)---
ID=3, 分数=0.5842, {'title': 'LLM 微调实战', 'category': 'AI', 'year': 2025}
ID=1, 分数=0.5631, {'title': 'RAG 入门指南', 'category': 'AI', 'year': 2024}
ID=5, 分数=0.5487, {'title': '向量数据库选型', 'category': 'AI', 'year': 2025}
使用 QdrantClient(":memory:") 是纯内存模式,不需要启动 Docker 服务端,复制粘贴就能跑。实际生产环境改为 QdrantClient(host="localhost", port=6333) 连接服务端。
| 维度 | Qdrant | Milvus | Pinecone | Weaviate |
|---|---|---|---|---|
| 核心定位 | 过滤优先的高性能向量搜索引擎 | 分布式向量数据库,面向超大规模 | 全托管向量数据库服务 | 语义搜索 + 知识图谱向量库 |
| 实现语言 | Rust(无 GC,性能稳定) | Go + C++(依赖 etcd 等组件) | 闭源云服务 | Go |
| 最擅长 | 复杂元数据过滤 + 向量搜索并行 | 十亿级向量分布式检索 | 零运维快速上线 | 多跳语义搜索 |
| 部署复杂度 | 低(单二进制 / Docker) | 高(需要 etcd、MinIO 等依赖) | 无需部署(SaaS) | 中等 |
| 适合人群 | 需要精细过滤的 RAG / 搜索系统 | 超大规模分布式场景 | 不想碰运维的团队 | 知识图谱结合向量搜索 |
核心区别:
| 误区 | 准确理解 |
|---|---|
| Qdrant 只能做向量相似度搜索 | Qdrant 的核心优势恰恰在过滤能力——向量搜索 + 复杂元数据条件可以并行执行,不是只算向量距离 |
| 向量维度越高搜索越准 | 维度过高会增加内存和计算开销。通常 384-768 维已足够,选对 Embedding 模型比堆维度更重要 |
| 所有 Payload 字段都要建索引 | 只对高频过滤字段建索引。索引越多写入越慢,按查询模式选择性创建 |
| 内存模式只能用于测试 | ":memory:" 模式确实适合测试,但 Qdrant 也支持磁盘存储 + 量化压缩,百万级向量不需要全放内存 |
| 优势 | 劣势 |
|---|---|
| Rust 原生实现,无 GC 停顿,延迟稳定可预测 | 分布式能力不如 Milvus 成熟,超大集群部署经验较少 |
| 过滤优先设计,复杂条件下性能衰减极小 | 社区生态规模小于 Milvus |
| 部署极简:单个 Docker 容器开箱即用 | 不支持 SQL 查询语法,纯 API 交互 |
| 支持多种量化(Scalar / Product / Binary),内存最多可压缩 64 倍 | GPU 加速索引构建为 2025 年新增功能,成熟度有待验证 |
参考答案:
关系:一个 Qdrant 实例包含多个 Collection,每个 Collection 包含多个 Point,每个 Point 携带一份 Payload。
参考答案:
「先搜后过」的做法是:先用向量搜索取出 Top-K 结果,再对这 K 个结果应用过滤条件。问题在于,如果过滤条件很严格,可能过滤完只剩几条甚至零条结果,导致召回不足。
Qdrant 的「过滤优先」是在 HNSW 图遍历过程中同步执行过滤:遍历到一个节点时,同时检查它是否满足过滤条件,不满足就跳过继续找。这样保证返回的 K 个结果都满足过滤条件,且搜索效率不会因过滤条件增多而大幅下降。
性能影响:在有复杂过滤条件的场景下,Qdrant 的 QPS(每秒查询数)远高于「先搜后过」方案,因为它不需要过度检索再丢弃。
参考答案:
关键配置思路:
m=16(平衡精度和内存),ef_construct=200(保证索引质量)on_disk=True),让操作系统管理内存映射,不需要全量加载到 RAM优先展示同分类且标签更接近的内容,方便继续串联学习。
开源 AI 原生向量数据库,内置向量化模块和生成模块,支持多模态搜索与混合检索。
轻量级开源向量数据库,pip 一装即用,专为 AI 应用的语义搜索和 RAG 场景设计。
开源云原生向量数据库,专为 AI 应用设计,支持 PB 级向量相似度搜索。