精通LangGraph-状态管理-01

文摘   2025-01-20 12:15   四川  
使用Pydantic model作为state
之前我们使用最多的可能是TypedDict,但是Pydantic model也是一个很好的选择,下面看一下这个类型如何作为graph state吧。
输入校验
from langgraph.graph import StateGraph, START, ENDfrom typing_extensions import TypedDict
from pydantic import BaseModel

# 图的整体状态(这是节点之间共享的公共状态)class OverallState(BaseModel):    a: str

def node(state: OverallState):    return {"a""再见"}

# 构建状态图builder = StateGraph(OverallState)builder.add_node(node)  # node_1 是第一个节点builder.add_edge(START, "node")  # 以 node_1 开始图builder.add_edge("node", END)  # 在 node_1 之后结束图graph = builder.compile()
# 使用有效输入测试图graph.invoke({"a""你好"})
我们在OverallState的时候继承了BaseModel,并且a的属性定义为str类型,如果我们输入是正确的,它会输出:
{'a''再见'}
如果我们这样:
try:    graph.invoke({"a": 123})  # Should be a stringexcept Exception as e:    print("An exception was raised because `a` is an integer rather than a string.")    print(e)
An exception was raised because `a` is an integer rather than a string.1 validation error for OverallStatea  Input should be a valid string [type=string_type, input_value=123, input_type=int]    For further information visit https://errors.pydantic.dev/2.10/v/string_type
可以看到,它起到了一种input的校验作用。
多node
运行时验证也适用于多节点图。在下面的示例中,bad_node 将 a 更新为integer。
因为运行时验证发生在输入上,所以在调用 ok_node 时会发生验证错误(而不是在 bad_node 返回与模式不一致的状态更新时)。
from langgraph.graph import StateGraph, START, ENDfrom typing_extensions import TypedDict
from pydantic import BaseModel

# 图的整体状态(这是节点之间共享的公共状态)class OverallState(BaseModel):    a: str

def bad_node(state: OverallState):    return {        "a"123  # 无效    }

def ok_node(state: OverallState):    return {"a""goodbye"}

# 构建状态图builder = StateGraph(OverallState)builder.add_node(bad_node)builder.add_node(ok_node)builder.add_edge(START, "bad_node")builder.add_edge("bad_node""ok_node")builder.add_edge("ok_node", END)graph = builder.compile()
# 使用有效输入测试图try:    graph.invoke({"a""hello"})except Exception as e:    print("由于 bad_node 将 `a` 设置为整数,引发了异常。")    print(e)
注意,他会在转换的时候就会报错,而不是去update的时候发现类型不对才去报错。

半夏决明
读书,摄影,随笔
 最新文章