想象一座藏书千万册的巨型图书馆。每天晚上,新书像潮水般涌来,读者却总能在几秒内找到“最像这本书的那本”。秘诀不在书架,而在图书管理员——“秦馆长”。他把每本书用一串数字提取“内容指纹”(向量),把这些指纹按层级分类放进多层索引柜(HNSW),在书脊上贴上作者、年份、类别的标签(payload),还为部分书制作“摘要卡片”节省空间(量化)。而这一切背后,秦馆长本人是用 Rust 铸造的机器人——从底层设计上杜绝“记错、手抖、崩溃、吵架”,所以再多读者同时进来也不慌。这套方案,就是 Qdrant——一个用 Rust 写成的开源高性能向量数据库。今天,我们就从这座“图书馆”的装修图纸讲起,看看它如何把“语义搜索 + 条件过滤”做到又快又准。

岗位关联

读完你将掌握 Qdrant 的核心机制:用 HNSW 索引、payload 过滤与量化压缩搭建秒级响应的向量检索系统,直接应用于 RAG、推荐系统与多条件语义搜索。

目录
  1. 可视化演示
  2. Qdrant核心架构
  3. HNSW索引原理
  4. Payload过滤机制
  5. 量化压缩策略
  6. Rust性能保障
  7. 混合检索实战
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

Query 标量量化:float32 -> int8 (75%压缩)Qdrant向量搜索可视化:展示HNSW图索引的搜索过程、Payload过滤和量化压缩效果

Qdrant核心架构

想象一座巨大的图书馆,馆藏千万册书。一位叫“秦馆长”的机器人管理员接手后,干的第一件事不是搬书,而是重新设计整个库房。他把书按主题分成几个大库房——在 Qdrant 里,每个库房叫作一个集合(Collection);每一本具体的书,叫作一个点(Point)。每本书有一个唯一编号(ID)、一串代表内容特征的“内容指纹”(向量),以及贴在封面上的标签(Payload,如作者、年份、分类)。

为什么这样设计?因为向量数据库要回答的问题不是“关键词是否匹配”,而是“内容是否相似”。就像秦馆长不看目录,而是通过“指纹”来判断两本书像不像。一个点就是一条完整的数据记录。建立集合时,你要指定向量的维度(比如 BERT 生成的 768 维)和距离度量方式——比如余弦距离,这决定了“相似”的标尺是什么。在 Qdrant 中,通过 create_collection 传入 VectorParams 即可完成这些配置。

实际开发中,集合(Collection)默认支持分片(Sharding)和副本(Replica),数据可以水平扩展。每个点都可附加任意 JSON 结构的 payload,例如 {"author": "阿加莎", "year": 2023, "price": 88}。而点与点之间“像不像”,可以用余弦相似度衡量:

秦馆长把每本书的指纹都按统一格式登记成“索引卡片”。读者来找书时,不用翻完所有书页,只需按指纹相似度排序——这背后,就是 Qdrant 集合、点、向量与距离度量这套骨架在支撑。

sim(q,v)=q⋅v∥q∥×∥v∥\text{sim}(\mathbf{q}, \mathbf{v}) = \frac{\mathbf{q} \cdot \mathbf{v}}{\|\mathbf{q}\| \times \|\mathbf{v}\|}
这个公式衡量两个向量夹角的余弦值:夹角越小(余弦值越接近 1),说明两个点“方向越一致”,在语义上就越相似。
  1. 向量点积 $\mathbf{q} \cdot \mathbf{v}$把两个向量对应位置相乘再求和,衡量“同向程度”,同向时给正分。
    q⋅v=∑i=1dqivi\mathbf{q} \cdot \mathbf{v} = \sum_{i=1}^{d} q_i v_i
  2. 模长乘积 $\|\mathbf{q}\| \times \|\mathbf{v}\|$把每个向量的分量平方和开根号得到“长度”,再相乘,用于抵消向量本身长短的影响。
    ∥q∥=∑i=1dqi2\|\mathbf{q}\| = \sqrt{\sum_{i=1}^{d} q_i^2}
  3. 相似度比值 $\text{sim}$点积除以模长乘积后,结果落在 $[-1, 1]$,值越大表示语义越接近。
    sim=⋅∥⋅∥\text{sim} = \frac{\cdot}{\|\cdot\|}

