【LangGraph】Graph Definitions(图定义):StateGraph、CompiledStateGraph 和 add_messages

LangGraph 图定义

LangGraph 是一个强大的框架,用于构建需要状态管理的复杂 LLM(大型语言模型)工作流。以下内容参考 LangGraph 官方文档中的 Graph Definitions 部分,涵盖了 StateGraphCompiledStateGraphadd_messages 函数的详细描述。内容以清晰的结构呈现,适合开发者学习和理解 LangGraph。

1. 类 StateGraph

继承自: Graph

描述:
StateGraph 是一个图,其节点通过读写共享状态进行通信。每个节点的签名是 State -> Partial,即接收状态并返回部分更新。状态的每个键可以选择性地使用 reducer 函数来聚合同一键的多个更新值,reducer 函数的签名是 (Value, Value) -> Value

1.1 参数

名称类型描述默认值
state_schemaOptional[type[Any]]定义状态的 schema 类。None
config_schemaOptional[type[Any]]定义配置的 schema 类,用于在 API 中暴露可配置参数。None

1.2 示例

以下示例展示如何使用 StateGraph 创建一个简单的图,计算逻辑斯蒂映射序列:

from langchain_core.runnables import RunnableConfig
from typing_extensions import Annotated, TypedDict
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph

# 定义 reducer 函数,用于合并状态值
def reducer(a: list, b: int | None) -> list:
    if b is not None:
        return a + [b]  # 如果 b 不为空,则追加到列表 a 中
    return a

# 定义状态类
class State(TypedDict):
    x: Annotated[list, reducer]  # x 是一个列表,使用 reducer 函数注解

# 定义配置 schema
class ConfigSchema(TypedDict):
    r: float  # 配置参数 r,类型为浮点数

# 创建 StateGraph 实例
graph = StateGraph(State, config_schema=ConfigSchema)

# 定义节点函数
def node(state: State, config: RunnableConfig) -> dict:
    r = config["configurable"].get("r", 1.0)  # 获取配置中的 r,默认为 1.0
    x = state["x"][-1]  # 获取状态中 x 的最后一个值
    next_value = x * r * (1 - x)  # 计算逻辑斯蒂映射的下一个值
    return {"x": next_value}  # 返回更新后的状态

# 添加节点并设置入口和出口
graph.add_node("A", node)  # 添加名为 "A" 的节点
graph.set_entry_point("A")  # 设置入口点为 "A"
graph.set_finish_point("A")  # 设置结束点为 "A"

# 编译图
compiled = graph.compile()

# 打印配置规格
print(compiled.config_specs)
# 输出: [ConfigurableFieldSpec(id='r', annotation=<class 'float'>, name=None, description=None, default=None, is_shared=False, dependencies=None)]

# 调用图并传入初始状态和配置
step1 = compiled.invoke({"x": [0.5]}, {"configurable": {"r": 3.0}})
# 输出: {'x': [0.5, 0.75]}

1.3 方法

名称描述
add_node向状态图中添加一个新节点。
add_edge从起始节点(或起始节点列表)到结束节点添加一个有向边。
add_conditional_edges从起始节点到任意数量的目标节点添加一个条件边。
add_sequence添加一个按提供顺序执行的节点序列。
compile将状态图编译为 CompiledStateGraph 对象。
1.3.1 方法 add_node
add_node(
    node: Union[str, RunnableLike],
    action: Optional[RunnableLike] = None,
    *,
    defer: bool = False,
    metadata: Optional[dict[str, Any]] = None,
    input: Optional[type[Any]] = None,
    retry: Optional[Union[RetryPolicy, Sequence[RetryPolicy]]] = None,
    cache_policy: Optional[CachePolicy] = None,
    destinations: Optional[Union[dict[str, str], tuple[str, ...]]] = None
) -> Self

描述:
向状态图中添加一个新节点。

参数:

