一文玩转 Milvus 新特性之 Hybrid Search
![一文玩转 Milvus 新特性之 Hybrid Search](https://assets.zilliz.com/cms-cn/large_08_08_132d39a931.png)
引言:Milvus 2.4 新增了单 collection 多向量列的支持,同时提供了针对多向量列 hybrid search 的搜索方法。在本篇 Blog 里,我们会围绕该功能展开并深入,从需求由来、设计实现到用法场景的探索,并通过具体例子的结合来介绍如何使用该功能以及其实际效果。
多向量列是什么?我们为什么需要它?|WHAT is Hybrid Search and WHY do we need it?
OpenAI 最近官宣的多模态大模型 GPT-4o 再一次引发了热议,近年来对多模态的处理能力被认为是通往 AGI 的必经之路。虽然关于 GPT-4o 的训练方法尚未公布,但从 CLIP 双模态模型的训练上我们可以窥见端倪,将不同模态但相互关联的数据提取特征,转为固定维度的向量输入给模型,然后通过对比学习的方式调整模型参数进行模态间融合。
抽象来看,这正是“万物皆可向量化”的有力例证。向量,AI 时代的信息编码方式,作为沟通不同模态的钥匙,其背后承载的信息也正变得愈发多元和复杂。因此,这些趋势也对向量数据库提出了更高的需求,作为向量数据存储的底座,如何能更好地支持复杂、多元化、甚至多模态数据的存储和检索?Milvus 新版本的多向量列支持和 Hybrid Search 正是在这样的背景下应运而生。在以往,Milvus 在单个集合内只能支持单个向量列,这在大多场景下是足够的。然而随着向量承载的信息的复杂化以及多模态的发展,在一些特定场景下,单个向量列就不足以表征更宽泛和丰富的信息了。
多向量列,顾名思义,就是在单个集合里支持多个独立的向量列。而这背后也是信息复杂性的体现,不同的向量列可以用来存储和表示:
111.PNG
- 多个角度的信息,如电商产品图片的正视图、侧视图和俯视图;
- 不同 embedding 模型的侧重,比如 dense embedding 更关注整体,而 sparse embedding 更关注局部和关键词;
- 多模态的融合,如司法刑侦场景下,自然人可以通过指纹、声纹、人脸等不同模态的生物信息表征,通过交叉验证则可以锁定唯一目标。
222.PNG
在向量数据库的视角里,多向量列是对信息的融合,无论是来自不同角度的融合、还是不同模型的融合、抑或是多模态信息的融合,通过在相同的 collection 里存储不同向量列的信息,信息维度上会更加丰富而全面,这样在搜索上也可以提供更好的灵活性以及综合准确度。正是在这些场景和需求的驱动下,多向量列的存储和检索成为了 Milvus 社区和业界共同探索的新方向。
Milvus 内部是如何处理多向量列的?| HOW does Milvus handle multi-vector and hybrid search?
处理流程概述
多向量列的支持涉及到多方面的重构,一方面是要解除存储写入的限制,并确保系统兼容性和稳定性;另一方面则是提供多向量列的搜索方法以应对更复杂的信息查询。
在写入链路上,我们首先移除了单 collection 单向量列的限制,并且对多向量列下的 segment 参数进行了优化,单表默认可以支持 4 列向量,最多可以支持 10 个向量列。同一 collection 的不同向量列既可以支持不同的 metric type 也可以支持不同的 index type。但需要注意的是,为了兼容系统设定,只有在所有向量列都创建好索引并 load 到内存后,collection 才能开放查询。
在读取链路上,我们采用推荐系统多检索器多路召回+混合排序的方式执行多向量列搜索。其处理流程大致如下图所示:首先通过定义内层参数控制召回结果,它作用于某一单路搜索召回的结果,该搜索也可以支持 filter 和 limit 等中间层参数,但不支持 output_field, group_by_field 这类输出参数,该步骤在推荐系统中通常被称为粗排。在得到各路召回结果之后,则是综合各路返回结果进行融合的过程称之为 Reranking,目前 Milvus 支持两种经典的融合策略,也支持在客户端调用 rerank 模型对结果进行重排序。
333.PNG
融合策略 | Rerank Strategy
目前 Milvus 可支持的融合策略包括基于排名的 RRF 以及基于 Score(Distance) 的加权平均算法 WeightedRanker。
策略一:RRF
RRF(Ranked Retrieval Fusion,排序检索融合)是一种常见的检索融合算法,此方法侧重于使用排名信息,将每个系统的排名结果加权并合并,以提高整体检索的相关性和效果。其基本步骤如下:
- 召回阶段收集排名:多个检索器(各路召回)对其查询分别生成排序结果。
- 排名融合:使用简单的评分函数(如倒数和)将各检索器的排名位置加权融合,公式如下:
444.png
这里,𝑁 代表不同召回路的数量,rank𝑖(𝑑) 是第 𝑖 个检索器对文档 𝑑 的排名位置,𝑘 是一个平滑参数,通常取 60。
- 综合排序:根据融合后的评分对文档重新排序,生成最终结果。
RRF 以其简单但强大的融合能力,广泛应用于搜索引擎、推荐系统和文档检索等领域。在仅需要对结果简单做融合的场景下,RRF 是很好的检索融合算法。
策略二:WeightedRanker
WeightedRanker 分数加权平均算法的核心思想是对多个召回路的输出结果的分数进行加权平均计算,以得到一个综合的结果,其中不同召回路的贡献可由预设的权重来决定。其基本步骤如下:
- 召回阶段收集分数:收集来自不同路召回的结果及其分数。
- 分数归一化:将各路的分数做归一化,使其值落在 [0,1] 之间,越接近 1 代表越相关。这是由于不同 Metric Type 的 Score 分布范围是不一样的,譬如 IP 的 distance 是 [-∞,+∞],而 L2 的 distance 是 [0,+∞]。Milvus 在这里通过 arctan 函数做归一化,最终通过数学变换将取值范围控制在 [0,1] 之间,为不同 metric type 相互关联建立基础。
555.png
权重分配:为每一路分配一个权重 w𝑖,这些权重根据数据源的可靠性、准确性或其他相关指标来确定,由用户指定,各路权重的取值范围也在 [0,1] 之间。
分数融合:采用加权平均的方式对归一化后的 Score 进行计算,获得最终得分,根据分值结果由大到小生成最终的排序结果。
666.png
加权平均融合算法通过权重的合理分配,可以更加有效地结合各路召回的信息,其优势在于权重的自由分配,灵活可调试,因此具有较强的实用性。
综合以上两个 fusion strategy,用户既可以对结果排名进行融合,又可以针对结果分数和相关性进行融合,这使得 hybrid search 具备较为综合的查询能力。接下来我们将通过具体例子来验证多向量列搜索的实际效果。
多向量列的上手体验 |HOW to use it?
- 数据准备和场景说明 Dataset:从公开资料中下载了多张包含交通灯照片作为数据集。
777.png
Target:在此次 demo 里,此张图片被选为多向量列的搜索目标。
888.png
- 特征提取
创建多向量列 Collection
999.png
其中,同种标注的地方是两个向量列,不同的向量列通过不同的 embedding models 进行提取,这里以 ResNet 和 CLIP 为例,分别代表典型图像和文本-图像双模态的模型。
ResNet - 第一列向量的特征提取器
ResNet 是残差网络(Residual Network)的简称,是深度学习领域的基础模型,极大地推动了图像识别和分类领域的研究。我们使用 ResNet-34 作为第一列向量的特征提取器,因为它已在 ImageNet 上经过训练,能有效区分各类图像。
1010.png
CLIP - 第二列向量的特征提取器
CLIP 是 Contrastive Language-Image Pre-training 的缩写,是由 OpenAI 开发的一个革命性的模型,它在视觉数据和文本数据之间架起了一座桥梁,极大地推动了多模态学习领域的发展。通过对互联网收集的各种数据进行训练,使其能够理解自然语言描述中的图像并对其进行分类。我们利用它从标题中提取的特征(文本)来搜索图片。
11.png
- 单向量列搜索
ResNet 的搜索结果
在图搜的场景下,如果 dataset 中包含待检索的图片一模一样的图片时,这时单向量列的 dense vector search 就能很快返回正确结果。然而在现实世界里,很多情况下待检索的图片和 dataset 往往有差异,有时候是不同角度的照片,有时候是细节与整体的关系,或者具有不同的环境背景参数,这都会影响 dense vector search 的返回结果,而这里我们以 target 图片的局部信息【红绿灯】为例进行一次图片搜索。
12.png
13.png
结果可以发现,返回的结果主体大多是突出【红绿灯】这一对象,而我们的 target 并不是作为最相似的图片返回的,如果结果限制在 limit = 2 那么我们就丢失了 target 目标图片。
CLIP 的搜索结果
然后我们来看另外的一路单列搜索,由于 CLIP 模型的跨模态理解能力,我们可以通过输入文本来搜索图片,这里的搜索 text 是 "with buildings at background"。
14.png
结果可以发现,返回的结果围绕【建筑物】这一背景元素输出,但我们的 target 依旧并非以最相似的图片返回结果。
- 多向量列搜索
两个单路召回效果都不够理想,因此我们采用多向量列进行搜索。这里 hybrid_search 采用平均加权的方式来融合两路 AnnSearchRequest 的结果,ResNet 和 CLIP 列的权重分别设置为 0.7 和 0.8。而此次混合搜索的结果融合了前两次单路召回的相关性信息,最终将 target 作为最相似 Top1 进行返回,用户得到了精准的召回结果。
15.png
效果分析和结论 本例通过两列多向量展示了图像+文本多模态输入的混合搜索,相比于各自单路搜索,其最终返回结果有明显的提升。从更直观的语言来解释,就是在本例中 ResNet 的【红绿灯】是局部信息的输入,而 CLIP 的【建筑物】则是背景信息的输入,在单路信息都不够充分的情况下其搜索结果自然也差强人意。而通过多向量列和 hybrid search 融合检索则能很好的结合这种【局部特征+背景信息】,形成更为全面的信息输入,从结果上看也是 hybrid search 更好地完成了搜索使命,获得了比单路召回都要精准的结果。
代码复现和更多场景 相关的复现代码见链接,除了这个 multi-modal 的 demo,repo 里还准备了 multi-angle,sparse+dense 等不同场景的 demo 和测试数据,结果都证明 hybrid search 在准确性、灵活性上具备更大的优势。
总结和未来规划
多向量列和 Hybrid Search 是 Milvus 新版本的一项重要新功能,通过融合多种搜索方法的优势,可以极大地提升搜索的灵活性和准确性。未来,我们也将持续迭代 Hybrid Search 功能,使其在更多领域发挥作用,譬如拓展到基于时间排序的融合可用于类似微博热搜推荐的场景,以及加入更强大和灵活的 fusion 算法和 rerank model,为用户提供更优质的搜索体验。关于多向量列的探索也远不止本文的内容和 demo,一如多模态大模型带给我们的惊喜还将持续。
技术干货
我决定给 ChatGPT 做个缓存层 >>> Hello GPTCache
我们从自己的开源项目 Milvus 和一顿没有任何目的午饭中分别获得了灵感,做出了 OSSChat、GPTCache。在这个过程中,我们也在不断接受「从 0 到 1」的考验。作为茫茫 AI 领域开发者和探索者中的一员,我很愿意与诸位分享这背后的故事、逻辑和设计思考,希望大家能避坑避雷、有所收获。
2023-4-14技术干货
LLMs 诸神之战:LangChain ,以【奥德赛】之名
毫无疑问,大语言模型(LLM)掀起了新一轮的技术浪潮,成为全球各科技公司争相布局的领域。诚然,技术浪潮源起于 ChatGPT,不过要提及 LLMs 的技术发展的高潮,谷歌、微软等巨头在其中的作用不可忽视,它们早早地踏入 AI 的技术角斗场中,频频出招,势要在战斗中一争高下,摘取搜索之王的桂冠。而这场大规模的 AI 之战恰好为 LLMs 技术突破奏响了序曲。LangChain 的加入则成为此番技术演进的新高潮点,它凭借其开源特性及强大的包容性,成为 LLMs 当之无愧的【奥德赛】。
2023-5-17技术干货
向量数据库的行业标准逐渐清晰!Vector DB Bench 正式开源!
本文将从 Vector DB Bench 的特点和优点出发,帮助开发者全面、客观、高效地评估向量数据库。
2023-6-21