5分钟实现你的第一个 Node.js 智能体

5分钟实现你的第一个 Node.js 智能体

从零开始,用 Node.js 打造一个能「思考」的旅行助手

摘要

AI Agent(智能体)是当下最火热的技术概念,但它的核心原理其实并不复杂。本文将用 5 分钟时间,带你从零实现一个真正的智能体------旅行助手。通过 ReAct 模式(思考-行动-观察循环),让 AI 学会自主决策、调用工具、完成任务。无需任何 mock 数据,完全使用真实 API,让你彻底理解 Agent 的底层原理,掌握 LangChain、AutoGPT 等框架的核心设计思想。


前言

最近 AI Agent(智能体)概念火热,各大厂商纷纷推出自己的 Agent 框架。但对于很多开发者来说,Agent 仍然是一个神秘的概念------它到底是怎么工作的?为什么能「自动」完成任务?

今天,我们就用 5 分钟时间,从零实现一个真正的智能体,让你彻底理解 Agent 的核心原理。

什么是智能体(Agent)?

简单来说,智能体 = 大语言模型 + 工具调用能力 + 循环决策机制

传统的 ChatGPT 只能对话,但智能体可以:

  1. 自主决策:分析任务,制定计划
  2. 调用工具:查询天气、搜索信息、执行操作
  3. 循环迭代:观察结果,调整策略,直到任务完成

就像给 AI 配上了「手」和「眼睛」,让它能真正「做事」。

ReAct:智能体的核心设计模式

我们的智能体采用 ReAct 模式(Reasoning + Acting),这是目前最流行的 Agent 设计模式。

复制代码
用户请求 → Thought(思考) → Action(行动) → Observation(观察) → ... → Finish(完成)

举个例子:

vbnet 复制代码
用户:帮我查北京天气,推荐景点

循环1:
Thought: 用户想了解北京天气和景点,我先查天气
Action: get_weather(city="北京")
Observation: 北京当前晴天,气温18摄氏度

循环2:
Thought: 已获取天气信息,现在可以推荐景点
Action: get_attraction(city="北京", weather="晴天")
Observation: 推荐故宫、长城等户外景点

循环3:
Thought: 信息已收集完毕,可以回答用户
Action: Finish[北京今天晴天18°C,推荐故宫、长城...]

这个「思考-行动-观察」的循环,就是 Agent 的灵魂。

代码实现

1. 项目结构

bash 复制代码
智能体1/
├── index.js      # 智能体核心代码(接入真实 LLM API)
├── package.json  # 项目配置
└── .env.example  # 环境变量示例

本项目使用真实 API,无任何 mock 数据:

  • 天气查询:调用 wttr.in 免费 API
  • 景点推荐:LLM 利用自身知识库完成

2. 核心代码解析

系统提示词(让 AI 学会 ReAct 格式)
javascript 复制代码
const AGENT_SYSTEM_PROMPT = `
你是一个智能旅行助手。你的任务是分析用户的请求,并使用可用工具一步步地解决问题。

# 可用工具:
- \`get_weather(city: str)\`: 查询指定城市的实时天气。
- \`get_attraction(city: str, weather: str)\`: 根据城市和天气搜索推荐的旅游景点。

# 输出格式要求:
你的每次回复必须严格遵循以下格式:

Thought: [你的思考过程和下一步计划]
Action: [你要执行的具体行动]

Action的格式必须是以下之一:
1. 调用工具:function_name(arg_name="arg_value")
2. 结束任务:Finish[最终答案]
`;

这段提示词是 Agent 的「培训教材」,教会 AI:

  • 有哪些工具可用
  • 如何输出思考和行动
  • 什么时候结束任务
工具函数(Agent 的「手」)
javascript 复制代码
// 查询天气 - 调用真实 wttr.in API(免费,无需 API Key)
async function get_weather(city) {
    const url = `https://wttr.in/${encodeURIComponent(city)}?format=j1`;
    const response = await fetch(url);
    const json = await response.json();
    const current = json.current_condition[0];
    const weatherDesc = current.weatherDesc[0].value;
    const tempC = current.temp_C;
    return `${city}当前天气:${weatherDesc},气温${tempC}摄氏度`;
}

重要说明:本示例只使用真实 API,无任何 mock 数据。景点推荐由 LLM 利用自身知识完成,展示了 Agent「用工具获取外部信息,用知识库进行推理」的核心能力。

ini 复制代码
#### 主循环(Agent 的「大脑」)

