运行 Agent¶
Agent 支持同步和异步执行,可使用 .invoke()
/ await .ainvoke()
获取完整响应,或使用 .stream()
/ .astream()
获取增量流式输出。本节将解释如何提供输入、解析输出、启用流式处理以及控制执行限制。
基本用法¶
Agent 可以通过两种主要模式执行
- 同步 使用
.invoke()
或.stream()
- 异步 使用
await .ainvoke()
或async for
配合.astream()
输入和输出¶
Agent 使用一个语言模型,该模型期望一个 messages
列表作为输入。因此,Agent 的输入和输出以 messages
列表的形式存储在 Agent 状态的 messages
键下。
输入格式¶
Agent 的输入必须是一个包含 messages
键的字典。支持的格式如下:
格式 | 示例 |
---|---|
字符串 | {"messages": "Hello"} — 被解释为一个 HumanMessage |
消息字典 | {"messages": {"role": "user", "content": "Hello"}} |
消息列表 | {"messages": [{"role": "user", "content": "Hello"}]} |
使用自定义状态 | {"messages": [{"role": "user", "content": "Hello"}], "user_name": "Alice"} — 如果使用自定义的 state_schema |
消息会自动转换为 LangChain 的内部消息格式。您可以在 LangChain 文档中阅读更多关于 LangChain 消息 的内容。
使用自定义 Agent 状态
您可以将 Agent 状态模式中定义的其他字段直接在输入字典中提供。这允许基于运行时数据或先前的工具输出实现动态行为。更多详情请参阅上下文指南。
注意
messages
的字符串输入会被转换为 HumanMessage。此行为与 create_react_agent
中的 prompt
参数不同,后者作为字符串传递时被解释为 SystemMessage。
输出格式¶
Agent 的输出是一个包含以下内容的字典:
messages
: 执行期间交换的所有消息列表(用户输入、助手回复、工具调用)。- 可选地,如果配置了结构化输出,则包含
structured_response
。 - 如果使用自定义的
state_schema
,输出中也可能包含与您定义的字段相对应的其他键。这些键可以保存来自工具执行或提示逻辑的更新后状态值。
有关使用自定义状态模式和访问上下文的更多详细信息,请参阅上下文指南。
流式输出¶
Agent 支持流式响应,以实现更具响应性的应用。这包括:
- 进度更新 在每一步之后
- LLM tokens 在生成时
- 自定义工具消息 在执行期间
流式处理在同步和异步模式下均可用:
提示
有关完整详情,请参阅流式处理指南。
最大迭代次数¶
为了控制 Agent 执行并避免无限循环,可以设置一个递归限制。这定义了 Agent 在抛出 GraphRecursionError
之前可以执行的最大步数。您可以在运行时或在定义 Agent 时通过 .with_config()
来配置 recursion_limit
。
from langgraph.errors import GraphRecursionError
from langgraph.prebuilt import create_react_agent
max_iterations = 3
recursion_limit = 2 * max_iterations + 1
agent = create_react_agent(
model="anthropic:claude-3-5-haiku-latest",
tools=[get_weather]
)
try:
response = agent.invoke(
{"messages": [{"role": "user", "content": "what's the weather in sf"}]},
{"recursion_limit": recursion_limit},
)
except GraphRecursionError:
print("Agent stopped due to max iterations.")
from langgraph.errors import GraphRecursionError
from langgraph.prebuilt import create_react_agent
max_iterations = 3
recursion_limit = 2 * max_iterations + 1
agent = create_react_agent(
model="anthropic:claude-3-5-haiku-latest",
tools=[get_weather]
)
agent_with_recursion_limit = agent.with_config(recursion_limit=recursion_limit)
try:
response = agent_with_recursion_limit.invoke(
{"messages": [{"role": "user", "content": "what's the weather in sf"}]},
)
except GraphRecursionError:
print("Agent stopped due to max iterations.")