名称类型描述默认值
nodeUnion[str, RunnableLike]这个节点将运行的函数或 runnable。如果提供的是字符串,它将被用作节点名称,action 将被用作函数或 runnable必填
actionOptional[RunnableLike]与节点关联的动作。如果 node 是字符串,则用作节点函数或 runnableNone
deferbool是否推迟节点的执行,直到运行即将结束。False
metadataOptional[dict[str, Any]]与节点关联的元数据。None
inputOptional[type[Any]]节点的输入 schema,默认使用图的输入 schema。None
retryOptional[Union[RetryPolicy, Sequence[RetryPolicy]]]节点的重试策略。如果提供的是序列,将应用第一个匹配的策略。None
cache_policyOptional[CachePolicy]节点的缓存策略。None
destinationsOptional[Union[dict[str, str], tuple[str, ...]]]指示节点可以路由到的目标,用于无边图的渲染,不影响执行。None

引发异常:

  • ValueError:如果键已经被用作状态键。

示例:

from langgraph.graph import START, StateGraph

# 定义节点函数
def my_node(state, config):
    return {"x": state["x"] + 1}  # 将状态中的 x 增加 1

# 创建并配置图
builder = StateGraph(dict)
builder.add_node(my_node)  # 节点名称将自动设为 "my_node"
builder.add_edge(START, "my_node")  # 从 START 到 my_node 添加边
graph = builder.compile()
graph.invoke({"x": 1})
# 输出: {'x': 2}

# 自定义节点名称
builder = StateGraph(dict)
builder.add_node("my_fair_node", my_node)  # 指定节点名称为 "my_fair_node"
builder.add_edge(START, "my_fair_node")
graph = builder.compile()
graph.invoke({"x": 1})
# 输出: {'x': 2}

返回值:

名称类型描述
SelfSelf状态图的实例,支持方法链式调用。
1.3.2 方法 add_edge
add_edge(
    start_key: Union[str, list[str]],
    end_key: str
) -> Self

描述:
从起始节点(或起始节点列表)到结束节点添加一个有向边。当提供单个起始节点时,图将等待该节点完成后再执行结束节点;当提供多个起始节点时,图将等待所有起始节点完成后再执行结束节点。

参数:

名称类型描述默认值
start_keyUnion[str, list[str]]边的起始节点(或节点列表)的键。必填
end_keystr边的结束节点的键。必填

引发异常:

类型描述
ValueError如果 start_key 是 “END”,或 start_keyend_key 不在图中。

返回值:

名称类型描述
SelfSelf状态图的实例,支持方法链式调用。
1.3.3 方法 add_conditional_edges
add_conditional_edges(
    source: str,
    path: Union[
        Callable[..., Union[Hashable, list[Hashable]]],
        Callable[..., Awaitable[Union[Hashable, list[Hashable]]]],
        Runnable[Any, Union[Hashable, list[Hashable]]]
    ],
    path_map: Optional[Union[dict[Hashable, str], list[str]]] = None,
    then: Optional[str] = None,
) -> Self

描述:
从起始节点到任意数量的目标节点添加一个条件边。

参数:

名称类型描述默认值
sourcestr起始节点,条件边将在退出此节点时运行。必填
pathUnion[Callable[..., Union[Hashable, list[Hashable]]], ...]决定下一个节点或节点的 callable。如果返回 “END”,图将停止执行。必填
path_mapOptional[Union[dict[Hashable, str], list[str]]]路径到节点名称的映射。如果省略,path 返回的路径应为节点名称。None
thenOptional[str]path 选择的节点之后执行的节点名称。None

返回值:

名称类型描述
SelfSelf图的实例,支持方法链式调用。

注意:
如果 path 函数的返回值没有类型提示(例如 -> Literal["foo", "__end__"])或 path_map,图的可视化将假设边可以过渡到图中的任何节点。

1.3.4 方法 add_sequence
add_sequence(
    nodes: Sequence[Union[RunnableLike, tuple[str, RunnableLike]]],
) -> Self

描述:
添加一个按提供顺序执行的节点序列。

参数:

名称类型描述默认值
nodesSequence[Union[RunnableLike, tuple[str, RunnableLike]]]RunnableLike 对象或 (name, RunnableLike) 元组的序列。每个节点按顺序执行。必填