HNSW索引原理

但千万本书如果两两比较,速度太慢。秦馆长想出一个聪明的办法:在库房里搭一座“多层阁楼”。顶层阁楼只放少数几本“代表书”,往下每层书更多,最底层放着全部藏书。要找书时,先上顶层看看大概在哪片区域,再一层层往下走,越走越精确,最后在最底层精确命中。

这个“多层阁楼”就是 HNSW(Hierarchical Navigable Small World,分层可导航小世界)索引。它把向量按层级组织:上层节点稀疏,下层节点稠密。搜索从最上层出发,每一层用“贪心算法”沿着最近的边往下跳,每跳一步都离目标更近。这样,查找一个最近邻居只需走过 $O(\log n)$ 个节点,而不是扫遍全部 $n$ 个点。

HNSW 如何决定一个节点出现在哪一层?它采用指数分布采样——每一层出现的概率为:

参数 $p$ 通常取 0.5 左右。$l$ 越大(越往高层),概率越小。构建时还需设置参数:$M$ 控制每个节点最多连多少个邻居,$ef\_construct$ 控制建索引时的搜索广度,$ef\_search$ 是查询时的搜索广度。三者的共同效果是:图的层数约为 $O(\log n)$,搜索路径长度近似 $O(\log n)$ 级别。

秦馆长每个周末只花几分钟搭阁楼,之后每天千万次查询都靠它在几毫秒内完成。这正是 HNSW 让 Qdrant 搜索“索引一下,秒出结果”的关键。

P(l)=(1−p)×pl,p∈(0,1)P(l) = (1-p) \times p^{l}, \quad p \in (0,1)
这句把概率公式的直觉讲清:高层节点少而稀疏,低层节点多而稠密,搜索从高到低逐层收敛。
  1. 指数项 $p^{l}$层数每升高一层,概率乘一次 $p$,因此高层节点数呈几何级减少。
    pl=p×p×⋯×p⏟l 次p^{l} = \underbrace{p \times p \times \cdots \times p}_{l\text{ 次}}
  2. 归一化系数 $(1-p)$让所有层概率加起来等于 1,是概率分布的标准归一化。
    ∑l=0∞(1−p)pl=1\sum_{l=0}^{\infty} (1-p)p^{l} = 1
  3. 层概率 $P(l)$节点出现在第 $l$ 层的概率。$l=0$ 时 $P=1$,即所有点都在最底层;$l$ 越大越稀有。
    P(l)=(1−p)×plP(l) = (1-p) \times p^{l}

Payload过滤机制

读者可不是只看“像不像”。他们常常说:“我要 2023 年出版、价格低于 200 元、而且是推理类的小说。”秦馆长如果把这个条件抛在脑后,把全部推理书抱过来一本本比较,效率就太低了。所以他会提前在书的封面上贴满标签,先按标签快速筛掉一大批。

这些标签就是 Qdrant 的 payload。每条 Point 都可以挂上一段 JSON 结构的载荷——比如 {"author": "阿加莎", "year": 2023, "price": 88, "tags": ["推理"]}。更重要的是,Qdrant 允许你给 payload 字段建索引,这样过滤就不是全表扫描,而是像查书目标签一样走索引,速度可以快几个数量级。

Qdrant 的过滤条件把 must(必须满足)、must_not(必须不满足)、should(至少满足一个)三类子句组合成一个布尔表达式。一条 Point 如果满足过滤条件,相当于:

