LangChain MultiPromptChain路由输入报错:缺失query输入键问题
问题修复方案
核心原因
RetrievalQA链默认要求输入键为query,但你的CustomMultiPromptChain在路由时直接将原始输入的input键传递给目标链,导致目标链找不到必填的query参数,触发报错。
修复方法(二选一即可)
方法1:修改RetrievalQA的输入键为input
在创建RetrievalQA实例时,显式指定input_key参数为input,让目标链直接接受input作为输入键,无需额外转换:
destination_chains = {} for p_info in prompt_infos: name = p_info["name"] chain_kwargs = p_info["kwargs"] # 添加input_key参数,将输入键设置为input chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-4"), chain_type="stuff", retriever=retriever, chain_type_kwargs=chain_kwargs, input_key="input" ) destination_chains[name] = chain
方法2:在CustomMultiPromptChain中添加输入键转换逻辑
重写CustomMultiPromptChain的_call方法,将输入的input键转换为目标链需要的query键,再传递给目标链:
from typing import Dict, Any, Optional from langchain.callbacks.manager import CallbackManagerForChainRun class CustomMultiPromptChain(MultiRouteChain): destination_chains: Mapping[str, Chain] """Map of name to candidate chains that inputs can be routed to. Not restricted to LLM""" def _call( self, inputs: Dict[str, Any], run_manager: Optional[CallbackManagerForChainRun] = None, ) -> Dict[str, Any]: # 执行路由逻辑,获取目标链名称 route_result = self.router_chain.run( inputs, callbacks=run_manager.get_child() if run_manager else None ) # 选择对应的目标链(无匹配则用默认链) destination_chain = self.destination_chains.get(route_result, self.default_chain) # 将input键转换为query键,适配RetrievalQA的输入要求 adjusted_inputs = {"query": inputs["input"]} # 运行目标链并返回结果 return destination_chain( adjusted_inputs, callbacks=run_manager.get_child() if run_manager else None )
验证说明
两种方法都能解决输入键不匹配的问题:
- 方法1更直接,通过修改目标链的输入要求适配当前路由逻辑;
- 方法2更灵活,适合无法修改目标链配置的场景,在路由层完成键转换。
内容的提问来源于stack exchange,提问作者Divya Nautiyal
相关产品推荐
相关产品推荐