引发异常:

类型描述
ValueError如果序列为空。
ValueError如果序列包含重复的节点名称。

返回值:

名称类型描述
SelfSelf状态图的实例,支持方法链式调用。
1.3.5 方法 compile
compile(
    checkpointer: Checkpointer = None,
    *,
    cache: Optional[BaseCache] = None,
    store: Optional[BaseStore] = None,
    interrupt_before: Optional[Union[All, list[str]]] = None,
    interrupt_after: Optional[Union[All, list[str]]] = None,
    debug: bool = False,
    name: Optional[str] = None
) -> CompiledStateGraph

描述:
将状态图编译为 CompiledStateGraph 对象。编译后的图实现了 Runnable 接口,可以被调用、流式处理、批处理和异步运行。

参数:

名称类型描述默认值
checkpointerCheckpointer检查点保存对象或标志,用于暂停、恢复和重放图。如果为 None,可能继承父图的检查点;如果为 False,不使用检查点。None
cacheOptional[BaseCache]缓存对象。None
storeOptional[BaseStore]存储对象。None
interrupt_beforeOptional[Union[All, list[str]]]在之前中断的节点名称列表。None
interrupt_afterOptional[Union[All, list[str]]]在之后中断的节点名称列表。None
debugbool是否启用调试模式。False
nameOptional[str]编译图的名称。None

返回值:

名称类型描述
CompiledStateGraphCompiledStateGraph编译后的状态图。

2. 类 CompiledStateGraph

继承自: CompiledGraph

描述:
CompiledStateGraph 是编译后的状态图,实现了 Runnable 接口,支持同步和异步执行、流式处理、状态管理和检查点功能。

2.1 方法

名称描述
stream为单个输入流式传输图的步骤。
astream异步为单个输入流式传输图的步骤。
invoke使用单个输入和配置运行图。
ainvoke异步在单个输入上调用图。
get_state获取图的当前状态。
aget_state异步获取图的当前状态。
get_state_history获取图的状态历史。
aget_state_history异步获取图的状态历史。
update_state使用给定值更新图的状态,如同来自指定节点。
aupdate_state异步使用给定值更新图的状态,如同来自指定节点。
bulk_update_state批量应用更新到图状态,需要设置检查点。
abulk_update_state异步批量应用更新到图状态,需要设置检查点。
get_graph返回计算图的可视化表示。
aget_graph异步返回计算图的可视化表示。
get_subgraphs获取图的子图。
aget_subgraphs异步获取图的子图。
with_config创建 Pregel 对象的副本并更新配置。
2.1.1 方法 stream
stream(
    input: dict[str, Any] | Any,
    config: Optional[RunnableConfig] = None,
    *,
    stream_mode: Optional[Union[StreamMode, List[StreamMode]]] = None,
    output_keys: Optional[Union[str, Sequence[str]]] = None,
    interrupt_before: Optional[Union[All, Sequence[str]]] = None,
    interrupt_after: Optional[Union[All, Sequence[str]]] = None,
    checkpoint_during: Optional[bool] = None,
    debug: Optional[bool] = None,
    subgraphs: bool = False
) -> Iterator[Union[dict[str, Any], Any]]

描述:
为单个输入流式传输图的步骤。每个步骤的输出可以以不同模式(stream_mode)发出,例如状态值、节点更新或调试信息。

参数:

名称类型描述默认值
input`dict[str, Any]Any`图的输入。
configOptional[RunnableConfig]用于运行的配置。None
stream_modeOptional[Union[StreamMode, List[StreamMode]]]流式输出模式,详见下文。None
output_keysOptional[Union[str, Sequence[str]]]要流式的键,默认包括所有非上下文通道。None
interrupt_beforeOptional[Union[All, Sequence[str]]]在之前中断的节点,默认包括图中所有节点。None
interrupt_afterOptional[Union[All, Sequence[str]]]在之后中断的节点,默认包括图中所有节点。None
checkpoint_duringOptional[bool]是否在中间步骤保存检查点,默认 TrueNone
debugOptional[bool]在执行期间是否打印调试信息,默认 FalseNone
subgraphsbool是否流式传输子图内部的事件,默认 False。如果为 True,事件将以 (namespace, data)(namespace, mode, data) 元组形式发出,其中 namespace 是子图节点的路径,例如 ("parent_node:<task_id>", "child_node:<task_id>")False

