智能体 (Agents)

智能体将语言模型与工具结合起来,创建能够推理任务、决定使用哪些工具并迭代地解决问题的系统。

createAgent() 提供了一个生产就绪的智能体实现。

LLM 智能体在循环中运行工具以实现目标。智能体运行直到满足停止条件 - 即当模型发出最终输出或达到迭代限制时。

createAgent() 使用 LangGraph 构建了一个基于图的智能体运行时。图由节点(步骤)和边(连接)组成,定义了智能体如何处理信息。智能体通过这个图移动,执行节点如模型节点(调用模型)、工具节点(执行工具)或中间件。

核心组件

模型

模型是智能体的推理引擎。它可以通过多种方式指定,支持静态和动态模型选择。

静态模型

静态模型在创建智能体时配置一次,在整个执行过程中保持不变。这是最常见和直接的方法。

从模型标识符字符串初始化静态模型:

import { createAgent } from "langchain";

const agent = createAgent({
  model: "gpt-5",
  tools: []
});

模型标识符字符串使用格式 provider:model(例如 "openai:gpt-5")。你可能需要对模型配置有更多控制,在这种情况下可以使用提供商包直接初始化模型实例:

import { createAgent } from "langchain";
import { ChatOpenAI } from "@langchain/openai";

const model = new ChatOpenAI({
  model: "gpt-4o",
  temperature: 0.1,
  maxTokens: 1000,
  timeout: 30
});

const agent = createAgent({
  model,
  tools: []
});

模型实例让你完全控制配置。当你需要设置特定参数如 temperaturemax_tokenstimeouts,或配置 API 密钥、base_url 和其他提供商特定设置时使用它们。

动态模型

动态模型在运行时根据当前状态和上下文选择。这启用了复杂的路由逻辑和成本优化。

要使用动态模型,创建带有 wrapModelCall 的中间件来修改请求中的模型:

import { ChatOpenAI } from "@langchain/openai";
import { createAgent, createMiddleware } from "langchain";

const basicModel = new ChatOpenAI({ model: "gpt-4o-mini" });
const advancedModel = new ChatOpenAI({ model: "gpt-4o" });

const dynamicModelSelection = createMiddleware({
  name: "DynamicModelSelection",
  wrapModelCall: (request, handler) => {
    // 根据对话复杂度选择模型
    const messageCount = request.messages.length;

    return handler({
        ...request,
        model: messageCount > 10 ? advancedModel : basicModel,
    });
  },
});

const agent = createAgent({
  model: "gpt-4o-mini", // 基础模型(当 messageCount ≤ 10 时使用)
  tools,
  middleware: [dynamicModelSelection],
});

有关中间件和高级模式的更多详情,请参阅中间件文档

有关模型配置详情,请参阅模型。有关动态模型选择模式,请参阅中间件中的动态模型

工具

工具赋予智能体采取行动的能力。智能体通过以下方式超越简单的仅模型工具绑定:

有关更多信息,请参阅工具

定义工具

将工具列表传递给智能体。

import * as z from "zod";
import { createAgent, tool } from "langchain";

const search = tool(
  ({ query }) => `Results for: ${query}`,
  {
    name: "search",
    description: "搜索信息",
    schema: z.object({
      query: z.string().describe("要搜索的查询"),
    }),
  }
);

const getWeather = tool(
  ({ location }) => `Weather in ${location}: Sunny, 72°F`,
  {
    name: "get_weather",
    description: "获取某个位置的天气信息",
    schema: z.object({
      location: z.string().describe("要获取天气的位置"),
    }),
  }
);

const agent = createAgent({
  model: "gpt-4o",
  tools: [search, getWeather],
});

如果提供空的工具列表,智能体将只包含一个没有工具调用能力的单个 LLM 节点。

工具错误处理

要自定义如何处理工具错误,请在自定义中间件中使用 wrapToolCall 钩子:

import { createMiddleware } from "langchain";

const errorHandlingMiddleware = createMiddleware({
  name: "ErrorHandling",
  wrapToolCall: async (request, handler) => {
    try {
      return await handler(request);
    } catch (error) {
      // 自定义错误处理逻辑
      return {
        content: `工具执行失败: ${error.message}`,
        isError: true,
      };
    }
  },
});

系统提示词

使用 prompt 参数为智能体提供指令和上下文:

const agent = createAgent({
  model: "gpt-4o",
  tools: [search, getWeather],
  prompt: "你是一个有帮助的助手。回答时要简洁明了。",
});

运行智能体

invoke

使用 invoke 运行智能体并获取最终结果:

const result = await agent.invoke({
  messages: [{ role: "user", content: "东京的天气怎么样?" }]
});

console.log(result.messages);

流式输出

使用 stream 获取实时更新:

const stream = await agent.stream({
  messages: [{ role: "user", content: "搜索最新的 AI 新闻" }]
});

for await (const event of stream) {
  console.log(event);
}

有关流式输出的更多详情,请参阅流式输出

配置

迭代限制

控制智能体可以运行的最大迭代次数:

const agent = createAgent({
  model: "gpt-4o",
  tools,
  maxIterations: 10, // 默认为 25
});

递归限制

设置图遍历的最大步数:

const result = await agent.invoke(
  { messages },
  { recursionLimit: 50 }
);