在大模型(LLM)应用爆发的当下,向量数据库已经成为 RAG(检索增强生成)架构中不可或缺的基础设施。而 Qdrant 凭借其高性能、易部署、功能完善的特点,成为众多开发者的首选之一。本文将从核心概念、索引原理到部署实战,带你完整认识 Qdrant。
一、什么是 Qdrant?
Qdrant 是一个开源的向量数据库(Vector Database),专门用于存储、管理和检索高维向量数据。它通过高效的近似最近邻搜索(ANN, Approximate Nearest Neighbor)算法,实现毫秒级的相似度查询。
核心定位:Qdrant = 向量存储 + 相似度搜索 + 过滤能力
它由 Rust 编写,底层基于 HNSW(分层可导航小世界图)索引,单机即可承载千万级向量,同时支持分布式部署与水平扩展。
二、为什么需要向量数据库?
传统数据库(如 MySQL、PostgreSQL)主要处理结构化数据,而 AI 应用更多面对的是"语义相似性"问题,例如:
- "找和这段话意思相近的内容"
- "推荐和用户兴趣相似的商品"
- "从知识库中检索出与问题最相关的文档片段"
这些需求都需要把文本、图片等内容用 Embedding 模型转换成高维向量,再通过向量距离度量相似度——这正是向量数据库擅长的领域。它与传统数据库最本质的区别在于:传统数据库回答"等于不等于",向量数据库回答"像不像"。
三、Qdrant 核心概念
| 概念 | 说明 |
|---|---|
| Collection(集合) | 一组向量的逻辑容器,类似关系数据库中的"表" |
| Point(数据点) | 集合中的一条数据,由 id、向量(Vector)和 Payload 组成 |
| Payload(载荷) | 附加的元数据(JSON 格式),支持过滤与排序 |
| Vector(向量) | 浮点数数组,维度由 Embedding 模型决定 |
| Index(索引) | 默认 HNSW 索引,控制召回速度与精度 |
一个典型的 Point 结构大致如下:
{
"id": 1,
"vector": [0.12, 0.35, 0.87, ...], // 768 维
"payload": {
"title": "Qdrant 使用指南",
"category": "database",
"author": "admin",
"views": 1024
}
}
Payload 的存在让 Qdrant 可以在相似度检索的同时完成结构化过滤,例如"只返回分类为 database 且浏览量大于 100 的结果",这是它相比纯向量索引方案(如 FAISS)的核心优势。
四、HNSW 索引原理简析
Qdrant 默认使用 HNSW(Hierarchical Navigable Small World) 图索引。它的核心思想是构建多层图结构:
- 上层稀疏图:节点少、连接远,负责快速"跳跃"到目标区域;
- 底层稠密图:节点密集、连接近,负责在局部精细搜索;
搜索时从顶层出发,逐层向下"导航",每一层都通过贪心算法逼近最近邻,最终在底层得到精确结果。这种结构把暴力检索 O(n) 的复杂度大幅降低,在百万级向量上也能维持毫秒级延迟。
与精确检索(Exact Search)不同,ANN 是"以可接受的精度损失换取数量级的速度提升",Qdrant 提供了 ef(搜索宽度)等参数来权衡召回率与延迟。
五、Docker 快速部署
Qdrant 提供了官方 Docker 镜像,一条命令即可启动:
# 启动 Qdrant 单机版,映射 6333(HTTP)与 6334(gRPC)端口
docker run -d --name qdrant \
-p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage \
qdrant/qdrant:latest
启动后访问 http://localhost:6333/dashboard 即可打开内置的 Web 管理面板,查看集合、向量与性能指标。也可以直接通过 REST API 验证服务状态:
curl http://localhost:6333/collections
如果需要分布式部署,可以使用 Qdrant 的 Cluster 模式,通过配置文件声明多个节点,实现分片(Sharding)与副本(Replication)。
六、Python SDK 实战
安装官方 SDK:
pip install qdrant-client
1. 创建集合
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance
client = QdrantClient(url="http://localhost:6333")
# 创建 768 维、余弦距离的集合
client.create_collection(
collection_name="articles",
vectors_config=VectorParams(size=768, distance=Distance.COSINE),
)
2. 写入向量
from qdrant_client.models import PointStruct
points = [
PointStruct(id=1, vector=[0.1] * 768, payload={"title": "向量数据库入门"}),
PointStruct(id=2, vector=[0.2] * 768, payload={"title": "RAG 实战"}),
]
client.upsert(collection_name="articles", points=points)
3. 相似度查询 + 过滤
from qdrant_client.models import Filter, FieldCondition, MatchValue
results = client.search(
collection_name="articles",
query_vector=[0.15] * 768, # 查询向量
query_filter=Filter(
must=[FieldCondition(key="title", match=MatchValue(value="向量数据库入门"))]
),
limit=5, # 返回 Top-5
with_payload=True,
)
for hit in results:
print(hit.id, hit.score, hit.payload)
4. 删除集合
client.delete_collection(collection_name="articles")
除了 Python,Qdrant 还提供了 @qdrant/js-client-rest、qdrant/go-client、Java 等官方 SDK,API 设计高度一致,上手成本很低。
七、选型对比:Qdrant vs Milvus vs pgvector
| 维度 | Qdrant | Milvus | pgvector |
|---|---|---|---|
| 部署复杂度 | 低(单机 Docker 即可) | 较高(依赖 etcd、MinIO 等组件) | 低(PostgreSQL 插件) |
| 过滤能力 | 强(Payload 过滤) | 强(标量索引) | 中(SQL 过滤) |
| 规模上限 | 千万级 | 十亿级 | 百万级 |
| 语言生态 | Rust 核心 + 多语言 SDK | Go/C++ 核心 | C(PG 原生) |
| 适合场景 | 中小规模 RAG、快速上线 | 大规模检索、机器学习平台 | 已有 PG、数据量小的场景 |
选型建议:中小团队做 RAG 应用、追求快速落地,优先 Qdrant;数据量达到亿级且基础设施完善,考虑 Milvus;项目本身就在用 PostgreSQL 且向量数据量不大,pgvector 是最省事的选择。
八、总结
Qdrant 以"简单、快速、功能完整"著称:一条 Docker 命令即可部署,内置 Web 管理面板,Payload 过滤机制让它天然适配业务检索场景。对于大多数 RAG 和语义搜索应用而言,它都是性价比极高的选择。
下一篇我们将介绍 Umi-OCR 的 Docker 部署与 API 调用,敬请期待。