langchain `as_retriever` 方法
定义检索器应该执行的搜索类型。选项包括:: 默认选项,基于相似度的搜索。"mmr": 基于最大边际相关性(Maximal Marginal Relevance)的搜索。: 基于相似度分数阈值的搜索。传递给搜索函数的关键字参数,可能包括:k: 要返回的文档数量(默认值:4)。: 用于的最低相关性阈值。fetch_k: 传递给 MMR 算法的文档数量(默认值:20)。: MMR 返回结果的多样性;1
as_retriever 方法是一个用于将 VectorStore 对象转换为 VectorStoreRetriever 对象的便捷方法。VectorStoreRetriever 是一个检索类,用于从向量存储中查找和检索最相关的文档。这个方法接受多个可选参数来配置检索的行为。
用法介绍
参数
-
search_type (Optional[str]):
- 定义检索器应该执行的搜索类型。
- 选项包括:
"similarity": 默认选项,基于相似度的搜索。"mmr": 基于最大边际相关性(Maximal Marginal Relevance)的搜索。"similarity_score_threshold": 基于相似度分数阈值的搜索。
-
search_kwargs (Optional[Dict]):
- 传递给搜索函数的关键字参数,可能包括:
k: 要返回的文档数量(默认值:4)。score_threshold: 用于similarity_score_threshold的最低相关性阈值。fetch_k: 传递给 MMR 算法的文档数量(默认值:20)。lambda_mult: MMR 返回结果的多样性;1 为最小多样性,0 为最大多样性(默认值:0.5)。filter: 根据文档元数据进行过滤。
- 传递给搜索函数的关键字参数,可能包括:
返回值
- VectorStoreRetriever: 为
VectorStore初始化的检索器类。
示例用法
示例 1:检索更多具有较高多样性的文档
如果你的数据集中有许多相似的文档,可以使用 mmr 检索类型并调整 lambda_mult 参数以增加多样性。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 6, 'lambda_mult': 0.25}
)
示例 2:为 MMR 算法考虑更多文档,但只返回前 5 个
你可以增加 fetch_k 以让 MMR 算法考虑更多文档,但最终只返回 k 个文档。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 5, 'fetch_k': 50}
)
示例 3:仅检索相似度分数高于某个阈值的文档
如果你只想要检索相关性分数高于某个阈值的文档,可以使用 similarity_score_threshold 类型并设置 score_threshold。
retriever = docsearch.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={'score_threshold': 0.8}
)
示例 4:只获取数据集中最相似的单个文档
通过设置 k 参数为 1,可以只获取数据集中最相似的一个文档。
retriever = docsearch.as_retriever(
search_kwargs={'k': 1}
)
示例 5:使用过滤器仅检索特定论文中的文档
你可以使用过滤器参数来限制检索范围,比如只检索特定论文中的文档。
retriever = docsearch.as_retriever(
search_kwargs={'filter': {'paper_title': 'GPT-4 Technical Report'}}
)
总结
as_retriever 方法非常灵活,可以根据需要配置不同的检索策略。你可以通过调整 search_type 和 search_kwargs 参数来满足不同的检索需求。这使得 VectorStore 能够适应各种场景下的文档检索任务。
最大边际相关性(Maximal Marginal Relevance,简称 MMR)是一种用于信息检索和摘要生成的技术,其目的是在保持结果相关性的同时增加结果的多样性。MMR 方法通过在每一步选择最相关但又与已选结果不同的文档,来平衡相关性和多样性。
这三种检索选项分别代表不同的文档检索策略,每种策略都有其独特的用途和适用场景。以下是对每种检索选项的详细介绍以及举例说明:
1. similarity(相似度检索)
描述:
- 基于向量之间的余弦相似度进行搜索,这是默认选项。
- 这种方法简单直接,返回与查询最相似的文档。
适用场景:
- 当你只关心文档与查询的相似程度时,这是最常用的方法。
- 适用于需要快速获取相关文档的场景。
示例:
假设你有一组产品描述,用户输入一个查询 “智能手机”,你希望返回与 “智能手机” 最相关的产品描述。
retriever = docsearch.as_retriever(
search_type="similarity",
search_kwargs={'k': 5} # 返回前5个最相似的文档
)
2. mmr(最大边际相关性检索)
描述:
- 基于最大边际相关性(Maximal Marginal Relevance)进行搜索。
- MMR 在检索结果中平衡相关性和多样性,减少相似文档的重复。
适用场景:
- 当你的数据集中有许多相似文档时,使用 MMR 可以提高结果的多样性。
- 适用于希望返回内容不同但相关的文档的场景。
示例:
假设你有一组新闻文章,用户输入一个查询 “股票市场”,你希望返回的结果不仅相关,而且覆盖不同的方面(如不同公司的股票、不同的市场动态等)。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 5, 'lambda_mult': 0.25} # 返回5个结果,多样性权重为0.25
)
3. similarity_score_threshold(相似度分数阈值检索)
描述:
- 基于向量相似度分数进行阈值过滤,只返回相似度高于某个阈值的文档。
- 这种方法可以过滤掉不相关或相关性较低的文档。
适用场景:
- 当你需要确保返回的文档高度相关时使用这种方法。
- 适用于需要高置信度的检索结果的场景。
示例:
假设你有一组技术报告,用户输入一个查询 “机器学习”,你希望只返回与机器学习高度相关的报告,而不是所有相关性较低的报告。
retriever = docsearch.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={'score_threshold': 0.8} # 只返回相似度分数高于0.8的文档
)
总结
similarity:适合快速获取最相似文档的场景,简单直接。mmr:适合需要平衡相关性和多样性的场景,避免返回重复内容。similarity_score_threshold:适合需要高置信度、高相关性结果的场景,通过设定阈值过滤结果。
根据具体需求选择适当的检索策略,可以提高检索结果的质量和相关性。
MMR 的工作原理
MMR 的基本思想是迭代地选择一个文档,使得该文档既与查询最相关,又与已经选择的文档尽可能不同。具体步骤如下:
- 初始化:开始时,从未选择的文档集中选择与查询最相关的文档。
- 迭代选择:在后续步骤中,MMR 会在剩余文档中选择一个使得边际相关性最大的文档。边际相关性定义为文档与查询的相关性减去文档与已选文档的相似性。
MMR 的公式
MMR 的公式如下:
[ \text{MMR} = \arg\max_{D_i \in R \setminus S} \left[ \lambda \cdot \text{Sim}1(D_i, Q) - (1 - \lambda) \cdot \max{D_j \in S} \text{Sim}_2(D_i, D_j) \right] ]
其中:
- ( D_i ) 表示候选文档。
- ( R ) 表示所有候选文档的集合。
- ( S ) 表示已选择文档的集合。
- ( Q ) 表示查询。
- ( \text{Sim}_1 ) 表示文档与查询之间的相似度。
- ( \text{Sim}_2 ) 表示文档之间的相似度。
- ( \lambda ) 是一个权重参数,用于平衡相关性和多样性(通常在 0 和 1 之间)。
参数解释
- ( \lambda ):
- 当 ( \lambda ) 趋向 1 时,MMR 更加关注文档与查询的相关性。
- 当 ( \lambda ) 趋向 0 时,MMR 更加关注文档之间的多样性。
MMR 的优点
- 提高结果的多样性:MMR 可以避免返回大量相似的结果,从而提高结果的多样性。
- 保持相关性:在增加多样性的同时,MMR 仍然保持了与查询的相关性。
MMR 的应用场景
- 信息检索:在搜索引擎中,MMR 可以用来提高搜索结果的多样性,避免返回大量相似的网页。
- 摘要生成:在自动摘要生成中,MMR 可以用来选择不重复的信息段,生成更全面的摘要。
- 推荐系统:在推荐系统中,MMR 可以用来提供更多样化的推荐,避免推荐相似度过高的项目。
示例
假设你有一组新闻文章,用户输入一个查询“股票市场”,你希望返回的结果不仅相关,而且覆盖不同的方面(如不同公司的股票、不同的市场动态等)。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 5, 'lambda_mult': 0.25} # 返回5个结果,多样性权重为0.25
)
在这个示例中:
k设置为 5,表示希望返回 5 个结果。lambda_mult设置为 0.25,表示多样性的权重,这个值越接近 0,结果越多样化;越接近 1,结果越相似。
MMR 可以在保持查询结果高相关性的同时,显著增加结果的多样性,从而提供更全面和多样的检索结果。
更多推荐

所有评论(0)