stream_mode 可选项:

  • "values": 在每个步骤后发出状态中的所有值,包括中断。在函数式 API 中,值在工作流结束时发出一次。
  • "updates": 在每个步骤后仅发出节点或任务名称及其返回的更新。如果同一步骤中有多个更新(例如运行多个节点),则分别发出这些更新。
  • "custom": 使用 StreamWriter 从节点或任务内部发出自定义数据。
  • "messages": 逐个 token 发出 LLM 消息,附带任何 LLM 调用的元数据,格式为 (LLM token, metadata) 的二元组。
  • "debug": 为每个步骤发出包含尽可能多信息的调试事件。
  • 可传递列表以同时流式传输多种模式,输出为 (mode, data) 元组。

示例:

from langgraph.graph import StateGraph
from typing_extensions import TypedDict

class State(TypedDict):
    value: int

graph = StateGraph(State)

def node(state: State) -> dict:
    return {"value": state["value"] + 1}

graph.add_node("A", node)
graph.add_edge("A", "A")
graph.set_entry_point("A")
compiled = graph.compile()

# 流式传输值模式
for output in compiled.stream({"value": 0}, stream_mode="values"):
    print(output)
# 输出: {'value': 1}, {'value': 2}, ...

# 流式传输更新模式
for output in compiled.stream({"value": 0}, stream_mode="updates"):
    print(output)
# 输出: {"A": {"value": 1}}, {"A": {"value": 2}}, ...

返回值:

类型描述
Iterator[Union[dict[str, Any], Any]]图中每个步骤的输出,形状取决于 stream_mode
2.1.2 方法 astream
async astream(
    input: dict[str, Any] | Any,
    config: Optional[RunnableConfig] = None,
    *,
    stream_mode: Optional[Union[StreamMode, List[StreamMode]]] = None,
    output_keys: Optional[Union[str, Sequence[str]]] = None,
    interrupt_before: Optional[Union[All, Sequence[str]]] = None,
    interrupt_after: Optional[Union[All, Sequence[str]]] = None,
    checkpoint_during: Optional[bool] = None,
    debug: Optional[bool] = None,
    subgraphs: bool = False
) -> AsyncIterator[Union[dict[str, Any], Any]]

描述:
异步为单个输入流式传输图的步骤。参数与 stream 方法相同。

示例:

import asyncio
from langgraph.graph import StateGraph
from typing_extensions import TypedDict

class State(TypedDict):
    value: int

graph = StateGraph(State)

def node(state: State) -> dict:
    return {"value": state["value"] + 1}

graph.add_node("A", node)
graph.add_edge("A", "A")
graph.set_entry_point("A")
compiled = graph.compile()

async def main():
    async for output in compiled.astream({"value": 0}, stream_mode="values"):
        print(output)

asyncio.run(main())
# 输出: {'value': 1}, {'value': 2}, ...

返回值:

类型描述
AsyncIterator[Union[dict[str, Any], Any]]图中每个步骤的输出,形状取决于 stream_mode
2.1.3 方法 invoke
invoke(
    input: dict[str, Any] | Any,
    config: Optional[RunnableConfig] = None,
    *,
    stream_mode: StreamMode = "values",
    output_keys: Optional[Union[str, Sequence[str]]] = None,
    interrupt_before: Optional[Union[All, Sequence[str]]] = None,
    interrupt_after: Optional[Union[All, Sequence[str]]] = None,
    checkpoint_during: Optional[bool] = None,
    debug: Optional[bool] = None,
    **kwargs: Any
) -> Union[dict[str, Any], Any]

描述:
使用单个输入和配置运行图。

参数:

