使用ConversationalRetrievalChain构建对话机器人遇报错:为何需传入chat_history?
问题原因及解决办法
核心原因
ConversationalRetrievalChain的memory参数主要负责持久化存储对话历史,但它不会自动将历史数据注入到提示模板的输入变量中。如果你的提示模板里声明了chat_history这个变量,调用链时就必须确保这个变量有值——要么手动传入,要么让链从memory中自动读取(需要正确配置memory的键和提示模板变量名一致)。
常见错误场景及解决
提示模板变量名与memory键不匹配
比如你初始化memory时用了默认键(ConversationBufferMemory默认键是history),但提示模板里写的是{chat_history},链找不到对应的值就会报错。
解决:统一变量名,初始化memory时指定memory_key="chat_history":from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory( memory_key="chat_history", return_messages=True, output_key="answer" # 若链的输出键为answer,需指定避免冲突 )同时提示模板保持
{chat_history},链会自动从memory中读取历史填充。调用链的方式不正确
直接用chain({"question": "你的问题"})调用,未让链自动从memory中获取历史会报错。正确做法有两种:- 使用
predict方法(自动读取memory中的历史):response = chain.predict(question="你的问题") - 手动从memory读取历史后传入:
chat_history = memory.load_memory_variables({})["chat_history"] response = chain({"question": "你的问题", "chat_history": chat_history})
- 使用
链的配置遗漏关键参数
初始化ConversationalRetrievalChain时,需确保指定return_source_documents=False(不需要返回源文档时),或正确设置output_key避免memory存储键冲突:from langchain.chains import ConversationalRetrievalChain from langchain.llms import OpenAI chain = ConversationalRetrievalChain.from_llm( llm=OpenAI(), retriever=your_retriever, memory=memory, return_source_documents=False )
内容的提问来源于stack exchange,提问作者karwi
相关产品推荐
相关产品推荐

