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

Langchain RAG聊天历史实现报错:|运算符不支持method与itemgetter操作

LangChain带聊天历史的RAG实现报错解决

问题背景

在实现LangChain带聊天历史的RAG功能时,运行以下代码出现类型错误:

loaded_memory = RunnablePassthrough.assign(
    chat_history=memory.load_memory_variables | itemgetter("history"),
)

报错信息:

TypeError: unsupported operand type(s) for |: 'method' and 'operator.itemgetter'

尝试直接调用方法获取历史后,又出现新错误:

loaded_memory = RunnablePassthrough.assign(
    chat_history=itemgetter("history")(memory.load_memory_variables({}) ),
)

报错信息:

TypeError: Expected a Runnable, callable or dict.Instead got an unsupported type: <class 'list'>

错误原因

  1. 原错误:memory.load_memory_variables是方法对象,不属于LangChain的Runnable类型,无法直接用|运算符与itemgetter链式调用(|仅支持Runnable之间的组合)。
  2. 修改后的错误:直接调用memory.load_memory_variables({})返回的是聊天历史列表,而RunnablePassthrough.assign()要求赋值的是Runnable、可调用对象或字典,不能是静态值。

解决方法

将memory.load_memory_variables包装为RunnableLambda,使其成为Runnable类型,再与itemgetter链式调用(itemgetter("history")会被自动转换为Runnable,用于提取内存变量中的history字段)。

完整修正代码:

from operator import itemgetter
from langchain.memory import ConversationBufferMemory
from langchain.schema.runnable import RunnablePassthrough, RunnableLambda

memory = ConversationBufferMemory(return_messages=True, output_key="answer", input_key="question")

# 将load_memory_variables方法包装为RunnableLambda,支持链式调用
loaded_memory = RunnablePassthrough.assign(
    chat_history=RunnableLambda(memory.load_memory_variables) | itemgetter("history"),
)

补充说明

  • RunnableLambda的作用是将普通函数/方法包装为LangChain的Runnable,使其支持链式调用操作。
  • 链式调用|会把前一个Runnable的输出作为后一个Runnable的输入,这里即先加载内存变量,再从中提取history字段作为chat_history的值。

内容的提问来源于stack exchange,提问作者David Scott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:05:01