Skip to content

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

生成时间:2026-05-24 20:29 题目数量:10道 AI:Java 比例:5:5


【面试题】1. 请解释大语言模型中的"幻觉"现象,以及在实际项目中如何有效降低幻觉风险? ​

【标准答案】 幻觉是指大模型生成看似合理但实际上不准确或虚构的内容。原因主要有:模型训练数据中的噪声、生成式模型的概率特性、以及上下文理解偏差。

在项目中降低幻觉的实用方法:

  • RAG检索增强:引入外部知识库,让模型基于真实文档回答,而不是依赖参数记忆
  • 提示词约束:明确要求"如果不确定,请直接说不知道",并设置温度参数为较低值(如0.3)
  • 多轮验证:对关键回答使用模型自反思,让模型检查自己的答案
  • 引用溯源:要求模型在回答时标注信息来源,方便人工核查

我之前做的智能客服项目中,通过接入企业知识库做RAG,幻觉率从20%降到了5%以下。


【面试题】2. Java中synchronized和ReentrantLock有什么区别?什么场景下会选择ReentrantLock? ​

【标准答案】 核心区别有四点:

  1. 实现层面:synchronized是JVM层面的关键字,ReentrantLock是JUC包下的API类
  2. 锁获取方式:synchronized自动加锁解锁,ReentrantLock需要手动lock()和unlock(),必须在finally中释放
  3. 功能特性:ReentrantLock支持公平锁选择、可中断锁获取、尝试非阻塞获取锁,synchronized不支持
  4. 性能:JDK6之后synchronized做了大量优化,性能差距不大,但高竞争场景下ReentrantLock更稳定

选择ReentrantLock的场景:

  • 需要公平锁保证顺序
  • 需要tryLock尝试获取,获取不到要有降级逻辑
  • 需要响应中断,避免死等
  • 需要配合Condition实现精细的线程通信

实际项目里,如果是简单同步,用synchronized更简洁;涉及复杂锁逻辑时,用ReentrantLock。


【面试题】3. 什么是RAG(检索增强生成)?它解决了大模型应用的哪些痛点? ​

【标准答案】 RAG是Retrieval-Augmented Generation的缩数,核心思路是:先从知识库检索相关文档,再把文档作为上下文喂给大模型,让模型基于检索结果生成答案。

解决的痛点:

  • 知识时效性:大模型训练有截止日期,RAG可以接入最新数据,比如今天的新闻、最新的产品文档
  • 领域专业性:企业私有数据没在模型训练集中,RAG可以让模型"学会"企业的业务规则和技术文档
  • 幻觉问题:有检索结果作为"证据",模型生成的答案更可靠,还能溯源引用
  • 成本控制:不用为了新知识重新训练模型,检索即用,成本远低于微调

典型流程:用户提问 → 向量化 → 向量数据库检索top-K → 文档片段拼接prompt → 大模型生成答案。


【面试题】4. Spring Boot中@Autowired和@Resource有什么区别?实际开发推荐用哪个? ​

【标准答案】 区别主要有三点:

  1. 来源:@Autowired是Spring自带的,@Resource是JSR-250标准,来自JDK
  2. 注入方式:@Autowired默认按类型注入,配合@Qualifier可以按名称;@Resource默认按名称注入
  3. 依赖性:@Autowired必须要有Spring容器支持,@Resource更通用,其他容器也能用

实际开发推荐用@Autowired,原因:

  • Spring生态更统一,IDE支持更友好
  • 配合构造器注入(Spring 4.3+可省略@Autowired),代码更简洁,也能明确依赖关系
  • 单元测试时Mock更方便

不过如果是跨框架项目,或者要遵循JDK标准规范,@Resource也可以。


【面试题】5. 设计一个AI Agent系统,能够自动分析用户问题、调用合适工具并给出答案,请描述核心架构。 ​

【标准答案】 AI Agent的核心架构分五个模块:

  1. 意图理解模块:大模型解析用户输入,识别任务类型(查询类、操作类、分析类等)

  2. 工具调度模块(Tool Router):

    • 维护工具注册表(API、数据库、代码执行器等)
    • 大模型根据任务规划,选择调用哪些工具
    • 典型框架:LangChain的Agent + Tools,或Spring AI的Function Calling
  3. 执行引擎:实际调用工具,获取结果,处理异常和超时

  4. 记忆模块:

    • 短期记忆:当前对话的上下文
    • 长期记忆:向量数据库存储历史交互和知识
  5. 输出模块:汇总工具执行结果,大模型生成自然语言回复

关键技术点:

  • 提示词工程:设计System Prompt,引导模型遵循ReAct(Reasoning + Acting)范式
  • 工具描述:每个工具的描述要清晰,让模型知道何时调用、如何传参
  • 容错机制:工具调用失败时,要有重试或降级策略

【面试题】6. MySQL索引什么情况下会失效?请列举常见场景和优化建议。 ​

【标准答案】 索引失效的常见场景:

  1. LIKE以通配符开头:如LIKE '%abc',索引失效;LIKE 'abc%'可以走索引
  2. 索引列参与计算:WHERE age + 1 = 30,对age列的计算导致索引失效
  3. 函数作用于索引列:WHERE DATE(create_time) = '2024-01-01',函数导致失效
  4. 隐式类型转换:字段是varchar,查询用数字,如WHERE phone = 13800138000(phone是varchar)
  5. 负向查询:NOT IN、!=、<>、NOT EXISTS通常不走索引
  6. OR连接非索引列:WHERE indexed_col = 1 OR non_indexed_col = 2
  7. 索引列使用IS NULL或IS NOT NULL:部分场景失效,取决于数据分布