名称类型描述默认值
input`dict[str, Any]Any`图的输入数据。
configOptional[RunnableConfig]图运行的配置。None
stream_modeStreamMode图运行的流模式,默认 "values""values"
output_keysOptional[Union[str, Sequence[str]]]从图运行中检索的输出键。None
interrupt_beforeOptional[Union[All, Sequence[str]]]在之前中断图运行的节点。None
interrupt_afterOptional[Union[All, Sequence[str]]]在之后中断图运行的节点。None
debugOptional[bool]启用图运行的调试模式。None
**kwargsAny传递给图运行的额外关键字参数。{}

返回值:

类型描述
Union[dict[str, Any], Any]如果 stream_mode"values",返回最新输出。如果 stream_mode 不是 "values",返回输出块列表。
2.1.4 方法 ainvoke
async ainvoke(
    input: dict[str, Any] | Any,
    config: Optional[RunnableConfig] = None,
    *,
    stream_mode: StreamMode = "values",
    output_keys: Optional[Union[str, Sequence[str]]]] = None,
    interrupt_before: Optional[Union[All, Sequence[str]]] = None,
    interrupt_after: Optional[Union[All, Sequence[str]]] = None,
    checkpoint_during: Optional[bool] = None,
    debug: Optional[bool] = None,
    **kwargs: Any
) -> Union[dict[str, Any], Any]

描述:
异步在单个输入上调用图。参数与 invoke 方法相同。

返回值:

类型描述
Union[dict[str, Any], Any]如果 stream_mode"values",返回最新值。如果 stream_mode"chunks",返回块列表。
2.1.5 方法 get_state
get_state(
    config: RunnableConfig,
    *,
    subgraphs: bool = False
) -> StateSnapshot

描述:
获取图的当前状态。

2.1.6 方法 aget_state
async aget_state(
    config: RunnableConfig,
    *,
    subgraphs: bool = False
) -> StateSnapshot

描述:
异步获取图的当前状态。

2.1.7 方法 get_state_history
get_state_history(
    config: RunnableConfig,
    *,
    filter: Optional[dict[str, Any]] = None,
    before: Optional[RunnableConfig] = None,
    limit: Optional[int] = None
) -> Iterator[StateSnapshot]

描述:
获取图的状态历史。

2.1.8 方法 aget_state_history
async aget_state_history(
    config: RunnableConfig,
    *,
    filter: Optional[dict[str, Any]] = None,
    before: Optional[RunnableConfig] = None,
    limit: Optional[int] = None
) -> AsyncIterator[StateSnapshot]

描述:
异步获取图的状态历史。

2.1.9 方法 update_state
update_state(
    config: RunnableConfig,
    values: Union[dict[str, Any], Any, None],
    as_node: Optional[str] = None,
) -> RunnableConfig

描述:
使用给定值更新图的状态,如同来自 as_node 节点。如果未提供 as_node,将设置为最后一个更新状态的节点(若不模糊)。

2.1.10 方法 aupdate_state
async aupdate_state(
    config: RunnableConfig,
    values: Union[dict[str, Any], Any],
    as_node: Optional[str] = None,
) -> RunnableConfig

描述:
异步使用给定值更新图的状态,如同来自 as_node 节点。如果未提供 as_node,将设置为最后一个更新状态的节点(若不模糊)。

2.1.11 方法 bulk_update_state
bulk_update_state(
    config: RunnableConfig,
    supersteps: Sequence[Sequence[StateUpdate]],
) -> RunnableConfig

描述:
批量应用更新到图状态,需要设置 checkpointer

参数:

名称类型描述默认值
configRunnableConfig要应用更新的配置。必填
superstepsSequence[Sequence[StateUpdate]]超级步骤的列表,每个超级步骤包括按顺序应用于图状态的更新列表。每个更新是 (values, as_node) 形式的元组。必填

引发异常:

类型描述
ValueError如果未设置 checkpointer 或未提供更新。
InvalidUpdateError如果提供了无效的更新。

返回值:

