AI+Java中级开发面试题库(带答案)
生成时间: 2026-05-24 19:32
题目数量: 10题
覆盖范围: AI方向 + Java中级方向
【面试题】1. 请解释大模型的"涌现能力"现象,并举例说明在什么情况下会出现?
【标准答案】
涌现能力是指模型在规模达到一定阈值后,突然展现出小模型完全不具备的能力。这不是渐进式提升,而是"质变"。
典型例子:
- 思维链推理:小模型随机猜,大模型能逐步推理
- 指令遵循:小模型听不懂复杂指令,大模型能精准执行
- 少样本学习:给几个例子就能学会新任务
关键点是规模阈值——不是越大越好,而是要跨过临界点。比如Chain-of-Thought在模型参数超过100亿后才显著涌现。
面试加分点:可以提到"Scale is all you need"的观点,但也要指出涌现的不可预测性是目前AI研究的难点。
【面试题】2. RAG中的向量数据库选型,你会考虑哪些因素?对比Milvus、Pinecone和Chroma?
【标准答案】
选型核心维度:
1. 部署模式
- Pinecone:纯托管,零运维,适合快速落地
- Milvus:自托管或云托管,灵活但需运维
- Chroma:轻量级,适合原型和小规模场景
2. 性能规模
- Pinecone:亿级向量,毫秒级延迟
- Milvus:十亿级,支持分布式扩展
- Chroma:百万级以下,单机场景
3. 功能特性
- Milvus:支持标量过滤、混合查询最全
- Pinecone:自动扩缩容、多可用区
- Chroma:API最简洁,开发体验好
实战建议:
- POC阶段:Chroma快速验证
- 生产环境:Pinecone省心,Milvus省钱(数据量大时)
- 特殊需求:需要混合查询选Milvus
【面试题】3. Spring Boot中@Transactional注解在什么情况下会失效?如何避免?
【标准答案】
失效场景我总结为"五个坑":
1. 方法不是public
- 原因:Spring AOP代理只拦截public方法
- 解决:改成public或用AspectJ编译时织入
2. 同类内部调用
@Service
public class OrderService {
public void placeOrder() {
this.createOrder(); // 直接调用,绕过代理
}
@Transactional
public void createOrder() {}
}- 解决:注入自己或用AopContext.currentProxy()
3. 异常被吞掉
- 默认只回滚RuntimeException和Error
- checked异常不回滚
- 解决:
@Transactional(rollbackFor = Exception.class)
4. 数据库引擎不支持
- MySQL的MyISAM不支持事务
- 解决:用InnoDB
5. 传播行为设置错误
REQUIRES_NEW会挂起当前事务- 嵌套事务用
NESTED(需要数据库支持savepoint)
面试加分:提一下事务传播机制的7种行为,以及分布式事务场景下@Transactional的局限性。
【面试题】4. 提示词工程中的"思维链(CoT)"和"思维树(ToT)"有什么区别?分别适用什么场景?
【标准答案】
思维链(Chain-of-Thought):
- 单线推理:一步一步往下走
- 适合:数学计算、逻辑推理、代码调试
- 示例:"请一步步思考:小明有5个苹果,吃了2个,妈妈又给了3个..."
思维树(Tree-of-Thought):
- 多分支探索:生成多个可能路径,评估后选择最优
- 适合:创意写作、复杂决策、博弈问题
- 示例:生成3个方案→评估每个优缺点→选择最优→继续深化
核心区别:
| 维度 | CoT | ToT |
|---|---|---|
| 搜索空间 | 单路径 | 多路径 |
| 计算成本 | 低 | 高 |
| 适用问题 | 有明确解法 | 需要探索权衡 |
| 实现复杂度 | 简单 | 需要多轮对话 |
实战建议:先用CoT验证思路,复杂问题再升级ToT。LangChain有现成的ToT实现。
【面试题】5. MySQL索引设计原则有哪些?什么情况下索引会失效?
【标准答案】
设计原则(最左前缀是核心):
- 选择性高的列优先:唯一性越高,索引效果越好
- 联合索引顺序:等值查询列在前,范围查询列在后
- 覆盖索引:查询列都在索引里,避免回表
- 前缀索引:长字符串用前缀,节省空间但无法排序
索引失效场景:
- 对索引列做运算:
WHERE YEAR(create_time) = 2024 - 函数处理:
WHERE LOWER(name) = 'abc' - 隐式类型转换:字符串字段传数字
WHERE phone = 13800138000 - LIKE左模糊:
WHERE name LIKE '%张' - OR连接非索引列:
WHERE indexed_col = 1 OR non_indexed_col = 2 - 联合索引不满足最左前缀:索引(a,b,c),查询WHERE b=1
面试加分:提一下EXPLAIN看执行计划,type字段从好到坏:system > const > eq_ref > ref > range > index > ALL。
【面试题】6. AI Agent中的ReAct框架是什么?它如何解决传统Prompt的局限性?
【标准答案】
ReAct = Reasoning + Acting,是Agent的核心框架。
传统Prompt的局限:
- 只能基于已有知识回答
- 无法获取实时信息
- 无法执行实际操作
ReAct的工作流程:
Thought: 我需要查今天北京的天气
Action: search("北京天气 2026年5月24日")
Observation: 晴,气温28°C
Thought: 用户可能想知道是否适合户外活动
Action: 完成
Answer: 今天北京晴天28度,适合户外活动核心优势:
- 可解释:推理过程透明
- 可纠错:Observation能发现错误重新规划
- 可扩展:接入任意工具(搜索、计算器、API)
实战框架:LangChain的ReAct Agent、AutoGPT、BabyAGI都是这个思路。
面试加分:提到ReAct的"思维痕迹"可以用来优化提示词,也是一种Few-shot的数据来源。
【面试题】7. Redis实现分布式锁有哪些方案?各自的问题和解决方案是什么?
【标准答案】
方案一:SETNX
SETNX lock:order 1
EXPIRE lock:order 10 # 设置过期时间问题:两条命令不是原子的,SETNX成功后宕机会死锁。
方案二:SET扩展参数(推荐)
SET lock:order "uuid" NX EX 10原子操作,解决死锁问题。
方案三:Redisson(生产推荐)
- 看门狗机制:自动续期
- 可重入锁:同一线程可多次获取
- 红锁:多节点防止单点故障
核心问题及解决:
| 问题 | 解决方案 |
|---|---|
| 死锁 | 设置过期时间 |
| 误删别人的锁 | 用UUID标识,释放时校验 |
| 过期时间不好估计 | Redisson看门狗自动续期 |
| 主从切换丢锁 | 红锁(RedLock)多节点 |
| 锁竞争激烈 | 分段锁、乐观锁 |
面试加分:提到Redis分布式锁的"不可靠"场景,比如GC停顿导致锁过期,极端情况用ZooKeeper。
【面试题】8. 如何评估一个RAG系统的效果?有哪些核心指标?
【标准答案】
RAG评估分两层:检索质量 + 生成质量。
检索层指标:
- 召回率(Recall):相关文档找回的比例
- 精确率(Precision):找回文档中相关的比例
- MRR:第一个相关文档的排名倒数
- MRR@K:前K个结果中第一个相关文档的位置
生成层指标:
- 忠实度(Faithfulness):答案是否基于检索内容,无幻觉
- 答案相关性:答案是否回答了问题
- 上下文精确度:检索内容是否精炼不冗余
评估框架:
- RAGAS:开源评估框架,自动化打分
- TruLens:支持LLM评估LLM
- 人工评估:最终兜底,但成本高
实战建议:
- 先用小数据集调参(chunk_size, top_k)
- RAGAS自动化评估
- 定期badcase分析优化
面试加分:提到"检索增强"不只是加文档,Embedding模型选择、重排序、查询改写都是优化点。
【面试题】9. Java线程池的核心参数有哪些?如何合理配置?
【标准答案】
七大核心参数:
ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 非核心线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 工作队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
)配置原则:
1. 线程数配置
- CPU密集型:
corePoolSize = CPU核心数 + 1 - IO密集型:
corePoolSize = CPU核心数 * (1 + 等待时间/计算时间) - 混合型:分开成两个线程池
2. 队列选择
ArrayBlockingQueue:有界,防止OOMLinkedBlockingQueue:无界,慎用SynchronousQueue:直接提交,适合任务快
3. 拒绝策略
AbortPolicy:抛异常(默认)CallerRunsPolicy:调用者执行DiscardOldestPolicy:丢弃最老任务DiscardPolicy:静默丢弃
监控指标:
getActiveCount():活跃线程getQueue().size():队列堆积getCompletedTaskCount():完成任务数
面试加分:提到Spring的@Async默认用SimpleAsyncTaskExecutor(每次新建线程),生产要自定义线程池。
【面试题】10. 大模型微调的LoRA方法是什么原理?相比全量微调有什么优势?
【标准答案】
原理:LoRA(Low-Rank Adaptation)用低秩分解冻结原模型,只训练两个小矩阵。
传统微调:W = W₀ + ΔW,ΔW是满秩矩阵,参数量=原模型。
LoRA:ΔW = B × A,B是d×r,A是r×d,r<<d。
举个例子:
- 原模型权重:4096×4096 = 16M参数
- LoRA(r=8):4096×8 + 8×4096 = 65K参数
- 参数量减少250倍!
核心优势:
| 维度 | 全量微调 | LoRA |
|---|---|---|
| 显存占用 | 100GB+ | 20GB内 |
| 训练速度 | 慢 | 快3-5倍 |
| 模型切换 | 需要多个大模型 | 共享基座+多个小adapter |
| 效果 | 最优 | 接近最优(r够大时) |
实战应用:
- QLoRA:4bit量化+LoRA,单卡微调65B模型
- 多任务场景:一个基座模型+多个LoRA adapter
- 推理时:
W = W₀ + α × B × A,α控制适配强度
面试加分:提到LoRA的局限——对基座模型能力要求高,如果基座不懂中文,LoRA很难救回来。
【本轮题目统计】
| 方向 | 题号 | 考点 |
|---|---|---|
| AI | 1 | 大模型原理-涌现能力 |
| AI | 2 | 向量数据库选型 |
| AI | 4 | 提示词工程-CoT/ToT |
| AI | 6 | AI Agent-ReAct框架 |
| AI | 8 | RAG系统评估 |
| AI | 10 | 模型微调-LoRA |
| Java | 3 | Spring事务失效 |
| Java | 5 | MySQL索引 |
| Java | 7 | Redis分布式锁 |
| Java | 9 | 线程池配置 |
覆盖维度:技术基础、架构设计、场景实操、性能优化