LangChain中提供的检索方法

在 LangChain 中,提供了多种检索方法以用于不同的场景

  • 合适的相似度度量 (similarity_search,带分数)。
  • 优化结果多样性 (MMR)。
  • 提高召回率 (MultiQueryRetriever)。
  • 控制上下文长度 (ContextualCompressionRetriever)。
  • 处理复杂查询 (SelfQueryRetriever)。
  • 实现智能知识库路由 (路由器)。
1. 基于相似度 (Similarity-Based Retrieval)

通过计算查询向量与向量存储中所有文档向量之间的距离相似度,然后返回最相似(距离最近)的文档。

  • 余弦相似度 (Cosine Similarity)
    • 原理: 衡量两个向量方向上的一致性,夹角越小,相似度越高。结果范围通常在 -1 (完全相反) 到 1 (完全相同) 之间。在文本嵌入领域,通常结果为 0 到 1,越接近 1 越相似。
    • 特点: 计算效率高,广泛应用于文本相似度计算。是大多数向量数据库的默认或核心相似度度量。
    • LangChain 中体现: 当你调用 vectorstore.similarity_search(query)vectorstore.as_retriever() 时,底层默认通常就是使用余弦相似度(或欧氏距离、点积等,取决于具体的向量存储和配置)。
  • 带分数的相似度搜索 (Similarity Search with Score)
    • 原理: 除了返回相关文档,还会返回每个文档与查询之间的相似度得分。这个分数可以直接用于量化相关性。
    • 特点: 允许你根据阈值筛选结果(例如,只返回相似度得分高于 0.7 的文档),或者在多个文档中进行更精细的排序。
    • LangChain 中体现: 调用 vectorstore.similarity_search_with_score(query) 方法。

2. 平衡相关性与多样性 (Diversity-Aware Retrieval)

仅仅返回最相似的文档有时会导致结果过于集中在某个主题的狭窄范围内,缺乏广度。为了解决这个问题,LangChain 提供了旨在平衡相关性和多样性的方法。(不仅相关,而且多样)

  • 最大边际相关性 (Maximum Marginal Relevance, MMR)

    • 原理: MMR 算法在检索过程中,不仅考虑文档与查询的相关性,还考虑文档与已选文档之间的不相似性。它每次选择一个与查询高度相关,但与已选文档尽可能不重复的文档。

    • 特点: 有效避免返回大量高度相似的重复信息,确保返回结果的覆盖面更广。在需要全面了解某个主题时非常有用。

    • LangChain 中体现: 调用 vectorstore.max_marginal_relevance_search(query) 或将检索器的 search_type 设置为 'mmr'

      retriever = vectorstore.as_retriever(search_type="mmr", search_kwargs={"k": 4, "fetch_k": 10})
      # k: 返回多少个文档;fetch_k: 首先检索多少个最相似的文档,然后从中应用 MMR 进行多样性筛选
      

3. 增强或优化检索策略 (Enhanced Retrieval Strategies)

在基础相似度搜索之上,增加了额外的逻辑或步骤来提高检索效果。

  • 多查询检索 (Multi-Query Retriever)

    • 原理: 对于一个用户的原始查询,它会使用一个 LLM 生成多个语义上相似但表述不同的子查询。然后,对这些子查询并行执行基础的相似度搜索,并将所有结果合并去重。

    • 特点: 显著提高召回率(找到所有相关文档的概率),因为不同的查询可能触及到向量空间中不同的相关区域。适用于用户查询可能模棱两可或有多种解释的场景。

    • LangChain 中体现: 使用 MultiQueryRetriever 类。

      # 示例
      from langchain.retrievers import MultiQueryRetriever
      retriever = MultiQueryRetriever.from_llm(retriever=base_retriever, llm=llm)
      
  • 上下文压缩检索 (Contextual Compression Retriever)

    • 原理: 首先,基础检索器(例如 VectorStoreRetriever)会检索出较多的相关文档。然后,一个“文档压缩器”会在将文档传递给 LLM 之前,对这些文档进行二次筛选和/或摘要,只保留其中与查询最相关的信息。

    • 特点: 有效地减少了传递给 LLM 的上下文令牌数量,降低成本,并确保 LLM 只关注最重要的信息,提高生成质量。

    • LangChain 中体现: 使用 ContextualCompressionRetriever 类结合一个 BaseDocumentCompressor (例如 LLMChainExtractorLLMChainFilter)。

      # 示例
      from langchain.retrievers import ContextualCompressionRetriever
      from langchain.retrievers.document_compressors import LLMChainExtractor
      compressor = LLMChainExtractor.from_llm(llm)
      compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=base_retriever)
      
  • 父文档检索器 (Parent Document Retriever)

    • 原理: 这是一种分层检索方法。在嵌入和检索时使用较小的子文档块(例如句子或小段落),但在将结果传递给 LLM 时,返回包含这些子文档的更大“父文档”
    • 特点: 解决了“小块不足以提供上下文,大块嵌入效果差”的问题。小块用于精确检索,大块用于提供丰富的上下文。
    • LangChain 中体现: 使用 ParentDocumentRetriever 类。
  • 时间加权向量存储检索 (Time-Weighted Vector Store Retriever)

    • 原理: 在传统的相似度搜索基础上,引入时间因素。它会优先返回与查询最相关且时间上更新近的文档。
    • 特点: 对于需要处理时间敏感信息(如新闻、日志、实时更新)的 RAG 应用非常有用。
    • LangChain 中体现: 某些支持时间加权的向量存储(如 Weaviate),或自定义的检索逻辑。
  • 基于代理的检索 (Agentic Retrieval / Self-Querying Retriever)

    • 原理: 允许 LLM 自己生成结构化的查询,以从向量存储中提取特定信息。LLM 会理解用户的复杂查询,并将其转换为向量数据库能够理解的过滤条件和搜索条件。

    • 特点: 处理更复杂的查询,例如“找到关于人工智能,但排除机器学习的文档,并且文档发布于2023年之后。”

    • LangChain 中体现: 使用 SelfQueryRetriever 类。

      # 示例
      from langchain.chains.query_constructor.base import AttributeInfo
      from langchain.retrievers import SelfQueryRetriever
      metadata_field_info = [
          AttributeInfo(name="source", description="文档来源", type="string"),
          AttributeInfo(name="date", description="发布日期", type="string"),
      ]
      retriever = SelfQueryRetriever.from_llm(
          llm, vectorstore, "关于文档的主题。", metadata_field_info, verbose=True
      )
      

4. 路由与选择 (Routing and Selection)

由于LangChain的特性,因此可以设计一种路由选择检索,主要就是由 LCEL 组合 RunnableLambda 和条件逻辑来实现

  • 语义路由器 (Semantic Router / Multi-Retriever Router)
    • 原理: 当存在多个不同类型或针对不同主题的检索器时,使用一个 LLM 或其他分类模型来根据用户查询的语义,动态地选择最合适的检索器
    • 特点: 实现了更智能的知识库管理。例如,你的应用可能有一个用于代码文档的检索器,一个用于产品手册的检索器,以及一个用于通用知识的检索器。路由器可以智能地决定使用哪一个。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值