NiceOffer

面试面经 · 第四范式

【第四范式】【Agent 开发】【暑期实习一面】面经(八股+大模型项目+手撕)

第四范式面经Agent 开发实习

海外一年制硕士,投递第四范式 Agent 开发暑期实习,简历偏后端 + 大模型应用,一面约 60 分钟,视频面试,面试官是 Agent 平台组的工程师。

题目摘要

  1. Go 语言基础:slice 与 array 的区别、slice 扩容机制、map 并发读写为什么会 panic、sync.Map 的适用场景。追问了 defer 的执行顺序和闭包捕获变量的坑。
  2. MySQL 与 Redis 八股:聚簇索引与二级索引的回表过程、EXPLAIN 里 type 字段的常见取值、事务隔离级别与 MVCC 的关系;Redis 为什么快、缓存穿透/击穿/雪崩的区别与各自解法、RDB 与 AOF 的取舍、分布式锁用 SET NX EX 而不是 SETNX + EXPIRE 的原因。
  3. Agent 项目深挖:RAG 链路的分块策略与召回评估、Function Calling 的工具描述怎么写、多轮对话的上下文管理与截断策略、推理成本优化的具体手段。
  4. 手撕算法:LRU 缓存。题意:设计一个数据结构,支持 get(key) 和 put(key, value),两者都要求 O(1) 时间复杂度,容量满时淘汰最久未使用的键。关键思路:哈希表 + 双向链表,哈希表存 key 到链表节点的映射,链表头部放最近使用、尾部放最久未使用,get 命中后把节点移到头部,put 时若 key 存在则更新并移到头部,不存在则插入头部,超容量则删尾部节点并同步删除哈希表项。面试官要求手写双向链表而不是用语言内置的 container/list,重点看边界处理(容量为 1、重复 put 同一个 key)。

项目深挖

追问一:你的 RAG 项目里分块是怎么做的,怎么判断分块策略好不好?

参考回答方向:先说清楚文档类型(PDF/网页/结构化表格),再讲分块不是固定 512 token 一刀切,而是按语义边界切(标题层级、段落),再叠加滑动窗口保留重叠。评估上不要只说"感觉召回变好了",要给出可量化的方式:构造一批 query-answer 对,看召回率(相关 chunk 是否进入 top-k)和最终答案的忠实度,必要时引入 rerank 模型对比 top-k 前后的效果。如果面试官追问"chunk 太大太小分别有什么问题",回答:太大导致噪声多、检索精度下降且挤占上下文窗口;太小导致语义不完整、单个 chunk 无法回答需要跨段推理的问题。

追问二:Function Calling 里工具多了怎么办,模型选错工具怎么处理?

参考回答方向:工具数量上去后,把所有工具描述塞进 prompt 会稀释注意力、增加 token 成本。常见做法是分层路由——先用一个轻量分类或检索步骤把候选工具缩小到几个,再交给主模型做 Function Calling;或者按业务域拆分多个 Agent,每个 Agent 只持有自己域内的工具。工具描述本身要写清楚用途、参数含义、边界条件,避免多个工具描述语义重叠。模型选错工具时,除了优化描述,还可以在工具执行层做参数校验和失败回退,把错误信息回传给模型让它重试,而不是直接抛异常。

追问三:多轮对话上下文越来越长,你怎么控制成本和效果?

参考回答方向:分几层讲。第一层是裁剪,保留 system prompt + 最近 N 轮 + 与当前问题相关的历史片段,历史片段可以用向量检索召回而不是全量保留。第二层是摘要压缩,把久远的历史用模型压缩成摘要,牺牲部分细节换 token。第三层是工程手段,比如 prompt caching 复用不变的前缀、把稳定内容放前面。还要提到取舍:摘要会丢信息,涉及精确数值或多步状态的历史不能压,得单独用结构化状态存。面试官如果追问"怎么验证压缩没丢关键信息",可以答用回归测试集跑压缩前后的答案一致性。

准备建议

  1. 八股不要背结论,要能讲因果链。比如被问 MVCC,不要只答"读已提交和可重复读靠 undo log + read view",要能说清楚 read view 在两种隔离级别下的生成时机差异,以及这如何导致幻读问题。Redis 的缓存三兄弟同理,每个都要能说出触发条件和对应解法,最好结合自己项目里真实遇到过的场景。
  1. 把简历上的 Agent 项目拆成"决策点"来准备。面试官不会满足于"我用了 LangChain 做了个 RAG",会追问每个技术选型背后的权衡:为什么这么分块、为什么用这个 embedding 模型、rerank 加在哪一步、失败 case 怎么定位。提前把项目里 3-5 个关键决策写成"问题-方案-对比-结果"的结构,面试时直接调用。
  1. 手撕算法按题型刷,不要按题号刷。LRU 这类题考的是双向链表 + 哈希表的组合,同类还有 LFU、设计限流器、设计线程安全队列。每类题手写一遍完整代码,重点练边界和指针操作,别依赖 IDE 补全。Go 岗位还要熟悉 container/list 的源码级实现,面试官可能让你对比自己写的和标准库的差异。

一面通过,三天后约了二面。

想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。