5分钟实现你的第一个 Node.js 智能体
摘要
AI Agent(智能体)无疑是当下最火热的技术概念,但说穿了,它的核心原理其实并不复杂。这篇文章的目标很简单:带你用 5 分钟时间,从零开始实现一个能真正干活的智能体——一个旅行助手。我们会借助 ReAct 模式(思考-行动-观察循环),让 AI 学会自主决策、调用工具、直至完成任务。全程使用真实 API,没有半点 mock 数据,目的是让你彻底理解 Agent 的底层原理,搞懂 LangChain、AutoGPT 这类框架到底在玩什么把戏。

前言
最近 AI Agent 这个概念确实有点热得发烫,各家大厂竞相推出自己的 Agent 框架。但对不少开发者来说,Agent 始终隔着一层纱——它到底是怎么工作的?为什么能“自动”把事儿给办了?
今天就花 5 分钟,咱们亲手从零实现一个真正的智能体,把这层窗户纸捅破。
什么是智能体(Agent)?
说白了,智能体就是大语言模型加上工具调用能力,再套上一个循环决策机制。
传统 ChatGPT 只能跟你一问一答,但智能体可以做到的事情更多:
- 自主决策:分析目标任务,制定执行计划
- 调用工具:查天气、搜信息、执行操作,真刀真枪地干活
- 循环迭代:根据上一步的观察结果调整策略,直到任务收工
这就好比给大模型配上了“手”和“眼睛”,让它能真正去“做事”。
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 的“培训教材”,教给大模型三件事:有哪些工具可用、如何输出思考和行动、什么时候该结束任务。
工具函数(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 的“大脑”)
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 a vailableTools = {
get_weather,
};
把所有工具函数放到一个对象里,好处显而易见:动态查找调用方便、扩展新工具简单、错误处理也顺手。
要加一个新工具,只需三步:实现工具函数(调用真实 API)→ 注册到 a vailableTools → 在系统提示词中说明工具用途。
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 a vailableTools = {
get_weather,
search_web,
};
然后在系统提示词里添上工具说明即可。Agent 会自动学习何时调用新工具,不用你做额外的适配。
支持更复杂的任务
- 多城市旅行规划
- 动态天气预警
- 与用户交互确认
总结
通过这 5 分钟的实战,我们理清了几个核心认知:
- Agent 的本质:LLM + 工具 + 循环决策
- ReAct 模式:Thought → Action → Observation 的循环
- 关键技术点:系统提示词设计、工具注册、Action 解析、Prompt History 管理
这就是所有复杂 Agent 框架的底层原理!无论 LangChain、AutoGPT 还是 OpenAI Function Calling,本质上都在做同一件事——只是封装得更完善、功能更丰富。
掌握了这个基础实现,接下来你就能:看懂各种 Agent 框架的源码、根据实际需求定制自己的 Agent、避开 Agent 开发中那些常见的坑。
