Skip to content

AI+Java中级开发面试题库 ​

生成时间: 2026-05-22 22:48
题目数量: 10道


本轮 AI+Java中级开发面试题库(带答案) ​

【面试题】1. 请解释Transformer架构中Self-Attention机制的工作原理,为什么它比RNN更适合处理长序列? ​

【标准答案】Self-Attention的核心是计算序列中每个词与其他所有词的相关性。具体来说,输入经过三个线性变换得到Query、Key、Value,然后计算Query和Key的点积并归一化,得到注意力权重,再对Value加权求和。

相比RNN,Self-Attention有三个优势:第一,并行计算能力强,RNN必须顺序处理,而Attention可以同时计算所有位置的关系;第二,长距离依赖问题得到解决,RNN随着序列增长信息会衰减,而Attention可以直接建模任意两个位置的关系,距离不会影响;第三,梯度传播更稳定,RNN容易出现梯度消失或爆炸,Attention则没有这个问题。这也是为什么现在的GPT、BERT等大模型都用Transformer架构的原因。

【面试题】2. ConcurrentHashMap在Java 8相比Java 7有什么重大改进?它是如何保证线程安全的? ​

【标准答案】Java 7的ConcurrentHashMap采用分段锁机制,把数据分成多个Segment,每个Segment一把锁,并发度受限于Segment数量。

Java 8做了重大改进,放弃了分段锁,改用CAS+synchronized锁单个Node。具体来说:插入时先用CAS尝试直接插入,失败则用synchronized锁住当前桶的头节点,粒度更细。另外,数据结构也从数组+链表升级为数组+链表+红黑树,当链表长度超过8时转红黑树,查询效率从O(n)提升到O(log n)。

这样做的好处是锁粒度更细,并发性能更好,内存占用也更少。这也是现在主流的做法。

【面试题】3. 在RAG系统中,什么是检索增强生成的"幻觉"问题?有哪些有效的解决方案? ​

【标准答案】幻觉问题指的是模型生成了与检索内容不符甚至编造事实的回答。原因有三个:检索到的文档不相关、模型过度依赖内部知识、或上下文整合不当。

解决方案主要有四类:第一,检索优化,用混合检索(关键词+向量)、重排序、提升Top-k文档相关性;第二,提示词优化,明确要求"仅根据提供的文档回答,不知道就说不知道";第三,生成后验证,让模型自我评估答案是否有依据,或用另一个模型做事实校验;第四,引入引用机制,要求答案标注来源段落,便于人工核查。

实际项目中,我建议从检索质量入手,因为垃圾进垃圾出,检索是RAG的地基。

【面试题】4. Spring Boot中@Autowired和@Resource有什么区别?你推荐使用哪种? ​

【标准答案】两者主要区别有三点:第一,来源不同,@Autowired是Spring提供的,@Resource是JDK标准注解(JSR-250);第二,注入方式不同,@Autowired默认按类型注入,配合@Qualifier按名称,@Resource默认按名称注入;第三,required属性,@Autowired支持required=false允许注入失败,@Resource不支持。

实际项目中的建议:如果只用Spring生态,推荐@Autowired配合构造器注入,代码更清晰、便于单元测试。如果要保持代码的可移植性(可能换其他DI框架),用@Resource。不过现在主流都是@Autowired,团队统一风格最重要。

【面试题】5. 设计一个AI Agent的工作流程,如何让Agent能够自主规划和执行任务? ​

【标准答案】一个完整的AI Agent需要四个核心组件:规划器、记忆系统、工具调用、反思机制。

工作流程是这样的:第一,用户输入任务后,规划器将任务拆解成子步骤,可以用思维链CoT或任务分解框架如Plan-and-Solve;第二,对于每个子任务,Agent判断是否需要调用外部工具(搜索、数据库查询、代码执行),通过Function Calling执行;第三,执行结果存入短期记忆或长期记忆向量库;第四,反思机制评估当前进度,如果失败则调整策略重试;第五,所有子任务完成后,整合结果输出给用户。

关键点在于让Agent有"自主性",比如加入ReAct框架(推理-行动循环),让模型自己决定下一步做什么。实际落地时,用LangChain的AgentExecutor或Spring AI的ChatClient都能快速实现。