名称类型描述
RunnableConfigRunnableConfig更新后的配置。
2.1.12 方法 abulk_update_state
async abulk_update_state(
    config: RunnableConfig,
    supersteps: Sequence[Sequence[StateUpdate]],
) -> RunnableConfig

描述:
异步批量应用更新到图状态,需要设置 checkpointer。参数、异常和返回值与 bulk_update_state 相同。

2.1.13 方法 get_graph
get_graph(
    config: Optional[RunnableConfig] = None,
    *,
    xray: Union[int, bool] = False
) -> Graph

描述:
返回计算图的可视化表示。

2.1.14 方法 aget_graph
async aget_graph(
    config: Optional[RunnableConfig] = None,
    *,
    xray: Union[int, bool] = False
) -> Graph

描述:
异步返回计算图的可视化表示。

2.1.15 方法 get_subgraphs
get_subgraphs(
    *,
    namespace: Optional[str] = None,
    recurse: bool = False
) -> Iterator[tuple[str, PregelProtocol]]

描述:
获取图的子图。

参数:

名称类型描述默认值
namespaceOptional[str]用于过滤子图的命名空间。None
recursebool是否递归到子图中,默认仅返回直接子图。False

返回值:

类型描述
Iterator[tuple[str, PregelProtocol]](namespace, subgraph) 对的迭代器。
2.1.16 方法 aget_subgraphs
async aget_subgraphs(
    *,
    namespace: Optional[str] = None,
    recurse: bool = False
) -> AsyncIterator[tuple[str, PregelProtocol]]

描述:
异步获取图的子图。参数和返回值与 get_subgraphs 相同。

2.1.17 方法 with_config
with_config(
    config: Optional[RunnableConfig] = None,
    **kwargs: Any
) -> Self

描述:
创建 Pregel 对象的副本并更新配置。

3. 类 Graph

描述:
GraphStateGraph 的基类,提供基本的图操作方法。

3.1 方法

名称描述
add_node向图中添加一个新节点。
add_edge从起始节点到结束节点添加一个有向边。
add_conditional_edges从起始节点到任意数量的目标节点添加一个条件边。
compile将图编译为 CompiledGraph 对象。
3.1.1 方法 add_node
add_node(
    node: Union[str, RunnableLike],
    action: Optional[RunnableLike] = None,
    *,
    metadata: Optional[dict[str, Any]] = None
) -> Self

描述:
向图中添加一个新节点。

参数:

名称类型描述默认值
nodeUnion[str, RunnableLike]这个节点将运行的函数或 runnable。如果提供的是字符串,它将被用作节点名称,action 将被用作函数或 runnable必填
actionOptional[RunnableLike]与节点关联的动作。如果 node 是字符串,则用作节点函数或 runnableNone
metadataOptional[dict[str, Any]]与节点关联的元数据。None
3.1.2 方法 add_edge
add_edge(start_key: str, end_key: str) -> Self

描述:
从起始节点到结束节点添加一个有向边。

参数:

名称类型描述默认值
start_keystr边的起始节点的键。必填
end_keystr边的结束节点的键。必填
3.1.3 方法 add_conditional_edges
add_conditional_edges(
    source: str,
    path: Union[
        Callable[..., Union[Hashable, list[Hashable]]],
        Callable[..., Awaitable[Union[Hashable, list[Hashable]]]],
        Runnable[Any, Union[Hashable, list[Hashable]]]
    ],
    path_map: Optional[Union[dict[Hashable, str], list[str]]] = None,
    then: Optional[str] = None,
) -> Self

描述:
从起始节点到任意数量的目标节点添加一个条件边。参数和返回值与 StateGraphadd_conditional_edges 方法相同。

3.1.4 方法 compile
compile(
    checkpointer: Optional[Checkpointer] = None,
    interrupt_before: Optional[Union[All, list[str]]] = None,
    interrupt_after: Optional[Union[All, list[str]]] = None,
    debug: bool = False,
    name: Optional[str] = None,
    *,
    cache: Optional[BaseCache] = None,
    store: Optional[BaseStore] = None
) -> CompiledGraph

