Qdrant 向量数据库:5 分钟搭好你的语义检索
【免费下载链接】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
当你给产品加上"按语义搜文档"或"以图搜图"功能时,第一反应往往是把关键词丢进传统数据库的 LIKE 查询——结果要么搜不到,要么慢到没法看。这类场景需要的是另一类基础设施:向量数据库。它先把文本、图片编码成一串数字(向量),再按"距离近即相似"的原则做检索。Qdrant 是目前开源向量数据库里热度最高、也最接近"拿来就能上生产"的选择之一,用 Rust 编写,单实例就能扛住相当高的并发。这篇 Qdrant 教程从拉镜像开始,覆盖数据建模、查询写法、量化决策,最后给出一份可直接对照的生产部署清单。
它凭什么值得用:三个决定性的理由
- 过滤和搜索是同一件事。很多向量检索方案里,加过滤条件会显著拖慢查询;Qdrant 把 payload(JSON 元数据)索引和向量索引用在同一套机制里优化,带条件检索时召回顺序仍然正确,延迟劣化可控。你的业务查询几乎总是"相似 + 限定条件",这一点直接决定体验。
- 写入链路设计得干净。请求先落 WAL(预写日志)保证不丢,再由异步更新线程应用到段,后台优化器定期合并段、重建索引——写入不被索引构建阻塞,这也是它能维持高吞吐写入的原因。
- 运维面完整。快照备份、集群共识、磁盘用量与延迟指标(Prometheus 格式)、量化压缩都内置,不用自己拼。
简单对比一下常见路线:
| 路线 | 强在哪 | 缺什么 | 适合谁 |
|---|---|---|---|
| 自研算法库(FAISS 类) | 极致灵活、可定制 | 无持久化、无 API、无集群 | 研究原型 |
| 关系库 + 向量插件 | 一套系统管两种数据 | 过滤深度、索引精度有限 | 小规模试用 |
| Qdrant | 检索、过滤、分布式一体 | 学习成本略高于前两者 | 生产级向量检索 |
上图是仓库里的时序图:一次写入先循环写进 WAL,Updater 应用变更,Optimizer 在后台择机优化——理解了这条链路,后面"为什么刚写入的数据搜不到"这类问题就都能解释了。
三分钟跑起来:Qdrant Docker 启动步骤
Docker 是最快的验证方式,两条命令加一段客户端代码:
docker run -d --name qdrant -p 6333:6333 \ -v $(pwd)/qdrant-data:/qdrant/storage qdrant/qdrantimport qdrant_client client = qdrant_client.QdrantClient(url="http://localhost:6333") print(client.get_collections()) # 空列表即启动成功6333是 REST 端口,数据目录挂载到卷上后重启不丢数据。想查接口细节可以看 OpenAPI 定义。
写好第一条查询:集合、点与载荷的建模
建模只需要理解三个词:
- 集合(Collection):向量库里的"表",建表时就定死了向量维度和距离度量(余弦/欧氏/点积),之后不可改。
- 点(Point):最小数据单元 = 一个向量 + 一个 ID。
- 载荷(Payload):挂在点上的任意 JSON 元数据,所有过滤条件都作用在它上面。
最小链路三步走:建集合 → 写入 → 带过滤条件搜索。
from qdrant_client import models client.create_collection( collection_name="products", vectors_config=models.VectorParams( size=384, distance=models.Distance.COSINE), )client.upsert("products", points=[ models.PointStruct(id=1, vector=vec_a, payload={"category": "shoes", "price": 399}), models.PointStruct(id=2, vector=vec_b, payload={"category": "bags", "price": 599}), ])res = client.search( "products", query_vector=vec_q, limit=10, query_filter=models.Filter(must=[ models.FieldCondition(key="category", match=models.MatchValue(value="shoes"))]), )几个实践判断:
- 维度不确定就先定死再试错——改维度要重建集合,所以选型阶段把 embedding 模型先敲定。
- 载荷字段尽量结构化(类目、价格、时间戳),字符串里再解析的做法没法建索引。
- 集合建好后不用管它:Qdrant 会在后台自动分段、合并、建索引,内部结构大致是"多个段 + 每个段独立的向量存储与 payload 索引 + 删除标记列表":
检索再进一步:混合搜索与量化怎么选
混合搜索——什么时候用:纯语义检索搞不定精确词。用户搜商品型号、人名、SKU 时,稠密向量的召回往往不理想。做法是再加一路稀疏向量(Qdrant 内置 BM25 分词,可直接对文本字段生成稀疏向量),查询时两路并行、用 RRF 融合排序:
res = client.query_points("products", query=models.Query(...), # 稠密路 using=models.Fusion.RRF, # 融合两路得分 )规则很直接:检索对象含大量专有名词、编号、短关键词就上混合搜索;纯自然语言文档问答则稠密路够用。
向量量化——什么时候用:向量数上百万后,内存账本开始难看(1000 万条 768 维 float32 ≈ 29 GB 起步)。量化把向量压缩后再进索引:标量量化(int8)大约 4 倍压缩、精度损失很小;乘积量化(PQ)可达 8–64 倍、适合超大规模;两者都建议开 rescore(用原向量对 top 候选重算距离补偿误差)。判断标准就一句话:内存成本超过可接受的精度损失时开量化,否则不开。
上生产前的检查清单:TLS、监控与备份
| 类别 | 检查项 | 说明 |
|---|---|---|
| 认证 | service.api_key | 设置后所有请求必须带api-key头;必须与 TLS 同时启用,明文传密钥不安全 |
| 传输 | service.enable_tls+ 证书三件套 | 生产环境务必开启;集群节点间通信另开cluster.p2p.enable_tls |
| 存储 | 持久化卷挂载storage_path | 数据目录必须挂卷;快照目录单独规划 |
| 内存 | on_disk_payload: true | 载荷放磁盘换 RAM,带索引的过滤字段仍驻留内存 |
| 写入 | wal.wal_capacity_mb | 写入密集场景调大,降低 WAL 滚动频率 |
| 可观测 | /metrics、/health | 接 Prometheus;重点盯段优化耗时与索引构建中状态 |
| 集群 | cluster.enabled: true | 分片数/副本数在创建集合时指定;可用read_only_api_key给监控单独授权 |
| 备份 | 定时快照 | 对/snapshots定期创建并异地存储,恢复演练每季度做一次 |
参数含义不确定时对照 config/config.yaml,每个字段都有注释;开发环境参考 config/development.yaml。
踩坑速查:五个高频问题一行解决
- 内存暴涨/OOM→ 向量和 HNSW 索引默认驻留内存 → 开标量量化 +
on_disk_payload,必要时把 HNSW 索引设为磁盘放置。 - 刚写入的数据搜不到→ 写入是异步链路(WAL → Updater → 段应用)→ 关键路径用
wait=true等待应用完成。 - 加了过滤条件延迟陡增→ 被过滤字段没有 payload 索引,退化成逐点扫描 → 给高频过滤字段建 payload 索引。
- 设置 api_key 后客户端 401→ 头部拼错或走了 HTTP 明文被中间件拦截 → 确认
api-key头 + 全站 HTTPS。 - 索引构建拖垮写入→
max_segment_size_kb过大,单段太重 → 调小段上限,让优化器小步迭代。
更底层的参数(优化器、HNSW m 值、full-scan 阈值)都在 config/config.yaml 里有详细说明,改之前建议先读注释里"1Kb ≈ 一个 256 维向量"的换算口径。
Qdrant 把向量检索、payload 过滤和分布式这三件麻烦事都做成了开箱组件,你的精力应该花在数据建模和召回调优上。下一步建议:按上面清单配一套测试环境,用真实数据压一轮查询和写入,再决定量化与分片策略——相关开发流程可参考 docs/DEVELOPMENT.md。
【免费下载链接】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),仅供参考