Qdrant 深度解析:面向向量搜索的高性能数据库

在大模型(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-restqdrant/go-client、Java 等官方 SDK,API 设计高度一致,上手成本很低。

七、选型对比:Qdrant vs Milvus vs pgvector

维度QdrantMilvuspgvector
部署复杂度低(单机 Docker 即可)较高(依赖 etcd、MinIO 等组件)低(PostgreSQL 插件)
过滤能力强(Payload 过滤)强(标量索引)中(SQL 过滤)
规模上限千万级十亿级百万级
语言生态Rust 核心 + 多语言 SDKGo/C++ 核心C(PG 原生)
适合场景中小规模 RAG、快速上线大规模检索、机器学习平台已有 PG、数据量小的场景

选型建议:中小团队做 RAG 应用、追求快速落地,优先 Qdrant;数据量达到亿级且基础设施完善,考虑 Milvus;项目本身就在用 PostgreSQL 且向量数据量不大,pgvector 是最省事的选择。

八、总结

Qdrant 以"简单、快速、功能完整"著称:一条 Docker 命令即可部署,内置 Web 管理面板,Payload 过滤机制让它天然适配业务检索场景。对于大多数 RAG 和语义搜索应用而言,它都是性价比极高的选择。

下一篇我们将介绍 Umi-OCR 的 Docker 部署与 API 调用,敬请期待。