面试面经 · 商汤
【商汤】【Agent 开发】【暑期实习三面】面经(八股+大模型项目+手撕)
商汤 Agent 开发 暑期实习三面面经
背景: 海外一年制硕士,投递 Agent 方向,三面为技术终面,面试官为团队资深工程师,全程约 1 小时,节奏快,无废话。
题目摘要
- Go 语言基础:goroutine 与 channel 的底层原理,GMP 模型简述,以及
select的随机性实现。 - MySQL 与 Redis 八股:MySQL 索引失效场景(隐式类型转换、最左前缀原则),Redis 持久化机制(RDB/AOF 混合)及缓存穿透解决方案。
- RAG 项目深挖:针对简历中的 Agent 项目,追问检索召回率优化、上下文窗口截断策略、Function Calling 的异常处理。
- 推理成本优化:如何降低单次 Agent 调用的 token 消耗,涉及 prompt 压缩与模型路由。
- 手撕算法:「合并区间」变体——给定一组区间,返回合并后区间的总长度(注意重叠部分只计一次)。关键思路:按起点排序,线性扫描维护当前合并区间右端点,累加长度,O(n log n)。
项目深挖
面试官对简历中的「基于 RAG 的客服 Agent」项目追问极细,以下为两个核心问题及参考回答方向。
追问 1:“你的 RAG 检索用了向量相似度,但用户问题包含专业术语或简称,召回率明显下降,你怎么处理?”
参考回答方向:先承认问题存在,然后分三层解决——第一层,构建同义词/别名映射表,在 query 预处理阶段做扩展;第二层,引入混合检索(BM25 + 向量),用 RRF(Reciprocal Rank Fusion)融合排序,解决向量模型对稀有词不敏感的问题;第三层,对高频失败 query 做离线分析,微调 embedding 模型或增加领域词典。面试官会追问“你怎么评估召回率提升”,需回答用人工标注的 100 条 query 集,对比命中率,并提到用 recall@5 作为核心指标。
追问 2:“你的 Agent 支持 Function Calling,如果模型连续调用多个函数,中间某次调用返回异常或超时,你的状态机怎么处理?”
参考回答方向:强调设计了两层容错——第一层,对每个函数调用设置超时(如 3 秒),超时后返回预设的 fallback 结果,并标记该步骤为“降级”;第二层,在对话状态机中维护一个“步骤栈”,异常时回滚到上一个安全节点,并向用户输出“部分功能暂不可用”的提示,而不是让整个 Agent 崩溃。同时提到,对关键函数(如支付查询)做了重试机制,但非关键函数(如天气查询)直接降级,以控制整体延迟。
追问 3(追加):“你提到用 prompt 压缩来降成本,具体怎么实现?压缩后效果变差怎么办?”
参考回答方向:压缩分两级——第一级,对历史对话做摘要,用 LLM 将多轮对话压缩为 200 字以内的摘要,只在用户新提问时追加摘要;第二级,对检索回来的文档做关键句抽取,用 TextRank 或正则过滤掉明显冗余内容。效果变差时,采用“压缩-验证”机制:压缩后的上下文让模型先输出一个置信度分数(0-1),低于阈值则回退到未压缩版本,并记录该 case 用于后续优化。
准备建议
- Go 语言别只背八股,要能画出 GMP 模型图。面试官会从“goroutine 栈初始多大”问到“channel 底层是 hchan 结构体,sendq/recvq 怎么组织”,建议手写一个简单的 worker pool,并解释
select的scase数组随机轮询逻辑。Java 方向同理,至少准备 JVM 内存模型和 ConcurrentHashMap 的 CAS + synchronized 细节。 - RAG 项目必须准备“失败案例”。面试官最反感“我的项目完美无缺”。主动说出一个已知缺陷(如“对长尾问题召回率低”),并给出针对性的改进方案(如混合检索 + 重排模型),这比吹嘘效果更可信。同时,准备 3 个指标:召回率、首轮回答准确率、单次调用成本,并能说出具体数值。
- 手撕算法不要只写最优解,要讲思考过程。面试官会看你是否先想到暴力解(O(n^2) 两两合并),再优化到排序 + 扫描。建议在写代码前用 1 分钟说思路,写完后主动分析边界条件(空数组、区间完全覆盖等)。另外,Agent 方向常考「Top K 高频元素」或「LRU 缓存」,建议一并复习。
结果反馈
三面通过,约 4 天后 HR 通知进入 offer 审批环节,整体流程约两周。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。