当图片、文本和视频被统一转换为高维向量后,检索系统面对的不只是相似度计算,还要处理海量存储、标量过滤、索引加载与成本控制。快手将这些问题放到 Apache Doris 的分析体系中解决,并围绕千亿级数据规模重新设计索引、缓存和查询链路,形成了一套兼顾召回效果与资源效率的工程方案。
作者:温佳豪,快手数据引擎技术中心架构师
导读:大模型和 AI Agent 落地之后,多模态内容向量化与相似度检索逐渐成为大数据分析的基础能力。在快手,基于 Apache Doris 深度定制的 Bleem 分析引擎在承载标量分析的同时,将向量检索扩展到了千亿级规模。本文系统梳理 Bleem 引擎在存算分离架构下的演进过程,重点介绍在千亿规模、高维向量与成本约束下,结合 IVF-ON-DISK、RaBitQ 量化与全局两层索引的设计方案与实测收益,并总结生产环境沉淀的工程经验。
在快手内部,基于 Apache Doris 深度定制优化的 Bleem 引擎,一直承载着商业化广告、AB 测试、风控圈定、电商数仓等核心业务,是快手大数据分析的核心底座之一。
随着 AI 业务的爆发,团队收到向量检索需求,梳理下来主要分为两类:
从底层负载特性来看,这类需求表现出明确的分析型特征:
Apache Doris 原生具备融合多模态检索(结构化查询 + 全文检索 + 向量索引)的演进方向。团队选择在 Doris 上扩展千亿级向量检索能力,不仅能直接覆盖复合检索,还能复用已有的调度、隔离与运维监控体系。

为在千亿规模下平衡存储成本与查询延迟,系统采用存算分离架构作为主力部署形态,并配套读写分离与资源隔离机制。
数据链路可概括成四个环节:数据导入 → 索引构建 → 向量检索 → 结果处理。
其中数据导入分为离线和实时两条链路。离线的走 Spark 从数据湖批量抽数,实时的走 Flink 从 Kafka 写入。数据进来后,Doris 会在存储层给向量列建好 ANN 索引,跟数据一起持久化。
在向量检索环节,系统统一采用前过滤(Pre-filtering)语义:
一条 SQL 既包含标量条件,又包含向量近邻。前过滤先通过倒排索引快速筛出满足标量条件的行号(row id 白名单),随后将白名单传给向量索引,仅在合规子集内计算距离。若谓词条件复杂无法走倒排,或过滤后候选集极小,系统会自动降级回退(Fallback)至暴力精确计算,兼顾查准率与数据完备性(该回退机制后文将详细展开)。

检索结果的流向分为两类:
为在千亿规模下平衡存储成本与查询延迟,系统采用存算分离作为主力部署形态。基于“原始向量体量大(千亿条近 1 PB)、量化索引小、查询输出更小”的数据特征,系统在存算分离架构下落地了分层存储与多级缓存:
在实际检索过程中,数据读取优先命中内存 ANN 索引缓存,未命中则读取本地磁盘 Index 队列、极少数冷数据回源远程存储。

系统通过划分逻辑计算组(Compute Group)实现读写分离,不同计算组之间资源物理隔离,共享同一份底层远程数据:

不同向量检索场景的技术指标差异显著,单一定制的配置参数难以满足多样化的负载需求。针对交互式分析(追求低延迟、小 K 值)与离线批量任务(追求高吞吐、大 K 值)的技术指标差异,系统实现了细粒度的资源控制。

nprobe)等核心向量检索参数由会话变量(Session Variable)动态驱动,允许各业务按需调整检索策略。千亿规模下的向量选型,本质是在召回率、性能与成本的不可能三角中寻得平衡。针对场景“成本高度敏感、追求目标召回、不追求毫秒级极致延迟”的特征,选型策略确定为:守住目标召回,优先压低内存成本。

Doris 的向量索引能力基于开源向量数据库引擎 Faiss 构建,原生支持 HNSW、IVF 与 IVF-ON-DISK 三种索引结构。
HNSW 召回率高、查询延迟低,但要求全量常驻内存;常规 IVF 同样要求倒排链全量常驻内存。对于千亿条 2048 维数据(索引体积近 1 PB),全内存方案硬件成本无法接受。
系统最终选择 IVF-ON-DISK:仅将簇中心等小体积元数据常驻内存,体量最大的倒排链沉降至磁盘,检索时按需加载并由专属 ANN 内存缓存兜底。该方案成功解耦了常驻内存开销与总数据规模,成为千亿场景下的必然选择。

以 2048 维单条向量(约 8 KB)计算,千亿条数据的原始体积接近 1 PB,生成的索引体积与原始数据相当。若采用 HNSW 或常规 IVF,需要部署数百 TB 级别的内存集群来维持索引常驻,硬件成本不可接受。IVF-ON-DISK 成功打破了常驻内存开销与总数据规模的线性绑定关系。