于是,当读者喊出“2023 + 推理 + 200 块以下”,秦馆长会先沿着标签索引,瞬间把候选集从千万缩到几百本,再做“指纹相似度”排序。这就是 payload 过滤的精髓:不要让昂贵的向量比较,浪费在不相关的内容上。

match(v)=(⋀imusti(v))∧¬(⋁jmust_notj(v))∧(⋁kshouldk(v))\text{match}(v) = \left( \bigwedge_{i} \text{must}_i(v) \right) \wedge \neg \left( \bigvee_{j} \text{must\_not}_{j}(v) \right) \wedge \left( \bigvee_{k} \text{should}_k(v) \right)
通俗理解:所有 must 条件都要成立,任何 must_not 条件都不能成立;should 字句至少命中一个,可根据场景选配。
  1. 全称与($\bigwedge_i$ must$_i$)所有 must 条件同时成立。就像把“作者=某、年份=某”等硬条件全部钉死。
    ⋀imusti(v)=must1∧must2∧⋯\bigwedge_{i} \text{must}_i(v) = \text{must}_1 \wedge \text{must}_2 \wedge \cdots
  2. 否定析取($\neg \bigvee_j$ must\_not$_j$)任何 must_not 条件成立就一票否决。
    ¬(⋁jmust_notj(v))=not(must_not1 or must_not2⋯ )\neg \left( \bigvee_{j} \text{must\_not}_j(v) \right) = \text{not(must\_not}_1 \text{ or must\_not}_2 \cdots)
  3. should 子句($\bigvee_k$ should$_k$)可选的偏好条件,至少一个命中即可加分或参与匹配。
    ⋁kshouldk(v)=should1∨should2∨⋯\bigvee_{k} \text{should}_k(v) = \text{should}_1 \vee \text{should}_2 \vee \cdots

量化压缩策略

书越来越多了,书架不够用了。秦馆长想了个主意:给每本书除了完整版,再做一张“摘要卡”——只保留最核心的关键词和数字,卡片只有完整版的四分之一大小。读者先用摘要卡快速判断,需要精确细节再翻原书。

在向量数据库里,“完整版”就是一个 float32 向量——每个维度占 4 字节。100 万条 768 维向量,光存向量就要约 3 GB 内存。Qdrant 提供两种“摘要卡”:标量量化(Scalar Quantization,SQ)和乘积量化(Product Quantization,PQ)。标量量化把每个 float32 数值压成 int8(1 字节),内存直接降到原来的 1/4。

标量量化的核心公式:

读者在书架前看到一排排“摘要卡”,既能迅速判断哪些书可能相关,又不用每本都抽出完整原著。这正是向量数据库在超大规模数据下保持便宜又快速的原因。

xint8=⌊(x−xmin⁡)(xmax⁡−xmin⁡)×255⌋x_{\text{int8}} = \left\lfloor \frac{(x - x_{\min})}{(x_{\max} - x_{\min})} \times 255 \right\rfloor
简单说:把每个维度上的浮点值,按全局最小值和最大值压缩到 0 到 255 的整数区间。恢复时再按逆公式近似还原。PQ 则更进一步:把向量切成若干子向量,用 $k$ 个聚类中心(码本)来表达每个子向量,压缩率可达几十倍。
  1. 位移项 $(x - x_{\min})$把当前维度最小值平移到 0,数值都变成非负。
    x−xmin⁡≥0x - x_{\min} \ge 0
  2. 归一化 $\frac{\cdot}{x_{\max} - x_{\min}}$除以极差,把数值映射到 $[0, 1]$ 区间,量纲消失。
    x−xmin⁡xmax⁡−xmin⁡∈[0,1]\frac{x - x_{\min}}{x_{\max} - x_{\min}} \in [0, 1]
  3. 量化取整 $\times 255$ 后向下取整映射到 0-255 的 int8 值,整数存储省内存。
    ⌊⋅×255⌋∈{0,1,…,255}\left\lfloor \cdot \times 255 \right\rfloor \in \{0, 1, \dots, 255\}

Rust性能保障

