混合检索是一种强大的技术,它整合了多种搜索算法,提高了搜索结果的准确性和相关性。混合检索结合了全文搜索和向量搜索的优势,为用户提供更有效和全面的搜索体验。
MyScaleDB 在 1.6.2 版本中,引入了混合检索 (opens new window)功能。本文将探讨它的实现原理,以及它在搜索领域带来的创新。
# 向量搜索与全文搜索的融合
在向量数据库中的混合检索系统中,通常使用两种不同类型的搜索方法:向量搜索 (opens new window)和全文搜索 (opens new window)。
- 向量搜索: 基于语义相似性找到结果,通常利用机器学习模型来理解单词和短语的含义及上下文。这种方法擅长捕捉文档之间的微妙关联和概念相关性。
- 全文搜索: 直接匹配文本中的关键词或短语。当查询的确切措辞至关重要时,这种方法更传统且高效。
这两种搜索方式各有优缺点。全文搜索在基本关键词检索和文本匹配方面表现出色,适用于关键术语非常重要的查询。而向量搜索在跨文档的语义匹配和深层含义理解方面更出色,但在处理短文本查询时效率可能较低。
混合检索结合了这两种搜索能力,实现了"两全其美"。它利用语义分析捕捉更广泛的上下文相关性,同时又保持了精确的关键词匹配,从而提供更全面和有效的搜索体验。
# 融合算法的实现
每种搜索方法(向量和全文)都会产生一组结果,每个结果都附带一个相关性分数。这些分数反映了特定方法所使用的搜索查询与特定结果的匹配程度。
融合算法有效地合并这些结果。它会调整和归一化向量和全文搜索的分数,使它们可比较,并实现无缝的组合。这个过程确保向用户呈现的最终结果集合了两种搜索方法的优势,提供既具有语义相关性又具有文本准确性的结果。
在MyScaleDB中,混合检索利用了文本搜索的BM25分数(称为“lex”表示词法)和向量搜索的距离度量(称为“sem”表示语义)。为了实现这种整合,MyScaleDB目前支持两种融合算法:相对分数融合(RSF)和倒数排序融合(RRF)。
# 相对分数融合(RSF)
相对分数融合(RSF)是混合检索系统中一种有效地组合向量和全文搜索结果的方法。该过程包括两个关键步骤:分数归一化和加权求和计算。
分数归一化:
- 归一化: RSF首先对向量和全文搜索的分数进行归一化。将原始分数转换到 0-1 范围内的统一尺度上。
- 最高和最低分数: 每种搜索类型(向量和文本)中的最高分数被缩放为1,表示该搜索中最相关的结果。相反,最低分数被缩放为0,表示最不相关的结果。
- 比例调整: 所有其他分数在最高和最低分数之间的相对位置基础上,在0-1范围内按比例调整。
加权求和:
- 权重分配: 在归一化之后,每个分数都乘以特定权重,反映了对该特定搜索类型(向量或全文)的重要性。
- 最终分数计算: 每个结果的最终分数是通过对这些加权、归一化的分数求和得出的,从而实现了综合平衡的排名,整合了两种搜索方法的优势。
所使用的归一化公式为:
RSF的目的是创建一个统一的排名,将向量搜索的语义相关性和全文搜索的文本准确性整合在一起。通过归一化分数并加上适当的权重,RSF确保最终的结果是平衡的,结合了两种搜索方法的优势,为用户提供更全面和准确的结果。
# 倒数排序融合(RRF)
倒数排序融合(RRF)是混合检索系统中的另一种方法,用于合并来自不同搜索方法(如向量和全文搜索)的结果。与RSF不同,RRF不需要分数归一化,而是根据每个结果在各自结果集中的位置进行排名。在以下公式,其中k是调整低排名结果重要性的任意常数。
RRF 的主要优点是简单高效。通过绕过分数归一化的需求,RRF直接关注排名位置,使得合并来自不同搜索方法的结果更加容易,特别适用于搜索方法的评分尺度不可直接比较的情况。
# 如何在MyScaleDB中执行混合检索
让我们通过一个示例来演示如何在MyScale中执行混合检索。下面显示的SQL查询基于预先导入到MyScale集群中的维基百科数据集。
首先,在'text'列上创建一个全文搜索(FTS索引 (opens new window)),并在'vector'列上使用 cosine distance 创建一个MSTG向量索引。
CREATE TABLE wiki_abstract
(
`id` UInt64,
`body` String,
`title` String,
`url` String,
`body_vector` Array(Float32),
VECTOR INDEX body_vec_idx body_vector TYPE MSTG('metric_type=Cosine'),
INDEX body_idx body TYPE fts('{"body":{"tokenizer":{"type":"stem", "stop_word_filters":["english"]}}}') GRANULARITY 1,
CONSTRAINT check_length CHECK length(body_vector) = 1024
) ENGINE = MergeTree ORDER BY id;
在这个SQL CREATE TABLE语句中,我们为BM25全文搜索定义了一个FTS索引,并为从文本列转换而来的高维数据上的余弦相似度搜索定义了一个向量索引。
接下来,我们可以执行一个利用文本和向量列的混合检索:
SELECT id, body, HybridSearch('fusion_type=RSF', 'fusion_weight=0.4')(body_vector, body,
HuggingFaceEmbedText('Who won the Polar Medal'), 'Who won the Polar Medal') AS score
FROM wiki_abstract
ORDER BY score DESC
LIMIT 5;
这个混合检索查询首先在body_vector
列上执行向量搜索distance()
函数,找到与查询向量最相似的对象。同时,使用TextSearch()
函数在body
列上进行全文搜索,根据查询词的频率对结果进行排名。然后,使用所选的融合算法(在本例中为RSF),返回前几个候选结果。
在这个示例中,我们为全文搜索加了0.4的权重,为向量搜索加了0.6的权重。还可以调整这些权重以进行实验,并找到适合您的数据和搜索需求的最佳平衡。
# 何时使用混合检索
混合检索查询特别适用于旨在利用语义向量搜索的强大功能的搜索系统,同时也依赖于全文搜索中精确关键词匹配的准确性。与标准全文搜索或纯语义向量搜索相比,混合搜索可以提供更准确和相关的结果。
例如,对于查询"Who won the Polar Medal",
- 向量搜索的前5个结果中包含3个正确答案:
- 全文搜索的前5个结果中包含2个正确答案:
- 如前一节所示,混合检索的前5个结果中包含4个正确答案。
通过结合向量和全文搜索,混合检索显著提高了搜索的准确性,提供了更高的搜索精度和更相关的结果。
# 结论
混合检索的重要性在于它通过将关键词搜索的直接性与语义搜索的上下文深度相结合,提高了搜索结果的准确性和相关性。这种双重方法确保用户不仅获得精确匹配,还获得上下文相关的结果,即使使用了不同的术语。混合检索在处理多样化的查询方面也表现出色,提供与用户意图一致的全面和适应性结果。其优化性能和适应各种应用的能力使其成为现代信息检索中的关键技术。
如果您对如何在MyScale中使用混合检索有任何问题,欢迎查阅MyScale文档 (opens new window)或加入我们的Discord (opens new window)寻求帮助。