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'>
错误原因
- 原错误:
memory.load_memory_variables是方法对象,不属于LangChain的Runnable类型,无法直接用|运算符与itemgetter链式调用(|仅支持Runnable之间的组合)。 - 修改后的错误:直接调用
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
相关产品推荐
相关产品推荐