优化建议:

  • LIKE查询避免前缀通配,考虑用全文索引或Elasticsearch
  • 计算放到应用层,SQL保持索引列"纯净"
  • 用函数索引(MySQL 8.0+)或虚拟列
  • 保证类型一致,避免隐式转换
  • OR场景考虑拆分成UNION ALL

【面试题】7. 向量数据库(如Milvus/Pinecone)在AI应用中起什么作用?与传统数据库有什么区别? ​

【标准答案】 向量数据库专门用于存储和检索高维向量数据,在AI应用中的核心作用:

  • 相似度搜索:快速找到与查询向量最相似的top-K结果,用于RAG、推荐系统、图像检索
  • 语义匹配:把文本、图片转成向量后,相似语义的内容向量距离也近
  • 大规模检索:传统数据库无法高效处理百万级向量的相似度计算,向量数据库用ANN(近似最近邻)算法优化

与传统数据库的区别:

维度传统数据库向量数据库
数据类型结构化数据(表、行、列)向量(浮点数组)
查询方式精确匹配(WHERE、JOIN)相似度匹配(余弦距离、欧氏距离)
索引结构B+树、哈希HNSW、IVF、PQ等向量索引
典型场景事务处理、报表RAG、推荐、图像搜索

典型流程:文本 → Embedding模型(如text-embedding-ada-002) → 向量 → 存入向量库 → 查询时做相似度检索。


【面试题】8. 请解释JVM的垃圾回收算法,CMS和G1收集器有什么区别? ​

【标准答案】 主流垃圾回收算法:

  • 标记-清除:标记存活对象,清除未标记的。缺点:内存碎片
  • 标记-整理:标记后把存活对象移到一端。优点:无碎片,适合老年代
  • 复制算法:分成两块,把存活对象复制到另一块。优点:简单高效,适合新生代
  • 分代收集:新生代用复制,老年代用标记-整理或CMS

CMS(Concurrent Mark Sweep):

  • 目标:最低停顿时间
  • 过程:初始标记(STW)→ 并发标记 → 重新标记(STW)→ 并发清除
  • 缺点:CPU敏感、有内存碎片、浮动垃圾问题

G1(Garbage First):

  • 目标:可控停顿时间 + 高吞吐
  • 思路:把堆分成多个Region,按回收价值优先回收垃圾多的Region
  • 优点:无内存碎片、可预测停顿时间、适合大堆(6GB+)

实际选择:小堆用CMS,大堆用G1,云原生场景考虑ZGC。


【面试题】9. 如何设计一个高效的提示词(Prompt)来让大模型生成高质量的代码? ​

【标准答案】 高效提示词的结构:角色设定 + 任务描述 + 约束条件 + 示例 + 输出格式

具体设计:

  1. 角色设定:"你是一个资深Java开发工程师,熟悉Spring Boot和微服务架构"

  2. 任务描述:

    • 明确要生成什么功能
    • 提供上下文:现有代码结构、依赖版本、业务场景
    • 说明输入输出格式
  3. 约束条件:

    • "代码要包含异常处理和日志记录"
    • "遵循阿里巴巴Java开发规范"
    • "不要使用过时的API"
  4. Few-shot示例:给1-2个相似功能的代码示例,让模型有参照

    • 示例要简洁,突出模式
    • 示例质量要高,模型会模仿风格
  5. 输出格式:

    • "只输出代码,不要解释"
    • "代码用Markdown代码块包裹,标注语言"

进阶技巧:

  • 分步骤生成:先生成接口设计,再生成实现,最后生成测试用例
  • 迭代优化:第一次生成后,追加"请优化性能"或"请添加注释"
  • 用System Prompt固定风格,User Prompt描述具体任务

【面试题】10. Redis如何实现分布式锁?有什么注意事项和优化方案? ​

【标准答案】 基础实现(SETNX):

java
SETNX lock_key unique_value
EXPIRE lock_key 30  // 设置过期时间
// 执行业务
DEL lock_key  // 释放锁

问题:SETNX和EXPIRE不是原子操作,可能死锁。

优化方案一:SET扩展命令(推荐)

java
SET lock_key unique_value NX EX 30
// NX:不存在才设置
// EX:设置过期时间

优化方案二:Lua脚本保证原子性 释放锁时,要检查value是否是自己加的,避免误删别人的锁:

lua
if redis.call("GET", KEYS[1]) == ARGV[1] then
    return redis.call("DEL", KEYS[1])
else
    return 0
end

注意事项:

  1. 锁续期:业务执行时间超过过期时间,需要看门狗线程续期
  2. 锁释放:只有加锁的线程才能释放,用unique_value标识
  3. 集群问题:主从切换时锁可能丢失,用Redlock算法(多节点加锁)

实际方案:

  • 简单场景:Redis SET NX EX + Lua释放
  • 复杂场景:Redisson框架(已实现看门狗、可重入锁、联锁)

本轮面试题生成完毕