欢迎光临
我们一直在努力

高级RAG检索

1、近似近邻(ANN)搜索

近似近邻(ANN)搜索以记录向量嵌入排序顺序的索引文件为基础,根据接收到的搜索请求中携带的查询向量查找向量嵌入子集,将查询向量与子群中的向量进行比较,并返回最相似的结果。

2、过滤搜索

ANN 搜索能找到与指定向量嵌入最相似的向量嵌入。但是,搜索结果不一定总是正确的。您可以在搜索请求中包含过滤条件,这样 Milvus 就会在进行 ANN 搜索前进行元数据过滤,将搜索范围从整个 Collections 缩小到只搜索符合指定过滤条件的实体。

如果 Collections 同时包含向量嵌入及其元数据,您可以在 ANN 搜索之前过滤元数据,以提高搜索结果的相关性。Milvus 收到携带过滤条件的搜索请求后,会将搜索范围限制在符合指定过滤条件的实体内。

image.png

如上图所示,搜索请求携带 chunk like % red % 作为过滤条件,表明 Milvus 应在 chunk 字段中包含 red 的所有实体内进行 ANN 搜索。具体来说,Milvus 会执行以下操作。

  • 过滤符合搜索请求中过滤条件的实体。
  • 在过滤后的实体中进行 ANN 搜索。
  • 返回前 K 个实体。

基本操作符

Milvus 支持几种用于过滤数据的基本操作符。

  • 比较操作符 :==,!=,>,<,>=, 和 <= 允许基于数字、文本或日期字段进行筛选。
  • 范围过滤器 :IN 和 LIKE 可帮助匹配特定的值范围或集合。
  • 算术操作符 :+,-,*,/,%, 和 `` 用于涉及数字字段的计算。
  • 逻辑操作符 :AND,OR, 和 NOT 或 '&&'、'||'、'~'、'!'将多个条件组合成复杂的表达式。

filter = "age > 25 and city in ['北京', '上海']"

3、全文搜索 (BM25)

全文搜索是一种在文本数据集中检索包含特定术语或短语的文档,然后根据相关性对结果进行排序的功能。该功能克服了语义搜索可能会忽略精确术语的局限性,确保您获得最准确且与上下文最相关的结果。此外,它还通过接受原始文本输入来简化向量搜索,自动将您的文本数据转换为稀疏嵌入,而无需手动生成向量嵌入。

该功能使用 BM25 算法进行相关性评分,在检索增强生成 (RAG) 场景中尤为重要,它能优先处理与特定搜索词密切匹配的文档。

全文搜索在 Milvus Standalone 和 Milvus Distributed 中可用,但在 Milvus Lite 中不可用

image.png

