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 动态工具
动态工具是指在运行时调整代理可用的工具集,而不是预先定义所有工具。并非每个工具都适用于所有情况。工具过多可能会使模型过载(上下文过载)并增加错误;工具过少则会限制功能。动态工具选择可以根据身份验证状态、用户权限、功能标志或对话阶段来调整可用工具集。
根据工具是否事先已知,有两种处理方法:
- 筛选预注册工具
- 动态注册工具
如果在创建代理时已知所有可能的工具,则可以预先注册它们,并根据状态、权限或上下文动态筛选哪些工具可以公开给模型。
如果工具列表是完全动态的(例如从数据库加载),则可以在调用 createAgent 之前异步获取工具。
dynamicTools.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,
configuration: {
baseURL: 'http://192.168.3.202:30001/v1',
},
apiKey: '11'
});
const calculate = tool(
({ expression }) => {
try {
return `Result: ${eval(expression)}`;
} catch (e) {
return "Invalid expression";
}
},
{
name: "calculate",
description: "Run mathematical calculations",
schema: z.object({
expression: z.string().describe("The math expression to evaluate"),
}),
}
);
// 模拟获取用户权限或动态工具列表
async function getDynamicTools(userId: string) {
if (userId === "admin") {
return [calculate];
}
return [];
}
const userId = "admin";
const dynamicTools = await getDynamicTools(userId);
const agent = createAgent({
model,
tools: dynamicTools,
});
const result = await agent.invoke({
messages: [
{
role: "user",
content: "What is 15 * 24?",
},
],
});
console.log(result);