面试面经 · 图森未来
【图森未来】【大模型开发】【暑期实习二面】面经(八股+大模型项目+手撕)
图森未来 大模型开发 暑期实习二面面经
背景
海外一年制硕士,投递大模型开发岗,一面通过后约一周收到二面通知。面试官为组内资深工程师,全程约 50 分钟,前半段挖项目,后半段手撕代码 + 八股抽查,整体风格务实,不绕弯子。
题目摘要
- Go 语言基础:goroutine 与 channel 的底层实现差异,何时用锁而非 channel,slice 扩容机制与内存泄漏场景。
- MySQL/Redis 八股:MySQL 索引失效的常见场景,Redis 持久化机制对比(RDB vs AOF),缓存穿透/击穿/雪崩的应对。
- 大模型项目深挖:RAG 检索质量优化、Function Calling 的容错设计、上下文窗口管理与推理成本权衡。
- 手撕算法:实现一个带过期时间的 LRU Cache(get/put 均为 O(1),支持自定义 TTL)。
项目深挖
面试官全程围绕简历上的一个 RAG 项目展开,简历里写了「基于向量检索 + 重排的文档问答系统」,以下为追问细节与回答方向参考。
追问 1:你的 RAG 系统检索质量不好时,怎么定位是召回问题还是生成问题?
追问 2:Function Calling 场景下,如果模型返回了错误的参数格式或调用了不存在的函数,你怎么处理?
追问 3:上下文管理上,你怎么控制 token 成本?长文档场景下会不会爆上下文?
手撕算法:带 TTL 的 LRU Cache
题目:设计一个支持过期时间(TTL)的 LRU 缓存,实现 get(key) 和 put(key, value, ttl),要求均摊 O(1) 时间复杂度。get 时若 key 不存在或已过期返回 -1;put 时若 key 已存在则更新 value 和过期时间,若缓存满则淘汰最久未使用且未过期的条目。
关键思路:
- 用「双向链表 + HashMap」实现基础 LRU,链表头为最近使用,链表尾为最久未使用。
- TTL 处理:每个节点额外存一个
expireAt时间戳,get时先检查是否过期,过期则删除节点并返回 -1。 - 淘汰策略:
put时若容量满,从链表尾部开始遍历,跳过已过期节点(直接删除),找到第一个未过期节点淘汰。若全部过期则淘汰最旧的一个。 - 注意边界:更新已有 key 时需重置其在链表中的位置(移到头部),并更新
expireAt。
面试官追问:如果并发访问怎么办?
准备建议
- 项目准备按「量化指标」展开:面试官对 RAG 项目的追问几乎全部围绕「你怎么知道效果好/坏」以及「坏了怎么修」。建议提前统计自己项目的检索准确率、端到端答案准确率(哪怕是自己手工标注 50 条测试集),并准备至少 2 个具体的失败案例和对应的优化动作,比背八股有用得多。
- 手撕题刷「带变体的 LRU」:图森这类公司喜欢考 LRU 的变体(TTL、并发、LFU),建议把 LeetCode 146 和 460 都刷熟,并自己扩展实现一版带过期时间的。重点不是背代码,而是能清晰说出 hashmap + 双向链表的原因(O(1) 查找 + O(1) 删除/移动),以及 TTL 的插入位置。
- Go 语言基础抓「并发 + 内存」:如果简历写了 Go,务必准备 goroutine 调度模型(GMP)、channel 与锁的适用场景、slice 扩容策略(1.18 后按 2x 增长,容量超过 256 后按 1.25x)、以及常见内存泄漏场景(goroutine 未退出、time.Ticker 未 Stop)。这些是高频考点,且容易在项目深挖后突然抽查,心态容易崩,提前过一遍不亏。
结果
二面结束当晚收到 HR 通知通过,约 3 天后进行三面(交叉面),后续还有 HR 面。整体感受是面试官对项目细节的追问密度很大,且会穿插基础题考察临场反应,建议把项目中的每个设计决策都准备好「为什么这样做」和「有没有更好的方案」。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。