```javascript
async function main() {
    const promptHistory = [`用户请求: ${userPrompt}`];

    for (let i = 0; i < 5; i++) {  // 最大循环5次
        // 1. 构建 Prompt,调用 LLM
        const fullPrompt = promptHistory.join('\n');
        const llmOutput = await llm.generate(fullPrompt, AGENT_SYSTEM_PROMPT);

        // 2. 解析 Action
        const actionMatch = llmOutput.match(/Action:\s*(.*)/s);
        const actionStr = actionMatch[1].trim();

        // 3. 执行工具或结束任务
        if (actionStr.startsWith('Finish')) {
            // 提取最终答案,结束循环
            console.log(`任务完成: ${finalAnswer}`);
            return;
        }

        // 4. 执行工具,获取观察结果
        const observation = await executeTool(toolName, args);
        const observationStr = `Observation: ${observation}`;

        // 5. 记录到历史,进入下一轮循环
        promptHistory.push(llmOutput);
        promptHistory.push(observationStr);
    }
}

这就是 Agent 的完整工作流程:

  1. 将对话历史发送给 LLM
  2. LLM 输出 Thought 和 Action
  3. 解析 Action,执行对应工具
  4. 将 Observation 加入历史
  5. 循环直到 LLM 输出 Finish

3. 运行演示

步骤一:安装依赖
bash 复制代码
cd 智能体1
npm install
步骤二:配置环境变量

方式1:单行命令(推荐,快速测试)

bash 复制代码
API_KEY='your_api_key' BASE_URL='https://your-api-gateway/v1' MODEL_ID='your_model_id' npm start

方式2:使用 export 设置(适合多次运行)

bash 复制代码
export API_KEY='your_api_key'
export BASE_URL='https://your-api-gateway/v1'
export MODEL_ID='your_model_id'
npm start

方式3:使用 .env 文件(推荐生产环境)

bash 复制代码
# 复制示例文件
cp .env.example .env

# 编辑 .env,填入你的配置
# .env 内容:
API_KEY=your_api_key
BASE_URL=https://your-api-gateway/v1
MODEL_ID=your_model_id

# 加载并运行
source .env && npm start
步骤三:查看运行结果

实际运行效果(使用 glm-5 模型):

ini 复制代码
============================================================
🤖 智能旅行助手启动
   模型: glm-5
   API: https://ai-gateway.greatld.com/lixx/v1/all/v1
============================================================

📝 用户输入: 你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。
============================================================

🔄 --- 循环步骤 1 ---

🧠 正在调用大语言模型...
✅ 大语言模型响应成功

💭 模型思考:
Thought: 用户想要查询北京的天气并根据天气推荐景点。我首先需要调用工具获取北京的实时天气信息。
Action: get_weather(city="北京")

📡 正在调用天气API: https://wttr.in/北京?format=j1
✅ 天气API响应成功
👀 观察结果:
Observation: 北京当前天气:Sunny,气温18摄氏度,湿度28%,风速14公里/小时
============================================================

🔄 --- 循环步骤 2 ---

🧠 正在调用大语言模型...
✅ 大语言模型响应成功

💭 模型思考:
Thought: 我已经获取了北京的天气信息(晴天,18摄氏度,微风)。这个天气状况非常舒适,适合户外活动。我可以利用我的旅游知识,推荐适合晴天游览的户外景点,如皇家园林或登高望远的地方,然后结束任务。
Action: Finish[北京今天天气晴朗,气温18摄氏度,湿度适中,非常适合户外活动。推荐您前往颐和园游览,在阳光明媚的日子里,昆明湖波光粼粼,万寿山景色宜人,非常适合散步和拍照。此外,您也可以考虑去故宫博物院,并顺便登上景山公园俯瞰故宫全景,晴天的视野会非常开阔壮观。]

============================================================
✅ 任务完成!
============================================================

🎉 最终答案:
北京今天天气晴朗,气温18摄氏度,湿度适中,非常适合户外活动。推荐您前往颐和园游览,在阳光明媚的日子里,昆明湖波光粼粼,万寿山景色宜人,非常适合散步和拍照。此外,您也可以考虑去故宫博物院,并顺便登上景山公园俯瞰故宫全景,晴天的视野会非常开阔壮观。
运行过程解析

智能体完整执行了 ReAct 循环

步骤 动作 说明
1 调用 LLM 模型分析用户请求,决定先查天气
2 执行工具 调用真实天气 API,获取北京天气
3 调用 LLM 模型根据天气信息,利用自身知识推荐景点
4 结束任务 输出最终答案,完成任务

关键点:景点推荐完全由 LLM 的知识库完成,无需硬编码数据,展示了 Agent 的真正智能。

关键设计点解析

1. 为什么用循环而不是单次调用?

因为复杂任务需要多步推理。单次调用只能处理简单问题,而 Agent 通过循环可以:

  • 先查天气,再推荐景点
  • 先搜索资料,再总结答案
  • 先分析需求,再执行操作

每一轮都基于之前的「观察结果」做新决策。

2. Prompt History 的作用

promptHistory 记录了完整的对话历史:

makefile 复制代码
用户请求: ...
Thought: ... Action: ...
Observation: ...
Thought: ... Action: ...
Observation: ...

这让 LLM 能「记住」之前做了什么,观察到什么,从而做出正确的下一步决策。

3. 工具注册机制

javascript 复制代码
const availableTools = {
    get_weather,
};

把工具函数放在一个对象中,方便:

  • 动态查找和调用
  • 扩展新工具
  • 错误处理

扩展新工具只需:

  1. 实现工具函数(调用真实 API)
  2. 注册到 availableTools
  3. 在系统提示词中说明工具用途

4. Action 解析的正则表达式

javascript 复制代码
// 解析工具名和参数
const toolNameMatch = actionStr.match(/(\w+)\(/);
const argsMatch = actionStr.match(/\((.*)\)/);
const argRegex = /(\w+)="([^"]*)"/g;

这些正则表达式解析 LLM 输出的 Action 格式:

  • get_weather(city="北京"){ name: "get_weather", args: { city: "北京" } }

进阶:如何扩展这个 Agent?

添加新工具

javascript 复制代码
// 搜索工具 - 调用真实搜索 API(如 DuckDuckGo)
async function search_web(query) {
    const url = `https://api.duckduckgo.com/?q=${encodeURIComponent(query)}&format=json`;
    const response = await fetch(url);
    const data = await response.json();
    return data.Abstract || '未找到相关信息';
}