【面试题】6. MySQL的索引什么时候会失效?能否举例说明? ​

【标准答案】索引失效是面试高频考点,常见情况有六种:

第一,对索引列使用函数或运算,比如WHERE YEAR(create_time) = 2024,索引失效;第二,隐式类型转换,比如字符串索引列传了数字参数;第三,LIKE以通配符开头,LIKE '%abc'失效,LIKE 'abc%'有效;第四,OR条件中有一个字段没有索引,整个索引失效;第五,联合索引不满足最左前缀原则,比如索引(a,b,c),WHERE b=1 AND c=2失效;第六,使用NOT、!=、<>、IS NOT NULL等否定条件。

实际排查用EXPLAIN,看type列是否为ALL或key列是否为NULL。开发中养成好习惯,写完SQL记得EXPLAIN一下。

【面试题】7. 什么是向量数据库?为什么在RAG系统中它比传统数据库更适合? ​

【标准答案】向量数据库是专门存储和检索高维向量嵌入的数据库,如Milvus、Pinecone、Chroma等。

在RAG场景下,向量数据库有三个核心优势:第一,语义检索能力,传统数据库做精确匹配或模糊查询,无法理解语义相似性,而向量数据库通过余弦相似度或欧氏距离,能找到语义相近的内容,比如"汽车"和"轿车"能匹配上;第二,检索效率高,向量数据库用ANN(近似最近邻)算法如HNSW、IVF,在百万级数据也能毫秒级返回;第三,专为AI设计,原生支持Embedding存储、元数据过滤、分布式扩展。

实际架构中,一般是向量数据库存Embedding做语义召回,再结合传统数据库做精确过滤,两者配合使用。

【面试题】8. 请解释Java中的Volatile关键字的作用和使用场景。 ​

【标准答案】Volatile有两个核心作用:保证可见性和禁止指令重排序。

可见性是指,当一个线程修改了volatile变量,其他线程能立即看到最新值。原理是修改后立即刷新到主内存,其他线程读取时从主内存重新加载。禁止重排序是通过内存屏障实现的,比如在DCL单例模式中,volatile防止对象初始化和引用赋值的重排序,避免其他线程拿到半初始化的对象。

使用场景主要有两类:一是状态标志位,比如volatile boolean running = true; 用于控制线程启停;二是DCL单例模式的双重检查锁。

但注意,volatile不能保证原子性,所以volatile i++这种场景是线程不安全的,得用AtomicInteger或锁。

【面试题】9. Redis如何实现分布式锁?Redlock算法解决了什么问题? ​

【标准答案】基础版分布式锁用SET key value NX PX milliseconds,NX保证不存在才设置,PX设置过期时间防死锁。释放锁用Lua脚本保证原子性:判断value是否一致再删除。

但基础版有问题:单点故障。如果Master加锁后挂了,锁没同步到Slave,另一个客户端又能加锁。Redlock算法解决了这个问题,核心思路是在多个独立的Redis实例上同时加锁,只有超过半数实例加锁成功才算成功。比如5个实例,需要至少3个成功。

实际项目中,更推荐用Redisson框架,它封装了Redlock,还提供看门狗机制自动续期,避免业务执行时间超过锁过期时间导致锁提前释放。

【面试题】10. 如何评估一个大模型在生产环境中的性能?有哪些关键指标? ​

【标准答案】评估大模型生产性能,从三个维度看:

第一,延迟指标,首字生成时间TTFT(Time to First Token)影响用户等待体验,一般要求<1秒;每秒生成Token数TPS,影响整体响应速度;端到端延迟P99,确保99%的请求在可接受时间内。

第二,吞吐量指标,QPS即每秒处理的请求数,并发用户数,GPU利用率(SM利用率和显存占用)。

第三,质量指标,虽然是性能但也很关键:准确率、幻觉率、回答相关性,可以用LLM-as-a-Judge让GPT-4打分。

优化手段包括:量化(FP16→INT8/INT4)、KV Cache优化、Batch策略调整、使用vLLM或TGI等推理框架。实际落地时,用Prometheus+Grafana监控这些指标,设置告警阈值。


题目分布: AI方向 5题 | Java方向 5题
覆盖维度: 技术基础(4题) | 架构设计(2题) | 场景实操(2题) | 性能优化(2题)