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

使用ConversationalRetrievalChain构建对话机器人遇报错:为何需传入chat_history?

问题原因及解决办法

核心原因

ConversationalRetrievalChain的memory参数主要负责持久化存储对话历史,但它不会自动将历史数据注入到提示模板的输入变量中。如果你的提示模板里声明了chat_history这个变量,调用链时就必须确保这个变量有值——要么手动传入,要么让链从memory中自动读取(需要正确配置memory的键和提示模板变量名一致)。

常见错误场景及解决

  1. 提示模板变量名与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中读取历史填充。

  2. 调用链的方式不正确
    直接用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})
      
  3. 链的配置遗漏关键参数
    初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:40:09