// 注册新工具
const availableTools = {
    get_weather,
    search_web,
};

然后在系统提示词中添加工具说明即可。Agent 会自动学习何时调用新工具。

支持更复杂的任务

  • 多城市旅行规划
  • 动态天气预警
  • 与用户交互确认

总结

通过这个 5 分钟实现,我们学到了:

  1. Agent 的本质:LLM + 工具 + 循环决策
  2. ReAct 模式:Thought → Action → Observation 循环
  3. 核心技术点:系统提示词设计、工具注册、Action 解析、Prompt History

这就是所有复杂 Agent 框架的底层原理!LangChain、AutoGPT、OpenAI Function Calling,本质上都在做同样的事情------只是封装得更完善、功能更丰富。

理解了这个基础实现,你就能:

  • 看懂各种 Agent 框架的源码
  • 根据需求定制自己的 Agent
  • 避免 Agent 开发中的常见坑

源码地址

完整代码已上传,欢迎 star 和 fork!


智能体并不神秘,它只是让 AI 学会了「思考」和「行动」。掌握了 ReAct 模式,你就掌握了 Agent 开发的核心。

下一篇预告:如何用 MCP(Model Context Protocol)让 Agent 接入更多工具,敬请期待!

相关推荐
灵机一物2 小时前
灵机一物AI智能电商小程序(已上线)-从需求到上线,2天用AI搞定电商签到、分享送积分功能
人工智能·ai编程·github copilot·claude code·电商开发·积分系统·全流程开发
Ferries2 小时前
《从前端到 Agent》系列|02:应用层-提示词工程 (Prompt Engineering)
前端·人工智能·深度学习
太难了啊2 小时前
智能体的两种灵魂:ReAct 与 Plan-and-Solve 深度对决
人工智能
时代中的一粒沙2 小时前
从0实现一个Agent:100行代码理解AI智能体的核心循环
人工智能
水中加点糖2 小时前
多模态数据标注平台LabelStudio——部署与智能标注体验
人工智能·机器学习·自动标注·数据标注·labelstudio·ai标注·标注平台
π....2 小时前
人工智能(AI) & 深度学习 毕设热门题目
人工智能·深度学习
ZoeJoy82 小时前
C# + 机器视觉 + AI:从工业相机取图到 YOLO 目标检测的完整工控解决方案
人工智能·数码相机·c#
饼干哥哥2 小时前
90%跨境电商工作流会被Kimi OpenClaw+Skills替代
人工智能
阿里云大数据AI技术2 小时前
Mem0 + Elasticsearch:构建 AI 记忆系统
人工智能·llm