链式调用LLMs时出现KeyError: 'analysis'的原因排查
错误原因分析
你的KeyError: 'analysis'大概率是因为链的上下文传递逻辑出错,具体有两种核心可能:
情况1:错误发生在搜索工具调用阶段
如果extract_chain的执行没有正确生成包含analysis键的上下文。比如extract_chain期望接收字典格式的输入(比如包含query键),但你调用链时传入的是纯字符串查询,导致{"analysis": extract_chain}这个RunnableMap步骤无法生成预期的{"analysis": 结果}字典,后续lambda访问x["analysis"]自然找不到键。情况2:错误发生在最终的
search_chain执行阶段
这是更常见的原因:你第二个步骤用了{"search_results": lambda x: search_tool.run(x["analysis"])}这种RunnableMap结构,它的输出只会保留search_results这一个键,之前的analysis键会被丢弃。而search_chain的search_prompt大概率需要同时使用analysis(拆解后的子查询)和search_results(搜索结果)两个变量,此时上下文里没有analysis,就会触发KeyError。
解决方法
方法1:使用RunnablePassthrough.assign保留上下文
assign方法会在原有上下文基础上添加新键,不会丢弃之前的内容:
from langchain_core.runnables import RunnablePassthrough search_tool = DuckDuckGoSearchRun() extract_chain = ( extract_prompt | llm | StrOutputParser() ) search_chain = ( search_prompt | llm | StrOutputParser() ) # 用assign逐步添加键,保留所有上下文 chain = RunnablePassthrough.assign(analysis=extract_chain) | RunnablePassthrough.assign(search_results=lambda x: search_tool.run(x["analysis"])) | search_chain
方法2:显式保留analysis键
在第二个RunnableMap中同时声明analysis和search_results,确保两个键都传递到后续链:
chain = {"analysis" : extract_chain} | {"analysis": lambda x: x["analysis"], "search_results": lambda x: search_tool.run(x["analysis"])} | search_chain
内容的提问来源于stack exchange,提问作者Q_Q_
相关产品推荐
相关产品推荐

