手写一个最小版 AI Agent:从 Prompt 工程到全栈智能体的进化之路

0 阅读7分钟

手写一个最小版 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) 本身只是一个强大的“大脑”,它擅长思考、规划和生成文本,但它有两个致命弱点:

  1. 记不住:你上周跟它聊的需求,这周它就忘了(缺乏长期记忆)。
  2. 动不了:它无法访问你的本地文件,无法帮你打开网页,无法操作数据库(缺乏工具能力)。

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 的思考过程是这样的:

  • 分析意图:用户需要一个前端项目。

  • 拆解任务

    1. 创建项目目录。
    2. 初始化 package.json
    3. 安装 React 依赖。
    4. 编写 App.jsxindex.css
    5. 启动开发服务器验证。
  • 生成计划:按顺序执行上述步骤。

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 的“灵魂”:

  1. 思考:用户需要 React 项目,我首先需要创建 package.json。 -> 调用 write_file
  2. 观察:文件创建成功。
  3. 思考:接下来需要创建 App.jsx 组件代码。 -> 调用 write_file
  4. 观察:组件代码写入成功。
  5. 思考:最后需要安装依赖。 -> 调用 run_bash (npm install)
  6. 观察:依赖安装完成,项目构建成功!

🔮 四、从 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 像团队一样工作!