gorollcri 2025-06-20 11:13 采纳率: 100%
浏览 6
已结题

langgraph项目问题集求解答

  1. 工具间传递参数怎么保持数据的类型不变?目前遇到了工具return一个数据,在message里传递给llm再传回下一个工具时,数据类型被强制转换成string了。而我需要原数据类型来保证工具的连续调用工作(ReAct)

2.至今天我还没有做多轮对话记忆,每一次human发言都是一次全新的对话。langgraph有直接的接口启动多轮记忆吗?还是说需要我自己用持久化存储实现

3.续2,我观察到invoke返回的message极其巨量,加上工具调用一轮简单对话就能用到800-1000token,这对吗?还是说我漏了什么处理

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-06-20 11:13
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你遇到的问题是,在使用 LangGraph 项目时,工具之间传递参数时,数据类型被强制转换成字符串,这导致了工具的连续调用不稳定。

    解决方案:

    1. 使用 jsonable_encoder 将数据转换为 JSON 可以序列化的格式,然后在传递参数时使用 json 模块将其转换为字符串。
    import json
    
    def encode_data(data):
        return json.dumps(data, cls=JSONEncoder)
    
    def decode_data(data):
        return json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
    
    1. 使用 pickle 模块将数据序列化,然后在传递参数时使用 pickle 模块将其反序列化。
    import pickle
    
    def serialize_data(data):
        return pickle.dumps(data)
    
    def deserialize_data(data):
        return pickle.loads(data)
    
    1. 使用 msgpack 模块将数据序列化,然后在传递参数时使用 msgpack 模块将其反序列化。
    import msgpack
    
    def serialize_data(data):
        return msgpack.packb(data)
    
    def deserialize_data(data):
        return msgpack.unpackb(data)
    
    1. 使用 avro 模块将数据序列化,然后在传递参数时使用 avro 模块将其反序列化。
    import avro
    
    def serialize_data(data):
        return avro.dumps(data)
    
    def deserialize_data(data):
        return avro.loads(data)
    
    1. 使用 protobuf 模块将数据序列化,然后在传递参数时使用 protobuf 模块将其反序列化。
    import protobuf
    
    def serialize_data(data):
        return protobuf.encode(data)
    
    def deserialize_data(data):
        return protobuf.decode(data)
    

    这些方法都可以解决数据类型转换的问题,但是需要根据具体情况选择合适的方法。

    代码示例

    以下是一个使用 jsonable_encoderjson 模块将数据转换为 JSON 可以序列化的格式的示例代码:

    import json
    from typing import Any
    
    class JSONEncoder(json.JSONEncoder):
        def default(self, obj: Any) -> Any:
            if hasattr(obj, '__dict__'):
                return obj.__dict__
            return super().default(obj)
    
    def encode_data(data: Any) -> str:
        return json.dumps(data, cls=JSONEncoder)
    
    def decode_data(data: str) -> Any:
        return json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
    

    结论

    使用 LangGraph 项目时,工具之间传递参数时,数据类型被强制转换成字符串,这导致了工具的连续调用不稳定。可以使用 jsonable_encoderpicklemsgpackavroprotobuf 模块将数据序列化,然后在传递参数时使用相应的模块将其反序列化,以保持数据的类型不变。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月28日
  • 已采纳回答 6月20日
  • 创建了问题 6月20日