搞前端的朋友最近应该都有同感:岗位要求里“AI”“大模型”出现的频率越来越高,但真问起“AI 应用前端工程师到底要会什么”,能说清楚的人并不多。它既不是让你去训练模型、推公式,也不是只会调几个 UI 组件就行——而是要用前端的方式,把大模型的能力变成用户能顺畅使用、愿意持续使用的产品。这篇三个月学习计划,就是给已经有一定前端基础、想往 AI 应用方向走的同学准备的。我按真实的工作节奏拆成了三个阶段,每个阶段都有明确的目标、实操任务和验收标准,你可以直接照着排计划。
我自己在带团队和带新人的过程中发现,很多人卡住的地方不在 API 怎么调,而在拿到一个 AI 产品需求后,不知道该把哪些环节怎么串起来:流式输出怎么渲染、工具调用怎么展示、知识库引用怎么溯源、长会话状态怎么管理。这些问题恰恰是 AI 应用前端工程师的核心价值所在,也是这套学习计划想解决的主要矛盾。
1. 先搞清楚:AI 应用前端这个岗位到底在做什么
1.1 岗位拆解:不是“会调 API 的前端”
最直观的理解是:AI 应用前端仍然是一名前端工程师,你照旧写 React、Vue、TypeScript,照旧处理路由、状态、样式、性能。但要你在常规前端能力之上,多出一整套面向大模型应用的技术栈和产品思维。
具体来说,你会碰到的典型场景包括:
- 聊天对话类界面:不只是发个消息收个回复,还要处理“打字机效果”、流式中断、消息重新生成、多轮上下文的展示。
- 智能体(Agent)工作台:用户触发一个复杂的任务,后端会有多个工具调用、多步推理,前端要怎么把过程展示给用户,让用户看得懂、能干预。
- 知识库问答 / RAG 界面:用户问“合同里约定的付款周期是多久”,系统把答案和引用片段一起吐出来,前端要负责引用的展示、跳转、来源标注。
- 多 Agent 协作的可视化:多个子 Agent 并行工作,界面要呈现出任务状态、进度、结果聚合。
我见过太多把 AI 页面做成“发送—展示”两步的团队,上线后用户根本不买账。原因很简单:大模型的输出是不可控的、耗时的、甚至有时候是错的,AI 产品的前端本质上要做的事情,是把这种不确定性、延迟和不可靠性包装成用户能接受的体验。这比普通业务页面复杂得多,也更有挑战性。
1.2 三个月计划的整体设计思路
整套学习计划的设计,核心逻辑是“先跑通,再深入,最后产品化”。第一个月让你理解大模型基础,能独立完成一个带流式输出的对话页面;第二个月切入真实 AI 应用的骨架——Agent 和 RAG,把前端交互形态吃透;第三个月回到工程化与产品思维,解决性能、稳定性、可观测性这些生产环境才会暴露的问题。
技术选型上,我建议主线选 React + TypeScript + Vite。原因不是 Vue 不行,而是 AI 生态里的开源组件、示例代码、SDK 目前 React 一侧最全,遇到问题更容易找到参考。如果你已经熟练 Vue,也没必要为了学 AI 强行重构技术栈,原理完全一致,只是 API 风格不同。
后端接口这一块,计划里用的是目前最通用的 OpenAI 兼容协议。国内可以直连的服务很多,比如 DeepSeek、通义千问、豆包、Kimi 都提供这类接口,你在国内网络环境下实测没有任何障碍。学习阶段不需要自己训练模型,要学会的是“如何在产品里用好别人的模型”。
2. 第一个月:从“调接口”到“会对话”
2.1 大模型基础不可跳过:Token、上下文、温度与输出控制
很多前端同事第一次拿到大模型接口,第一反应是“这不就是 POST 一个 JSON 吗”。表面上的确是这样,但如果你不理解 Token 和上下文窗口这些基础概念,后面几乎一定会踩坑。
先说 Token。Token 是模型处理文本的最小单位,中文通常一个字在 0.5 到 2 个 Token 之间,英文一个词大概是 1 到 2 个 Token。你每次调用接口都要为输入和输出全部 Token 付费,所以 Token 不是后端才需要关心的东西,前端在设计产品时就要心里有数:长文本输入、超长历史记录、默认携带的系统提示词,都会显著影响速度和成本。
再说上下文窗口。现在的模型通常有 32K、128K 甚至更大的上下文,但这不意味着你可以在多轮对话里无限堆历史消息。上下文窗口由“输入 + 输出”共同占用,历史消息越多,留给模型输出的空间就越小,费用也越高。前端在做多轮会话时,往往需要参与“历史消息多少条该保留、多少条该截断或摘要”的策略决策。
还有两个高频参数:temperature 控制随机性,0 到 2 之间,做客服问答这类确定性场景建议调低,做文案生成可以调高;max_tokens 控制单次输出上限,前端要避免设置过小导致回答被截断,也要避免过大导致用户等待过久。
我个人的建议是:别一上来就啃模型原理,先用一个真实的 API Key 把官方文档里的示例跑一遍,再用不同的 temperature 和 max_tokens 组合多测几次,你对大模型输出的“脾气”会建立第一手感觉。这个感觉比背十篇文章都有用。
2.2 用 Fetch 实现一个流式聊天页:核心代码与实现细节
流式输出是大模型应用前端的第一道坎,也是我认为最值得花时间吃透的部分。
大模型接口默认支持 SSE(Server-Sent Events),服务端会一段一段地把内容推给前端,而不是等全部生成完再一次性返回。前端要做的是拿到这个流,边接收边渲染。如果一个对话页面没有流式效果,用户等待 10 秒看到一整坨内容,和 1 秒开始出字、3 秒看到大部分内容,体验差距是巨大的。
用浏览器原生 Fetch 就能完成最核心的流式解析,不必依赖额外库。思路是用response.body.getReader()读取字节流,再用TextDecoder解码,按 SSE 约定用空行切分事件,从data:字段里取出真实内容:
const response = await fetch("/api/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ messages: [{ role: "user", content: "请用一句话介绍你自己" }], stream: true, }), }); if (!response.ok || !response.body) { throw new Error("chat stream unavailable"); } const reader = response.body.getReader(); const decoder = new TextDecoder(); let buffer = ""; while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); // SSE 事件以空行分隔,按行拆分后只取出 data: 部分 const lines = buffer.split("\n"); buffer = lines.pop() ?? ""; for (const line of lines) { const trimmed = line.trim(); if (!trimmed.startsWith("data:")) continue; const payload = trimmed.slice(5).trim(); if (payload === "[DONE]") return; try { const json = JSON.parse(payload); const delta = json.choices?.[0]?.delta?.content; if (delta) { // 这里把 delta 追加到页面内容里 appendContent(delta); } } catch { // 半包或跨包数据,留在缓冲区等待下一次拼装 } } }这里有一个前端新手特别容易忽略的坑:SSE 数据包不是按你看到的字符串边界传过来的,一个完整 JSON 很可能被拆成两半,服务端和浏览器之间还有缓冲。上面代码里buffer = lines.pop()的处理就是把不完整的最后一行留着,等下一块数据来了再拼接。没有这一步,数据量一大会频繁报 JSON 解析错误。
流式内容拿到之后,渲染层还有几个升级点:Markdown 渲染(推荐react-markdown搭配remark-gfm),代码高亮(用shiki或highlight.js),以及针对大表格、长代码块的稳定渲染。流式输出时用户会看到整段内容在飞速变化,如果你在每一段 delta 到达时都重新执行一次完整 Markdown 解析,页面会卡到没法看。常见优化是节流渲染:比如 100ms 内最多更新一次视图,或者只在收到完整代码块/完整段落时才重新渲染一次。
注意:流式渲染对 DOM 操作的压力远大于普通接口渲染,任何不必要的重渲染都会让打字机效果变卡。实测下来,React 里把这部分组件用 memo 包裹、减少父组件频繁 setState 波及范围,能明显改善。
2.3 第一个月的实战任务与验收标准
第一个月的学习不能只靠看文档,我把实战任务分为三个递进关卡:
任务一:实现一个最小可用的对话页面。包含输入框、消息列表、流式打字机效果、多轮对话。验收标准是,连续追问 10 轮不卡顿,流式输出过程中页面不白屏、不闪烁。
任务二:给对话页面加上“停止生成”“重新生成”功能。停止需要调用接口中断流式请求,重新生成要替换当前最后一条消息,而不是追加重复内容。这个任务会逼你处理“请求生命周期管理”和“消息状态一致性”,非常值。
任务三:做一个简单的“AI 助手工具页”,比如代码解释器。用户粘贴一段代码,模型逐行解释并输出。要求渲染出 Markdown、代码块、行内引用。验收标准是 200 行以上代码的解释过程中,页面滚动和交互不出现明显掉帧。
我自己在任务二上花的时间比预期多了一倍,因为“重新生成”牵涉到消息 ID 的替换、流式过程中状态的切换、以及中断之后光标和滚动位置的复位。如果你想缩短摸索时间,强烈建议一开始就把消息结构定义成对象数组,每条消息有独立的 id、status(loading / streaming / done / error)、content、createdAt,而不是直接用一个字符串数组。这个抽象会一直用下去。
3. 第二个月:Agent、RAG 与对话体验进阶
3.1 Agent 交互的前端形态:工具调用、推理过程与状态展示
到了第二个月,你开始接触智能体(Agent)应用。它和多轮闲聊最核心的区别是:模型不仅仅是“生成文本”,它还可能决定“调用某个工具”,比如查数据库、搜文档、执行代码,然后用工具返回的结果继续推理。后端通常基于 ReAct 模式或 Function Calling / Tool Use 机制来实现这套流程。
前端这边,你要处理的核心问题是:怎么把模型的“思考 + 行动 + 观察”过程,用界面语言讲给用户听。
这里行业里已经有比较成熟的交互模式,我建议直接按它们来设计:
- 工具调用状态卡:当模型决定调用某个工具时,页面出现一个卡片或区块,显示工具名称、入参摘要、执行状态(执行中 / 成功 / 失败)。用户需要知道“系统在做什么”,而不是面对转圈发呆。
- 推理过程折叠面板:把模型的中间思考过程(chain of thought)默认折叠起来,用户想查可以展开。不要把冗长的思维链直接铺在主消息流里,会淹没真正的回答。
- 多步骤进度视图:Agent 执行多个步骤时,用纵向时间线展示每一步的输入输出,最后统一汇总结果。
通信协议层面,Agent 场景下我建议优先考虑 SSE 或 WebSocket 做实时推送,具体选择要看后端实现和你需要双向通信的程度。如果只是服务端持续推送结果,SSE 更简单;如果用户随时要打断 Agent 流程并发送新的控制指令,WebSocket 更顺手。前后端要约定好事件类型,比如tool_start、tool_end、step_update、final_answer,前端按事件类型驱动 UI 状态迁移。
实际开发中还有一个经常被忽略的点:Agent 任务的持续时间通常远长于普通对话,可能是一分钟甚至更久。前端必须设计“中途取消”“暂停后恢复”等控制能力,并且要把 Agent 运行状态持久化到后端,用户刷新页面后还能看到任务的历史进度,而不是一切归零。这已经是 AI 工作台类产品的基本要求了。
3.2 知识库问答的界面实现:RAG 引用的展示与溯源
RAG(检索增强生成)是目前企业落地最广的大模型应用形态。技术链路一般是这样:文档离线切块 → Embedding 模型转成向量 → 存入向量数据库;用户提问时,后端把问题向量化,在库里做相似度检索,取回 Top-K 相关片段,连同原始问题一起喂给大模型生成回答。
前端在这一整套链路里能发挥的价值,就是“让用户相信这个答案是靠谱的”——具体体现为引用的展示与溯源。
一个合格的 RAG 问答界面,在回答中的关键句后面通常会有 [1] [2] 这样的引用角标,点击后弹出或跳转到参考来源片段。实现方式不复杂:后端返回的答案里带有引用的索引标记,例如[1]、[2],同时返回citations数组,每一项包含来源文档名、页码/段落 ID、原文片段。前端把这些标记转成可点击的元素,并把引用列表渲染在答案下方。
还要注意一个体验细节:当用户点击引用角标时,理想行为是既能查看完整引用原文,最好还能定位到原文在文档中的位置。这需要你和后端约定“块 ID”体系,前端拿到块 ID 后可以调用文档预览组件跳到对应位置。这个能力在合同审查、政策问答类产品里非常加分。
我在做这类功能时踩过一个不大不小的坑:模型输出的引用标号可能和实际 citations 列表对不上,比如文本里写了 [3],但 citations 只有两项。前端做角标渲染时,一定要做越界判断,引用数组里没有对应索引就不要渲染成可点击链接,避免用户点到空内容产生困惑。
3.3 状态管理与多轮会话:消息模型是 AI 前端的底盘
普通管理后台的状态管理关注的是“表单数据”“列表数据”,而 AI 应用的状态管理核心是“消息流”。这听起来简单,但真正设计好非常考验功底。
我建议你从第二个月开始,把消息模型设计成一个可扩展的类型系统,而不是简单的字符串数组。下面这个 TypeScript 类型定义可以作为起步参考:
type Role = "user" | "assistant" | "system" | "tool"; interface ToolCall { id: string; name: string; arguments: Record<string, unknown>; status: "pending" | "running" | "success" | "error"; result?: unknown; } interface Citation { id: string; sourceTitle: string; snippet: string; blockId?: string; } interface ChatMessage { id: string; role: Role; content: string; status: "idle" | "streaming" | "done" | "error"; createdAt: number; toolCalls?: ToolCall[]; citations?: Citation[]; error?: string; }有了这个基础模型,流式更新的逻辑会清晰很多:收到流式 delta 时只更新content;收到tool_start事件时向toolCalls里追加一项;收到引用信息时再更新citations。渲染层按不同的状态渲染不同的 UI 子组件。
状态管理工具上,现在主流选择是 TanStack Query(Server State 缓存 + 乐观更新)配合 zustand(UI 状态和临时状态)。TanStack Query 特别适合处理消息列表的分页加载和会话历史回填,zustand 适合管理当前会话的临时 UI 状态,比如是否正在流式输出、当前聚焦哪条消息、侧栏是否展开。两者配合比只用任何一个都要顺手。
多轮会话还有一个常见难点:随着对话变长,Token 会超限。产品上常见策略有三种,前端都要支持呈现:第一条,滑动窗口截断,只保留最近 N 条消息;第二条,历史摘要,把前面的对话内容浓缩成一段摘要后和最近几条消息一起发;第三条,关键消息保留,系统消息和工具调用结果总是保留,用户闲聊历史可以丢弃。前端职责是清楚地在界面上告诉用户“当前会话已处理了多少上下文、还剩多少”,或者至少不要等模型报错才暴露问题。
4. 第三个月:工程化、性能优化与 AI 产品思维
4.1 生产环境绕不开的工程化硬骨头
到第三个月,你不再只是完成 Demo,而是要考虑“这个页面能不能稳定跑在生产环境”。有几个工程化问题是我在实际交付中反复遇到的,提前列在这里。
第一是 API Key 的隔离。大模型接口的 Key 绝对不能直接暴露在前端代码里,必须通过自己的后端服务转发,由后端统一管理与模型服务的鉴权、计量、限流。前端只跟自己的后端通信,后端再和模型服务通信。这样做既安全,又方便以后切换模型供应商,前端不需要改一行代码。
第二是错误处理与降级。大模型服务经常会出现限流、超时、5xx 错误。前端要有一个明确的错误展示规范:是重试、降级到小模型、还是提示用户稍后再试。我见过不少团队前端只处理了 200 状态,模型服务一抖动整个对话页直接白屏。生产环境里这是不可接受的。
第三是流式中断与恢复。手机端切后台、网络切换、用户主动停止,都会导致流式中断。前端要保存已经收到的部分内容,并在网络恢复或用户再次操作时给出选择:继续生成、重新生成、还是保留当前回复。这里要跟后端协商好“断点续传”方案,很多服务已经原生支持。
第四是大文件处理。AI 产品里经常要上传文档供模型解析,几十 MB 的文件如果直接走普通 POST 大概率会失败。需要用到分片上传、进度条显示、Worker 做切片计算减少主线程卡顿。这已经是 AI 应用前端的标配能力,而不是额外加分项。
最后是提示词注入的前端侧意识。用户可能通过上传文档或对话内容诱导模型忽略系统指令。前端能做的是警告提示、限制上传文件格式与大小、在用户粘贴可疑内容时进行风险提示。这些不是安全专著,但前端是第一道关口,至少要有这根弦。
4.2 性能优化:流式渲染、虚拟列表与长会话的体能极限
AI 应用页面的性能瓶颈往往和普通业务页面不一样。普通页面慢在接口请求和图片加载,AI 页面慢在大模型推理延迟、长流式响应、以及消息列表的无限增长。
首 Token 延迟是用户体验第一个可以感知的指标。你可以在前端计算“用户发出消息时间”到“收到第一个 delta 的时间”,把这个指标可视化展示出来。如果首 Token 超过 5 秒,用户流失率会显著上升。优化手段包括:请求体瘦身、降低历史消息数量、模型版本选型、以及在后端做增量预填充。前端虽然不能直接控制推理速度,但可以减少不必要的请求包装,并且用骨架屏、占位提示让等待期不那么难受。
消息列表的无限增长则是另一个隐形杀手。一个长对话可能有几百条消息,每条消息里有超大段 Markdown 和渲染后的代码块,如果全部渲染在 DOM 里,页面必崩。解决方案是列表虚拟化(windowing),只渲染视口附近的消息。React 生态里常用@tanstack/react-virtual或react-window。需要注意的是,AI 消息高度不固定,流式输出时高度会动态变化,虚拟滚动要做好动态测量,否则会出现滚动跳位。我实践中觉得@tanstack/react-virtual的动态测量支持比react-window好一些。
还有一个小优化点:流式渲染过程中,尽量用requestAnimationFrame或节流函数合并 delta 更新,避免每收到 10 字节就触发一次 React 渲染。实测下来,一次渲染合并 100ms 内的所有 delta,就能显著降低 CPU 占用,尤其是移动端。
4.3 AI 产品思维:反馈闭环、可观测性与数据指标
第三个月要开始学着用产品视角审视自己的页面。AI 应用和传统软件最大的区别是:模型输出质量不稳定,产品需要通过反馈闭环不断修正体验。
在界面上一定要提供“点赞/点踩”按钮,而且点踩时要让用户选择原因:答案错误、不够详细、推理不透明等。这些标注数据最终会回到后端的评估和调优流程中。前端要设计清晰的埋点事件:消息发送、首 Token 到达、完整输出、用户编辑、点赞点踩、重新生成等。没有这些数据,AI 产品就像闭着眼睛开车。
还有一个经常被低估的功能:对话分享、导出和快照。用户对一个 AI 回答满意,希望能把这段对话发给同事或保存在项目里。前端要实现“生成分享链接”或“导出为 Markdown / PDF”的能力。这里要注意导出 Adobe 样式(而不是让用户看到原始 JSON)。
可观测性方面,接入类似 Sentry 的错误监控,以及自定义的性能指标(首 Token 延迟、TTFT、完整输出时长、Token 消耗估算)展示在内部调试面板里。生产环境中如果出现大量用户反馈“回答好慢”,你先能定位是模型本身慢,还是前端渲染卡顿,这比任何猜测都有用。
5. 常见问题与避坑速查
我把自己和小伙伴们在实战中经常踩的一些坑整理成了速查表。哪怕你不按完整计划学习,先把这里面几条记下来,也能帮助你在 AI 应用前端开发中少走不少弯路。
| 问题现象 | 根本原因 | 快速处理方案 |
|---|---|---|
| 流式输出时常断,内容缺失 | 半包 JSON 未被正确处理 | SSE 解析时保留不完整行,缓冲区拼接完整后再解析 |
| 首 Token 一直不出现,用户以为系统挂了 | 请求体携带超长历史消息,或者后端串行处理慢 | 精简系统提示词,限制上下文条数,排查后端串行模型调用 |
| 打字机效果一顿一顿 | 每次 delta 到达都触发全量 Markdown 渲染 | 节流合并渲染,推荐 100ms 合并一次,组件 memo 包裹 |
| 消息重新生成后出现重复内容 | 重新生成时没有移除旧消息,而是追加了新消息 | 用消息 ID 定位并替换整体内容,彻底清空旧流缓冲 |
| 模型输出引用标号与实际来源对不上 | 模型幻觉或返回了不存在的索引 | 前端渲染引用角标时做越界判断,缺失则降级为普通文本 |
| 页面滚动条乱跳 | 流式输出时父组件反复 setState 导致虚拟列表测量错位 | 虚拟列表开启动态测量,流式渲染节流,稳定后再滚动 |
| 多轮会话后模型开始胡言乱语 | 上下文窗口溢出或历史消息里混入脏数据 | 实现窗口截断或历史摘要策略,前端显示当前上下文占比 |
| Token 费用飙升 | 每次请求携带过多系统提示词和重复历史 | 对指令类文本缓存复用,历史做裁剪,增加用户侧 Token 消耗展示 |
| 长会话页面卡死 | 消息全部渲染进 DOM,没有做虚拟化 | 引入列表虚拟化,只渲染可视区内消息 |
| 大文件上传总是失败 | 单次 POST 携带几十 MB 实体,网关超时 | 改用分片上传,Worker 中做切片和哈希计算,展示真实进度条 |
这个表格差不多能覆盖你在三个月实践里八成会遇见的“前端常见病”。遇到问题时,先按这个表排查一遍,大部分能快速解决。
最后分享两个我自己实践中的体会
第一,AI 应用前端工程师最值钱的能力,不是堆组件、炫交互,而是对“大模型在产品里怎么工作”有系统性理解。你学会了流式输出、工具调用展示、RAG 引用溯源,就能胜任绝大多数 AI 应用团队的前端核心岗位。但如果你只停留在“把接口返回的数据渲染出来”,那和大模型时代以前的调用接口开发没有本质区别,价值感天差地别。
第二,动手做项目的优先级永远高于刷教程。三个月里你只需要做两个完整项目:一个 Chat 产品,一个 Agent/RAG 工作台。做完、上线、找真实用户用,你会迅速发现文档里永远写不清的坑——这正是成长为 AI 应用前端工程师最快的方式。