为什么秦馆长能同时接待几百个读者,从不手忙脚乱、从不把书放错位置?这跟他“出厂设置”有关——他是在 Rust 车间里用“所有权”纪律打造出来的。

传统系统级语言 C++ 追求极致性能,却容易犯内存泄漏、越界访问等错误;带垃圾回收的语言(GC)又总在运行时“暂停”做清理。Rust 另辟蹊径:用所有权(Ownership)和借用(Borrow)规则,在编译期就排除内存安全问题,同时没有 GC 停顿,性能与 C++ 相当。这就像一个从不会忘记还书、也从不会撕破书页的机器人,因为它的“大脑”在出厂前就被严格验证过。

Rust 的三个关键点支撑起 Qdrant 的高性能:一是所有权——每个值在任一时刻只能有一个“主人”,离开作用域即自动释放,不会泄漏也不会 double free;二是并发安全——通过 Send/Sync trait 在编译期保证“跨线程传递数据不会产生数据竞争”,让 Qdrant 可以放心地把搜索任务拆给多核并行;三是零成本抽象——用 trait 和泛型写出来的高阶代码,编译后展开为接近手写指令的机器码,不额外付出运行时开销。这正是 Qdrant 敢在单机上扛住每秒百万级向量查询的底气。

所以,当其它数据库因为内存越界而崩溃、因为 GC 停顿而卡顿时,秦馆长依然稳如泰山地微笑服务。Rust 就是他强大到可怕但又从不越界的“性格设定”。

混合检索实战

现在一位真正的读者走到前台:“我想找一本和《摄影构图学》讲得最像的书,而且必须是 2020 年以后出版的,豆瓣评分 8.5 以上。”秦馆长动作流畅:先在记忆里按标签瞬间锁定一个几十本的小书堆,再在书堆里按指纹相似度挑出最像的那本。

这个动作就叫混合检索(Hybrid Search):向量相似度 + 元数据过滤的联合查询。Qdrant 官方推荐优先做预过滤(Pre-filtering)——先用 payload 过滤缩窄候选集,再对候选集做 ANN 搜索。相比后过滤(Post-filtering,先搜索再剔除不满足条件的点),预过滤能省下大量无效的向量距离计算,代价是过滤条件过窄时可能会把真正的最近邻排在外面。

Qdrant 在执行带过滤的搜索时,最后的得分可理解为:

读者满意地拿到那本书时,秦馆长只花了几十毫秒。混合检索不是把两个能力简单拼起来,而是让“标签闸门”和“指纹排序”像一个整体般协同——这也是 Qdrant 在 RAG、推荐系统上大受欢迎的原因。

