什么是Agent?

最近两年AI发展火爆,各类智能体(Agent)层出不穷Agent 开发岗位在过去一年中大量涌现,无论你是前端还是后端去求职的时候都会问你一些关于Agent的内容。可以说,掌握 Agent 开发正逐渐成为程序员的必备技能。本片文章将以最小的案例带你急速进入Agent开发的大门。

什么是Agent?

Agent的概念其实很简单,你可以把大模型比作你的脑子,而Agent就是你这个人。

  • 大模型 = 大脑:负责思考、理解、推理、生成想法,但它没有“手脚”,无法直接行动。

  • Agent = 你这个人:不仅有一个大脑(大模型),还有感知环境的能力、记忆、以及可以调用各种“工具”(如用手上网查资料、用计算器算数、用API订票),最终把想法变成行动

Agent = 大模型(大脑) + 记忆系统(记忆) + 工具(手脚) + 反馈循环(学习)

了解了什么是Agent,接下来我们使用我们熟知的NodeJS来实现一个简单的智能体。

手写一个极简 Agent

为了让你直观理解 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 最本质的那条线。至于它能长成怎样的智能体,就看你的想象力了。

posted @ 2026-07-21 23:17  沐子馨  阅读(4)  评论(0)    收藏  举报