LangChain对话检索链中language变量报KeyError问题求助
解决LangChain对话检索链中
language变量的KeyError问题 核心原因
KeyError: 'language'意味着链在执行过程中无法找到名为language的输入变量,通常是变量未正确传递到链的某个环节导致。以下是针对性修复方案:
1. 调用链时必须显式传入language
确保调用invoke()/run()方法时,参数字典包含language键:
# 错误示例:缺少language参数 chain.invoke({"question": "如何安装Python?", "chat_history": []}) # 正确示例:传入language变量 chain.invoke({"question": "如何安装Python?", "chat_history": [], "language": "zh-CN"})
2. 确保Prompt模板正确声明language变量
定义Prompt时必须将language加入input_variables列表,模板中使用{language}占位符:
from langchain.prompts import PromptTemplate prompt = PromptTemplate( input_variables=["question", "context", "language"], template="请用{language}回答问题:{question}\n参考上下文:{context}" )
3. 对话检索链需显式传递额外变量到子链
使用ConversationalRetrievalChain时,默认仅传递question和chat_history到子链,需通过chain_type_kwargs指定额外变量:
from langchain.chains import ConversationalRetrievalChain from langchain.chains.question_answering import load_qa_chain # 构建QA子链并关联自定义prompt qa_chain = load_qa_chain(llm, chain_type="stuff", prompt=prompt) # 构建对话检索链时,确保变量传递到子链 retrieval_chain = ConversationalRetrievalChain.from_llm( llm=llm, retriever=vectorstore.as_retriever(), combine_docs_chain=qa_chain, # 显式声明子链需要的所有输入变量 chain_type_kwargs={"input_variables": ["question", "context", "language"]} )
4. 避免记忆组件过滤language变量
如果使用记忆组件,不要将language存入记忆(除非需要),调用时作为独立参数传入即可:
# 从记忆中获取对话历史 chat_history = memory.load_memory_variables({})["chat_history"] # 调用链时传入language变量 response = retrieval_chain.invoke({ "question": "你的问题", "chat_history": chat_history, "language": "en-US" })
快速排查方法
开启LangChain的调试模式,查看变量在链各环节的传递情况:
retrieval_chain = ConversationalRetrievalChain.from_llm( llm=llm, retriever=vectorstore.as_retriever(), combine_docs_chain=qa_chain, debug=True # 开启调试,输出变量流动详情 )
内容的提问来源于stack exchange,提问作者Faiq Aslam
相关产品推荐
相关产品推荐

