LangChain Agent存储Intermediate Steps至内存遇Pydantic类型错误求助
解决方案
问题核心是intermediate_steps返回的是包含工具调用与响应的列表结构,而ConversationBufferMemory默认会将其直接赋值给AIMessage的content字段,但该字段要求必须是字符串类型。以下是无需修改LangChain源码的解决办法:
方法1:自定义对话内存类,自动序列化intermediate_steps
继承ConversationBufferMemory并重写save_context方法,将intermediate_steps序列化为JSON字符串后再存入内存:
import json from langchain.memory import ConversationBufferMemory class CustomConversationBufferMemory(ConversationBufferMemory): def save_context(self, inputs: dict, outputs: dict) -> None: # 检查outputs中是否包含intermediate_steps if "intermediate_steps" in outputs: # 将intermediate_steps序列化为JSON字符串 outputs["intermediate_steps"] = json.dumps(outputs["intermediate_steps"]) # 调用父类的save_context完成后续存储 super().save_context(inputs, outputs)
用这个自定义类初始化内存:
memory = CustomConversationBufferMemory(output_key="intermediate_steps", return_messages=True)
方法2:手动处理Agent结果后存入内存
如果不想自定义内存类,可以在Agent运行后,手动将intermediate_steps转为字符串,再调用内存的save_context方法:
# 运行Agent获取结果 result = agent1({"input": "你的用户请求"}) # 将intermediate_steps转为JSON字符串 intermediate_str = json.dumps(result["intermediate_steps"]) # 手动保存到内存 memory.save_context( inputs={"input": result["input"]}, outputs={"intermediate_steps": intermediate_str} )
说明
- 方法1更自动化,适合需要Agent自动管理内存的场景,后续从内存中读取时,可通过
json.loads()将字符串还原为原结构。 - 方法2需要手动干预结果存储,适合对内存存储逻辑有更灵活控制的场景。
内容的提问来源于stack exchange,提问作者user18148705
相关产品推荐
相关产品推荐

