本轮 AI+Java中级开发面试题库(带答案)
生成时间:2026-05-20 23:17
【面试题】1. Transformer中Self-Attention的计算复杂度是多少?在实际大模型推理中如何优化?
【标准答案】Self-Attention的计算复杂度是O(n²·d),其中n是序列长度,d是向量维度。n²来源于每个token要与所有token计算注意力分数。实际优化主要几个方向:一是KV Cache,推理时缓存已算出的Key和Value矩阵,避免重复计算,这是最基础也最有效的手段;二是Flash Attention,通过分块计算减少HBM读写次数,实际推理速度提升2-4倍;三是MQA/GQA,多查询注意力让多个Head共享一组KV,减少KV Cache显存占用;四是PagedAttention(vLLM),把KV Cache分页管理,解决显存碎片问题,提升并发吞吐。面试时重点说清KV Cache原理+Flash Attention思路就够了。
【面试题】2. ConcurrentHashMap在JDK 1.7和1.8中的实现有什么区别?1.8中size()方法怎么保证准确?
【标准答案】JDK 1.7用Segment分段锁,整个Map分成16个Segment,每个Segment继承ReentrantLock,锁粒度是Segment级别。1.8抛弃了Segment,改用Node数组+cas+synchronized,锁粒度降到单个桶(数组元素),并发度从固定16提升到数组长度。put时先尝试cas写入空桶,失败再用synchronized锁住头节点,效率更高。1.8的size()方法用的是LongAdder思路——先尝试不加锁累加baseCount和CounterCell数组,如果前后两次结果一致就返回,不一致再锁所有段精确统计。大多数情况下无锁就能拿到准确值,性能很好。
【面试题】3. RAG系统中检索到的文档和用户问题相关度不高怎么解决?请说出至少3种方案。
【标准答案】这是RAG落地的核心痛点。第一种:优化Embedding模型,用领域数据微调Embedding,或者换更强的模型如bge-large-zh-v1.5,领域内召回率提升明显。第二种:加HyDE(Hypothetical Document Embedding),先让LLM根据问题生成假设性答案,再用假设答案去检索,因为假设答案和真实文档的语义空间更接近。第三种:混合检索,向量检索+BM25关键词检索取并集再Rerank,关键词检索能兜底精确匹配场景。第四种:加Reranking层,用Cross-Encoder对初筛结果重排序,Top-K精度显著提升。第五种:优化Chunk策略,别无脑按固定字数切,按语义段落切,加overlap,保证上下文完整性。实际项目建议组合使用:混合检索+Rerank是最常见的有效组合。
【面试题】4. JVM中一次完整的GC流程是怎样的?什么情况下会触发Full GC?
【标准答案】JVM默认分代收集。新对象分配在Eden区,Eden满触发Minor GC(YGC),存活对象复制到Survivor区,年龄+1,达到阈值(默认15)晋升老年代。老年代空间不足时触发Major GC/Full GC。触发Full GC的典型场景:一是老年代空间不足,大对象直接进老年代或长期存活对象撑满;二是System.gc()被调用(建议但不强制);三是元空间(Metaspace)不足;四是新生代晋升时老年代放不下(Promotion Failure);五是CMS GC时出现Concurrent Mode Failure(并发标记期间老年代满了,退化为Serial Old)。面试重点说清分代逻辑和Full GC触发条件,顺便提一下避免Full GC的思路:调大新生代、减少大对象分配、避免内存泄漏。
【面试题】5. Spring AI中如何实现一个多轮对话的ChatClient?对话历史怎么管理?
【标准答案】Spring AI的ChatClient支持ChatMemory管理对话上下文。核心用法:先创建ChatClient.builder(chatModel).build(),然后通过.advisor(new MessageChatMemoryAdvisor(chatMemory))注入记忆。ChatMemory有几种实现:InMemoryChatMemory适合单机开发测试;RedisChatMemory适合生产环境分布式部署。多轮对话的关键是每次请求把之前的消息列表带上,MessageChatMemoryAdvisor自动从ChatMemory中取历史消息拼接到Prompt里。注意Token上限问题,历史消息太长要截断,可以设maxMessages限制保留最近N轮,或者用摘要压缩策略。生产中还要注意多用户隔离,每个用户/会话用不同的conversationId。
【面试题】6. Redis分布式锁用SETNX实现有什么问题?Redisson是怎么解决的?
【标准答案】裸SETNX有几个经典问题:一是锁过期但业务没执行完,锁被别人拿到导致并发问题;二是客户端宕机锁无法释放造成死锁(加过期时间可解决但引入问题一);三是集群主从切换时锁丢失,主节点加锁后未同步到从就宕机,从升主后锁丢失。Redisson的解决方案:针对问题一,Redisson用看门狗(Watchdog)机制,默认锁30秒,后台线程每10秒(1/3时间)自动续期,业务没完成锁不会过期;针对问题三,Redisson有RedLock算法,向多个独立Redis实例加锁,多数成功才算获取锁。实际项目中推荐直接用Redisson的RLock,别手写SETNX。RedLock在实际中用得少,因为延迟高且争议大,单实例Redisson够用。
【面试题】7. 什么是AI Agent?它和普通的LLM调用有什么本质区别?
【标准答案】普通LLM调用是单次请求-响应,模型只负责生成文本,没有自主行动能力。AI Agent的核心区别是有自主决策和行动的循环:感知→规划→行动→观察→再规划,直到任务完成。关键组件:一是Tools/工具调用,Agent能调用搜索引擎、数据库、API等外部工具获取信息或执行操作;二是Memory,短期记忆(对话上下文)和长期记忆(向量库中的知识);三是Planning,能拆解复杂任务为子步骤,ReAct框架就是经典实现——Reasoning+Acting交替进行;四是自主性,Agent自己判断下一步做什么,不需要人每步指挥。举个实际例子:用户说"帮我分析竞品",普通LLM只能给分析框架,Agent会自己搜索竞品信息→提取数据→生成报告→保存文档,全程自主完成。
【面试题】8. MySQL中什么情况下索引会失效?列举至少5种常见场景。
【标准答案】索引失效是SQL优化的核心考点。常见场景:一,最左前缀原则违反,联合索引(a,b,c)查b或c不走索引;二,对索引列做函数运算,如WHERE YEAR(create_time)=2024,create_time索引失效,应改范围查询;三,隐式类型转换,varchar列用int查如WHERE phone=13800000000,MySQL会转列值导致索引失效;四,LIKE以通配符开头,如LIKE '%abc'不走索引,'abc%'可以;五,OR条件中有无索引列,如WHERE indexed_col=1 OR non_indexed=2,整个条件索引失效;六,NOT IN、NOT EXISTS、!=在某些场景下优化器判断全表扫描更快时放弃索引;七,数据量太小或区分度太低(如性别字段),优化器觉得全表扫更快直接不走。面试时重点说前五种,再补一句:用EXPLAIN看执行计划最靠谱。
【面试题】9. 提示词工程中Chain-of-Thought(CoT)和Few-Shot分别是什么?在什么场景下选择哪种?
【标准答案】CoT是在Prompt中引导模型逐步推理,典型方式是加"请一步步思考"或给出推理示例让模型模仿推理过程。CoT适用于需要多步推理的任务:数学计算、逻辑推理、复杂分析,效果提升显著,GSM8K上准确率可以从17%提到58%。Few-Shot是给几个输入输出示例让模型理解任务格式和风格,适用于输出格式固定、任务模式明确的场景,如文本分类、信息提取、格式转换。两者可以组合使用:Few-Shot CoT,给几个带推理过程的示例,效果最好。选择建议:简单格式化任务用Few-Shot就够了,复杂推理任务必须CoT,最强方案是Few-Shot+CoT组合。另外Zero-Shot CoT(只加"Let's think step by step")也有不错效果,适合不想构造示例的快速场景。
【面试题】10. Kafka如何保证消息不丢失?从Producer、Broker、Consumer三个角度说明。
【标准答案】Producer端:设置acks=all(或-1),确保消息写入所有ISR副本才返回成功;配合retries和retry.backoff.ms做重试;启用幂等性enable.idempotence=true防止重试导致重复。Broker端:min.insync.replicas=2,至少2个副本确认才算写入成功,配合acks=all形成双保险;unclean.leader.election.enable=false,禁止非ISR副本成为Leader,防止数据丢失;replication.factor≥3保证副本冗余。Consumer端:关闭自动提交enable.auto.commit=false,业务处理完成后再手动提交offset;用幂等消费或去重表防止重复消费。面试重点说清三者配合:Producer的acks=all+Broker的min.insync.replicas是核心防线,Consumer的手动提交是兜底。三者缺一不可。