在LangGraph的世界里,状态更新是一个关键环节,它决定了图结构的动态变化。为了让状态管理更加清晰和有序,我们可以选择TypedDict、Pydantic模型或dataclass来定义状态。本文将详细探讨这些方法的定义和更新细节,并通过生动的例子展示它们的魅力。
首先,让我们来看看TypedDict。它是Python中的一种类型,用于表示字典结构,并能指定字典中每个键的类型。通过TypedDict,我们可以精确地定义状态的结构,使得状态管理更加直观和可控。
from typing import TypedDict
class State(TypedDict):
name: str
age: int
active: bool
state = {"name": "Alice", "age": 30, "active": True}
print(state)
接下来,我们谈谈Pydantic。这是一个非常强大的数据验证和解析库,可以将数据转换成Pydantic模型实例,并进行类型检查和验证。
from pydantic import BaseModel
class State(BaseModel):
name: str
age: int
active: bool
state = State(name="Bob", age=25, active=False)
print(state)
最后,我们来看看dataclass。它是Python 3.7引入的标准库,提供了一种简单的方式来定义类,并自动生成常用的方法(如init、repr等)。
from dataclasses import dataclass
@dataclass
class State:
name: str
age: int
active: bool
state = State(name="Charlie", age=40, active=True)
print(state)
在LangGraph中,默认情况下,图的输入和输出结构将是相同的,且状态决定了该结构。我们可以通过定义一个简单的State例子来进一步理解这一点:
from langchain_core.messages import AnyMessage
from typing_extensions import TypedDict
class State(TypedDict):
messages: List[AnyMessage]
extra_field: int
def node(state: State):
messages = state["messages"]
new_message = AnyMessage("Hello!")
return {"messages": messages + [new_message], "extra_field": 10}
graph_builder = StateGraph(State)
graph_builder.add_node(node)
graph_builder.set_entry_point("node")
graph = graph_builder.compile()
result = graph.invoke({"messages": [HumanMessage("Hi")]})
for message in result["messages"]:
message.pretty_print()
通过上述例子,我们可以看到,使用图来调用状态更新是非常方便的。为了处理状态中的每个键的独立更新,我们可以使用reducer函数。对于TypedDict状态架构,我们可以通过在状态的相应字段上使用reducer函数注解来定义reducers。
from typing_extensions import Annotated
from langgraph.graph.message import add_messages
class State(TypedDict):
messages: Annotated[List[AnyMessage], add_messages]
extra_field: int
def node(state: State):
new_message = AnyMessage("Hello!")
return {"messages": [new_message], "extra_field": 10}
graph = StateGraph(State).add_node(node).set_entry_point("node").compile()
result = graph.invoke({"messages": [HumanMessage("Hi")]})
for message in result["messages"]:
message.pretty_print()
LangGraph还包含了一个内置的reducer add_messages,它处理了这些考虑事项:
from langgraph.graph.message import add_messages
class State(TypedDict):
messages: Annotated[List[AnyMessage], add_messages]
extra_field: int
def node(state: State):
new_message = AnyMessage("Hello!")
return {"messages": [new_message], "extra_field": 10}
graph = StateGraph(State).add_node(node).set_entry_point("node").compile()
input_message = {"role": "user", "content": "Hi"}
result = graph.invoke({"messages": [input_message]})
for message in result["messages"]:
message.pretty_print()
通过这些生动的例子,我们可以看到LangGraph在状态更新方面的强大功能和灵活性。无论是TypedDict、Pydantic还是dataclass,LangGraph都能为我们提供清晰、直观的状态管理方案。希望本文能帮助大家更好地理解和应用LangGraph的状态更新机制。
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
Copyright 2005-2024 yuanmayuan.com 【源码园】 版权所有 备案信息
声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告