描述:
将图编译为 CompiledGraph 对象。参数和返回值与 StateGraphcompile 方法类似。

4. 类 CompiledGraph

继承自: Pregel

描述:
CompiledGraph 是编译后的图,提供了与 CompiledStateGraph 类似的方法,支持流式处理、调用和状态管理。

4.1 方法

方法与 CompiledStateGraph 相同,详见第 2.1 节。

5. 函数 add_messages

add_messages(
    left: Messages,
    right: Messages,
    *,
    format: Optional[Literal["langchain-openai"]] = None
) -> Messages

描述:
合并两个消息列表,按 ID 更新现有消息。默认情况下,确保状态是“仅追加”的,除非新消息的 ID 与现有消息相同。

参数:

名称类型描述默认值
leftMessages基础消息列表。必填
rightMessages要合并到基础列表中的消息列表(或单个消息)。必填
formatOptional[Literal["langchain-openai"]]返回消息的格式,None 表示按原样返回,"langchain-openai" 表示格式化为 OpenAI 消息格式(内容可以是字符串、文本块或图像 URL 块,工具响应作为单独的 ToolMessages 返回)。None

要求:
必须安装 langchain-core>=0.3.11 才能使用此功能。

返回值:

类型描述
Messages带有 right 中消息合并到 left 中的新消息列表。
Messages如果 right 中的消息与 left 中的消息具有相同 ID,则替换 left 中的消息。

示例:

5.1 基本用法
from langchain_core.messages import AIMessage, HumanMessage

msgs1 = [HumanMessage(content="Hello", id="1")]
msgs2 = [AIMessage(content="Hi there!", id="2")]
add_messages(msgs1, msgs2)
# 输出: [HumanMessage(content='Hello', id='1'), AIMessage(content='Hi there!', id='2')]
5.2 覆盖现有消息
msgs1 = [HumanMessage(content="Hello", id="1")]
msgs2 = [HumanMessage(content="Hello again", id="1")]
add_messages(msgs1, msgs2)
# 输出: [HumanMessage(content='Hello again', id='1')]
5.3 在 StateGraph 中使用
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph

class State(TypedDict):
    messages: Annotated[list, add_messages]  # 使用 add_messages 注解 messages 字段

builder = StateGraph(State)
builder.add_node("chatbot", lambda state: {"messages": [("assistant", "Hello")]})
builder.set_entry_point("chatbot")
builder.set_finish_point("chatbot")
graph = builder.compile()
graph.invoke({})
# 输出: {'messages': [AIMessage(content='Hello', id=...)]}
5.4 使用 OpenAI 消息格式
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages(format='langchain-openai')]  # 指定 OpenAI 格式

def chatbot_node(state: State) -> list:
    return {"messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Here's an image:",
                    "cache_control": {"type": "ephemeral"},
                },
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/jpeg",
                        "data": "1234",
                    },
                },
            ]
        },
    ]}

builder = StateGraph(State)
builder.add_node("chatbot", chatbot_node)
builder.set_entry_point("chatbot")
builder.set_finish_point("chatbot")
graph = builder.compile()
graph.invoke({"messages": []})
# 输出:
# {
#     'messages': [
#         HumanMessage(
#             content=[
#                 {"type": "text", "text": "Here's an image:"},
#                 {
#                     "type": "image_url",
#                     "image_url": {"url": "data:image/jpeg;base64,1234"},
#                 },
#             ],
#         ),
#     ]
# }

6. 总结

  • StateGraph:用于定义节点、边和共享状态的图,编译后生成 CompiledStateGraph 以供执行。
  • CompiledStateGraph:支持灵活的执行方式(同步/异步、流式/批量)和状态管理,stream 方法提供了多种输出模式,适合实时处理和调试。
  • add_messages:简化对话类工作流中的消息管理,支持 OpenAI 消息格式,适用于智能代理和多轮对话场景。

LangGraph 提供了一个强大且灵活的框架,适合构建复杂的 LLM 工作流。开发者可以从简单的图开始,逐步探索条件边、异步执行和检查点等高级功能。


参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值