You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LangChain中配置第二个检索器补充获取缺失信息?

在LangChain中实现多检索器的Fallback逻辑

要在第一个检索器无法找到有效信息时调用第二个不同文档集的检索器补充信息,但RetrievalQA没有extra_retriever参数,以下是两种可行的实现方式:


方法一:手动实现检索Fallback流程

先调用主检索器获取文档,判断是否能满足回答需求,若不能则调用备用检索器,最后将上下文传入QA链。

1. 适配Prompt模板

修改Prompt以支持主上下文和额外上下文的输入:

from langchain.prompts import PromptTemplate

template = """Use the following pieces of context to answer the question at the end. If you don't know the answer from the main context, try the extra text. If still no answer, just say you don't know—don't make one up. Keep answers to 3 sentences max, concise. Always end with "thanks for asking!".

Main Context: {main_context}
Extra Context: {extra_context}
Question: {question}
Helpful Answer:"""
QA_CHAIN_PROMPT = PromptTemplate(
    input_variables=["main_context", "extra_context", "question"],
    template=template,
)

2. 手动处理检索与QA调用

from langchain.chains import RetrievalQA

# 初始化两个检索器
main_retriever = vectordb.as_retriever()
extra_retriever = extradb.as_retriever()

# 创建QA链(不直接绑定检索器,后续手动传入上下文)
qa_chain = RetrievalQA.from_chain_type(
    llm,
    chain_type="stuff",
    chain_type_kwargs={"prompt": QA_CHAIN_PROMPT},
    return_source_documents=True
)

question = "Is probability a class topic?"

# 第一步:从主检索器获取文档
main_docs = main_retriever.get_relevant_documents(question)
main_context = "\n".join([doc.page_content for doc in main_docs])

# 判断是否需要调用备用检索器(示例:检查主检索是否返回有效文档)
use_extra = len(main_docs) == 0 or all(len(doc.page_content.strip()) < 10 for doc in main_docs)

extra_context = ""
if use_extra:
    # 第二步:从备用检索器获取文档
    extra_docs = extra_retriever.get_relevant_documents(question)
    extra_context = "\n".join([doc.page_content for doc in extra_docs])

# 执行QA推理
result = qa_chain({
    "main_context": main_context,
    "extra_context": extra_context,
    "question": question
})

print(result["result"])

方法二:使用FallbackRetriever自动处理

LangChain内置的FallbackRetriever可以将多个检索器组合,当第一个检索器返回空或不符合条件时,自动切换到下一个。

1. 初始化Fallback检索器

from langchain.retrievers import FallbackRetriever
from langchain.chains import RetrievalQA

# 配置两个检索器(可调整search_kwargs控制返回文档数量)
main_retriever = vectordb.as_retriever(search_kwargs={"k": 3})
extra_retriever = extradb.as_retriever(search_kwargs={"k": 3})

# 创建Fallback检索器:优先用main_retriever,失败则用extra_retriever
fallback_retriever = FallbackRetriever(
    retrievers=[main_retriever, extra_retriever]
    # 可选:自定义fallback触发条件,默认是返回文档数为0
    # fallback_condition=lambda docs: len(docs) == 0
)

2. 创建并调用RetrievalQA链

如果不需要区分主/额外上下文,可合并所有检索结果为单一上下文,简化Prompt:

template = """Use the following context to answer the question. If you don't know, say so—don't make up answers. Keep it concise, max 3 sentences. End with "thanks for asking!".

{context}
Question: {question}
Helpful Answer:"""
QA_CHAIN_PROMPT = PromptTemplate(
    input_variables=["context", "question"],
    template=template,
)

# 绑定Fallback检索器到RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
    llm,
    retriever=fallback_retriever,
    return_source_documents=True,
    chain_type_kwargs={"prompt": QA_CHAIN_PROMPT}
)

# 执行查询
question = "Is probability a class topic?"
result = qa_chain({"query": question})
print(result["result"])

两种方法对比

  • 方法一:灵活性高,可自定义判断是否触发Fallback的逻辑(比如基于文档相关性分数、让LLM评估主上下文是否足够回答等)。
  • 方法二:代码简洁,适合简单的“无结果则切换”场景。

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:07:03