5分钟实现你的第一个 Node.js 智能体
从零开始,用 Node.js 打造一个能「思考」的旅行助手
摘要
AI Agent(智能体)是当下最火热的技术概念,但它的核心原理其实并不复杂。本文将用 5 分钟时间,带你从零实现一个真正的智能体——旅行助手。通过 ReAct 模式(思考-行动-观察循环),让 AI 学会自主决策、调用工具、完成任务。无需任何 mock 数据,完全使用真实 API,让你彻底理解 Agent 的底层原理,掌握 LangChain、AutoGPT 等框架的核心设计思想。
前言
最近 AI Agent(智能体)概念火热,各大厂商纷纷推出自己的 Agent 框架。但对于很多开发者来说,Agent 仍然是一个神秘的概念——它到底是怎么工作的?为什么能「自动」完成任务?
今天,我们就用 5 分钟时间,从零实现一个真正的智能体,让你彻底理解 Agent 的核心原理。
什么是智能体(Agent)?
简单来说,智能体 = 大语言模型 + 工具调用能力 + 循环决策机制。
传统的 ChatGPT 只能对话,但智能体可以:
- 自主决策:分析任务,制定计划
- 调用工具:查询天气、搜索信息、执行操作
- 循环迭代:观察结果,调整策略,直到任务完成
就像给 AI 配上了「手」和「眼睛」,让它能真正「做事」。
ReAct:智能体的核心设计模式
我们的智能体采用 ReAct 模式(Reasoning + Acting),这是目前最流行的 Agent 设计模式。
用户请求 → Thought(思考) → Action(行动) → Observation(观察) → ... → Finish(完成)
举个例子:
用户:帮我查北京天气,推荐景点
循环1:
Thought: 用户想了解北京天气和景点,我先查天气
Action: get_weather(city="北京")
Observation: 北京当前晴天,气温18摄氏度
循环2:
Thought: 已获取天气信息,现在可以推荐景点
Action: get_attraction(city="北京", weather="晴天")
Observation: 推荐故宫、长城等户外景点
循环3:
Thought: 信息已收集完毕,可以回答用户
Action: Finish[北京今天晴天18°C,推荐故宫、长城...]
这个「思考-行动-观察」的循环,就是 Agent 的灵魂。
代码实现
1. 项目结构
智能体1/
├── index.js # 智能体核心代码(接入真实 LLM API)
├── package.json # 项目配置
└── .env.example # 环境变量示例
本项目使用真实 API,无任何 mock 数据:
- 天气查询:调用 wttr.in 免费 API
- 景点推荐:LLM 利用自身知识库完成
2. 核心代码解析
系统提示词(让 AI 学会 ReAct 格式)
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 的「手」)
// 查询天气 - 调用真实 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「用工具获取外部信息,用知识库进行推理」的核心能力。
#### 主循环(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 的完整工作流程:
- 将对话历史发送给 LLM
- LLM 输出 Thought 和 Action
- 解析 Action,执行对应工具
- 将 Observation 加入历史
- 循环直到 LLM 输出 Finish
3. 运行演示
步骤一:安装依赖
cd 智能体1
npm install
步骤二:配置环境变量
方式1:单行命令(推荐,快速测试)
API_KEY='your_api_key' BASE_URL='https://your-api-gateway/v1' MODEL_ID='your_model_id' npm start
方式2:使用 export 设置(适合多次运行)
export API_KEY='your_api_key'
export BASE_URL='https://your-api-gateway/v1'
export MODEL_ID='your_model_id'
npm start
方式3:使用 .env 文件(推荐生产环境)
# 复制示例文件
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 模型):
============================================================
🤖 智能旅行助手启动
模型: 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 记录了完整的对话历史:
用户请求: ...
Thought: ... Action: ...
Observation: ...
Thought: ... Action: ...
Observation: ...
这让 LLM 能「记住」之前做了什么,观察到什么,从而做出正确的下一步决策。
3. 工具注册机制
const availableTools = {
get_weather,
};
把工具函数放在一个对象中,方便:
- 动态查找和调用
- 扩展新工具
- 错误处理
扩展新工具只需:
- 实现工具函数(调用真实 API)
- 注册到
availableTools - 在系统提示词中说明工具用途
4. Action 解析的正则表达式
// 解析工具名和参数
const toolNameMatch = actionStr.match(/(\w+)\(/);
const argsMatch = actionStr.match(/\((.*)\)/);
const argRegex = /(\w+)="([^"]*)"/g;
这些正则表达式解析 LLM 输出的 Action 格式:
get_weather(city="北京")→{ name: "get_weather", args: { city: "北京" } }
进阶:如何扩展这个 Agent?
添加新工具
// 搜索工具 - 调用真实搜索 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 分钟实现,我们学到了:
- Agent 的本质:LLM + 工具 + 循环决策
- ReAct 模式:Thought → Action → Observation 循环
- 核心技术点:系统提示词设计、工具注册、Action 解析、Prompt History
这就是所有复杂 Agent 框架的底层原理!LangChain、AutoGPT、OpenAI Function Calling,本质上都在做同样的事情——只是封装得更完善、功能更丰富。
理解了这个基础实现,你就能:
- 看懂各种 Agent 框架的源码
- 根据需求定制自己的 Agent
- 避免 Agent 开发中的常见坑
源码地址
完整代码已上传,欢迎 star 和 fork!
智能体并不神秘,它只是让 AI 学会了「思考」和「行动」。掌握了 ReAct 模式,你就掌握了 Agent 开发的核心。
下一篇预告:如何用 MCP(Model Context Protocol)让 Agent 接入更多工具,敬请期待!