面试面经 · 第四范式
【第四范式】【大模型开发】【暑期实习HR面】面经(八股+大模型项目+手撕)
第四范式 大模型开发 暑期实习 HR面 面经
背景:海外一年制硕士,计算机相关专业,有一段中小厂大模型应用实习,主攻 RAG 和 Agent 方向。
题目摘要
面试整体节奏偏快,技术面与 HR 面合并进行,总时长约 50 分钟。核心考点如下:
- 编程语言基础(Go):考察 goroutine 调度模型、channel 底层实现、内存逃逸分析、GMP 模型中的 P 本地队列与全局队列交互逻辑。
- MySQL/Redis 八股:MySQL 事务隔离级别与 MVCC 实现原理、索引失效场景;Redis 的持久化机制(RDB/AOF)选择依据、缓存穿透与布隆过滤器应用。
- 大模型项目深挖(RAG + Agent):围绕一个实际项目追问文档切分策略、检索召回率优化、LLM 幻觉缓解手段,以及多轮对话中的上下文管理方案。
- 手撕算法题:实现一个带过期时间的 LRU 缓存(LRU Cache with TTL)。要求写出
get和put方法,get时若 key 过期则删除并返回 -1,容量满时淘汰最久未使用且未过期的条目。 - 推理成本优化:针对线上服务,如何降低单次请求的 LLM 调用成本,包括 prompt 压缩、模型路由、缓存复用等。
- 场景设计题:给定一个客服问答系统,用户问题需要实时检索知识库并生成回答,如何设计整体链路并保证响应延迟 < 2s。
项目深挖
追问 1:你的 RAG 项目中文档切分是如何做的?为什么不用固定 chunk size?
参考回答方向:固定大小切分会导致语义断裂,尤其是表格和代码块。我使用基于结构感知的切分策略,先按 Markdown 标题层级划分章节,再对每个章节按段落边界和句子长度动态调整 chunk 大小。同时保留 metadata(章节路径、页码)用于检索后的引用溯源。面试官可能会追问切分粒度对召回率的影响,可以补充一个对比实验数据(如固定 512 字符 vs 动态切分,Recall@5 提升约 8%)。
追问 2:Agent 中 Function Calling 的上下文管理怎么做的?
参考回答方向:核心是控制历史消息的长度和相关性。我采用了两级策略:第一级是滑动窗口,只保留最近 N 轮对话;第二级是函数调用结果摘要,将大段的工具返回内容用 LLM 压缩成结构化摘要(如 JSON 字段),再注入到下一轮请求中。另外,对系统提示词和工具描述做持久化缓存,避免重复编码。面试官可能会问“摘要本身是否会造成信息丢失”,可以回答对关键字段(如金额、时间)做强制保留,摘要仅针对非结构化文本。
追问 3:你们如何评估 RAG 生成结果的质量?
参考回答方向:分为检索评估和生成评估。检索端用 Recall@K、MRR,生成端用 faithfulness(通过 NLI 模型判断生成内容是否被检索文档支持)和 answer relevance(与用户问题的语义相关性)。另外,我搭建了一个小规模的 golden dataset,覆盖常见问题类型和边界 case(如多跳问题、否定表达),用于回归测试。面试官可能追问“有没有遇到检索好但生成差的情况”,可以回答幻觉问题,并补充用 prompt 约束和知识库置信度过滤来缓解。
手撕算法题详解
题目:设计一个带过期时间的 LRU 缓存,支持 get(key) 和 put(key, value, ttl) 操作。get 时若 key 已过期,删除并返回 -1;put 时若容量满,淘汰最久未使用且未过期的条目。
关键思路:
- 使用双向链表 + HashMap 实现 O(1) 的 LRU 淘汰。
- 每个节点额外存储过期时间戳
expireAt,在get和put时检查当前时间是否超过expireAt,若过期则从链表和 Map 中移除。 - 淘汰时从链表尾部向前遍历,跳过已过期节点(实际上过期节点在访问时已懒删除,因此尾部节点即为最久未使用且未过期)。
- 注意边界:
put更新已有 key 时,需要更新 value 和 ttl,并移动到链表头部。
代码骨架:
type Node struct {
key, value int
expireAt int64
prev, next *Node
}
type LRUCache struct {
capacity int
m map[int]*Node
head *Node
tail *Node
}准备建议
- Go 语言重点复习并发模型:不要只背概念,要能画出 GMP 调度流程图,并解释 channel 的发送和接收在底层如何通过
hchan实现阻塞与唤醒。面试官可能追问go func()后协程何时被调度,建议结合runtime.Gosched()和runtime.GOMAXPROCS举例说明。 - 项目准备要带数据:每个优化点都要有量化对比,如“切分策略调整后召回率从 72% 提升到 81%”“引入缓存后平均延迟从 1.8s 降到 0.6s”。没有数据的优化在面试中缺乏说服力,建议提前整理一份项目指标表格。
- 手撕题要练到闭眼写:LRU 变体题(带 TTL、带频率)是高频考点,建议在 LeetCode 上找 LRU 和 LFU 原题各写三遍,并额外练习在 15 分钟内完成带过期时间的版本。注意 Go 中时间处理用
time.Now().UnixNano(),避免精度问题。
结果反馈
一面通过,两天后约了二面(技术终面),整体体验专业且高效,问题都围绕实际业务场景展开,没有纯八股轰炸。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。