具体来看实现机制,IVF-ON-DISK 包含三个核心环节:
确定 IVF-ON-DISK 索引结构后,还需解决倒排链内部的存储密度问题。在 Doris 原生支持的 SQ(Scalar Quantization,标量量化)与 PQ(Product Quantization,乘积量化)基础上,系统引入了 RaBitQ 量化算法。三类算法的技术特征如下:
系统最终选定 4-bit 密度的 RaBitQ 方案(对应 8 倍存储压缩) 。

为验证量化算法在不同维度下的表现,团队在开源标准数据集 SIFT-1M(128 维)与快手真实业务数据集 KWAI-1M(2048 维)上进行了对比评估。测试涵盖了维度差异达 16 倍的场景,实测数据如下:


PQ 压缩比高、生态成熟,代价是需训练并常驻码本、且有整除与训练门槛约束;RaBitQ 量化免码本、带理论误差界,契合快手的主力高维业务场景。
Doris 的向量索引默认构建在数据文件(Segment)粒度。千亿规模下 Segment 数量剧增,单次查询触达的 Segment 过多,会导致跨段归并与分片元信息处理开销过大。
为此,系统将 IVF 的粗聚类逻辑上移,与 Doris 的表分区(Partition)机制融合,建立了全局两层索引架构:利用全量向量训练全局质心,将向量按就近原则归簇,并将簇 ID 映射为表的分区键。查询分为两级执行:

其次,针对高维 Embedding 语义倾斜易产生“巨型簇加空桶”导致裁剪失效的问题,系统在质心训练阶段引入带容量上限硬约束的均衡 K-Means 算法。该算法将簇间变异系数从 0.53 压降至 0.15,最大与最小分区的记录数差距从 12 倍收敛至 2.3 倍,保障了第一层分区裁剪的实际剪枝效率。两层裁剪叠加后,单次查询实际参与计算的向量数据量降至全表体量的 1% 左右。

为验证上述选型与架构优化的综合效果,系统在快手线上一个 2048 维、千亿规模的真实向量表上进行了评估。
测试配置如下:
实测数据显示,完整全局两层索引方案相比暴搜:查询耗时缩短 120 倍(42 分钟降至 21 秒),扫描字节数降低 4800 倍,CPU 消耗降低 57 倍,峰值内存降低 23 倍,验证了该方案在千亿级高维向量检索场景下的可行性与性价比。

在大架构落地之外,针对生产环境中的典型性能瓶颈,团队在工程实现上进行了端到端的深度优化:
当标量谓词无法由倒排索引处理、或过滤后剩余候选集极小时,系统会自动回退为暴力精确计算(暴搜)。传统回退需要将完整的原始浮点向量从磁盘读回内存并逐行计算距离。
核心优化思路是:在 IVF-ON-DISK + RaBitQ 索引架构下,避开原始向量读取,直接利用 Segment 内现有的 RaBitQ 量化码按行号估算距离,免去原始向量读取;同时按存活行密度自适应切换“逐点读”或“批量读”。
优化后,回退耗时缩短 6.8~14 倍,峰值内存降低 4~7 倍,估算距离与精确距离的平均相对误差仅 0.1%。

在离线模型语料构建等场景中,业务常需一次性检索出数十万至百万级别的近邻,并输出对应的原始向量。直接执行极易导致内存溢出(OOM)。
为此,系统将检索逻辑进行 “排序”与“取向量”解耦。子查询仅检索主键与距离,归并后将 Top-K 结果广播生成 Runtime Filter,各节点本地并行回表精准读取原始向量。
优化后,在百万级 K 值检索场景下,扫描字节数降低约 15 倍,峰值内存由 39 GB 大幅降至 821 MB(降低约 47 倍),彻底消除了超大 K 值查询引发的内存熔断风险。

针对千亿级超大向量负载,团队在导入与查询两侧沉淀了以下关键调优参数:
nprobe);加大 ANN 倒排链专属内存缓存,关闭超大数据集下的通用列存 Page Cache;调高回退阈值,促使标量谓词尽量被倒排索引完全消化。
在千亿级向量检索稳定运行的基础上,快手也在与 Doris 社区保持积极合作,将在实践中沉淀的优化经验与相关能力逐步回馈社区,推动向量检索能力的持续演进。团队后续的演进工作主要集中在三个维度:
Bleem 引擎从实际业务需求出发,基于 Apache Doris 深度扩展向量检索能力,通过存算分离与多级缓存平衡了成本与性能,依托 IVF-ON-DISK 结构、RaBitQ 量化与全局两层索引架构,在千亿级高维向量场景下拿到了数量级的性能与资源收益,并完成了回退加速与大 K 值改写等工程实践。方案与线上实测数据可为行业内海量多模态检索任务的落地提供参考。
如果你有同样的需求,或对 Apache Doris 向量检索、千亿级多模态数据分析的架构设计与工程落地感兴趣,欢迎进行社区交流与共建。
SelectDB 是基于 Apache Doris 的商业版本,为企业提供千亿级混合检索开箱即用、集群性能调优及 7×24 专家级技术保障。欢迎访问 SelectDB 官网申请试用或咨询企业级落地方案。