跳到主要内容

Agent

智能体将语言模型与工具相结合,创建能够对任务进行推理、决定使用哪些工具并迭代地寻求解决方案的系统。

createAgent() 提供了一个可用于生产环境的代理实现。

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

model

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

/**
* 1. 创建模型,不同的 provider 提供了不同的模型,使用不同的 模型定义函数
*/
const model = new ChatOpenAI({
model: "Qwen3-30B-A3B-AWQ",
temperature: 0,
// timeout: 30,
configuration: {
baseURL: 'http://192.168.3.202:30001/v1',
},
apiKey: '11'
});

/**
* 模型调用
* model 上有 invoke 方法,可以传入 prompt,也可以传入 messages,即字符串 和 message list 类型
*
* invoke 方法是异步获取结果
* 也可以用 stream 流式获取
*/
const result = await model.invoke([
{
role: "user",
content: "What is the meaning of life?"
}
])

console.log(result);


/**
* stream 流式获取
*/
const stream = await model.stream([
{
role: "user",
content: "What is the meaning of life?"
}
])

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

/**
* 2. 创建 agent
*/
const agent = createAgent({
model,
tools: []
})

const result2 = await agent.invoke({
messages: [{ role: "user", content: "What is the meaning of life?" }]
})

console.log(result2);

Dynamic model 动态模型

动态模型就是根据不同的输入,自动选择不同的模型来处理

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

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

const chatModel = new ChatOpenAI({
model: "Qwen3-30B-A3B-AWQ",
temperature: 0,
// timeout: 30,
configuration: {
baseURL: 'http://192.168.3.202:30001/v1',
},
apiKey: '11'
})


const embeddingModel = new ChatOpenAI({
model: "Qwen3-Embedding-0.6B",
// temperature: 0,
// timeout: 30,
configuration: {
baseURL: 'http://192.168.3.202:30003/v1',
},
apiKey: '11'
});

const dynamicModelSelection = createMiddleware({
name: "DynamicModelSelection",
wrapModelCall: (request: any, handler: any) => {
const messageCount = request.messages.length;

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

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

const res = await agent.invoke({
messages: [
{ role: "user", content: "请解释什么是 Prompt Engineering" }
]
});
console.log(res);

Tools 工具

工具赋予智能体执行操作的能力。智能体超越了简单的仅模型工具绑定,还能实现以下功能:

  • 连续调用多个工具(由单个提示触发)
  • 在适当的时候并行调用工具
  • 基于先前结果的动态工具选择
  • 工具重试逻辑和错误处理
  • 跨工具调用保持状态持久性

创建工具,并使 Agent 调用工具。

tools.ts
import { createAgent } from "langchain";
import { ChatOpenAI } from "@langchain/openai";
import * as z from "zod";
import { tool } from "langchain";

const model = new ChatOpenAI({
model: "Qwen3-30B-A3B-AWQ",
temperature: 0,
// timeout: 30,
configuration: {
baseURL: 'http://192.168.3.202:30001/v1',
},
apiKey: '11'
});


const search = tool(
({ query }) => `Results for: ${query}`,
{
name: "search",
description: "Search for information",
schema: z.object({
query: z.string().describe("The query to search for"),
}),
}
);

const getWeather = tool(
({ location }) => `Weather in ${location}: Sunny, 72°F`,
{
name: "get_weather",
description: "Get weather information for a location",
schema: z.object({
location: z.string().describe("The location to get weather for"),
}),
}
);

const agent = createAgent({
model,
// 要定义一个具有静态工具的代理,请将工具列表传递给该代理
tools: [search, getWeather],
});

const result = await agent.invoke({
messages: [
{
role: "user",
content: "What is the weather in San Francisco?",
},
],
});

console.log(result);

Dynamic tools 动态工具

动态工具是指在运行时调整代理可用的工具集,而不是预先定义所有工具。并非每个工具都适用于所有情况。工具过多可能会使模型过载(上下文过载)并增加错误;工具过少则会限制功能。动态工具选择可以根据身份验证状态、用户权限、功能标志或对话阶段来调整可用工具集。

根据工具是否事先已知,有两种处理方法:

如果在创建代理时已知所有可能的工具,则可以预先注册它们,并根据状态、权限或上下文动态筛选哪些工具可以公开给模型。