要使用全文搜索,请遵循以下主要步骤。

  • 创建 Collections:设置一个带有必要字段的 Collections,并定义一个将原始文本转换为稀疏嵌入的函数。
  • 插入数据:将原始文本文档插入 Collections。
  • 执行搜索:使用查询文本搜索你的 Collections 并检索相关结果。
  • search_params = {
    'params': {'drop_ratio_search': 0.2}, # Proportion of small vector values to ignore during the search
    }

    client.search(
    collection_name='demo',
    data=['whats the focus of information retrieval?'],
    anns_field='sparse',
    limit=3,
    search_params=search_params
    )

    4、混合搜索

    混合搜索指的是一种同时进行多个 ANN 搜索、对这些 ANN 搜索的多组结果进行 Rerankers 并最终返回一组结果的搜索方法。使用混合搜索可以提高搜索精度。混合搜索最常用于稀疏密集向量搜索和多模态搜索等场景。

    MilvusCollectionHybridSearchRetriever 是使用 Milvus 和 LangChain 进行混合搜索的另一种实现, 即将被弃用 。

    应用场景

    混合搜索适用于以下两种情况。

    稀疏-密集向量搜索

    不同类型的向量可以表示不同的信息,使用各种嵌入模型可以更全面地表示数据的不同特征和方面。例如,对同一个句子使用不同的 Embeddings 模型,可以生成表示语义的密集向量和表示句子中词频的稀疏向量。

    • 稀疏向量: 稀疏向量的特点是其向量维度高,存在很少的非零值。这种结构使其特别适合传统的信息检索应用。在大多数情况下,稀疏向量中使用的维数对应于一种或多种语言中的不同词块。每个维度都有一个值,表示该标记在文档中的相对重要性。这种布局对于涉及文本匹配的任务非常有利。
    • 密集向量: 密集向量是从神经网络中衍生出来的嵌入。当排列成有序数组时,这些向量能捕捉到输入文本的语义本质。需要注意的是,稠密向量并不局限于文本处理;它们还广泛应用于计算机视觉,以表示视觉数据的语义。这些稠密向量通常由文本 Embeddings 模型生成,其特点是大部分或所有元素都非零。因此,密集向量对于语义搜索应用特别有效,因为即使在没有精确文本匹配的情况下,它们也能根据向量距离返回最相似的结果。这种功能可以获得更细致入微、更能感知上下文的搜索结果,通常可以捕捉到基于关键词的方法可能忽略的概念之间的关系。
    多模式搜索

    多模态搜索是指跨多种模态(如图像、视频、音频、文本等)对非结构化数据进行相似性搜索。例如,一个人可以用指纹、声纹和面部特征等多种数据模式来表示。混合搜索支持同时进行多种搜索。例如,用相似的指纹和声纹搜索一个人。

    工作流程

    混合搜索的主要工作流程如下。

  • 通过BERT和Transformers 等嵌入模型生成密集向量。
  • 通过BM25、BGE-M3、SPLADE 等嵌入模型生成稀疏向量。
  • 创建 Collections 并定义 Collections Schema,其中包括密集向量场和稀疏向量场。
  • 将稀疏密集向量插入上一步刚刚创建的 Collections 中。
  • 进行混合搜索:稠密向量上的 ANN 搜索将返回一组前 K 个最相似的结果,稀疏向量上的文本匹配也将返回一组前 K 个结果。
  • 归一化:对两组 K 强结果的得分进行归一化,将得分转换为 [0,1] 之间的范围。
  • 选择适当的 Rerankers 策略,对两组 Top-K 结果进行合并和重排,最终返回一组 Top-K 结果。
  • image.png

    5、重新排名

    下图展示了在 Milvus 中执行混合搜索的过程,并强调了重排在此过程中的作用。

    reranking_process

    混合搜索中的重新排序是一个关键步骤,它可以整合来自多个向量场的结果,确保最终输出结果具有相关性并能准确排出优先级。目前,Milvus 提供以下重新排序策略:

    • WeightedRanker:这种方法通过计算来自不同向量搜索的得分(或向量距离)的加权平均值来合并结果。它根据每个向量场的重要性分配权重。
    • RRFRanker:这种策略根据结果在不同向量列中的排名来合并结果。

    加权评分(WeightedRanker)

    WeightedRanker 策略根据每个向量字段的重要性,为每个向量检索路径的结果分配不同的权重。当每个向量字段的重要性不同时,就会应用这种 Rerankers 策略,这样就可以通过给某些向量字段分配更高的权重,使其比其他向量字段更受重视。例如,在多模态搜索中,文本描述可能比图像中的颜色分布更重要。

    互易等级融合(RRFRanker)

    RRF 是一种数据融合方法,它根据排名的倒数来组合排名列表。它是一种平衡各向量场影响的有效方法,尤其是在没有明确的重要性优先顺序时。这种策略通常用于想要对所有向量场给予同等考虑,或对每个场的相对重要性存在不确定性时。

    RRF 的基本流程如下:

    • 在检索过程中收集排名 :检索器跨多个向量字段检索并对结果进行排序。
    • 排名融合 :RRF 算法对每个检索器的排名进行权衡和合并。计算公式如下

      rrf-ranker

      这里,𝑁 代表不同检索路径的数量,rank𝑖(𝑑) 是第 𝑖 个检索器检索到的文档𝑑 的排名位置,𝑘 是平滑参数,通常设置为 60。

    • 综合排名 :根据综合得分对检索结果重新排序,得出最终结果。

    RRF 允许在不指定明确权重的情况下平衡各领域的影响。在最终排名中,多个字段一致同意的最匹配结果将被优先排序。

    在RRF(Reciprocal Rank Fusion)算法中**,参数 k是平滑因子**,用于控制排名对最终得分的影响程度。以下是 k=60和 k=100的核心区别:

    image.png

    示例说明

    假设两路检索结果如下:

    • 稠密向量检索 :文档A排名第1,文档B排名第5。
    • 稀疏向量检索 :文档A排名第3,文档B排名第1。

    k=60的得分计算 :

    • 文档A:1/(60+1)+1/(60+3)≈0.032
    • 文档B:1/(60+5)+1/(60+1)≈0.034 → 文档B胜出

    k=100的得分计算 :

    • 文档A:1/(100+1)+1/(100+3)≈0.020
    • 文档B:1/(100+5)+1/(100+1)≈0.019 → 文档A胜出

    可见,k=60更倾向稀疏向量检索的高排名项(文档B),而 k=100平衡了双方权重。

    nprobe=10

    功能说明
    • 作用场景 :用于Milvus/FAISS等向量数据库的近似最近邻(ANN)搜索,属于IVF(Inverted File)类索引的核心参数。

    • 定义 :nprobe控制搜索时访问的聚类中心(桶)数量。例如,若索引有1024个聚类中心(nlist=1024),nprobe=10表示仅搜索距离查询向量最近的10个聚类中心内的向量。

    • 影响 :

      • 精度 :值越大(如 nprobe=128),搜索范围越广,召回率越高,但计算量增加。
      • 性能 :值越小(如 nprobe=1),搜索速度越快,但可能遗漏相关结果。

    # 数值比较

    # 数值比较 filter = "price < 100" filter = "rating >= 4.5"

    # 字符串匹配 filter = "category == '科技'" filter = "author in ['Alice', 'Bob']"

    # 逻辑组合 filter = "price < 100 AND category == '科技'" filter = "status == 1 OR is_featured == true"  

    赞(0)
    未经允许不得转载:171主机测评 » 高级RAG检索
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址