
如有侵权行为,请私信联系我删除,大家也可以自行关注公众号获取更多题库
事先声明,本人非公众号主
以下是对联想 AI 前端开发岗位一面、二面、三面所有问题的详细回答,按原题顺序整理。
一面(技术基础)
1. 请简述一下 JavaScript 的事件循环机制,特别是在处理异步请求时它是如何工作的?
JavaScript 是单线程语言,事件循环(Event Loop)是其实现异步非阻塞 I/O 的核心机制。它主要依赖以下几个组成部分:
- 调用栈(Call Stack):同步代码执行的地方,函数调用会形成栈帧。
- 任务队列(Task Queue / Macrotask Queue) :存放宏任务(如
setTimeout、setInterval、I/O 事件、UI 渲染)。 - 微任务队列(Microtask Queue) :存放微任务(如
Promise.then、MutationObserver、queueMicrotask)。
工作流程:
- 执行全局同步代码,将同步任务压入调用栈执行。
- 遇到异步任务(如
setTimeout、fetch、Promise 等),浏览器/Node 会将其交给对应的 Web API 或线程处理,回调函数分别进入宏任务队列或微任务队列。 - 当调用栈为空时,会先清空所有微任务(执行微任务队列中的任务,直到队列为空)。
- 然后取出一个宏任务执行,执行过程中可能产生新的微任务,继续在第 3 步清空。
- 如此循环,即事件循环。
处理异步请求(如 AJAX / fetch):
- 请求发出后,代码不会阻塞,继续执行后续同步代码。
- 请求返回时,其回调(通常是
Promise.then或async/await后续代码)会被放入微任务队列(如果基于 Promise)或宏任务队列(如果基于 callback)。 - 事件循环保证在适当时间执行这些回调,从而实现非阻塞。
示例:
javascript
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
// 输出顺序:1,4,3,2
2. 谈谈你对前端流式输出(Streaming)的理解,在 AI 对话场景中如何实现?
流式输出:服务器将数据分块(chunk)逐步发送给客户端,客户端边接收边渲染,而不是等待完整响应后再一次性展示。这对于 AI 对话场景至关重要,因为大模型生成文本需要时间,流式输出能极大降低感知延迟,提升用户体验。
在 AI 对话中的实现方式:
-
客户端 :使用
fetchAPI 或EventSource(SSE)接收流式数据。-
基于
fetch+ReadableStream:javascriptconst response = await fetch('/api/chat', { method: 'POST', body: JSON.stringify({ message }) }); const reader = response.body.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) break; const chunk = decoder.decode(value); // 解析 chunk(例如 SSE 格式或纯文本),逐步追加到页面 appendToUI(chunk); } -
基于 SSE(Server-Sent Events):服务器设置
Content-Type: text/event-stream,客户端使用new EventSource(url),监听message事件。
-
-
服务端 :需要支持流式输出。例如在 Node.js 中,将模型生成的 token 逐个 flush 到响应流;Python FastAPI 可使用
StreamingResponse。 -
数据格式 :常见的有纯文本逐字发送、JSON 块(如
{"delta":"你"})、SSE 格式。AI 对话 API(如 OpenAI)通常返回 SSE 格式,每个 chunk 携带一个 token。 -
前端渲染优化:
- 使用
requestAnimationFrame或虚拟滚动控制刷新频率。 - 对 Markdown 内容可先累积再解析,或实时解析(注意性能)。
- 处理断连重试(保存已输出文本断点)。
- 使用
3. 请手写一个防抖函数,并说明在 AI 输入框场景下的应用。
防抖:在事件连续触发时,只在最后一次触发后等待指定时间再执行函数,如果等待期间再次触发则重新计时。
javascript
function debounce(func, delay) {
let timer = null;
return function(...args) {
const context = this;
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
timer = null;
}, delay);
};
}
在 AI 输入框场景中的应用:
- 用户连续输入时,不希望每次按键都发送请求,而是等用户停止输入一段时间(如 500ms)后再请求 AI 接口,避免无效请求,降低服务器压力,也避免 UI 频繁更新。
- 配合"正在输入"提示,防抖后触发请求获取 AI 建议、补全或搜索结果。
使用示例:
javascript
const searchAI = debounce(async (text) => {
const res = await fetch('/api/ai-suggest', { body: text });
// 渲染建议
}, 500);
inputElement.addEventListener('input', (e) => {
searchAI(e.target.value);
});
4. CSS 中如何实现一个 AI 对话气泡的自适应布局?
实现自适应对话气泡(类似聊天界面,用户消息和 AI 消息左右分布,气泡宽度根据内容自适应且不超出容器)。
基本结构:
html
<div class="chat-container">
<div class="message user">用户的消息内容,可能很长,会自动换行</div>
<div class="message ai">AI 的回复内容,也需要自适应</div>
</div>
CSS 关键点:
css
.chat-container {
display: flex;
flex-direction: column;
gap: 12px;
max-width: 600px;
margin: 0 auto;
}
.message {
max-width: 80%; /* 最大宽度不超过容器的80% */
padding: 8px 12px;
border-radius: 18px;
word-wrap: break-word; /* 长单词或URL换行 */
white-space: normal;
display: inline-block; /* 或 inline-flex,使宽度根据内容收缩 */
}
.user {
align-self: flex-end;
background-color: #007aff;
color: white;
border-bottom-right-radius: 4px;
}
.ai {
align-self: flex-start;
background-color: #e5e5ea;
color: black;
border-bottom-left-radius: 4px;
}
进一步自适应:
- 使用
min-width保证短消息也有一定舒适度。 - 结合
calc()动态调整边距。 - 对于包含代码块或表格的复杂 AI 回复,可设置
overflow-x: auto并限制最大宽度。 - 使用 CSS Grid 或 Flexbox 实现整体布局,气泡内部可使用
display: flex对齐头像或时间戳。
5. 说一下 Promise.all 和 Promise.race 的区别,在 AI 并发请求中怎么用?
| 方法 | 行为 | 返回值 | 失败处理 |
|---|---|---|---|
Promise.all(iterable) |
所有 Promise 都成功时,返回一个包含所有结果的数组;只要有一个失败,立即 reject 该错误。 | 成功时结果数组顺序与输入一致 | 一旦有 reject,立即终止并返回该 reject |
Promise.race(iterable) |
返回最先完成(成功或失败)的那个 Promise 的结果或错误。 | 第一个 settled 的结果(resolve 或 reject) | 取决于哪一个先 settled |
在 AI 并发请求中的应用:
-
Promise.all场景:- 同时请求多个不同的 AI 模型(如同时获取文本生成、情感分析、关键词提取),需要所有结果都成功才进行后续处理。
- 批量请求多个 AI 接口(如一次发送多条消息等待全部完成后再渲染列表)。
- 注意:如果其中一个请求失败,整个都会失败,需要 catch 后做容错(比如重试或提示部分失败)。
-
Promise.race场景:- 设置超时机制:同时请求 AI 接口和一个超时 Promise(如
setTimeout封装的 reject),谁先完成就采用谁,防止模型响应过慢导致 UI 卡死。 - 多源备用策略:同时请求主 AI 服务和备用服务,使用最快响应的结果。
- 用户停止生成:点击"停止"按钮时,通过一个立即 reject 的 Promise 与生成请求 race,实现中断效果。
- 设置超时机制:同时请求 AI 接口和一个超时 Promise(如
示例(超时控制):
javascript
function aiRequestWithTimeout(promise, ms) {
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), ms)
);
return Promise.race([promise, timeoutPromise]);
}
6. 在前端项目中,如何处理 AI 返回的 Markdown 内容渲染?
AI 模型经常返回 Markdown 格式的文本(包括标题、列表、代码块、表格、公式等)。前端需要安全且正确地渲染为 HTML。
常用方法:
-
使用成熟的 Markdown 解析库:
marked:快速,插件丰富。remark/rehype:基于 unified 生态,更灵活(支持语法树操作)。markdown-it:功能全面。
-
安全性(XSS 防护):
-
不要直接
innerHTML未净化的内容。 -
使用 DOMPurify 对生成的 HTML 进行过滤:
javascriptimport DOMPurify from 'dompurify'; const rawHtml = marked.parse(markdownText); const cleanHtml = DOMPurify.sanitize(rawHtml); element.innerHTML = cleanHtml;
-
-
代码高亮:
- 搭配
highlight.js或prism.js,在渲染后对<pre><code>块执行高亮。 - 或者使用
marked的highlight选项。
- 搭配
-
数学公式(LaTeX):
- 使用
KaTeX或MathJax。对 Markdown 中的$...$或$$...$$需要预处理或使用专门的插件(如remark-math+rehype-katex)。
- 使用
-
流式渲染优化:
- 对于 AI 流式输出的 Markdown,如果每收到一个 token 就重新解析整个文本,性能会很差。常用策略:
- 累积完整消息后一次性渲染。
- 或者只解析新增部分,但实现复杂。简单方案:设置一个防抖(如 100ms),在用户静止或段落结束位置触发重新渲染。
- 也可使用虚拟 DOM 差异更新,但注意 Markdown 解析开销较大。
- 对于 AI 流式输出的 Markdown,如果每收到一个 token 就重新解析整个文本,性能会很差。常用策略:
示例(marked + DOMPurify):
javascript
import { marked } from 'marked';
import DOMPurify from 'dompurify';
function renderMarkdown(content) {
const raw = marked.parse(content);
const sanitized = DOMPurify.sanitize(raw);
document.getElementById('ai-response').innerHTML = sanitized;
// 代码高亮
document.querySelectorAll('pre code').forEach(block => {
hljs.highlightElement(block);
});
}
二面(深入原理与项目)
1. 介绍一下项目中使用的 AI 相关技术栈,遇到了哪些性能瓶颈?
技术栈示例:
- 前端:React + TypeScript + Vite,状态管理用 Zustand/Redux Toolkit,UI 组件库 Ant Design / Tailwind。
- AI 服务调用:OpenAI API(GPT-3.5/4)、本地部署的 LLaMA(通过 FastAPI 代理)、RAG 向量检索(Pinecone / Chroma)。
- 流式传输:fetch + ReadableStream,SSE。
- 渲染 :Markdown 使用
marked+highlight.js,数学公式使用KaTeX。 - 工具链:ESBuild,Web Worker,IndexedDB 缓存。
遇到的性能瓶颈及解决方案:
-
长对话上下文 Token 过多:
- 问题:多次对话后,每次请求需携带大量历史消息,导致响应慢、消耗 token 配额。
- 解决:实现上下文管理,超过 N 轮对话后自动摘要压缩历史;使用
langchain的ConversationSummaryMemory。
-
流式渲染导致界面卡顿:
- 问题:AI 快速输出 token 时,每个 chunk 都触发 React 重绘,造成掉帧。
- 解决:使用
requestAnimationFrame批量更新;或采用虚拟滚动 + 限流(如 30fps);或将消息渲染迁移到 Web Worker 中处理 DOM 操作(通过 OffscreenCanvas 或直接传递 HTML 字符串)。
-
Markdown 解析耗时:
- 问题:长回复解析和代码高亮占用主线程,导致输入框响应迟钝。
- 解决:将 Markdown 解析放到 Web Worker 中进行,完成后主线程只负责渲染;对代码高亮使用
useMemo缓存。
-
首屏加载大量历史消息:
- 问题:对话列表很长,一次性渲染导致内存占用高。
- 解决:实现虚拟滚动(
react-window或react-virtual),只渲染可视区域的消息。
2. React 的 Fiber 架构是如何提升大型 AI 应用渲染性能的?
React 15 的栈调和(Stack Reconciler)采用同步递归,一旦开始更新就无法中断,可能导致大量组件渲染时浏览器掉帧。
Fiber 架构的核心改进:
-
可中断的异步渲染:Fiber 将渲染工作拆分成多个小任务单元,并可以根据优先级调度。在 AI 应用中,当用户输入或动画(如 AI 回复流式展示)需要高优先级更新时,可以中断低优先级的后台渲染(如历史消息列表的重排)。
-
优先级调度:React 内置了不同事件优先级(如用户点击为最高,useEffect 清理为低)。AI 对话中,用户正在输入时,可以暂停 AI 回复的渲染,保证输入流畅;用户停止输入后再恢复渲染。
-
双缓冲树(current 与 workInProgress):允许在内存中构建新的更新树,完成后一次性提交到 DOM,避免界面闪烁。对于 AI 流式消息频繁更新,减少了直接 DOM 操作开销。
-
并发模式(Concurrent Mode) :结合
useTransition和useDeferredValue,可将 AI 回复的渲染标记为过渡任务,不阻塞用户交互。例如:javascriptconst [isPending, startTransition] = useTransition(); startTransition(() => { setAiResponse(newChunk); // 低优先级更新 });
在大型 AI 应用中(类似 ChatGPT),Fiber 使得大量 Markdown 内容渲染、长列表更新、同时发生的用户输入和模型输出能够平滑进行,避免界面"卡死"。
3. 如何设计一个通用的 AI 对话组件,使其支持不同模型接口?
设计目标:模型可以随时替换(OpenAI、Claude、Gemini、自研模型),前端组件无需修改核心逻辑。
方案:
-
定义统一的接口抽象(Adapter 模式):
- 创建一个
AIService类或接口,包含sendMessage(messages, options)方法,返回统一的流式或 Promise 结果。 - 具体实现类负责翻译不同模型的 API 格式(请求参数、认证、端点)。
- 创建一个
-
依赖注入 / 配置驱动:
-
在组件外部注入
service实例,组件只调用service.send。 -
示例:
typescriptinterface AIService { sendMessage(params: { messages: Message[], stream: boolean }): AsyncIterable<Chunk>; } class OpenAIService implements AIService { ... } class CustomLLMService implements AIService { ... }
-
-
通用消息格式:
- 前端统一使用
{ role: 'user'/'assistant', content: string, ...meta }。 - 适配器负责转换为模型所需格式(如 OpenAI 的
messages数组、Anthropic 的system+messages结构)。
- 前端统一使用
-
配置下发:
- 通过环境变量或后端配置 API,动态告诉前端使用哪个模型、API 地址、额外参数(temperature、top_p 等)。
-
渲染器可插拔:
- 对于 Markdown、代码高亮、表格等不同模型的输出,使用统一的渲染管道,但允许针对特定模型注册自定义处理器(比如某些模型返回 JSON 结构而非纯文本)。
-
示例代码:
ts
const ChatComponent = ({ aiService }: { aiService: AIService }) => {
const send = async (text: string) => {
const stream = aiService.sendMessage({ messages: [{ role: 'user', content: text }], stream: true });
for await (const chunk of stream) {
appendToMessage(chunk.delta);
}
};
// ...
};
4. 在 AI 应用中,你是如何优化 Token 计算和上下文管理的?
Token 直接影响成本、响应速度和上下文窗口限制。
优化策略:
-
Token 精确计数:
- 使用模型对应的 tokenizer(如 OpenAI 的
tiktoken)在前端/后端预先统计。前端可以调用轻量级的gpt-tokenizer库估算,用于限制输入长度。
- 使用模型对应的 tokenizer(如 OpenAI 的
-
上下文裁剪:
- 滑动窗口:保留最近 N 轮对话(如 10 轮),超出部分丢弃。
- 摘要压缩:当对话长度超过阈值时,调用一次 AI 生成摘要,然后用摘要替换早期对话历史。
- 关键词提取:只保留与当前问题相关性高的历史片段(结合向量相似度)。
-
分段发送:
- 用户上传超长文档时,先分割成多个 chunk,分别询问 AI 摘要或关键信息,再组织最终提问。
-
系统提示词复用:
- 系统指令(system prompt)通常较长,缓存其 token 数量,避免每次重复计算。
-
使用
langchain的BaseChatMemory:- 配合
ConversationTokenBufferMemory设置最大 token 数,自动丢弃最旧的对话。
- 配合
-
前端显示 Token 使用量:
- 每轮请求后从响应头或 body 中获取
usage字段,提醒用户消耗情况。
- 每轮请求后从响应头或 body 中获取
5. 聊聊你对 RAG(检索增强生成)前端实现的理解。
RAG 流程:用户提问 → 将问题向量化 → 在知识库中检索相似文档片段 → 将片段作为上下文注入到 AI 提示词中 → 生成最终答案。
前端可以承担的角色:
-
向量化请求 :前端调用嵌入模型 API(如
text-embedding-ada-002)将用户问题转为向量,发送给后端检索服务。 -
缓存检索结果:对于相同或高度相似的问题,前端可缓存检索到的文档 ID 和答案,减少重复请求。
-
展示引用来源:前端需要渲染 AI 回答时,同时展示附带的引用链接或文档片段,增加可解释性。
-
实时混合检索 :在一些场景中,前端可直接在浏览器中运行轻量级向量数据库(如
lancedb或sqlite-vec)做小规模本地 RAG,保护隐私并降低延迟。 -
流式 RAG:后端可以边检索边生成,前端收到"正在检索"状态,然后逐步展示生成过程。
前端实现难点:
- 需要管理大文件分块上传到知识库。
- 检索结果过多时,前端需截断上下文(按 token 限制)。
- 显示高亮的检索片段。
6. 什么是 Web Worker?在 AI 应用中它有什么用处?
Web Worker 是浏览器中独立于主线程的后台线程,可以执行 JavaScript 代码而不阻塞 UI 渲染。Worker 与主线程通过 postMessage 通信,不能直接操作 DOM。
在 AI 应用中的具体用途:
-
Markdown / 代码高亮解析:
- 将
marked+highlight.js放到 Worker 中执行,主线程只负责接收解析好的 HTML 字符串并渲染,避免长解析任务阻塞用户输入。
- 将
-
大文本处理:
- AI 返回几十 KB 甚至 MB 级别的回复,需要对文本进行拆分、查找、替换等操作时,放入 Worker。
-
音频 / 图像预处理:
- 多模态 AI 中,用户上传图片或录音,前端需要压缩、转格式、提取特征等耗时操作,使用 Worker 避免界面冻结。
-
本地向量搜索:
- 在客户端实现简单的 RAG 时,可用 Worker 运行轻量级向量检索(如
hnswlib)。
- 在客户端实现简单的 RAG 时,可用 Worker 运行轻量级向量检索(如
-
Token 计数:
- 调用 tiktoken 等库计算大段文本的 token 数量,不阻塞主线程。
示例:
javascript
// worker.js
import { marked } from 'marked';
self.onmessage = (e) => {
const html = marked.parse(e.data);
self.postMessage(html);
};
7. 谈谈你对前端工程化中 CI/CD 的理解,如何保证 AI 功能的稳定性?
CI/CD:持续集成(Continuous Integration)与持续部署(Continuous Delivery)/持续部署。前端工程化中常见流程:代码提交 → 自动运行 lint、单元测试、构建 → 部署到测试环境 → 自动化测试 → 部署生产。
针对 AI 功能的稳定性保障:
-
自动化测试:
- 单元测试:对 AI 请求封装函数、Token 计算工具、Markdown 渲染组件进行测试。
- 快照测试:对固定的 AI 回复内容(mock 数据)渲染结果进行快照比对,防止 UI 意外变化。
- 集成测试:使用模拟 API 服务器(如 MSW)测试完整对话流程,包括流式响应、错误重试。
-
回归测试:
- 当 AI 模型版本或提示词模板变更时,自动运行一组典型问答用例,比较输出是否符合预期(使用 diff 或语义相似度)。
-
性能监控:
- 在 CI 中集成 Lighthouse CI,检测 AI 页面首屏加载、流式渲染的帧率,设置性能预算。
-
错误边界与降级:
- 前端代码中封装错误边界,当 AI 请求失败或解析异常时,展示友好提示并记录错误到 Sentry。
-
蓝绿部署 / 特性开关:
- 新 AI 功能放在 feature flag 后,先对部分用户灰度发布,通过前端埋点实时观察错误率。
-
CDN 与缓存策略:
- AI 相关的静态资源(模型 tokenizer 字典、高亮 css)使用强缓存;API 响应可前置 CDN 缓存(适合非个性化请求)。
8. 如果遇到前端渲染大量 AI 生成的数学公式,你会怎么优化?
AI 生成大量 LaTeX 公式(如数十甚至上百个)时,直接使用 MathJax 或 KaTeX 渲染可能导致页面卡顿几秒甚至无响应。
优化策略:
-
使用 KaTeX 代替 MathJax:
- KaTeX 速度远快于 MathJax,适合大批量公式。
-
懒加载 + 虚拟滚动:
- 只渲染可视区域内的公式,使用
IntersectionObserver或虚拟滚动库,超出屏幕的公式先渲染占位符,滚动到附近时再触发 KaTeX 渲染。
- 只渲染可视区域内的公式,使用
-
Web Worker 预渲染:
- 将公式的 LaTeX 源码发送给 Worker,Worker 中调用 KaTeX 的
renderToString生成 HTML 字符串,返回给主线程直接插入。注意:KaTeX 需要 DOM 环境,可在 Worker 中使用jsdom(较重)或直接采用纯文本计算方式?更好的办法是主线程中批量渲染时使用requestIdleCallback。
- 将公式的 LaTeX 源码发送给 Worker,Worker 中调用 KaTeX 的
-
批量渲染与节流:
- 收集一屏内的所有公式,一次性调用 KaTeX 渲染(复用 DOM 节点)。避免每次单独调用造成的重排。
-
缓存渲染结果:
- 对于相同 LaTeX 表达式,将其渲染后的 HTML 缓存到
Map中,后续直接复用。
- 对于相同 LaTeX 表达式,将其渲染后的 HTML 缓存到
-
简化字体和样式:
- 使用 KaTeX 的"strict"选项忽略不严格的语法,减少错误处理开销。
-
服务端渲染:
- 如果可能,在后端预先将 Markdown 中的公式转换为 HTML 再下发,前端直接展示,极大减轻前端压力。适用于非流式场景。
-
示例(配合虚拟滚动):
javascript
// 只渲染可见行的公式
const visibleRows = rows.slice(start, end);
visibleRows.forEach(row => {
const html = katex.renderToString(row.latex, { throwOnError: false });
row.element.innerHTML = html;
});
三面(架构与综合能力)
1. 如果你设计一个支持千万级用户的 AI 对话系统前端,你会考虑哪些架构问题?
1. 高可用与容灾:
- 静态资源部署在多地域 CDN(如 CloudFront),确保全球用户快速访问。
- API 网关负载均衡,前端配置多个备用的 AI 服务端点,自动故障转移。
2. 性能与加载速度:
- 代码分割:核心对话模块按需加载,首屏只加载聊天窗口基础代码,Markdown 解析库、代码高亮等非核心模块可通过
React.lazy拆分。 - 资源预加载:预测用户可能会使用历史记录、设置页面,提前加载相关 chunk。
- Service Worker 缓存:利用 Workbox 缓存 API 响应(如历史对话列表)和静态资源,实现离线可用或弱网快速加载。
3. 实时交互与流式处理:
- 千万级用户同时产生 AI 流式请求,前端需要管理大量 WebSocket 或 SSE 连接。可采用:
- 使用 HTTP/2 或 HTTP/3 多路复用,减少连接数。
- 对非活跃连接自动断开,心跳检测。
- 服务端推送使用 WebSocket 时,前端需实现连接池和重连机制(指数退避)。
4. 状态管理与同步:
- 多 Tab 同步:使用
localStorage事件或 BroadcastChannel 同步用户登录状态、主题配置。 - 长对话状态持久化:IndexedDB 存储历史消息,避免每次刷新页面重新加载。
5. 安全性:
- 前端严格防范 XSS(对 AI 生成的任意内容进行净化)。
- CSRF 保护(使用 token)。
- 防止 API 密钥泄露,所有调用通过后端代理。
6. 监控与可观测性:
- 前端埋点(Sentry 或自研)收集 JS 错误、API 延迟、流式渲染卡顿率。
- 性能指标:FCP、LCP、TTFB,以及 AI 首 token 时间(TTFT)。
- 用户行为追踪:用户是否中断生成、复制答案、点击引用等。
7. 国际化与可访问性:
- 支持多语言 UI,AI 回复本身可能多语言,由模型控制。
- 无障碍支持(ARIA 标签,键盘导航)。
8. 升级与向后兼容:
- 模型切换时,前端需要兼容不同输出格式(如新模型返回 JSON 而非纯文本),因此需要版本化的 API 客户端和渲染适配器。
2. 面对快速迭代的 AI 技术,你通常如何保持技术敏感度并应用到工作中?
-
持续学习:
- 关注顶级会议(NeurIPS、ICML)和 AI 前沿博客(OpenAI、DeepMind、Google AI)。
- 订阅周报(AI 前线、DataElixir)、科技媒体(MIT Tech Review)。
-
动手实践:
- 定期尝试新的 AI 模型(HuggingFace 上跑 demo),使用 LangChain 或 LlamaIndex 搭建小应用。
- 将新模型(如 GPT-4o、Claude 3.5)集成到自己的 side project 中,对比效果。
-
社区参与:
- 加入 AI 前端相关的开源项目(如 Copilot for X),阅读源码,提 PR。
- 参加技术会议(如 AI 开发者大会、VueConf AI 专场)。
-
知识内化与分享:
- 每周写技术笔记或推文,总结新发现(例如新的 prompt 技巧、WebGPU 运行大模型)。
- 团队内部组织 AI 技术分享会,倒逼自己深入研究。
-
应用到工作中:
- 评估新技术是否能解决当前痛点,例如 RAG 提升问答准确性、WebLLM 实现本地推理。
- 做小规模原型验证,用数据证明价值(如流式渲染帧率提升 30%),然后推动演进。
3. 在团队协作中,如果产品经理对 AI 输出的预期与模型实际效果有偏差,你如何处理?
-
澄清预期:
- 首先与产品经理明确"期望的具体表现"是什么?是风格、格式、准确性还是功能?展示当前模型的能力边界(例如 GPT-3.5 不能做数学推理,或者不会返回 JSON 结构)。
-
数据驱动沟通:
- 设计评估数据集和评分标准(如准确性、友好度、格式),让产品、开发、测试共同打分,量化偏差程度。用具体案例说明差距。
-
探索可落地的改进:
- 提示工程:优化 system prompt 和 few-shot examples,引导模型更符合预期。
- 后处理:在前端或后端对 AI 输出进行正则清洗、格式转换、屏蔽敏感词。
- 模型微调:如果有预算和数据,建议微调模型。
- 引入 RAG:提供更精准的上下文知识,修正错误事实。
-
设置兜底与降级:
- 对明显不符合预期的回答,前端可以展示"重新生成"按钮,或调用备用模型。
- 显示免责声明:"AI 生成内容仅供参考"。
-
建立反馈闭环:
- 收集用户对 AI 回答的点赞/点踩,将低质量样本定期反馈给产品/算法团队,驱动迭代。
-
保持透明迭代:
- 使用 A/B 测试验证新 prompt 或模型版本的效果,给产品信心。
4. 谈谈你对 AI Agent(智能体)的理解,前端在其中扮演什么角色?
AI Agent:能够感知环境、进行规划、调用工具(Tool Use)、执行行动并完成特定目标的自主智能体。典型框架:感知 → 推理(使用 LLM)→ 行动(调用 API、操作数据库、发送请求)→ 循环。例如 AutoGPT、BabyAGI。
前端在 AI Agent 中的角色:
-
Agent 交互界面:
- 展示 Agent 的思考过程(Chain of Thought)、工具调用记录、执行结果,让用户理解 Agent 的决策。
- 提供"中断"或"人工介入"按钮,允许用户修正 Agent 路径。
-
Agent 能力的前端接入:
- 将浏览器本身变成 Agent 的工具箱:例如 Agent 可以执行前端代码来修改页面样式、填写表单、抓取用户当前看到的 DOM 数据。
- 利用浏览器 API(如
fetch、localStorage、剪贴板)扩展 Agent 的能力。
-
本地 Agent 推理:
- 通过 WebLLM、Transformers.js 在浏览器中运行轻量级 Agent 模型,无需服务端,保护隐私。前端负责管理推理状态和内存。
-
多模态 Agent 的前端处理:
- 用户通过摄像头、麦克风、文件上传等提供环境输入,前端将这些数据预处理后交给 Agent。
- 展示 Agent 生成的图文、音频回答。
-
Agent 编排的可视化:
- 设计低代码界面让用户构建自己的 Agent 工作流(拖拽节点:触发条件→模型推理→工具调用→输出),前端实现节点编辑器。
-
状态持久化:
- Agent 执行通常较慢,前端需要保存任务进度到 IndexedDB,即使页面刷新也能恢复。
简而言之,前端是 AI Agent 的"感官界面"和"行动操作台",让 Agent 能看见用户环境、操作浏览器组件,并把思考过程以可理解的方式呈现给用户。
以上是三个面试环节所有问题的详细答案。以上答案是我借助ai加上自己的理解生成,如果有不正确的地方还望指出共同学习!!!