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

链式调用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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:44:51