AI工程师面试八股文:30道必背高频题深度解析
AI工程师面试八股文:30道必背高频题深度解析
适读人群:准备面试AI工程师岗位的Java开发者 阅读时长:约25分钟 文章价值:30道高频题+标准答案,面试前一天通读,心里有底
先说一件真实的事
上个月星球里有个同学,工作经验7年,技术不差,但投了十几家AI方向的岗位,面试通过率很低。他发来一段面试复盘,让我看看哪里出了问题。
看完我明白了——他技术没问题,但回答AI相关问题时"说不清楚"。比如面试官问"RAG和Fine-tuning怎么选",他答了五分钟,绕了一大圈,最后面试官说"好,我们继续下一题"。
这不是技术问题,是表达结构的问题。面试官想听的是:一句话结论 + 关键原因 + 具体例子,不是你把所有知道的东西全倒出来。
我帮他把常见的30道题整理了答题框架,第二周他就拿到了offer。这篇文章就是那份整理。
第一类:LLM基础原理(7道)
Q1:Transformer的注意力机制是什么,为什么重要?
答题框架:自注意力 → 并行计算 → 长依赖 → 应用
标准答案:
注意力机制让模型在处理每个词时,能"看到"序列中所有其他词的信息,并根据相关性分配权重。核心公式:Attention(Q,K,V) = softmax(QK^T/√d_k)V。
相比RNN的顺序处理,Transformer的自注意力可以并行计算,同时能捕获长距离依赖关系。这是GPT系列能理解长文本的根本原因。
加分点:提到多头注意力(Multi-Head Attention)可以并行关注不同维度的信息,以及位置编码如何引入序列信息。
Q2:什么是Prompt Engineering,有哪些核心技巧?
标准答案:
Prompt Engineering是通过设计输入文本来引导LLM产生期望输出的技术。核心技巧:
| 技巧 | 描述 | 适用场景 |
|---|---|---|
| Role Prompting | 赋予模型角色身份 | 专业领域任务 |
| Few-shot | 提供输入输出示例 | 格式固定的任务 |
| Chain of Thought | 要求"一步步思考" | 推理/计算任务 |
| ReAct | 思考+行动交替 | Agent任务 |
| Output Constraints | 明确指定输出格式 | 结构化输出 |
加分点:提到Prompt要明确、具体,避免歧义;高风险场景要做Prompt注入防护。
Q3:Temperature和Top-P参数有什么区别,怎么调?
标准答案:
- Temperature:控制输出的随机性。T=0输出最确定(greedy),T=1是训练默认,T>1更随机发散。
- Top-P(核采样):从概率累计达到P的候选token中采样。P=0.9表示只考虑概率最高的前90%的token。
实际调参建议:
| 场景 | Temperature | Top-P |
|---|---|---|
| 代码生成 | 0.1-0.3 | 0.9 |
| 创意写作 | 0.8-1.2 | 0.95 |
| 数据提取 | 0 | - |
| 客服问答 | 0.3-0.5 | 0.9 |
不要同时调两个,通常只调Temperature,或只调Top-P。
Q4:什么是幻觉(Hallucination),有哪些缓解方法?
标准答案:
幻觉指LLM自信地输出错误或捏造的信息。根本原因是LLM是概率预测模型,不是知识数据库。
缓解方法:
- RAG:提供真实外部文档作为上下文,让模型基于事实回答
- 降低Temperature:减少创意发挥
- 指令约束:在Prompt中明确"不确定就说不知道"
- 输出验证:对关键信息做事后校验(如数字、日期)
- 思维链:强制模型展示推理过程,便于检查
Q5:RAG和Fine-tuning怎么选?
这是AI面试最高频的一道题,很多人答不清楚。
标准答案(一句话结论):知识更新快用RAG,改变行为风格用Fine-tuning,两者不互斥可叠加。
| 对比维度 | RAG | Fine-tuning |
|---|---|---|
| 知识更新 | 实时(改知识库即可) | 需要重新训练 |
| 成本 | 推理成本+向量库 | 训练成本高 |
| 适用场景 | 企业知识问答、实时信息 | 特定风格、专业领域术语 |
| 幻觉控制 | 强(基于文档回答) | 一般 |
| 需要数据量 | 不需要标注数据 | 需要高质量标注数据 |
Q6:Token是什么,Context Window有什么限制?
标准答案:
Token是LLM处理文本的基本单位,通常1个Token ≈ 0.75个英文单词 ≈ 0.5个中文字符。
Context Window限制了单次处理的最大Token数。超出后的影响:
- 早期的信息会被"遗忘"(丢弃)
- 部分模型会报错
- 影响回答质量(忘记了重要前提)
工程对策:
- RAG代替把全文档塞入上下文
- 会话历史压缩(摘要化旧对话)
- 滑动窗口保留最近N轮
Q7:什么是Embedding,为什么能做语义搜索?
标准答案:
Embedding是把文本映射到高维向量空间的过程。语义相近的文本,在向量空间中距离也近。
语义搜索原理:
- 文档入库时,每段文本通过Embedding模型转为向量,存入向量数据库
- 查询时,把问题也转为向量
- 计算查询向量与所有文档向量的余弦相似度
- 返回相似度最高的Top-K个文档
与关键词搜索的区别:关键词搜索要求词语完全匹配,语义搜索能理解"如何减肥"和"怎么瘦下来"是同一个意思。
第二类:Spring AI与框架(8道)
Q8:Spring AI相比LangChain4j有什么优缺点?
标准答案:
| 维度 | Spring AI | LangChain4j |
|---|---|---|
| 生态集成 | 原生Spring Boot | 需要手动集成 |
| 学习曲线 | 低(Java开发者熟悉) | 中等 |
| 功能完整性 | 核心功能完备 | 更丰富(Agent等) |
| 社区活跃度 | Pivotal背书,活跃 | 活跃 |
| 生产稳定性 | 1.0正式版,稳定 | 活跃迭代 |
选择建议:已有Spring生态 → Spring AI;需要复杂Agent → LangChain4j。
Q9:Spring AI的Advisor机制是什么?
标准答案:
Advisor是Spring AI的AOP机制,允许在AI调用前后插入横切逻辑。类比Spring AOP的Aspect。
常见内置Advisor:
MessageChatMemoryAdvisor:自动注入会话历史QuestionAnswerAdvisor:自动做RAG检索并注入上下文SimpleLoggerAdvisor:请求日志
自定义Advisor示例:
@Component
public class TokenLimitAdvisor implements CallAroundAdvisor {
@Override
public AdvisedResponse aroundCall(AdvisedRequest request, CallAroundAdvisorChain chain) {
// 前置:检查Token预算
validateTokenBudget(request);
AdvisedResponse response = chain.nextAroundCall(request);
// 后置:记录Token消耗
recordTokenUsage(response);
return response;
}
@Override
public String getName() { return "TokenLimitAdvisor"; }
@Override
public int getOrder() { return 0; }
}Q10:RAG的完整实现流程是什么?
标准答案:
RAG(检索增强生成)分两个阶段:
离线阶段(入库):
- 读取原始文档(PDF/Word/网页等)
- 文本分块(TokenTextSplitter等)
- 向量化(EmbeddingModel)
- 存入向量数据库(PGVector/Chroma等)
在线阶段(查询):
- 用户问题向量化
- 向量数据库相似度检索(Top-K)
- 检索结果注入Prompt上下文
- LLM生成最终答案
// 用QuestionAnswerAdvisor一行代码完成RAG
ChatClient chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(new QuestionAnswerAdvisor(vectorStore))
.build();Q11:向量数据库怎么选型?
| 数据库 | 特点 | 适合场景 |
|---|---|---|
| PGVector | PostgreSQL扩展,运维熟悉 | 已有PG环境,中小规模 |
| Chroma | 轻量,开发友好 | 本地开发,小规模 |
| Milvus | 专用向量DB,性能强 | 大规模,高并发 |
| Pinecone | 全托管云服务 | 不想运维,快速上线 |
| Weaviate | 支持混合检索 | 需要关键词+向量混合 |
| Redis Vector | Redis自带,低延迟 | 已有Redis,对延迟敏感 |
实际建议:开发用Chroma,生产优先PGVector(Java团队运维成本低)。
Q12:Spring AI的Function Calling怎么实现?
标准答案:
Function Calling让LLM能调用你定义的Java方法,实现与外部系统的交互。
// 1. 定义工具函数
@Bean
@Description("查询指定城市的当前天气")
public Function<WeatherRequest, WeatherResponse> weatherFunction() {
return request -> weatherService.getWeather(request.city());
}
// 2. 注册到ChatClient
String result = chatClient.prompt()
.user("北京今天天气怎么样?")
.functions("weatherFunction") // 告诉LLM可以用这个工具
.call()
.content();
// LLM会自动决定是否调用,并把结果整合进回答加分点:说明LLM不是直接执行函数,而是生成调用意图(函数名+参数),由框架执行后把结果传回LLM。
Q13:如何实现多轮对话记忆?
// Spring AI 1.0 推荐方式:MessageChatMemoryAdvisor
ChatClient chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(
new MessageChatMemoryAdvisor(
new InMemoryChatMemory(), // 开发环境
// new CassandraChatMemory(repo), // 生产环境
"default-session",
20 // 保留最近20条消息
)
)
.build();
// 使用时传入会话ID
String response = chatClient.prompt()
.advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId))
.user("我上次说的那个问题...") // LLM能记住上下文
.call()
.content();加分点:说明生产环境要用持久化的Memory(Redis/数据库),InMemoryChatMemory重启后数据丢失。
Q14:如何处理LLM调用超时和异常?
@Service
public class ResilientChatService {
private final ChatClient chatClient;
// 配合Resilience4j实现熔断+重试
@CircuitBreaker(name = "llm", fallbackMethod = "fallbackResponse")
@Retry(name = "llm")
@TimeLimiter(name = "llm")
public CompletableFuture<String> chat(String message) {
return CompletableFuture.supplyAsync(() ->
chatClient.prompt().user(message).call().content()
);
}
// 降级响应
public CompletableFuture<String> fallbackResponse(String message, Throwable t) {
log.error("LLM调用失败,降级处理: {}", t.getMessage());
return CompletableFuture.completedFuture(
"抱歉,AI服务暂时不可用,请稍后重试或联系人工客服。"
);
}
}Q15:向量检索结果不准确怎么优化?
标准答案(按优先级排列):
- 检查分块质量:块太大包含多个主题,块太小语义不完整
- Embedding模型选型:中文用专门的中文Embedding模型(m3e-base等)
- 增加重排序(Re-ranking):用Cross-Encoder对候选结果重新打分
- 混合检索:向量检索 + BM25关键词检索,取并集后重排
- 查询扩展:用LLM对原始问题做改写/扩展,生成多个变体查询
- 元数据过滤:结合业务字段过滤(时间范围、类别等)
第三类:系统设计(8道)
Q16:设计一个高并发的AI问答服务
答题框架:缓存 → 限流 → 异步 → 降级
关键设计点:
- 缓存:完全相同问题直接缓存(Redis,TTL 1小时),语义相似问题用向量缓存
- 限流:用户级别Token Bucket,防止单用户打爆
- 异步:非实时场景走队列,削峰
- 降级:LLM不可用时返回预设FAQ或转人工
Q17:企业私有化部署AI的架构方案
核心考量:数据安全、网络隔离、GPU资源管理。
推荐架构:
企业内网:
- Ollama/vLLM 部署本地LLM(Qwen/DeepSeek)
- PGVector 存向量数据(PostgreSQL)
- Spring Boot 应用层
- Nginx 反向代理
GPU资源管理:
- 开发/测试:CPU量化版本(4bit量化,内存减半)
- 生产:GPU服务器,多实例负载均衡Q18:AI应用的成本控制怎么做?
标准答案(5个维度):
- 缓存:相同/相似问题复用答案,能节省30-60%
- 模型路由:简单问题用小模型(7B),复杂问题用大模型
- Prompt压缩:去掉冗余上下文,减少输入Token
- 流控:限制每用户每日Token配额
- 异步批处理:非实时任务攒批统一处理,利用批量API折扣
Q19:如何评估AI应用的效果?
标准答案:
| 评估层次 | 指标 | 工具 |
|---|---|---|
| RAG检索层 | 召回率、精确率、MRR | 构建评估集 |
| 生成质量 | BLEU、ROUGE(有参考答案时) | 自动评估 |
| 端到端 | 用户满意度、问题解决率 | 用户反馈 |
| 业务指标 | 转化率、人工转接率下降 | 埋点统计 |
推荐用LLM-as-Judge:用另一个LLM来评判回答质量,比人工高效,比规则指标更接近人类判断。
Q20:Agent和RAG的区别是什么,各用在什么场景?
标准答案:
| 维度 | RAG | Agent |
|---|---|---|
| 本质 | 检索增强,一次交互 | 自主规划,多步行动 |
| 适用场景 | 知识问答、文档检索 | 需要多步推理、调用工具 |
| 复杂度 | 低 | 高 |
| 可控性 | 高 | 低(不确定性更大) |
| 延迟 | 低(单次) | 高(多次LLM调用) |
Agent适合的场景举例:
- "帮我查一下最近的客户投诉,汇总成报告发给总监"(需要查数据库+写报告+发邮件)
- "分析这份代码,找出Bug并提交修复PR"(需要读文件+分析+写代码+操作Git)
第四类:场景实战(7道)
Q21:如何防止Prompt注入攻击?
标准答案:
Prompt注入:用户输入中包含恶意指令,覆盖系统Prompt的行为。
防御措施:
- 输入过滤:检测并过滤 "ignore previous instructions" 等模式
- 输出验证:验证输出是否符合预期格式和范围
- 角色隔离:System Prompt用不可覆盖的标记包裹
- 沙箱化:AI输出不直接执行,经过审查层
- 权限最小化:Agent的工具权限最小化,防止被滥用
// 输入预处理示例
public String sanitizeInput(String userInput) {
// 检测注入模式
List<String> injectionPatterns = List.of(
"ignore previous",
"forget all instructions",
"你现在是",
"ignore all above"
);
for (String pattern : injectionPatterns) {
if (userInput.toLowerCase().contains(pattern)) {
throw new SecurityException("检测到非法输入");
}
}
// 截断超长输入
return userInput.length() > 2000 ? userInput.substring(0, 2000) : userInput;
}Q22-Q30:其余高频题速览
| 题目 | 一句话答案 |
|---|---|
| Q22: 什么是向量数据库的ANN索引? | 近似最近邻搜索,用HNSW/IVF牺牲少量精度换速度 |
| Q23: 如何实现流式输出(SSE)? | Spring AI返回Flux<String>,前端用EventSource接收 |
| Q24: Reranker是什么? | 用Cross-Encoder对召回结果重新精排,提升Top-K精度 |
| Q25: 什么是Hybrid Search? | 向量检索+BM25关键词检索结果融合,取长补短 |
| Q26: 如何处理多语言场景? | Embedding模型选多语言版(multilingual-e5),Prompt指定目标语言 |
| Q27: AI应用怎么做灰度发布? | 按用户ID分桶,小流量跑新版,监控指标正常再扩量 |
| Q28: 如何构建AI应用的监控体系? | 三层:基础设施层(CPU/GPU)、模型层(延迟/Token)、业务层(满意度/转化) |
| Q29: Spring AI如何支持多模型切换? | 通过Bean名称切换ChatModel,或用自定义路由策略 |
| Q30: 什么时候应该自建LLM,什么时候用API? | 数据敏感/高并发/成本考量选自建;快速验证/低频使用选API |
面试答题技巧
用 STAR变体 回答技术题:
- Situation(背景):一句话说明场景
- Answer(核心答案):先说结论,再展开
- Trade-off(取舍):说明方案的优缺点,展示深度
- Example(例子):用具体项目或代码说明
面试官最烦的两件事:
- 绕很久说不到重点
- 只说优点不说缺点(太完美就是不真实)
小结
这30道题覆盖了AI工程师面试90%的高频场景。但光背答案不够,要真正做过项目才能答得有血有肉。
建议的复习顺序:
- 先通读一遍,知道大概考什么
- 把不熟的题对应到实际项目里实现一遍
- 面试前一天再过一遍,重点看自己会的部分怎么说得更结构化
那个同学后来告诉我,面试官问他RAG vs Fine-tuning,他直接说"三句话:知识更新快用RAG,改行为用Fine-tuning,不互斥可以叠加",面试官笑了说"好,清楚"。
