在 LangChain 的 RetrievalQA
中,search_kwargs
是一个用于配置检索行为的参数。search_kwargs={"k": 3}
表示在检索时,向量数据库会返回与用户问题最相关的 前 3 个文档块。以下是对 search_kwargs={"k": 3}
的详细解释:
1. search_kwargs
的作用
search_kwargs
是一个字典,用于向向量数据库传递检索时的配置参数。它的具体内容取决于所使用的向量数据库(如 Milvus、Weaviate、Chroma 等),但通常包括以下常见的参数:
k
:指定返回的文档块数量。filter
:用于过滤文档块的元数据条件。score_threshold
:设置相似度分数的阈值,只返回分数高于阈值的文档块。
在 search_kwargs={"k": 3}
中,k
是核心参数,表示返回的文档块数量。
2. k=3
的含义
k=3
表示向量数据库会检索出与用户问题最相关的 3 个文档块。- 这些文档块是根据它们的嵌入向量与问题嵌入向量的相似度排序的,相似度最高的文档块会排在前面。
3. 检索过程
- 用户提出问题:例如,“关于公司法律条款的解释”。
- 生成问题的嵌入向量:使用嵌入模型(如
NomicEmbedText
)将问题转换为向量。 - 检索相关文档块:
- 向量数据库会计算问题向量与所有文档块向量的相似度。
- 返回相似度最高的前 3 个文档块。
- 处理文档块:
- 根据
chain_type
的设置(如stuff
、map_reduce
等),将检索到的文档块传递给 LLM 生成答案。
- 根据
4. 示例
假设向量数据库中存储了以下文档块:
- “公司法律条款规定…”
- “根据公司法第12条…”
- “公司法的适用范围包括…”
- “公司法的法律责任…”
- “公司法的修订历史…”
当用户提出问题时,向量数据库会返回相似度最高的 3 个文档块。例如:
- 文档块 1:相似度 0.95
- 文档块 2:相似度 0.92
- 文档块 3:相似度 0.90
这些文档块会被传递给 LLM 生成答案。
5. 调整 k
的影响
k
较小(如k=1
):- 优点:检索速度更快,生成的答案更简洁。
- 缺点:可能会遗漏一些相关信息,导致答案不完整。
k
较大(如k=10
):- 优点:可以获取更多相关信息,生成的答案更全面。
- 缺点:检索速度较慢,生成的答案可能包含冗余信息。
选择合适的 k
值需要在检索速度和答案质量之间进行权衡。
6. 结合其他参数
search_kwargs
还可以结合其他参数实现更复杂的检索逻辑。例如:
- 按元数据过滤:
表示只检索search_kwargs={"k": 3, "filter": {"category": "legal"}}
category
为legal
的文档块,并返回前 3 个。 - 设置相似度阈值:
表示只返回相似度分数高于 0.8 的文档块。search_kwargs={"k": 3, "score_threshold": 0.8}
7. 代码示例
以下是一个完整的示例,展示了如何使用 search_kwargs={"k": 3}
:
from langchain.chains import RetrievalQA
from langchain.llms import Ollama
from langchain.vectorstores import Milvus
# 设置 RAG 管道
def setup_rag_pipeline(vector_store):
llm = Ollama(model="deepseek-r1:1.5b", base_url="http://127.0.0.1:11434")
qa_pipeline = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 使用 "stuff" 处理文档块
retriever=vector_store.as_retriever(search_kwargs={"k": 3}) # 检索前 3 个相关文档块
)
return qa_pipeline
总结
search_kwargs={"k": 3}
表示检索与用户问题最相关的 3 个文档块。k
的值影响检索结果的数量和质量,需要根据实际需求进行调整。search_kwargs
还可以结合其他参数(如filter
、score_threshold
)实现更复杂的检索逻辑。