score(q,v)=sim(q,v)×1[filter(v)]\text{score}(q, v) = \mathrm{sim}(q, v) \times \mathbb{1}[\text{filter}(v)]
指示函数 $\mathbb{1}[\cdot]$ 在过滤条件满足时取 1,不满足取 0。因此不满足条件的向量在评分阶段直接被归零,返回结果一定既有高相似度,又符合标签条件。在 RAG 知识库、电商导购、日志异常分析等场景里,混合检索都是标配。
  1. 相似度核心 $\text{sim}(q, v)$余弦或点积等,决定内容像不像。
    sim(q,v)=cos⁡(q,v)\text{sim}(q, v) = \cos(q, v)
  2. 指示函数 $\mathbb{1}[\text{filter}(v)]$过滤通过取 1,否则取 0,是一道逻辑闸门。
    1[filter(v)]={1若 v 满足过滤条件0其他\mathbb{1}[\text{filter}(v)] = \begin{cases} 1 & \text{若 } v \text{ 满足过滤条件} \\ 0 & \text{其他} \end{cases}
  3. 相乘合成匹配则保留相似度分数;不匹配得 0 分,排名自然垫底,从结果中淘汰。
    score=sim×0 或 sim×1\text{score} = \text{sim} \times 0 \text{ 或 } \text{sim} \times 1

AI 应用场景

RAG知识库中的权限过滤检索

阶段:检索增强生成(RAG)中的检索模块

解决的问题:企业内部知识库文档权限不同。传统向量检索只按相似度返回,容易把无权限内容也搜出来。Qdrant 将文档权限编码为 payload,在检索时直接过滤部门、密级等字段,保证 RAG 只取到“有权限的相似片段”。

具体案例:某金融公司把 10 万份研报切成向量存入 Qdrant,每条带 department、security_level 字段;当法务人员提问时,Qdrant 用 Filter 限定 security_level = "internal",返回的答案绝不越权。

电商平台的“条件 + 语义”商品推荐

阶段:召回(Recall)阶段

解决的问题:传统电商只做关键词匹配或标签筛选,理解不了“通勤穿的宽松休闲鞋”这种语义。Qdrant 把所有商品描述编码成向量,同时挂上 category、price、brand 等 payload,把“标签过滤 + 语义相似”一次完成。

具体案例:某鞋类商城,用户搜“适合雨天通勤的鞋”,Qdrant 预过滤 category=shoes 且 price<500,再按向量相似度召回前 20 个商品,点击率比纯 BM25 提升 30%。

IoT日志异常检测

阶段:可观测性分析

解决的问题:日志量大,需要快速找“和已知异常最像的日志”,但又不能倒出全库。payload 挂上 timestamp、severity,检索时限定最近 5 分钟 + 严重级别,再用向量相似度定位异常样本。

具体案例:某云厂商将告警日志编码为向量存入 Qdrant,线上出现新告警时,系统在 1 秒内找到历史上最相似的 10 条告警并给出处理预案。

Python 演示

python44 行
from qdrant_client import QdrantClientfrom qdrant_client.models import (    Distance, FieldCondition, Filter, MatchValue,    PointStruct, Range, ScalarQuantization, ScalarType, VectorParams,) client = QdrantClient(":memory:") client.create_collection(    collection_name="books",    vectors_config=VectorParams(size=4, distance=Distance.COSINE),    quantization_config=ScalarQuantization(type=ScalarType.INT8),) points = [    PointStruct(id=1, vector=[0.95, 0.05, 0.10, 0.02],                payload={"author": "agatha", "year": 2020, "score": 9.1}),    PointStruct(id=2, vector=[0.80, 0.15, 0.20, 0.10],                payload={"author": "agatha", "year": 1965, "score": 8.8}),    PointStruct(id=3, vector=[0.10, 0.90, 0.80, 0.05],                payload={"author": "asa", "year": 2023, "score": 9.5}),    PointStruct(id=4, vector=[0.20, 0.85, 0.75, 0.30],                payload={"author": "cop", "year": 2019, "score": 8.2}),] client.upsert(collection_name="books", points=points) query = [0.90, 0.10, 0.15, 0.05] hits = client.search(    collection_name="books",    query_vector=query,    query_filter=Filter(        must=[            FieldCondition(key="year", range=Range(gte=2000)),            FieldCondition(key="score", range=Range(gte=8.0)),        ],        must_not=[FieldCondition(key="author", match=MatchValue(value="asa"))],    ),    limit=2,) for hit in hits:    print(hit.id, round(hit.score, 4), hit.payload)
目的:通过 Qdrant 内存模式快速演示“向量相似度 + payload 过滤”的混合检索:建集合、开 int8 量化、写入 4 本书、查询时过滤年份和评分并排除指定作者。
  1. quantization_config=ScalarQuantization(type=ScalarType.INT8)在创建集合时开启 int8 标量量化,内存占用降到原来的 1/4。
  2. client.upsert(collection_name="books", points=points)把 4 条“带 payload 的点”写入集合。
  3. query_vector=[0.90, 0.10, 0.15, 0.05]表示“语义上接近《摄影构图学》”的查询向量。
  4. FieldCondition(key="year", range=Range(gte=2000))年份必须大于等于 2000,对应图书标签过滤。
  5. must_not=[...MatchValue(value="asa")]一票否决:作者为 asa 的书直接排除。
  6. for hit in hits:遍历结果,输出 ID、相似度得分和 payload 详情。

常见误区

误区我听说 FAISS 也做向量近邻搜索,Qdrant 应该跟它差不多,就是一个计算相似度的工具库吧?

正解Qdrant 是完整的向量数据库,而不只是 ANN 计算库。它支持增删改查、payload 过滤、持久化、分布式部署和权限控制,像“图书馆”一样管理数据全生命周期。FAISS 是受你指挥的计算引擎,Qdrant 则是自带图书管理员的完整馆舍。F 在真实业务中,你需要数据库的可靠性和查询能力,Qdrant 天然面向服务化场景。

为何常见:因为大家最先接触的往往是 FAISS、Annoy 这类计算库,容易把“相似度计算”和“数据库服务”混为一谈。

误区只要我把过滤条件写进 Qdrant,它就能秒级返回,不用管什么索引,数据库会自己优化。

正解payload 过滤不加索引时,Qdrant 需要扫描候选集合中每一条点的 payload,就像把每本书封面拆开看标签,数据量大时依旧慢。正确做法是给过滤高频的字段(如 year、category)建 keyword 或 integer 索引,相当于在标签墙前加一套按字母排序的目录。

为何常见:传统关系数据库有自动优化器,让人误以为所有数据库都能自动加速任意过滤;但向量数据库的过滤能力需要显式设计。

误区一旦开了量化,向量就变成“残废”,搜索出来的结果肯定乱七八糟,我宁愿多花钱买内存也坚决不用。

正解标量量化(SQ)将 float 压成 int8 后通常能保持 95% 以上召回率,因为向量在高维空间中的相对顺序受影响很小,而且量化后还可以用重打分(rescoring)进一步补偿精度。PQ 压缩率高但精度损失大一些,适合超大向量集和可接受召回略降的场景。关键在于按业务做权衡,而不是一刀切拒绝。

为何常见:人天生对“有损压缩”不信任,总觉得丢了信息就丢了灵魂;实际上工程中“足够好的近似”往往性价比最高。

误区Rust 不是强调“安全”吗?安全跟性能是不是矛盾的?它会不会只能单线程干活?

正解恰恰相反,Rust 通过所有权和 Send/Sync trait 在编译期消灭数据竞争,让 Qdrant 可以放心地利用多核并行搜索。没有 GC 停顿、没有锁竞争,多线程下的表现反而比很多语言更稳定。秦馆长不是“动作慢”,而是“从不犯错”,所以敢同时接待更多人。

为何常见:把“安全”误听成“保守、慢”,忽略了 Rust“安全 + 高效”的组合,其实它是两者兼得。

误区先做 ANN 搜出 100 条,再做过滤,肯定比先过滤再搜更准,因为向量搜索用到了全量信息。

正解预过滤和 post-filter 的准确率取决于场景。预过滤先缩窄候选,若过滤条件太严可能把真近邻排除;后过滤先找近邻再过滤,可能返回数量不足且浪费时间在无效计算上。Qdrant 官方推荐以预过滤为主,配合 payload 索引;如果过滤条件极强,也可以用后过滤。两者并非天然优劣,而是要按数据分布选择。

为何常见:很多人对“先粗后细”的自然直觉导致倾向后过滤,忽略过滤本身能大幅剪枝提升速度。

面试题

Q1. Qdrant 底层主要用什么编程语言实现?

单选题 · easy

  • A.Python
  • B.Java
  • C.Rust← 正确答案
  • D.Go

答案:C。Qdrant 是 Rust 编写的向量数据库。Rust 提供内存安全、无 GC 和强并发能力,像秦馆长这样“从不犯错又手脚麻利”的机器人,最适合做高性能存储引擎。

Q2. 在 Qdrant 中,一条具体数据(含 ID、向量、payload)被称为什么?

单选题 · easy

  • A.Collection
  • B.Point← 正确答案
  • C.Index
  • D.Schema

答案:B。Collection 是集合(库房),Point 才是具体的一本书(含 id、向量、payload)。Index 是加速检索的索引,Schema 是传统数据库里的表结构概念。

Q3. Qdrant 中 payload 使用什么数据格式描述?

单选题 · easy

  • A.CSV
  • B.JSON← 正确答案
  • C.XML
  • D.Parquet

答案:B。payload 是任意 JSON 结构,比如 {"year": 2023, "author": "agatha"}。JSON 灵活、易读,能覆盖大多数业务元数据场景。

Q4. HNSW 搜索时从哪一层开始遍历?

单选题 · mid

  • A.最底层
  • B.中间的随机层
  • C.最稀疏的顶层← 正确答案
  • D.任意一层

答案:C。HNSW 从最稀疏的顶层出发,贪心跳到下一层,逐层下探到最稠密的底层。就像秦馆长先看阁楼顶层的大类,再逐层缩小范围。

Q5. 标量量化(SQ)把 float32 向量压缩成什么类型?

单选题 · mid

  • A.int8← 正确答案
  • B.int16
  • C.float64
  • D.bool

答案:A。SQ 把每个 float32 值映射到 0-255 的 int8 整数,内存降为原来的 1/4。int16 只有 2 倍压缩,float64 反而变大,bool 不能表示连续数值。

Q6. Qdrant 官方推荐的带过滤搜索方式是?

单选题 · mid

  • A.后过滤
  • B.预过滤← 正确答案
  • C.不过滤
  • D.随机抽样

答案:B。Qdrant 推荐先用 payload 过滤缩窄候选集,再做 ANN 搜索(预过滤)。它能大幅减少无效的距离计算,配合 payload 索引效果最佳。

Q7. 关于 HNSW 中的参数 M,描述正确的是?

单选题 · hard

  • A.M 越大,图越稀疏
  • B.M 越大,召回更好但更耗时← 正确答案
  • C.M 只影响过滤
  • D.M 越大,内存占用越少

答案:B。M 是每个节点的最大连接数。M 越大图越稠密,搜索路径越丰富,召回率更高,但构建和搜索耗时及内存占用也更大。它不直接影响 payload 过滤。

Q8. Qdrant 支持哪些距离度量?

多选题 · mid

  • A.余弦距离← 正确答案
  • B.点积← 正确答案
  • C.欧氏距离← 正确答案
  • D.编辑距离

答案:ABC。Qdrant 支持 Cosine、Dot、Euclid 三种距离。编辑距离是文本相似度度量,针对字符串,不适合作为向量数据库的距离函数。

Q9. 下列哪些做法能提高 Qdrant 过滤搜索效率?

多选题 · hard

  • A.给高频筛选的 payload 字段建索引← 正确答案
  • B.查询时先缩窄候选集再做向量搜索← 正确答案
  • C.给所有 payload 字段都建全文索引
  • D.避免每次查询都全量扫描 payload← 正确答案

答案:ABD。给高频字段建索引、预过滤缩窄候选、避免全量扫描都是高效手段。给所有字段建全文索引会浪费内存和更新成本,反而降低性能。

Q10. 关于 Qdrant 中乘积量化(PQ)相比标量量化(SQ)的特点,正确的有哪些?

多选题 · extreme

  • A.PQ 压缩率通常更高← 正确答案
  • B.PQ 构建时需要训练码本← 正确答案
  • C.PQ 完全没有精度损失
  • D.PQ 更适合超大向量集合← 正确答案

答案:ABD。PQ 将向量拆成子向量并用聚类码本表示,压缩率可达几十倍,适合超大规模集合,但需要训练码本且有精度损失。SQ 实现简单、精度损失小,但不适合极高压缩场景。C 说法错误,PQ 一定有损失。