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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:35:06