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

Langchain中BufferMemory结合ChatPromptTemplate无法运行问题排查

问题原因及解决办法

这个报错message._getType is not a function本质是自定义ChatPromptTemplate和RedisChatMessageHistory返回的消息格式不兼容——移除Prompt后,BufferMemory和ConversationChain用默认模板能自动适配消息类型;加了自定义模板后,错误的模板结构破坏了适配逻辑,具体原因和解决办法如下:

核心原因

  1. 自定义Prompt里错误用普通字符串变量(比如{history})接收历史消息,但BufferMemory结合RedisChatMessageHistory返回的是Message对象列表,不是纯文本字符串。模板渲染时试图解析这些对象,触发了不存在的_getType方法。
  2. 没有使用LangChain专门的MessagesPlaceholder占位历史消息,导致消息对象无法被正确识别和格式化。

解决步骤

1. 修正ChatPromptTemplate的定义

必须用MessagesPlaceholder替代普通的{history}变量,让模板能正确处理Message对象列表:

from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder

# 正确模板结构:系统消息 + 历史消息占位符 + 用户输入
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是专业对话助手,结合历史对话和当前问题给出回答"),
    MessagesPlaceholder(variable_name="history"),  # 用占位符接收历史消息
    ("human", "{input}")
])

2. 确保BufferMemory配置正确

开启return_messages=True,让BufferMemory返回Message对象列表(而非字符串),同时保证memory_key和Prompt里的变量名一致:

from langchain.memory import BufferMemory
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory.chat_message_histories import RedisChatMessageHistory

# 初始化Redis消息历史
history = RedisChatMessageHistory(redis_url="redis://localhost:6379", session_id="your-session-id")
# 配置BufferMemory:指定chat_memory、memory_key和return_messages=True
memory = BufferMemory(chat_memory=history, memory_key="history", return_messages=True)

# 初始化LLM和对话链
llm = ChatOpenAI(temperature=0)
chain = ConversationChain(llm=llm, memory=memory, prompt=prompt)

3. 清理Redis旧数据(可选)

如果之前Redis里存过格式不兼容的历史消息,可能导致后续解析出错,执行Redis命令清理对应session的数据:

redis-cli DEL "message_store:your-session-id"

内容的提问来源于stack exchange,提问作者Guy Nesher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:08:09