
混合搜索是一种结合多种搜索算法的技术,旨在提高搜索结果的准确性和相关性。它同时利用了基于关键词的搜索算法和向量搜索技术的优点。通过发挥不同算法的优势,为用户提供更有效的搜索体验。
Weaviate 1.17 版本引入了混合搜索功能。它使用稀疏向量和稠密向量来表示搜索查询和文档的语义含义和上下文。在本博客文章中,您将学习混合搜索的定义、稀疏向量和稠密向量的作用、何时使用混合搜索,以及如何在 Weaviate 中实现和使用混合搜索。
稀疏向量和稠密向量
稀疏向量和稠密向量使用不同的算法计算。稀疏向量主要由零值组成,只有少量非零值,而稠密向量主要包含非零值。稀疏嵌入由诸如 BM25 和 SPLADE 等算法生成。稠密嵌入由诸如 GloVe 和 Transformers 等机器学习模型生成。
请注意,Weaviate 中混合搜索的当前实现使用 BM25/BM25F 和向量搜索。
如果您有兴趣了解 Weaviate 中稠密向量索引的构建和优化方式,请查看这篇文章 文章。
BM25
BM25 基于关键词评分方法 TF-IDF(词频-逆文档频率)构建,它采用 二元独立模型 来自 IDF 计算,并添加了一个归一化惩罚,该惩罚根据数据库中所有文档的平均长度来衡量文档的长度。
以下公式展示了 BM25 的评分计算
文档、查询对的得分是通过衡量查询中每个关键词相对于文本集合的唯一性来确定的。BM25 包含额外的静态参数 k1 和 b,这些参数可以帮助校准性能以适应特定的数据集。
BM25F
BM25F 也已在 Weaviate 1.17 中实现。BM25F 是 BM25 的变体,允许为每个对象中的多个文本字段赋予不同的权重,用于排名计算。这些权重对于文档中的某些字段比其他字段更重要的情况非常重要。例如,标题可能比摘要赋予更高的权重,因为标题有时更具信息量和简洁性。这种类型的加权使 BM25F 比 BM25 更灵活和可定制。
稠密向量
稠密向量表示存储在数据库中的信息;这包括文本、图像和其他类型的数据。这些嵌入由机器学习模型生成,将数据转换为向量。这些向量紧密地打包信息,并且主要由非零值组成。向量中每个值的含义取决于您使用的机器学习模型。
向量数据库,例如 Weaviate,存储这些嵌入并计算两个向量之间的距离。距离度量 显示两个 向量嵌入 有多相似或不相似。搜索查询被转换为向量,类似于数据向量,并且距离值决定了向量的接近程度。

