






















最近两年AI发展火爆,各类智能体(Agent)层出不穷,Agent 开发岗位在过去一年中大量涌现,无论你是前端还是后端去求职的时候都会问你一些关于Agent的内容。可以说,掌握 Agent 开发正逐渐成为程序员的必备技能。本片文章将以最小的案例带你急速进入Agent开发的大门。
Agent的概念其实很简单,你可以把大模型比作你的脑子,而Agent就是你这个人。
大模型 = 大脑:负责思考、理解、推理、生成想法,但它没有“手脚”,无法直接行动。
Agent = 你这个人:不仅有一个大脑(大模型),还有感知环境的能力、记忆、以及可以调用各种“工具”(如用手上网查资料、用计算器算数、用API订票),最终把想法变成行动。
Agent = 大模型(大脑) + 记忆系统(记忆) + 工具(手脚) + 反馈循环(学习)
了解了什么是Agent,接下来我们使用我们熟知的NodeJS来实现一个简单的智能体。
为了让你直观理解 Agent 的工作流程,我们不依赖任何框架,实现一个只有一个工具(天气)的 Agent。这个例子会揭示最本质的Agent调用工具流程。
首先我们要知道开发一个Agent最重要的就是让大模型(LLM)具有调用工具的能力,而这个工具就是查询天气的功能,我们先定义这个工具函数。
// ---------- 1. 本地工具实现(模拟天气查询) ---------- async function getWeather(location, units = 'celsius') { // 模拟真实 API 调用(实际可替换为 openweathermap.org 等) const temp = units === 'celsius' ? 25 : 77; return `${location} 当前温度 ${temp}°${units === 'celsius' ? 'C' : 'F'},晴天。`;} // 工具名称到本地函数的映射 const toolsMap = { get_weather: getWeather, };
定义好了之后接下来要做的就是如何让LLM调用这个工具,要让LLM知道如何调用工具首先你要做的是要让LLM知道你有这个工具以及这个工具干嘛的以及如何穿参等等,对于此OpenAI提供了一个Schema规范,就是一个JSON,定义了调用的函数,函数名称,传参,描述等等,如:
const tools = [ { type: 'function', function: { name: 'get_weather', // 调用的函数名 description: 'Retrieves current weather for the given location.', // 工具描述 strict: true, parameters: { type: 'object', // 参数类型 properties: { location: { type: 'string', description: 'City name', }, units: { type: 'string', enum: ['celsius', 'fahrenheit'], }, }, // 传参 required: ['location'], additionalProperties: false, // 控制一个对象是否可以包含 未在 properties 中明确定义的额外属性。 }, }, }, ];
这样定义好之后,当你问它“今天天气如何?”的时候它就知道去调用查询天气工具了。
接下来我们需要封装一个调用大模型API接口,还是以OpenAI为例:
async function callOpenAI(messages, tools) { const res = await fetch('https://api.openai.com/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, }, body: JSON.stringify({ model: 'gpt-5.5-chat-latest', messages, tools, // 传入工具定义 tool_choice: 'auto', // 让模型自主决定是否调用 temperature: 0, }), }); const data = await res.json(); return data.choices[0].message; }
就是一个简单的fetch请求,传入用户的问题以及这个Agent所有的tools,当然我们现在只有一个tool。这里的OPENAI_API_KEY是你实际的Key,你可以定义到环境变量中或者读取一些配置文件等。
最后一步就是定义Agent的主函数了,接收用户消息并对大模型返回结果处理。
async function runAgent(userMessage) { // 消息历史 const messages = [ { role: 'system', content: '你是一个天气助手,可以查询天气。' }, { role: 'user', content: userMessage }, ]; // 工具定义(就是你提供的那个 JSON) const tools = xxx; // 第一次调用:模型可能返回 tool_calls const assistantMsg = await callOpenAI(messages, tools); messages.push(assistantMsg); // 检查是否有工具调用请求 if (assistantMsg.tool_calls && assistantMsg.tool_calls.length > 0) { for (const toolCall of assistantMsg.tool_calls) { const { name, arguments: argsStr } = toolCall.function; const args = JSON.parse(argsStr); // { location: "北京", units: "celsius" } const toolFunc = toolsMap[name]; if (toolFunc) { // 执行本地工具 const result = await toolFunc(args.location, args.units); // 回传工具结果 messages.push({ role: 'tool', tool_call_id: toolCall.id, content: result, }); } } // 第二次调用:模型根据工具结果生成最终答案 const finalMsg = await callOpenAI(messages, null); // 不再传 tools,直接生成回答 return finalMsg.content; } else { // 没有调用工具,直接返回模型回答 return assistantMsg.content; } }
我们直接执行这个函数便完成了一个简单的Agent闭环,定义工具 → 调用模型 → 解析 tool_calls → 执行本地函数 → 回传结果 → 再次调用模型。怎么样。是不是比你想象中的简单。核心思想弄懂了,后续的开发就是在稳定性和功能上做“加法”。你现在已经掌握了构建 AI Agent 最本质的那条线。至于它能长成怎样的智能体,就看你的想象力了。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。