概述
代理将语言模型与工具相结合,创建能够对任务进行推理、决定使用哪些工具并迭代推进解决方案的系统。create_agent() 提供了一个基于论文《ReAct: Synergizing Reasoning and Acting in Language Models》(https://arxiv.org/abs/2210.03629)的生产级 ReAct(推理 + 行动)代理实现。
ReAct 将代理的行为框架化为交替进行的
思考 -> 行动 -> 观察 步骤,其中模型会写出其推理过程,选择一个工具,查看工具的结果,然后重复此过程。ReAct 减少了幻觉现象,并使决策过程可审计:代理可以形成假设(思考),用工具进行测试(行动),并根据反馈更新其计划(观察)。ReAct 循环会一直运行,直到达到停止条件——即模型输出最终答案或达到最大迭代次数限制。核心组件
模型
模型 是代理的推理引擎。它可以通过多种方式指定,支持静态和动态模型选择。静态模型
静态模型在创建代理时配置一次,并在执行过程中保持不变。这是最常见且最直接的方法。要从模型标识符字符串初始化静态模型:provider:model 格式(例如 "openai:gpt-5"),并支持自动推断(例如 "gpt-5" 将被推断为 "openai:gpt-5")。您可能希望对模型配置拥有更多控制权,此时可以直接使用提供商包初始化模型实例:
动态模型
runtime:代理的执行环境,包含在代理执行期间保持不变的配置和上下文数据(例如用户 ID、会话详细信息或应用程序特定配置)。state:在代理执行过程中流动的数据,包括消息、自定义字段以及在处理过程中需要跟踪和可能修改的任何信息(例如用户偏好或工具使用统计)。.bind_tools(tools) 绑定工具的 BaseChatModel 实例,其中 tools 是 tools 参数的一个子集。
工具
工具赋予代理采取行动的能力。代理超越了简单的仅模型工具绑定,能够实现:- 由单个提示触发的多个工具调用序列
- 在适当情况下并行调用工具
- 根据结果动态选择工具
- 工具重试逻辑和错误处理
- 工具调用之间的状态持久化
- 工具列表(LangChain
@tool、可调用对象或表示内置提供商工具的dict) - 配置好的
ToolNode
传递工具列表
将工具列表传递给代理将在底层创建一个ToolNode。这是设置工具调用代理的最简单方法:
传递配置好的 ToolNode
或者,您可以直接创建一个ToolNode 并将其传递给代理。这允许您自定义工具节点的行为,例如处理工具错误:
ToolNode 中发生错误,代理将向模型返回一个带有自定义错误消息的 ToolMessage:
ReAct 循环中的工具使用
代理遵循 ReAct(推理 + 行动)模式,在简短的推理步骤与有针对性的工具调用之间交替进行,并将结果观察反馈到后续决策中,直到能够提供最终答案。 跟随代理应用 ReAct 回答用户问题的过程:提示:识别当前最受欢迎的无线耳机并验证库存。
search_products("wireless headphones")check_inventory("WH-1000XM5")提示
您可以通过提供提示来塑造代理处理任务的方式。prompt 参数可以以多种形式提供。
字符串
SystemMessage
可调用对象
prompt 时,代理将直接从消息中推断其任务。
高级配置
结构化输出
在某些情况下,您可能希望代理以特定格式返回输出。LangChain 通过response_format 参数提供了一种简单通用的方法。
内存
代理通过消息状态自动维护对话历史。您还可以配置代理使用自定义状态模式在对话期间记住额外信息。 存储在状态中的信息可以被视为代理的“短期记忆”:模型前钩子
模型前钩子是一个可选节点,可以在调用模型之前处理状态。用例包括消息修剪、摘要和上下文注入。 它必须是一个可调用对象或可运行对象,接收当前图状态并以以下形式返回状态更新:必须提供
messages,并将其用作 agent 节点(即调用 LLM 的节点)的输入。其余键将添加到图状态中。模型后钩子
模型后钩子是一个可选节点,可以在工具执行之前处理模型的响应。用例包括验证、防护措施或其他后处理。 它必须是一个可调用对象或可运行对象,接收当前图状态并返回状态更新。 模型后钩子示例,用于过滤机密信息:流式传输
我们已经看到如何使用.invoke 调用代理以获得最终响应。如果代理执行多个步骤,这可能需要一段时间。为了显示中间进度,我们可以流式传输回发生的消息。