Qdrant 向量数据库:一条命令起步,3 个上生产前必调的能力
【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant
语义搜索换个说法就查不到?Qdrant 向量数据库把文本转成向量做相似度匹配,一条 docker 命令就能起步,过滤、量化、混合搜索开箱即配。
一、它适合谁:先判断该不该用它
Qdrant 是一个用 Rust 写的向量相似性搜索引擎,你往里存的是“带载荷(payload)的向量点”,出来的是“最像查询向量的前 N 个”。它主打两件事:扛得住高并发的检索,以及对 payload 的复杂过滤。适合语义检索、RAG、推荐、以图搜图这类“按相似度找”的场景。
| 方案 | 核心定位 | 过滤 / 检索 | 上手成本 |
|---|---|---|---|
| 关系数据库(+向量扩展) | 精确匹配为主,顺带向量 | 强在 SQL,向量能力偏弱 | 低,多数团队已有 |
| Qdrant 自建 | 纯向量相似性检索 | 稠密+稀疏+多向量,过滤语法丰富 | 中,一条命令起服务 |
| 托管向量云 | 同上,免运维 | 同 Qdrant | 低,但绑定厂商 |
一句话说明边界:如果你的数据不到几万条、又只需要关键词精确匹配,关系型数据库就够了,不必引入向量库。
二、10 分钟拿到第一个结果
先起一个服务,数据落在容器里,跑通再谈配置:
docker run -p 6333:6333 qdrant/qdrant # 6333 是 REST 端口用 Python 连上,建一个集合。集合(collection)就是“存同类向量的库”,建的时候必须定死向量维度和距离度量这两件事,后面所有点都得符合它:
from qdrant_client import QdrantClient, models client = QdrantClient(url="http://localhost:6333") # 连本地实例 client.create_collection( collection_name="docs", vectors_config=models.VectorParams(size=4, distance=models.Distance.COSINE), # 4维、余弦距离 )每个点 = 一个向量 + 一份 payload(任意 JSON 元数据,用来做过滤)。写入两个点:
points = [ models.PointStruct(id=1, vector=[0.1, 0.2, 0.3, 0.4], payload={"title": "向量入门", "tag": "ai"}), models.PointStruct(id=2, vector=[0.5, 0.6, 0.1, 0.2], payload={"title": "RAG 实践", "tag": "rag"}), ] client.upsert(collection_name="docs", points=points) # upsert=有则更新无则新增然后搜。注意“最像”不等于“对”,所以可以叠一层过滤,只在你关心的范围内找:
res = client.search( collection_name="docs", query_vector=[0.2, 0.3, 0.3, 0.4], # 查询向量 limit=3, query_filter=models.Filter( must=[models.FieldCondition( key="tag", match=models.MatchValue(value="ai"))]), # 只留 ai 标签 ) print(res[0].score) # 相似度分数,越大越像跑通后值得看一眼集合“里面长什么样”:一个集合拆成若干段(segment),每段自带向量存储、向量索引、payload 和索引,再加一个 WAL 做写入兜底。这就是它既快又能容错的原因。
三、值得深挖的 3 个能力
3.1 向量量化:把内存占用压下来 ⭐
解决什么问题:向量默认按 float32 常驻内存,100 万条 768 维 ≈ 2.5GB+,规模一大就扛不住。
怎么配:建集合时挂上标量量化(int8)即可,Qdrant 官方称可把内存占用最多压掉 97%;要更极致就上乘积量化(PQ)或二值量化(Binary)。量化在 lib/quantization 里实现。
注意什么:量化是用精度换内存。召回掉得明显时,打开rescore用原始向量二次排序,把精度找回来;量化对已有数据不生效,得重建索引。
3.2 混合搜索:语义和关键词一起查 ⚡
解决什么问题:纯稠密向量抓不住型号、编号这类精确词;纯关键词又不懂“语义相近”。
怎么配:给同一个点同时存稠密向量和稀疏向量(稀疏常用 BM25),查询时一次发出,用 RRF 或 DBSF 两种融合策略把两路结果合成一个排序。
注意什么:你得同时维护两套向量的生成链路;稀疏向量喂关键词、稠密向量喂语义,分工别混。
3.3 复杂过滤:像 SQL 一样筛
解决什么问题:光“像”不够,你还得按类别、价格区间、地理位置筛。
怎么配:filter 支持must/should/must_not三段,条件是关键词匹配、数值范围、地理围栏等,可任意组合。
注意什么:常被过滤的字段建payload 索引会快很多;没建索引就退化成全表扫描,数据量大时延迟明显。
四、上生产前必看:单节点先跑稳
先上单节点 + 持久化存储 + 配置文件这一种形态,验证数据量和延迟后再考虑集群。生产配置里,认证、加密、省内存这三处是重点:
service: api_key: "your_secret_api_key" # 开启请求认证 enable_tls: true # 传输加密,配了 api_key 就该开 storage: on_disk_payload: true # 载荷走磁盘,省 RAM optimizers: indexing_threshold_kb: 10000 # 段内向量达到该 KB 才建索引关键调优参数速查(对照 config/config.yaml 调):
| 参数 | 作用 | 建议值 |
|---|---|---|
storage.on_disk_payload | 载荷放内存还是磁盘 | 数据量大就true省 RAM |
optimizers.indexing_threshold_kb | 起建向量索引的门槛 | 默认 10000,小机器可调低 |
hnsw_index.m | 图索引每个节点的边数 | 16,越大越准越占内存 |
hnsw_index.ef_construct | 建图时考虑多少邻居 | 100,建索引更快可调小 |
service.max_request_size_mb | 单请求最大体积 | 默认 32,批量大就调高 |
storage.wal.wal_capacity_mb | 单个 WAL 段大小 | 默认 32,写多可加大 |
写入路径是这样的:请求先进 WAL 落盘、返回成功,再由 Updater 更新段、Optimizer 在后台合并重建。理解了它,你就能看懂“为什么刚写的点偶尔搜不到”。
监控盯三个指标就够了(都是 Prometheus 格式):
- 内存占用:resident memory 逼近上限是头号风险,配合量化和
on_disk_payload压。 - 磁盘用量:向量、WAL、快照都吃磁盘,提前留余量。
- 请求延迟 / 优化任务:搜索 P99 升高、优化器长时间不跑,都要告警。
curl -s http://localhost:6333/health # 探活;/metrics 拿指标,/cluster 看集群状态五、踩坑现场:先对号入座
| 现象 | 原因 | 解法 |
|---|---|---|
| 搜索精度明显偏低 | 维度/距离度量没对齐,或索引还没建好 | 保证查询向量维度、distance 与集合一致;等索引完成或临时exact=true |
| 刚写入的点搜不到 | 优化器还没把新段建进索引 | 属正常延迟,等优化完成;急用就开启精确搜索 |
| 内存持续涨、进程 OOM | 向量+载荷全量常驻内存 | 开量化、on_disk_payload: true,必要时调max_resident_memory_percent配额 |
| 请求报 413 / 大 payload 被拒 | 撞了max_request_size_mb上限 | 调大该参数,或分批写入 |
| 集群节点间通信失败、共识卡住 | p2p 端口(默认 6335)不通,或节点 TLS 证书不一致 | 放开 6335,所有节点用同一套证书 |
| 重启后加载慢、反复 OOM 崩溃 | 段全量载入内存 | 用low_memory_mode(如no_resident)把组件降级为磁盘版 |
更多写入与容错细节,可翻 lib/collection 模块和 docs/DEVELOPMENT.md。
收尾:我该不该用 Qdrant
- ✅ 数据是“按相似度找”,而非纯精确匹配,且规模上到百万级以上
- ✅ 检索要带复杂过滤(多字段、范围、地理、多租户),Qdrant 的 payload 过滤正好覆盖
- ✅ 在意内存成本,需要量化把向量占用压下来
- ✅ 能接受先用单节点 Docker 起步,再按需扩集群
- ❌ 只有关键词匹配、数据量很小,关系型数据库更省事
如果上面勾中三条以上,它大概率就是你这一层该用的向量引擎——先 docker 一条命令跑通,把量化和过滤配好,再谈扩缩。
【免费下载链接】qdrantQdrant - High-performance, massive-scale Vector Database and Vector Search Engine for the next generation of AI. Also available in the cloud https://cloud.qdrant.io/项目地址: https://gitcode.com/GitHub_Trending/qd/qdrant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考