什么是混合搜索?
混合搜索将稠密向量和稀疏向量合并在一起,以提供两种搜索方法的最佳效果。一般来说,稠密向量擅长理解查询的上下文,而稀疏向量擅长关键词匹配。考虑查询“如何捕获阿拉斯加鳕鱼”。稠密向量表示能够将“捕获”理解为钓鱼,而不是棒球或疾病。稀疏向量搜索将仅匹配短语“阿拉斯加鳕鱼”。这个示例查询展示了混合搜索如何结合稀疏向量和稠密向量的优点。
混合搜索是如何工作的?
混合搜索通过将稀疏向量搜索(例如,BM25)和密集向量搜索的结果组合成一个单一的、排序后的列表来工作。为了实现这一点,Weaviate 首先并行执行向量搜索和关键词搜索。然后,这些搜索的结果被传递给一个融合算法,例如互易秩融合 (RRF),它将对象组合并排序成一个列表。
RRF 确保来自两种搜索类型的相关结果得到公平的表示,并惩罚在任一列表中排名较低的文档。Benham 和 Culpepper (2018) 探索了各种排名融合技术以改进搜索结果。这篇论文分析了七种将两个列表的排序结果组合成单个排名的策略。让我们深入了解 RRF 分数的计算方式。
RRF 分数是通过对每个列表给出的倒数排名的总和来计算的。通过将文档的排名放在分母中,它会惩罚在列表中排名较低的文档。
让我们看一个例子。我们有三个文档,分别标记为 A、B 和 C,并且已经运行了 BM25 和密集搜索。在这个例子中,我们将常数 k 设置为 0。
| BM25 排名 | 密集排名 | 结果 |
|---|---|---|
| A | B | A: 1/1 + 1/3 = 1.3 |
| B | C | B: 1/2 + 1/1 = 1.5 |
| C | A | C: 1/3 + 1/2 = 0.83 |
上表显示了 BM25 和密集搜索的排序顺序。为了将这两个列表融合在一起,我们需要对倒数排名求和。根据结果,排名第一的文档是 Document B,排名为 1.5,然后是 Document A,排名为 1.3,以及 Document C,排名为 0.83。
Weaviate 支持两种融合算法,rankedFusion 和 relativeScoreFusion。rankedFusion 是默认的融合算法,但是您可以在 fusionType 参数中进行更改。
要深入了解 Weaviate 的混合搜索如何组合稀疏和密集向量,您可以在我们的博客文章中了解更多关于这些 融合算法的信息。
何时使用混合搜索?
混合搜索查询非常适合想要利用语义搜索能力的搜索系统,但仍然依赖于精确的关键词匹配。例如,之前示例搜索查询“如何捕获阿拉斯加的极鳕”使用混合搜索查询比使用普通的关键词搜索甚至语义搜索查询会产生更好的结果。
混合搜索的优势
混合搜索引擎带来了多种优势,使其成为现代搜索系统的强大方法,尤其是在语义理解和精确关键词匹配都至关重要时。这种双重方法擅长处理各种用户查询,无论它们是需要精确匹配的特定领域查询,还是依赖于上下文和含义的语义查询。例如,在用户可能会在其查询中包含歧义短语、特定领域术语或拼写错误的情况下,混合搜索通过理解查询意图同时仍然尊重关键关键词的精确匹配来确保相关结果。
除了其灵活性之外,混合搜索还可以通过减少对完美措辞查询的需求来显著改善用户体验。密集向量嵌入捕获搜索查询背后的语义含义,使其更容易处理多概念甚至多语言查询。它能够无缝集成语义关系与精确的关键词匹配,确保更准确和上下文相关的结果。
这使得混合搜索引擎成为电子商务、客户支持和其他以搜索为驱动的领域的理想选择。
Weaviate 中的一个简单的混合搜索管道
要使用 Weaviate 混合搜索,您只需要确认您使用的是 Weaviate v1.17 或更高版本。运行混合搜索查询需要五个参数(其中一些是可选的)
hybrid:表示您想要使用混合搜索查询query:搜索查询alpha(可选,默认值为0.75):每个搜索算法的权重alpha= 0 -> 纯关键词搜索alpha= 0.5 -> 关键词和向量搜索的相等权重alpha= 1 -> 纯向量搜索
vector(可选):可选地提供您自己的向量score(可选):有关稀疏和密集方法对结果贡献程度的更多信息fusionType(可选,默认值为rankedFusion):选择融合算法
只需几行代码,您就可以开始使用混合搜索。查询是“捕获鲑鱼的渔民”(类似于上面的示例)。当我们将 alpha 设置为 0.5 时,它会平等地权衡密集和稀疏向量结果。
response = article.query.hybrid(
query="fisherman that catches salmon",
alpha =0.5,
return_metadata=MetadataQuery(score=True, explain_score=True)
for o in response.objects:
print(o.properties)
print(o.metadata.score, o.metadata.explain_score)
您可以在 Weaviate Recipes 中找到有关使用混合搜索的端到端笔记本!
总结
本文解释了混合搜索的概念。在 Weaviate 向量数据库的上下文中,混合搜索是关键词搜索和语义搜索的组合。通过将这两种搜索类型结合起来,混合搜索查询可以在您想要利用语义搜索的力量但又依赖于精确匹配某些关键词(例如产品或品牌名称)的情况下,产生更相关的结果。
请查看 文档以获取有关混合搜索的更多信息!
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。