面试面经 · 图森未来
【图森未来】【大模型开发】【暑期实习一面】面经(八股+大模型项目+手撕)
图森未来 大模型开发 暑期实习一面面经
背景:海外一年制硕士,计算机相关专业,投递方向为大模型应用开发,无实习经历,有 2 个个人项目。
题目摘要
- Go 语言基础:goroutine 与 channel 的使用场景,如何避免 goroutine 泄漏;sync.WaitGroup 与 errgroup 的区别。
- MySQL/Redis 八股:MySQL 索引失效场景;Redis 缓存穿透、击穿、雪崩的区别与解决方案。
- 大模型项目深挖:RAG 检索增强生成中的 chunk 切分策略、向量检索召回率优化;Function Calling 的调用流程与异常处理。
- 手撕算法:实现一个带过期时间的 LRU 缓存(要求 get 和 put 均为 O(1) 时间复杂度)。
项目深挖
追问 1:你的 RAG 项目里,chunk 是怎么切的?为什么这么切?
参考回答方向:
追问 2:你的 Function Calling 流程中,如果模型返回了不存在的函数名或参数格式错误,怎么处理?
参考回答方向:
追问 3:你的项目里如何控制推理成本?
参考回答方向:
手撕算法
题目:设计一个 LRU 缓存,支持 get(key) 和 put(key, value) 操作,要求所有操作平均时间复杂度 O(1)。额外要求:支持 set_expire(key, ttl) 方法,使 key 在 ttl 秒后过期;get 时若 key 已过期,返回 -1 并删除该 key。
关键思路:
- 基础 LRU 用哈希表 + 双向链表实现,哈希表存 key 到链表节点的映射,链表维护访问顺序(头插法或尾插法均可)。
- 过期处理有两种方案:
- 惰性删除:
get时检查 key 的过期时间,若已过期则删除。实现简单,但过期 key 会占用内存直到被访问。 - 定时清理:维护一个最小堆(按过期时间排序),每次
put或get时检查堆顶是否过期,批量删除。需要额外空间 O(n)。
- 面试时我先给出惰性删除方案,代码更简洁;面试官追问“如何防止过期 key 堆积”,我再补充最小堆方案,并说明两者结合使用(惰性删除为主,堆做辅助清理)。
- 注意边界:
put时若 key 已存在,需要更新值并刷新过期时间;若缓存已满,先淘汰最久未使用的节点,再插入新节点。
准备建议
- 把项目里的技术选型理由背熟。面试官不会问“你项目做了什么”,而是问“为什么用这个方案”“有没有对比过其他方案”。每个项目至少准备 3 个“为什么”和 3 个“如果换一种做法会怎样”。建议用文档把项目的架构图、关键代码片段、踩过的坑整理成 2-3 页,面试前过一遍。
- 手撕题不要只刷 LeetCode 原题。图森这类公司喜欢在经典题上做变体(如 LRU 加过期时间、两数之和改为返回索引列表)。刷题时多问自己“如果加一个条件怎么做”,训练举一反三的能力。Go 语言版本尤其要熟练,因为面试官可能要求用 Go 写。
- 大模型项目的成本数据要量化。面试官对“用了 RAG”“接了 Function Calling”这种描述免疫,但对“召回率提升 5%”“缓存命中率 30%”“推理成本降低 40%”这类数字印象深刻。提前在项目里跑几组对比实验,把数据记录下来,放在简历和自我介绍里。
结果反馈
一面通过,约 5 天后进行二面。整体面试节奏紧凑,技术考察偏实战,项目深挖部分占了大半时间,建议后续面试者重点打磨项目细节和量化指标。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。