
搞前端的朋友最近应该都有同感岗位要求里“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 实现一个流式聊天页核心代码与实现细节流式输出是大模型应用前端的第一道坎也是我认为最值得花时间吃透的部分。大模型接口默认支持 SSEServer-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、statusloading / 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: Recordstring, 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 QueryServer State 缓存 乐观更新配合 zustandUI 状态和临时状态。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 应用前端工程师最快的方式。