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
: 根据文档元数据进行过滤。VectorStore
初始化的检索器类。如果你的数据集中有许多相似的文档,可以使用 mmr
检索类型并调整 lambda_mult
参数以增加多样性。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 6, 'lambda_mult': 0.25}
)
你可以增加 fetch_k
以让 MMR 算法考虑更多文档,但最终只返回 k
个文档。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 5, 'fetch_k': 50}
)
如果你只想要检索相关性分数高于某个阈值的文档,可以使用 similarity_score_threshold
类型并设置 score_threshold
。
retriever = docsearch.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={'score_threshold': 0.8}
)
通过设置 k
参数为 1,可以只获取数据集中最相似的一个文档。
retriever = docsearch.as_retriever(
search_kwargs={'k': 1}
)
你可以使用过滤器参数来限制检索范围,比如只检索特定论文中的文档。
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 方法通过在每一步选择最相关但又与已选结果不同的文档,来平衡相关性和多样性。
这三种检索选项分别代表不同的文档检索策略,每种策略都有其独特的用途和适用场景。以下是对每种检索选项的详细介绍以及举例说明:
similarity
(相似度检索)描述:
适用场景:
示例:
假设你有一组产品描述,用户输入一个查询 “智能手机”,你希望返回与 “智能手机” 最相关的产品描述。
retriever = docsearch.as_retriever(
search_type="similarity",
search_kwargs={'k': 5} # 返回前5个最相似的文档
)
mmr
(最大边际相关性检索)描述:
适用场景:
示例:
假设你有一组新闻文章,用户输入一个查询 “股票市场”,你希望返回的结果不仅相关,而且覆盖不同的方面(如不同公司的股票、不同的市场动态等)。
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k': 5, 'lambda_mult': 0.25} # 返回5个结果,多样性权重为0.25
)
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 的公式如下:
[ \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] ]
其中:
假设你有一组新闻文章,用户输入一个查询“股票市场”,你希望返回的结果不仅相关,而且覆盖不同的方面(如不同公司的股票、不同的市场动态等)。
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 可以在保持查询结果高相关性的同时,显著增加结果的多样性,从而提供更全面和多样的检索结果。