Skip to content

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. 同类内部调用

java
@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个方案→评估每个优缺点→选择最优→继续深化

核心区别:

维度CoTToT
搜索空间单路径多路径
计算成本低高
适用问题有明确解法需要探索权衡
实现复杂度简单需要多轮对话

实战建议:先用CoT验证思路,复杂问题再升级ToT。LangChain有现成的ToT实现。


【面试题】5. MySQL索引设计原则有哪些?什么情况下索引会失效? ​

【标准答案】

设计原则(最左前缀是核心):

  1. 选择性高的列优先:唯一性越高,索引效果越好
  2. 联合索引顺序:等值查询列在前,范围查询列在后
  3. 覆盖索引:查询列都在索引里,避免回表
  4. 前缀索引:长字符串用前缀,节省空间但无法排序

索引失效场景:

  1. 对索引列做运算:WHERE YEAR(create_time) = 2024
  2. 函数处理:WHERE LOWER(name) = 'abc'
  3. 隐式类型转换:字符串字段传数字WHERE phone = 13800138000
  4. LIKE左模糊:WHERE name LIKE '%张'
  5. OR连接非索引列:WHERE indexed_col = 1 OR non_indexed_col = 2
  6. 联合索引不满足最左前缀:索引(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度,适合户外活动

核心优势:

  1. 可解释:推理过程透明
  2. 可纠错:Observation能发现错误重新规划
  3. 可扩展:接入任意工具(搜索、计算器、API)

实战框架:LangChain的ReAct Agent、AutoGPT、BabyAGI都是这个思路。

面试加分:提到ReAct的"思维痕迹"可以用来优化提示词,也是一种Few-shot的数据来源。


【面试题】7. Redis实现分布式锁有哪些方案?各自的问题和解决方案是什么? ​

【标准答案】

方案一:SETNX

redis
SETNX lock:order 1
EXPIRE lock:order 10  # 设置过期时间

问题:两条命令不是原子的,SETNX成功后宕机会死锁。

方案二:SET扩展参数(推荐)

redis
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
  • 人工评估:最终兜底,但成本高

实战建议:

  1. 先用小数据集调参(chunk_size, top_k)
  2. RAGAS自动化评估
  3. 定期badcase分析优化

面试加分:提到"检索增强"不只是加文档,Embedding模型选择、重排序、查询改写都是优化点。


【面试题】9. Java线程池的核心参数有哪些?如何合理配置? ​

【标准答案】

七大核心参数:

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:有界,防止OOM
  • LinkedBlockingQueue:无界,慎用
  • 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很难救回来。


【本轮题目统计】

方向题号考点
AI1大模型原理-涌现能力
AI2向量数据库选型
AI4提示词工程-CoT/ToT
AI6AI Agent-ReAct框架
AI8RAG系统评估
AI10模型微调-LoRA
Java3Spring事务失效
Java5MySQL索引
Java7Redis分布式锁
Java9线程池配置

覆盖维度:技术基础、架构设计、场景实操、性能优化