九方智投 AI 应用开发一面:Java 八股、RAG 调优与智能客服设计
- 轮次
- 一面
- 结果
- 挂
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 讲讲 HashMap 的底层结构。
- HashMap 线程安全吗?需要线程安全时用哪个?
- volatile 关键字的作用是什么?
- 了解 AQS 吗?大概讲一下。
- MySQL 用过吗?InnoDB 的索引类型有哪些?
- B+ 树索引是怎么搜索的?
- 消息队列一般用什么?RabbitMQ 的 exchange 有哪几种?
- Kafka 为什么快、性能高?
- 项目里的定时任务怎么做的?
- 做 RAG 时 chunk size、overlap 怎么确定?
- 向量检索和关键词检索分别解决什么问题?为什么要混合检索?
- 如果 RAG 检索效果差,怎么区分问题出在哪?
- 响应速度、模型选择、效果之间怎么取舍?
- LangChain 和 LangGraph 的核心差异是什么?
- Checkpointer 的存储怎么设计?
- 恢复任务时,模型版本、用户权限发生变化怎么处理?
- 设计一套面向投资理财课程售卖的智能客服:需要哪些功能?怎么设计?如果员工不信任,怎么说服?
《参考解析》
HashMap 与并发:JDK 1.8 的 HashMap 是数组 + 链表 + 红黑树。插入时用 (n-1) & hash 定位桶,空桶直接放,冲突挂链表,链表长度到 8 且数组长度到 64 转红黑树;扩容按 2 倍,元素要么留在原位置,要么移到“原位置 + 旧容量”。它线程不安全:并发 put 可能丢数据,扩容时可能形成环(1.7 头插法),1.8 改成尾插法但仍不保证安全。需要并发用 ConcurrentHashMap;需要有序用 TreeMap;需要读写分离可以用 CopyOnWriteArrayList 之类,但要看场景。
volatile 与 AQS:volatile 保证可见性和有序性(禁止指令重排),不保证原子性;典型用途是状态标志、单例的双重检查锁。实现上靠内存屏障,写操作后把缓存刷回主存并使其他核的缓存失效,读操作前插入屏障。AQS 是抽象队列同步器,核心是一个 volatile 的 state 加一个 CLH 双向队列:获取锁失败就入队并 park,释放时唤醒后继;支持独占和共享两种模式,ReentrantLock、Semaphore、CountDownLatch 都基于它。回答时讲清 state 的含义、CAS 修改、队列与条件变量即可。
InnoDB 索引与 B+ 树:索引类型按结构分 B+ 树索引、哈希索引(自适应哈希,用户不能直接建)、全文索引、空间索引;按用途分聚簇索引(主键)和二级索引(辅助索引)。InnoDB 聚簇索引叶子存整行,二级索引叶子存主键值,所以二级索引查询可能回表;覆盖索引可以避免回表。B+ 树搜索从根节点开始,比较 key 找到子页指针,逐层下行到叶子,叶子内再用页目录二分查找;范围查询在叶子链表上顺序扫描。非叶子节点不存数据,所以扇出大、树高低,通常 3~4 层就能支撑千万级数据。
RabbitMQ 与 Kafka:RabbitMQ 的 exchange 类型有 direct(按 routing key 精确匹配)、topic(按模式匹配)、fanout(广播)、headers(按消息头匹配),还有死信 exchange。Kafka 快的原因:顺序写磁盘、页缓存、零拷贝(sendfile)、批量发送与压缩、分区并行、稀疏索引;它把消息追加到 partition 日志,消费者按 offset 顺序读,避免随机写和复杂路由。
RAG 调优:chunk size 和 overlap 没有万能值,要看文档类型和问题粒度。先用 300~800 字、overlap 10%~20% 做基线,再用评测集比较不同组合的召回率、答案忠实度和端到端成功率;表格、代码、问答对单独切。混合检索是向量负责语义相似、关键词负责专有名词和精确匹配,二者召回结果融合后重排。效果差要分层定位:是解析丢了内容、切分破坏了语义、embedding 不适配、查询没改写、top-k 不合理、重排不好,还是模型没用好上下文;用“黄金问题 + 标准答案 + 标准证据”逐层评估,不要只调 prompt。
LangChain 与 LangGraph:LangChain 是组件库和链式编排,适合线性流程;LangGraph 是状态图,支持循环、分支、持久化、断点恢复和人工介入,适合多步 Agent。Checkpointer 存的是每个 thread 的状态快照:消息、工具结果、当前节点、待办、版本号。设计上按 thread_id + checkpoint_id 存,状态用可序列化结构,支持按时间回放;存储可以放 Redis/Postgres/对象存储,注意隐私字段脱敏和 TTL。恢复时要校验模型版本、提示词版本、工具 schema 和用户权限:版本不兼容就拒绝恢复或迁移状态;权限变化要重新鉴权,不能拿旧快照里的权限继续执行。
智能客服设计:功能分四块:售前咨询(课程内容、适合人群、价格、试听)、售中(下单、支付、优惠、发票)、售后(退款、有效期、账号问题)、人工转接。架构是“渠道接入 → 意图识别 → 知识检索 → 对话管理 → 工具调用 → 人工坐席 → 质检与评测”。投资理财课程有合规要求,不能承诺收益、不能给个股建议,话术要有免责声明和敏感词拦截。员工不信任时,不要靠说服,先做小范围试点:选一个高频、低风险场景,给出可量化的指标(自助解决率、平均处理时长、转人工率、客户满意度),让员工参与标注和验收,保留人工接管和一键回滚,用结果建立信任。