手写一个最小版 AI Agent:从 Prompt 工程到全栈智能体的进化之路
摘要:2026 年,AI 的战场已经从单纯的“对话”转向了“行动”。当 Cursor 能够自动写代码、Manus 能够独立拆解任务时,我们是否还停留在写 Prompt 的阶段?本文带你从零开始,拆解 AI Agent 的核心公式
Agent = LLM + Memory + Tool + RAG,并用 Node.js + LangChain 手写一个最小可行性版本(MVP),揭秘从 Prompt Engineer 到 Agent Engineer 的进阶之路。
🚀 引言:AI 的划时代转折
如果你关注最近的科技圈,一定会被这些产品刷屏:
- 千问点奶茶、豆包、元宝:大模型不再只是陪聊,它们开始接管具体的生活任务。
- OpenClaw(养虾计划) :一人公司的终极形态。虚拟数字人协同多 Agent 工作,编程、做 PPT、算账、市场分析,任务被自动拆解并分发给不同的 Agent 执行。
- Manus 及其开源版本:被誉为“通用智能体”的雏形,能够自主规划长程任务。
- Seedance:自动抓取抖音视频数据并进行深度分析。
这些现象背后指向同一个趋势:互联网计算正在向 AI Agent 推理运行发生质的飞跃。
曾经,我们钻研 Prompt Engineering(提示词工程),试图让 DeepSeek 或 Gemini 吐出更完美的代码; 现在,我们需要掌握 Agent Engineering(智能体工程),构建能思考、有记忆、会使用工具的全栈智能体。
那么,如何打造这样一个 AI Agent?今天,我们就手撕一个最小版本的 Cursor。
🧠 一、重新定义:Agent 到底是什么?
很多人对 Agent 有误解,认为它就是一个更聪明的大模型。其实不然。
大模型(LLM) 本身只是一个强大的“大脑”,它擅长思考、规划和生成文本,但它有两个致命弱点:
- 记不住:你上周跟它聊的需求,这周它就忘了(缺乏长期记忆)。
- 动不了:它无法访问你的本地文件,无法帮你打开网页,无法操作数据库(缺乏工具能力)。
AI Agent = LLM(大脑) + Memory(记忆) + Tool(工具) + RAG(外部知识)
- LLM:负责思考(Thinking)和规划(Planning)。
- Memory:让它记住用户的偏好、历史对话和长期目标。
- Tool:赋予它手脚,让它能读写文件、执行 Bash 命令、调用 API。
- RAG:让它连接公司内部的私密文档库,基于私有知识回答问题。
一句话总结:Agent 就是一个知道内部知识、能思考规划、有长期记忆、并且能自动帮你做事的扩展版大模型。
🛠️ 二、核心拆解:从理论到实践
要手写一个 Agent,我们必须实现上述四个模块。让我们通过一个经典场景来演示: “用 React 创建一个 TodoList 项目” 。
1. 思考与规划 (Thinking & Planning)
当你告诉 Agent:“帮我用 React 写一个 TodoList”,传统的 LLM 会直接输出一大段代码。 而 Agent 的思考过程是这样的:
-
分析意图:用户需要一个前端项目。
-
拆解任务:
- 创建项目目录。
- 初始化
package.json。 - 安装 React 依赖。
- 编写
App.jsx和index.css。 - 启动开发服务器验证。
-
生成计划:按顺序执行上述步骤。
2. 工具扩展 (Tool Use)
这是 Agent 与普通聊天的分水岭。为了让 LLM 完成上述计划,我们需要给它配备“工具箱”:
- File System Tool:允许 LLM 读取、写入、修改文件。没有它,代码只能停留在对话框里。
- Bash Tool:允许 LLM 执行终端命令(如
npm install,npm run dev)。
当 LLM 决定“需要安装依赖”时,它不会直接告诉你命令,而是调用 Bash 工具执行 npm install,并读取执行结果来判断是否成功。
3. 记忆管理 (Memory)
如果第二天你说:“把背景改成蓝色的”,Agent 必须记得昨天创建的项目在哪里,用了什么技术栈。
- 短期记忆:当前对话的上下文窗口。
- 长期记忆:将关键信息(如项目路径、用户偏好)存入向量数据库或简单的 JSON 存储中。
4. 知识库检索 (RAG)
如果公司规定“所有 React 项目必须使用公司内部 UI 库”,Agent 需要通过 RAG 检索内部文档,自动在代码中引入正确的组件,而不是瞎编一个不存在的库。
💻 三、实战:手写最小版 Agent (Node.js + LangChain)
我们将使用 Node.js (后端基石) + NestJS (企业级框架思维) + LangChain (Agent 编排框架) 来构建这个 MVP。
1. 环境准备
npm init -y
npm install langchain @langchain/core @langchain/openai fs-extra
2. 定义工具 (Tools)
首先,我们要赋予 LLM 操作文件系统的能力。
// tools/file-system.ts
import { tool } from "@langchain/core/tools";
import * as fs from "fs-extra";
import * as path from "path";
// 写文件工具
export const writeFileTool = tool(
async ({ filePath, content }: { filePath: string; content: string }) => {
const fullPath = path.resolve(process.cwd(), filePath);
await fs.ensureDir(path.dirname(fullPath));
await fs.writeFile(fullPath, content, "utf-8");
return `文件已成功写入: ${fullPath}`;
},
{
name: "write_file",
description: "用于将代码或内容写入指定路径的文件。参数:filePath (相对路径), content (文件内容)",
schema: z.object({
filePath: z.string().describe("文件相对路径"),
content: z.string().describe("文件内容"),
}),
}
);
// 执行命令工具 (简化版,生产环境需注意安全)
import { exec } from "child_process";
import { promisify } from "util";
const execPromise = promisify(exec);
export const bashTool = tool(
async ({ command }: { command: string }) => {
try {
const { stdout, stderr } = await execPromise(command);
return stdout || stderr;
} catch (error: any) {
return `执行错误: ${error.message}`;
}
},
{
name: "run_bash",
description: "在终端执行 shell 命令,如 npm install, ls 等",
schema: z.object({
command: z.string().describe("要执行的 shell 命令"),
}),
}
);
3. 构建 Agent 大脑
利用 LangChain 的 createReactAgent,我们可以快速组装一个具备“思考 - 行动”循环的 Agent。ReAct (Reasoning + Acting) 是目前最主流的 Agent 范式。
// agent.ts
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { writeFileTool, bashTool } from "./tools/file-system";
import { MemorySaver } from "@langchain/langgraph";
// 1. 初始化大模型 (这里假设使用兼容 OpenAI 协议的模型,如 DeepSeek 或 Gemini)
const llm = new ChatOpenAI({
modelName: "gpt-4o", // 或者 deepseek-chat
temperature: 0,
});
// 2. 定义工具集
const tools = [writeFileTool, bashTool];
// 3. 初始化记忆存储器 (支持多轮对话记忆)
const memory = new MemorySaver();
// 4. 创建 Agent
const agent = createReactAgent({
llm,
tools,
checkpointSaver: memory,
});
// 5. 执行任务
async function runAgent() {
const config = { configurable: { thread_id: "user-123" } }; // 区分不同用户的记忆
const input = "请用 React 创建一个简单的 TodoList 项目。需要包含 package.json, App.jsx 和 index.html,并尝试运行 npm install。";
console.log("🤖 Agent 正在思考并执行任务...");
const stream = await agent.stream({ messages: [{ role: "user", content: input }] }, config);
for await (const chunk of stream) {
if ("agent" in chunk) {
console.log("💭 思考:", chunk.agent.messages[0].content);
} else if ("tools" in chunk) {
console.log("🛠️ 动作:", chunk.tools.messages[0].content);
}
}
}
runAgent().catch(console.error);
4. 运行效果
当你运行这段代码,你会看到类似以下的日志输出,这就是 Agent 的“灵魂”:
- 思考:用户需要 React 项目,我首先需要创建
package.json。 -> 调用write_file - 观察:文件创建成功。
- 思考:接下来需要创建
App.jsx组件代码。 -> 调用write_file - 观察:组件代码写入成功。
- 思考:最后需要安装依赖。 -> 调用
run_bash(npm install) - 观察:依赖安装完成,项目构建成功!
🔮 四、从 Prompt Engineer 到 Agent Engineer
通过上面的 Demo,我们可以清晰地看到职业角色的转变:
| 维度 | Prompt Engineer (过去) | Agent Engineer (现在/未来) |
|---|---|---|
| 核心工作 | 调试提示词,优化输出格式 | 设计工具链,编排工作流,管理状态 |
| 依赖能力 | 语言学技巧,创造力 | 全栈开发 (Node/Python),系统设计,API 集成 |
| 交付物 | 一段文本/代码片段 | 一个可自动执行任务的智能系统 |
| 局限性 | 无法操作外部环境,无状态 | 突破沙盒,拥有持久记忆和行动力 |
未来的全栈开发者,不再是单纯地写 CRUD,而是定义 Agent 的能力边界。
- 你需要懂 NestJS 来构建稳健的后端服务,作为 Agent 的“身体”。
- 你需要懂 Vector DB 来实现 RAG,作为 Agent 的“图书馆”。
- 你需要懂 LangChain/LangGraph 来编排复杂的任务流程,作为 Agent 的“神经系统”。
📝 结语
AI Agent 不是遥不可及的黑科技,它就是 LLM + 工具 + 记忆 的工程化落地。
从“千问点奶茶”到“一人公司 OpenClaw”,时代的浪潮已经拍岸而来。不要只做那个只会写 Prompt 的人,试着去手写一个能帮你干活的最小版 Agent 吧。
当你看着自己的代码自动创建项目、自动修复 Bug、自动部署上线时,你会发现:编程的尽头,是指挥一群硅基员工为你打工。
互动话题: 你最想让你的 AI Agent 帮你自动完成什么工作?是自动写周报,还是自动抢演唱会门票?欢迎在评论区留言讨论!
下期我们将深入探讨 Agent 的多智能体协作(Multi-Agent)架构,揭秘如何让一群 Agent 像团队一样工作!