createAgent() 提供了一个生产就绪的代理实现。
LLM 代理通过循环运行工具来实现目标。
代理会持续运行,直到满足停止条件——即模型发出最终输出或达到迭代限制。
核心组件
模型
模型 是代理的推理引擎。可以通过多种方式指定,支持静态和动态模型选择。静态模型
静态模型在创建代理时配置一次,并在整个执行过程中保持不变。这是最常见且直接的方法。 从 初始化静态模型:provider:model (例如 "openai:gpt-5")。您可能希望更精细地控制模型配置,在这种情况下,您可以直接使用提供者包初始化模型实例:
temperature、max_tokens、timeouts,或配置 API 密钥、base_url 和其他提供者特定设置时,请使用它们。参考 API 参考 查看模型上可用的参数和方法。
动态模型
动态模型根据当前的 状态和 在 选择。这实现了复杂的路由逻辑和成本优化。 要使用动态模型,创建带有wrapModelCall 的中间件来修改请求中的模型:
工具
工具赋予代理执行操作的能力。代理通过以下方式超越了简单的仅模型工具绑定:- 按顺序进行多次工具调用(由单个提示触发)
- 在适当时进行并行工具调用
- 基于先前结果的动态工具选择
- 工具重试逻辑和错误处理
- 跨工具调用的状态持久性
定义工具
向代理传递一个工具列表。工具错误处理
要自定义工具错误的处理方式,在自定义中间件中使用wrapToolCall 钩子:
ToolMessage]。
ReAct 循环中的工具使用
代理遵循 ReAct(“推理 + 行动”)模式,在简短推理步骤与针对性工具调用之间交替进行,并将结果观察反馈到后续决策中,直到能够给出最终答案。ReAct 循环示例
ReAct 循环示例
提示:识别当前最流行的无线耳机并验证其可用性。
- 推理:“流行度是时间敏感的,我需要使用提供的搜索工具。”
- 行动:调用
search_products("wireless headphones")
- 推理:“在回答之前,我需要确认排名第一的商品的可用性。”
- 行动:调用
check_inventory("WH-1000XM5")
- 推理:“我有了最流行的型号及其库存状态。现在可以回答用户的问题了。”
- 行动:生成最终答案
系统提示
您可以通过提供提示来塑造代理处理任务的方式。@[system_prompt] 参数可以作为字符串提供:
system_prompt] 时,代理将直接从消息推断其任务。
动态系统提示
对于需要根据运行时上下文或代理状态修改系统提示的更高级用例,您可以使用中间件。调用
您可以通过向其State 传递更新来调用代理。所有代理在其状态中都包含一个消息序列;要调用代理,请传递一条新消息:
高级概念
结构化输出
在某些情况下,您可能希望代理以特定格式返回输出。LangChain 通过responseFormat 参数提供了一种简单、通用的方法来实现这一点。
记忆
代理通过消息状态自动维护对话历史记录。您还可以配置代理使用自定义状态模式来记住对话过程中的附加信息。 存储在状态中的信息可以看作是代理的短期记忆:流式传输
我们已经看到可以使用invoke 调用代理以获取最终响应。如果代理执行多个步骤,这可能需要一段时间。为了显示中间进度,我们可以在消息发生时将其流式传输回来。
中间件
中间件 提供了强大的扩展性,用于在执行的不同阶段自定义代理行为。您可以使用中间件来:- 在调用模型之前处理状态(例如,消息修剪、上下文注入)
- 修改或验证模型的响应(例如,防护栏、内容过滤)
- 使用自定义逻辑处理工具执行错误
- 基于状态或上下文实现动态模型选择
- 添加自定义日志记录、监控或分析