Fabric 中的 Cosmos DB 中的混合搜索

Fabric 中的 Cosmos DB 支持混合搜索功能,该功能使用倒数排名融合(RRF)函数将矢量搜索与全文搜索评分(BM25)相结合。

混合搜索使用基于矢量和传统的基于关键字的搜索方法的优势来提供更相关的和准确的搜索结果。 混合搜索很容易在 Fabric 中的 Cosmos DB 中执行,因为能够在同一文档中存储元数据和矢量。

Fabric 中的 Cosmos DB 中的混合搜索集成了两种不同的搜索方法:

  • 矢量搜索:利用机器学习模型了解查询和文档的语义含义。 此方法允许更细微的上下文感知搜索结果,对于传统关键字搜索可能不足的复杂查询尤其有用。

  • 全文搜索(BM25:一种成熟的算法,根据字词和字词的存在和频率对文档进行评分。 BM25 对于简单的关键字搜索有效,为搜索相关性提供可靠的基线。

然后,使用倒数排名融合 (RRF) 函数合并矢量搜索和全文搜索的结果。 RRF 是一种排名聚合方法,用于合并来自多个搜索算法的排名,以生成单个统一排名。 此方法可确保最终搜索结果受益于两种搜索方法的优势,并提供多种优势。

  • 增强相关性:混合搜索通过将语义理解与关键字匹配相结合,为各种查询提供更相关的结果。

  • 改进准确度:RRF 函数可确保确定这两种搜索方法中最相关结果的优先级。

  • 多功能性:适用于各种用例,包括检索扩充生成(RAG),以改进基于你自己的数据的大型语言模型(LLM)生成的响应。

使用全文索引和矢量索引查看此示例索引策略:

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/\"_etag\"/?"
    },
    {
      "path": "/vector/*"
    }
  ],
  "fullTextIndexes": [
    {
      "path": "/text"
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector",
      "type": "DiskANN"
    }
  ]
}

重要

目前,矢量策略和矢量索引在创建后是不可变的。 若要进行更改,请创建新的集合。 其他索引仍保持可变。

混合搜索查询

可以通过在包含RRF函数和ORDER BY RANKVECTORDISTANCE子句中使用一个FULLTEXTSCORE系统函数来执行混合搜索查询。 例如,用于查找前 k 个最相关结果的参数化查询如下所示:

SELECT TOP @k
  *
FROM
  container c
ORDER BY
  RANK RRF(VECTORDISTANCE(c.vector, @queryVector), FULLTEXTSCORE(c.content, @searchTerm1, @searchTerm2, ...))

假设有一个文档,每个文档都有矢量嵌入存储在属性 c.vector 中,文本数据包含在属性 c.text 中。 若要使用混合搜索获取 10 个最相关的文档,可以将查询编写为:

SELECT TOP 10
  * 
FROM
  container c
ORDER BY
  RANK RRF(VECTORDISTANCE(c.vector, [1,2,3]), FULLTEXTSCORE(c.text, "searchable", "text", "goes" ,"here"))

加权混合搜索查询

可以选择指定一个权重数组,以影响每个组件分数在RRF函数中的重要性。 例如,如果你有两个分量分数(VECTORDISTANCEFULLTEXTSCORE),并且想要将矢量搜索的权重设定为 BM25 评分的两倍,那么可以按照如下方式将数字数组 [2, 1] 作为 RRF 的最后一个参数添加。

SELECT TOP 10
  *
FROM
  container c
ORDER BY
  RANK RRF(VECTORDISTANCE(c.vector, [1,2,3]), FULLTEXTSCORE(c.text, "searchable", "text", "goes" ,"here"), [2, 1])