本文深入浅出地讲解了Agent开发的核心概念,将其简化为“模型+工具+循环”的模式。通过裸API调用的方式,详细阐述了如何实现工具清单、函数执行、名字映射和循环对话历史管理。文章强调前端工程师具备的技能可直接迁移至Agent开发,并提供了从裸API到MCP协议的进阶路径,最后总结了三种实现方式的优缺点及适用场景,旨在帮助初学者快速掌握大模型开发的基础。
先搞清楚一件事:Agent 到底在做什么?
把"智能体"“Agent 框架”"多智能体协作"这些词全扔掉,剩下的东西很朴素——一个会说话的模型,加上一堆你的函数,再加上一个循环。就这三样。
前端工程师学这个,不是学新大陆。你只是换了个调用对象:以前调后端接口 API,现在调大模型 API;以前给组件写 props,现在给工具写描述。下面一步步拆。
一、Agent = 模型 + 工具 + 循环
先做一个区分,这个区分是一切的基础:
模型不会做事,模型只会说话。
它不能查你的数据库、不能发 HTTP 请求、不能写文件。它唯一的能力是——在对话里"提议":“我建议调用get_weather这个函数,参数是杭州。”
把提议变成现实,是你的代码干的。
打个比方。你招了个特别聪明的实习生(大模型),他脑子好使,但没手:不会查数据库,不会调公司接口,不会打开文件。你给他一张纸,上面写着所有他能"申请"的操作:
工具清单:- get_weather(城市) —— 查天气- search_docs(关键词) —— 搜文档- send_email(收件人, 内容) —— 发邮件然后工作流程是这样的:他说"我要查天气,杭州"→ 你帮他查 → 你把结果递给他 → 他接着想下一步。如此反复,直到他说"好了,我回答完了"。
这个"他说 → 你做 → 你递回 → 他再说"的循环,就是 Agent 的心脏。有个学名叫 ReAct(Reason + Act),翻译过来就是:想一步,做一步。
所以这告诉我们什么?Agent 开发的全部工作量,是回答四个问题:
- 给模型看什么?(工具清单,即"工具描述")2.模型说要用工具时,你执行什么?(工具实现,即"你的函数")3.模型报的工具名,怎么对上你的函数?(注册表,即"名字 → 实现的映射")4.执行结果怎么喂回去?(循环,即"对话历史管理")
用裸 API 写一遍,全貌就出来了。不要先学框架——框架会把这四个问题藏起来,让你以为自己在做别的事。
import OpenAI from "openai";const client = new OpenAI(); // ① 工具清单:一段给模型看的 JSON 描述const tools = [{ type: "function", function: { name: "get_weather", description: "查询指定城市的实时天气", parameters: { type: "object", properties: { city: { type: "string", description: "城市名,如:杭州" } }, required: ["city"] } }}]; // ② 工具实现:普通函数,自己从 args 里解构参数// 示例返回 mock 数据;实际项目换成真实 API 调用即可async function getWeather(args: { city: string }) { // 例如: return fetch(`https://api.example.com/weather?city=${args.city}`).then(r => r.json()); return { city: args.city, temp: 28, condition: "晴" };} // ③ 工具注册表:工具名 → 函数实现,类比前端路由表:path → component// 类型从里往外读:(args: any) => Promise<any> 是"接参数、返回 Promise 的函数",// Record<string, 它> 就是"键为工具名、值为这类函数的对象"const registry: Record<string, (args: any) => Promise<any>> = { get_weather: getWeather,}; // ④ 循环:模型提议 → 你执行 → 结果回传 → 直到模型直接回答const messages: any[] = [{ role: "user", content: "杭州今天热吗?" }]; for (let i = 0; i < 5; i++) { const res = await client.chat.completions.create({ model: "gpt-4o", messages, tools }); const msg = res.choices[0].message; // 模型没要求用工具 → 它在直接回答,循环结束 if (!msg.tool_calls?.length) { console.log(msg.content); break; } // 模型要求用工具 → 循环不认识任何具体工具,查注册表执行 messages.push(msg); for (const call of msg.tool_calls!) { const tool = registry[call.function.name!]; // 查不到就把错误回传给模型,它会自己修正(模型偶尔会幻觉出不存在的工具名) const result = tool ? await tool(JSON.parse(call.function.arguments!)) : { error: `未知工具: ${call.function.name}` }; messages.push({ role: "tool", tool_call_id: call.id, content: JSON.stringify(result) }); }}先拆一下注册表的类型标注。这种"类型套类型"的写法以后你在所有 Agent 框架里都会见到变体,值得花一分钟拆开——从里往外读,只有两层:
里层:(args: any) => Promise<any>——这是函数的类型。左边是参数,右边是返回值。你写的getWeather就长这样:接收参数,返回 Promise。
外层:Record<string, X>——TS 内置工具类型,意思是"键为 string、值为 X 的对象"。
两层合起来:一个对象,键是工具名,值是异步函数。等价写法放一起就眼熟了:
// 两种写法完全等价;第二种就是索引签名,你肯定写过const registry: Record<string, (args: any) => Promise<any>> = { get_weather: getWeather };const registry2: { [name: string]: (args: any) => Promise<any> } = { get_weather: getWeather };为什么必须写成这样?因为循环里是registry[call.function.name]动态查表——工具名来自模型,代码写的时候不知道是哪个字符串。TS 必须被告知"任何字符串都可能是键",这个类型表达的就是这件事。(any是示例偷懒,生产代码会给工具参数定义统一的接口。)
循环本身一行都不能认识具体工具——它只做三件事:查表、执行、回传。加新工具时,循环不动,只往tools数组和registry各加一条。本节开头说 Agent 是"模型 + 工具 + 循环"三个部件,注册表就是"工具"和"循环"之间的插座,让三者真正解耦。
这个for循环,就是 90% 的 Agent 框架在底层帮你做的事。你自己写一遍,再回头看任何框架,都是透明的。
二、你会的,直接就能用
前端背景不是零基础,是准入门票。一张对照表:
| 你已有的前端技能 | Agent 开发中的对应物 | 为什么能直接迁移 |
|---|---|---|
| TypeScript 类型 / Zod 校验 | 工具参数 Schema | 工具描述就是写给模型看的"类型声明",你早就在写类型了 |
| fetch + 流式读取 | 流式输出(SSE / Stream) | Agent 的回答本质是一个 HTTP 流,打字机式渲染你早就会了 |
| React 组件 + Props 设计 | 工具接口设计 | 组件是给人用的接口,工具是给模型用的接口,设计原则一样:描述清晰、输入输出明确 |
| Redux / 状态管理 | Agent 的记忆与上下文 | 都在回答同一个问题:状态放哪、怎么更新、什么时候清理 |
| Promise / 事件循环 | 多工具调用编排 | 工具可能并行、可能串行、可能失败重试,本质是你熟悉的异步流程 |
| 事件监听 / 回调 | 工具调用回调 / Webhook | 模型"请求调用"、你"响应执行",就是一对事件 |
注意第一行:你给组件写 prop 类型、给接口写参数约束的肌肉记忆,原样搬过来就是工具描述。
工具描述写得好不好,直接决定 Agent 靠不靠谱。一个模糊的描述:
get_weather:查天气模型不知道该传什么、什么时候该调。而一个清晰的描述,跟你在团队里写接口文档没有区别:说清楚这个工具干什么、参数是什么、边界在哪里。工具的可用性,取决于描述,不取决于实现。
三、最快的路径:四周,三个台阶
第一周:裸 API + Function Calling
不装任何框架。用上面的循环,给模型接 2 个工具:查天气、查节假日。目标是亲手跑通"提议 → 执行 → 回传"的完整循环。
这一周你会有一个绕不开的困惑:为什么模型返回的不是答案,而是一个tool_calls对象?
想明白它,你就摸到了 Agent 的边界——模型在"说话",不是在做。它永远只能提议,执行权在你这。这个困惑本身就是理解。
第二周:流式输出 + 前端渲染
把回答变成打字机效果。用stream: true拿流,逐段 push 到 React state 渲染。你会发现这不就是fetch流式读取吗——你在做骨架屏、做 SSE 推送时已经写过一模一样的代码了。
第三周:MCP,把你的 API 变成标准插座
MCP(Model Context Protocol)是 2025 年捐赠给 Linux Foundation 的开放协议,现在 OpenAI、Google、Microsoft、AWS 都原生支持,已经事实上成了"AI 连接工具"的标准。
理解它只需要一个类比:USB。
以前每个设备一个充电口——给这个模型写一套工具协议,换一家模型又要重写。MCP 把接口统一了:你写一次工具,任何支持 MCP 的客户端(Claude、Cursor、你自己的应用)插上就能用。前端工程师有一个独特优势——官方有 TypeScript SDK,你用 TS 就能写:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";import { z } from "zod"; const server = new McpServer({ name: "weather", version: "1.0.0" }); // 这就是你熟悉的 Zod schema,模型会动态发现这个工具server.tool( "get_weather", { city: z.string().describe("城市名") }, async ({ city }) => ({ content: [{ type: "text", text: `${city} 28°C 晴` }] })); await server.connect(new StdioServerTransport());这周的任务:把你现有项目里的一个 API(比如你写的某个 Node 接口)包装成 MCP Server。你会发现它跟写一个 Express 路由差不多——定义输入、定义输出、注册。
第四周:多工具 + 记忆
给 Agent 加 3 个以上工具,让它学会自主编排;再引入上下文管理——模型的工作记忆是一张有限的便签纸,聊得越久字越密,你要学会撕掉旧的、把长对话压缩成摘要。这就触及了 Agent 开发的深层成本问题:token 就是钱,上下文管理就是省钱。
四、三个避坑
坑一:一上来就学框架。 LangChain 这类框架把循环、记忆、工具全封装了,你照着示例跑通一个 demo,却完全不知道发生了什么。等你遇到问题,抽象层会让你无从下手。顺序必须是:裸 API 写循环 → 再碰框架。
坑二:让工具描述模糊。 给模型看的描述,和给你同事看的函数注释是同一回事。写不清,模型就瞎猜,猜就错。这是 Agent 应用里最常见的"看起来正常但总出错"的原因。
坑三:忘了权限边界。 模型只会提议,它没有安全意识,也不会判断副作用。你的工具里如果有"发邮件"“删文件”"转账"这类操作,在循环里加一道人工确认。记住:责任永远在代码这边,不在模型那边。
五、表格总结:三种"给 AI 装手"的方式怎么选
| 维度 | 裸调用(Function Calling) | MCP | 框架(LangChain.js / Vercel AI SDK) |
|---|---|---|---|
| 本质 | 模型 API 的一个参数 | 开放的协议标准 | 开发框架 |
| 工具定义在哪 | 每次请求都带上 | 独立 Server,客户端运行时动态发现 | 代码里的类 / 装饰器 |
| 换模型 | 各家 API 略有差异 | 任何支持 MCP 的客户端通用 | 模型无关 |
| 上手成本 | 最低,一个 JSON 对象 | 中等,需要理解协议 | 最高,抽象概念一堆 |
| 适合场景 | 原型、2~3 个工具的小助手 | 生产环境、多模型、团队共享工具 | 复杂编排、RAG 管线、多 Agent |
| 前端友好度 | 直接可用 | 官方 TS SDK,推荐重点掌握 | JS 版可用但偏重 |
| 学习顺序 | 第一周 | 第三周 | 最后再碰 |
一句话收尾:工具清单,加一个循环。模型负责说,你负责做。剩下的全是细节——而细节,恰好是你擅长的事。
大模型的知识又多又杂,到底怎么学?
做这行久了,被问最多的问题就一个:大模型的知识又多又杂,我到底先学啥?翻了一堆资料,看啥都像重点,结果啥都没学进去。今天把我自己一路摸出来的顺序捋一遍,零基础、应届生、转行的都适用。跟着走,至少方向不乱、不瞎忙,学完拿得出手。
第一阶段(10天):初阶应用
这一阶段就一个目标:把大模型真正"玩明白",不是只会聊天那种,而是能调教它、能用代码把大模型和业务接起来。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
这阶段正式进实战,目标很实在:做出两个能拿出手的东西——一个私有知识库,一个 agent 对话机器人。
为什么要做 RAG
搭建一个简单的 ChatPDF
检索的基础概念
什么是向量表示(Embeddings)
向量数据库与向量检索
基于向量检索的 RAG
搭建 RAG 系统的扩展知识
混合检索与 RAG-Fusion 简介
向量模型本地部署
…
走完这 30 天,Python 或 JavaScript 背景的基本能独立做一套 RAG 应用,简历上也敢写"大模型应用开发"了。
第三阶段(约20天):动手微调
学到这,你已经开始 “造” 模型了 —— 通过微调,搞出垂直领域的专用小模型。
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你从 “只会用” 变成 “能造” 的 AI 小子。那么你还想往下探索吗?
想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!
第四阶段(20天):商业闭环,部署落地
技术学完,落地才算数。这阶段带你搞明白大模型怎么真正跑起来、用起来。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
想要入坑大模型的朋友,给大家准备了一份2026 年最新 AI 大模型全套学习资料:
1、大模型系统化学习路线
2、大模型学习视频教程
3、大模型学习书籍&电子文档
4、AI大模型最新行业报告
5、大模型项目实战&配套源码
6、2026大模型大厂面试真题
7、为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。
8、适合谁学?
- 传统后端 / Java / 前端开发,想转型 AI 应用
- 大学生、应届生,想拿更好的 offer
- 产品经理、运营,想武装职业竞争力
- 技术负责人,想给团队落地提效
学习是反人性的,但回报是真金白银。技术会更新,赛道会切换,但只要你先动手,机会就永远站在你这边。
9、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
想要入局AI大模型赛道、抢占行业红利的朋友,微信扫描下方CSDN官方认证二维码,即可100%免费领取全套学习资料!
好了,就写到这。路线是死的,人是活的,卡住了随时来问我。觉得有用就点个收藏,别让它进收藏夹吃灰——动起来比啥都强。