运行代理

代理支持同步和异步执行,可使用 .invoke() / await .ainvoke() 获取完整响应,或使用 .stream() / .astream() 获取增量流式输出。本节将解释如何提供输入、解释输出、启用流式传输以及控制执行限制。

基本用法

代理可以在两种主要模式下执行

  • 同步使用 .invoke().stream()
  • 异步使用 await .ainvoke()async for.astream()
<code tabindex="0"><span id="__span-0-1">from langgraph.prebuilt import create_react_agent
<span id="__span-0-2">
<span id="__span-0-3">agent = create_react_agent(...)
<span id="__span-0-4">
<span id="__span-0-5">response = agent.invoke({"messages": [{"role": "user", "content": "what is the weather in sf"}]})

输入和输出

代理使用语言模型,该模型期望一个 messages 列表作为输入。因此,代理的输入和输出以 messages 列表的形式存储在代理状态messages 键下。

输入格式

代理输入必须是包含 messages 键的字典。支持的格式有

消息会自动转换为 LangChain 的内部消息格式。您可以在 LangChain 文档中阅读更多关于LangChain 消息的信息。

使用自定义代理状态

您可以在输入字典中直接提供代理状态模式中定义的额外字段。这允许根据运行时数据或先前的工具输出来实现动态行为。
详情请参见上下文指南

输出格式

代理输出是一个字典,包含

  • messages:执行期间交换的所有消息列表(用户输入、助手回复、工具调用)。
  • 可选地,如果配置了结构化输出,则包含 structured_response
  • 如果使用自定义 state_schema,输出中还可能包含与您定义的字段对应的额外键。这些键可以保存工具执行或提示逻辑更新后的状态值。

有关使用自定义状态模式和访问上下文的更多详细信息,请参见上下文指南

流式输出

代理支持流式响应,以实现更具响应性的应用程序。这包括

  • 每一步之后的进度更新
  • 生成时的LLM 令牌
  • 执行期间的自定义工具消息

流式传输在同步和异步模式下均可用

<span id="__span-2-1">for chunk in agent.stream(
<span id="__span-2-2">    {"messages": [{"role": "user", "content": "what is the weather in sf"}]},
<span id="__span-2-3">    stream_mode="updates"
<span id="__span-2-4">):
<span id="__span-2-5">    print(chunk)

最大迭代次数

要控制代理执行并避免无限循环,请设置递归限制。这定义了代理在引发 GraphRecursionError 之前可以执行的最大步骤数。您可以在运行时或通过 .with_config() 定义代理时配置 recursion_limit

<span id="__span-4-1">from langgraph.errors import GraphRecursionError
<span id="__span-4-2">from langgraph.prebuilt import create_react_agent
<span id="__span-4-3">
<span id="__span-4-4">max_iterations = 3
<span id="__span-4-5">recursion_limit = 2 * max_iterations + 1
<span id="__span-4-6">agent = create_react_agent(
<span id="__span-4-7">    model="anthropic:claude-3-5-haiku-latest",
<span id="__span-4-8">    tools=[get_weather]
<span id="__span-4-9">)
<span id="__span-4-10">
<span id="__span-4-11">try:
<span id="__span-4-12">    response = agent.invoke(
<span id="__span-4-13">        {"messages": [{"role": "user", "content": "what's the weather in sf"}]},
<span id="__span-4-14">        {"recursion_limit": recursion_limit},
<span id="__span-4-15">    )
<span id="__span-4-16">except GraphRecursionError:
<span id="__span-4-17">    print("Agent stopped due to max iterations.")

其他资源