相关路线:本篇面向 AI 应用工程岗位。通用前端基础、框架原理和工程化准备请从前端面试题大全与复习路线开始;临近面试时可用前端面经汇总练习项目追问与系统设计表达。
这份题库是给正在或准备做 AI 方向的前端 / 全栈工程师准备的,重点放在真实面试常考、能直接用上工程的题目,而不是 ChatGPT 拽词汇说一遍就完事的概念题。
几条原则:
- 每道题都标了「考察点」,知道面试官真正想确认什么,比记标准答案更值钱。
- 答案尽量按面试节奏写:先用一两句话把结论说清,再补关键细节,再补一个能让对方点头的延伸或例子。
- 实在通用的概念题不会写得太啰嗦,真正决定差异化的,是工程实战那几节(Agent 架构、RAG、MCP、LangChain/LangGraph、前端集成、AI 提效)。
题量按主题排布,越往后越偏工程实操:
- 一、大模型基础(先把"是什么"打通)
- 二、Prompt 工程(最该练的硬功夫)
- 三、AI Agent 架构(高频且能拉开差距)
- 四、RAG 检索增强生成(ToB 项目几乎必问)
- 五、Function Calling 与 MCP(新一年最火的实战题)
- 六、Memory 与上下文管理(Agent 真正难的部分)
- 七、LangChain / LangGraph 框架(开源生态主战场)
- 八、模型微调 / 私有化部署 / ToB 落地(资深岗常问)
- 九、前端 AI 集成与工程化(前端的主场)
- 十、AI 提效篇(怎么用 AI 反过来帮自己干活)
- 十一、综合追问 & 场景题(拉差距的部分)
这一节别背太多概念,面试官真正想确认的是:你有没有过手感。每个点能说出一个自己见过的现象,胜过把维基百科背一遍。
30 秒速记
大语言模型本质上是一个自回归概率模型:读取上文,预测下一个 token,再循环生成后续内容。 过去的 NLP 模型通常为分类、翻译等单项任务分别训练,而 LLM 能通过 prompt 在多种任务间切换。模型规模扩大后会表现出推理、代码和跨语言能力,但这不等于它像人一样思考。涉及金额、权限或状态迁移时,我仍会交给确定性代码处理。
考察点:能否用一句话讲清,并知道它不是「智能」而是「概率」。
LLM 本质上是一个只会做一件事的概率模型:给一段上文,预测下一个 token 最可能是什么。把这个动作循环执行,就能输出一句话、一段代码、一篇文章。
它和过去 NLP 的区别有两点最关键:
一句话总结:本质是「自回归概率分布」+「大力出奇迹」,不要把它当成会思考的人。
更准确地说,文本先被 tokenizer 转成离散编号,模型通过 Transformer 的注意力层计算“当前位置应该关注前文哪些信息”,最后得到词表上每个候选 token 的概率分布。所谓聊天、写代码和翻译,底层都还是重复“读取当前上下文 → 预测一个 token → 把它追加回上下文”。模型能表现出任务迁移能力,是因为预训练把大量语言和代码模式压进了参数,并不意味着它在运行时拥有数据库、事实校验器或人的意图。
过去的专用 NLP 模型通常有明确输入输出:分类器输出类别,序列标注模型输出每个词的标签,翻译模型把源语言映射到目标语言。LLM 把任务描述、示例和输入统一写进上下文,减少了“一项任务训练一个模型”的成本,但也把稳定性问题转移到提示、评测和外部约束。需要百分百正确的金额计算、权限判断和状态迁移,仍应交给确定性代码。
type NextToken = { token: string; probability: number }
function greedyDecode(step: (context: string[]) => NextToken[], prompt: string[], max = 4) {
const context = [...prompt]
for (let index = 0; index < max; index += 1) {
const candidates = step(context).sort((a, b) => b.probability - a.probability)
const next = candidates[0]
if (!next || next.token === '<eos>') break
context.push(next.token)
}
return context
}
这段最小代码没有实现神经网络,却准确表达了解码不变量:每一轮的输出会成为下一轮输入。真实服务还要处理采样、停止条件、上下文上限与 KV Cache;如果没有终止标记或最大输出长度,自回归循环就可能持续生成。
面试官追问
不会,流畅表达来自基于上下文逐个预测 token,不等于模型具备事实校验器或可靠的业务意图。金额计算、权限判断和状态迁移应交给确定性代码,模型只负责理解与表达;否则一次合理但错误的生成就可能造成业务事故。
LLM 服务,你会怎样设计输入和验收,而不是只换一个接口?可把任务说明、示例和原始输入统一放进上下文,通过 prompt 让同一模型切换任务。验收仍要按分类、翻译和摘要分别准备样本与输出约束,因为通用能力减少了逐任务训练成本,却把稳定性压力转移到了提示、评测和外部约束。
LLM 的参数规模更大、回答也更自然,这能否作为放宽事实约束的理由?不能,规模带来的任务迁移和生成能力不代表运行时拥有公司的数据库或事实校验机制。仍应把检索材料放入上下文并校验引用和关键字段;更大的模型可能改善表达或推理表现,但无法单独提供百分百事实保证。
先检查是否设置最大输出长度和停止条件,以及模型是否能生成并正确识别 <eos>。自回归生成会把本轮输出追加到上下文再预测下一枚 token,缺少边界就可能持续运行;强行缩短上限能止损,但也可能截断完整代码。
LLM 与过去的 NLP 模型没有本质工程差异,你会如何用任务接口反驳?传统专用模型通常拥有明确的固定输入输出,例如分类器只返回类别,翻译模型只做源语言到目标语言的映射。LLM 则把任务描述、示例与数据一并放进上下文,用同一套自回归接口完成多类任务;代价是输出稳定性更依赖提示和约束。
30 秒速记
模型选型不能只看品牌,我会先按工具调用、长文本、多模态、私有化和成本等业务约束筛选。 长链路工具调用可优先评估 Claude,通用生态和多模态可看 GPT、Gemini,中文私有化则可测试 Qwen、DeepSeek。真正上线前,要用同一批业务样本比较成功率、延迟、成本和限流表现。生产环境还可以做模型路由,但备用模型必须通过相同的工具协议和结构化输出测试。
面试时别背版本号,记住选型口径:
| 选型角度 | 倾向哪家 |
|---|---|
| Agent / 工具调用 / 长任务稳定 | Claude(Anthropic) |
| 通用 + 生态最广 + 多模态 | GPT / OpenAI |
| 超长上下文 / 多模态 | Gemini |
| 开源 + 微调研究的事实标准 | LLaMA(Meta) |
| 开源 + 推理 / 代码 / 数学 | DeepSeek |
| 中文场景 / 国内私有化 | Qwen(阿里)、GLM(智谱) |
| 中文长文档 / 阅读理解 | Kimi(Moonshot) |
| 轻量 / 边缘 / 端侧部署 | Mistral / Phi / Gemma |
被追问"为什么这么选"时一定要说业务场景:
真正的选型不能靠品牌印象。先把业务样本划成事实问答、代码、长文、多模态、工具调用和安全拒答等集合,用同一份 system prompt、相同输出约束分别跑候选模型,记录任务成功率、TTFT、端到端延迟、输入输出成本和限流表现。模型版本会滚动更新,表格里的“谁更强”只能是待验证假设,不能当永久结论。
生产上通常还会做模型路由,而不是全量押注一家:简单分类走便宜的小模型,复杂推理升级到强模型,敏感数据走私有模型;主模型超时或限流时只能回退到通过相同契约测试的备选模型。回退模型若不支持相同工具协议或结构化输出,静默切换反而会扩大事故。
type Task = { kind: 'extract' | 'agent' | 'vision'; sensitive: boolean }
function routeModel(task: Task) {
if (task.sensitive) return { model: 'private-model', reason: '数据不得离开专网' }
if (task.kind === 'extract') return { model: 'fast-model', reason: '低成本结构化抽取' }
if (task.kind === 'vision') return { model: 'multimodal-model', reason: '需要图像输入' }
return { model: 'strong-tool-model', reason: '长链路工具调用' }
}