NiceOffer

面试面经 · 商汤

【商汤】【大模型开发】【暑期实习二面】面经(八股+大模型项目+手撕)

商汤面经大模型开发实习

海外一年制硕士,投递商汤大模型开发暑期实习,一面技术面通过后约到二面,整体节奏偏快,面试官明显更偏工程落地和项目细节,八股问得不算多但会顺着答案继续追。

题目摘要

  • Go 语言基础:slice 的底层结构、扩容规则,以及 slice 作为函数参数时修改元素是否会影响原切片;map 是否并发安全,如何实现并发安全的 map。
  • MySQL / Redis 八股:MySQL 聚簇索引与非聚簇索引的区别,为什么推荐自增主键;Redis 缓存穿透、缓存击穿、缓存雪崩的区别与各自解决方案,追问布隆过滤器误判怎么处理。
  • RAG 项目深挖:文档切分策略怎么定的,chunk size 和 overlap 如何权衡;向量检索召回不准时怎么排查;是否做过 rerank,用的什么模型,效果提升多少。
  • Function Calling / Agent:工具调用的参数校验和失败重试怎么做;多轮对话里上下文怎么管理,超长上下文如何裁剪;有没有做过工具调用的并发编排。
  • 推理成本优化:线上 QPS 上来后怎么降本,是否用过量化、KV Cache 复用、请求批处理,具体收益如何衡量。
  • 手撕算法:LRU 缓存。题意:设计一个满足 LRU 淘汰策略的缓存结构,支持 get(key) 和 put(key, value),要求两个操作平均时间复杂度 O(1),容量满时淘汰最久未使用的键。关键思路:哈希表 + 双向链表,哈希表负责 O(1) 定位节点,双向链表维护访问顺序,头部放最近使用、尾部放最久未使用,get 命中后把节点移到头部,put 时若已存在则更新并移到头部,若超容量则删除尾节点并同步删除哈希表记录。面试官要求手写,注意边界:容量为 0、重复 put 同一个 key、get 不存在的 key。

项目深挖

追问一:RAG 里 chunk 切分你是怎么定的,凭什么说这个参数好?

参考回答方向:不要只说“试出来的”。可以从文档类型出发——技术文档按标题层级切,长段落再按语义切;chunk size 结合 embedding 模型的最大输入长度和检索粒度权衡,太大召回噪声多,太小语义不完整。overlap 一般取 chunk size 的 10%–20% 防止跨块语义断裂。更重要的是给出评估方式:构造一批带标准答案的问题集,看召回率、命中率和最终回答准确率,用数据说明参数调整前后的差异,而不是拍脑袋。

追问二:向量检索召回结果不相关,你怎么定位是 embedding 的问题还是切分的问题还是检索策略的问题?

参考回答方向:分层排查。先看召回 top-k 里有没有正确文档,如果没有,大概率是 embedding 表征或切分问题;如果有但排得靠后,是排序问题,可以加 rerank。再看切分后的 chunk 是否语义完整,可以人工抽查。还可以对比不同 embedding 模型在同一批 query 上的召回表现。回答时体现排查链路,比直接给结论更加分。

追问三:Function Calling 里模型返回的参数格式不对或者工具执行失败,你怎么处理?

参考回答方向:参数层面做 schema 校验,用 JSON Schema 约束,解析失败时把错误信息回传给模型让它重试,设置最大重试次数避免死循环。工具执行层面区分可重试错误(超时、限流)和不可重试错误(参数非法、权限不足),前者退避重试,后者直接把错误结果作为 observation 返回给模型,让它决定下一步。还要考虑幂等性,避免重试导致重复副作用。

准备建议

  1. 把项目里每个技术选型都准备好“为什么”和“数据”。面试官不会满足于“我用了某某方案”,要能说出对比过哪些方案、为什么选这个、上线后指标变化。提前把 RAG 或 Agent 项目的关键指标(召回率、准确率、延迟、成本)整理成可复述的数字。
  1. 八股按“原理 + 场景 + 追问”三层准备。比如 Redis 缓存三兄弟,不仅要背定义,还要能说清楚布隆过滤器误判怎么办、热点 key 怎么发现、缓存和数据库一致性怎么保证。MySQL 索引要能结合执行计划讲,别停在概念。
  1. 手撕题按高频模板刷,重点练链表和哈希组合类。LRU、LFU、设计类题目出现频率高,写的时候先跟面试官确认边界条件,写完主动跑几个用例。Go 或 Java 选一门写熟,注意语言层面的细节,比如 Go 的 map 遍历无序、slice 扩容后地址变化。

二面结束后约一周收到感谢信,流程终止。

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