面试面经 · 虾皮
【虾皮】【大模型开发】【暑期实习三面】面经(八股+大模型项目+手撕)
虾皮 大模型开发 暑期实习三面面经
背景:海外一年制硕士,投递方向为 LLM 应用与 Agent 开发。
题目摘要
三面整体风格偏工程落地与系统设计,没有纯八股背诵环节,但基础知识会以“你项目里为什么这么选”的方式被追问。核心考点如下:
- Go 语言基础:goroutine 泄漏的检测与避免、channel 与 mutex 的适用场景、sync.Pool 的作用。
- MySQL 与 Redis 综合:InnoDB 隔离级别与 MVCC 实现、索引失效场景、Redis 持久化机制(RDB/AOF)在大模型缓存场景下的选择。
- RAG 项目深挖:向量检索召回质量评估、chunk 切分策略、混合检索实现。
- Agent Function Calling 设计:工具调用的参数校验、错误恢复、多轮对话中的上下文管理。
- 推理成本优化:Prompt 压缩、缓存策略、模型蒸馏在项目中的实际落地。
- 手撕算法:实现一个带过期时间的 LRU 缓存(要求支持
get和put,put时若 key 已存在则更新值和过期时间,过期后get返回 -1)。
项目深挖
追问 1:你的 RAG 系统里,向量检索和关键词检索的结果是怎么融合的?
参考回答方向:先说明两种检索各自的优劣(向量召回语义相关但可能忽略精确术语,BM25 精确匹配强但无法处理同义改写),再讲融合策略——我采用的是 RRF(Reciprocal Rank Fusion),即对两个检索结果分别赋予排名倒数权重,再合并排序。重点要提到你如何确定两个检索结果的权重比,比如通过线下评估集(如 100 条人工标注 query)调参,观察 Recall@K 和 MRR 指标。如果面试官追问“为什么不用学习式排序”,可以答“当时数据量不足以训练一个稳定的 reranker,且 RRF 实现成本低、效果可接受”。
追问 2:Agent 调用工具时,如果模型返回了不存在的函数名或参数格式错误,你怎么处理?
参考回答方向:三层兜底方案。第一层是 schema 校验,在调用工具前用 JSON Schema 对模型输出做校验,不合法直接拒绝并返回错误信息给模型,让模型重新生成;第二层是 重试机制,设置最大重试次数(比如 2 次),每次重试时把错误信息附加到对话历史里,引导模型修正输出;第三层是 人工兜底,如果重试仍失败,则返回预设的 fallback 回答。面试官可能会追问“为什么不用 function calling 的强制参数”,可以答“强制参数只能保证格式,不能保证语义正确,比如参数值枚举越界,仍需校验层拦截”。
追问 3:你提到做了 Prompt 压缩来降成本,具体怎么做的?
参考回答方向:分两个维度。一是 历史对话压缩,对超过 N 轮的对话,用一个小模型(如 7B 模型)将早期对话摘要成 2-3 句话,替换原始内容,只保留最近几轮完整对话;二是 工具结果截断,对工具返回的长文本(比如数据库查询结果),只保留与当前 query 最相关的前 K 行,或者用关键词抽取替代全文。要主动提到成本收益数据——比如压缩后 token 数降低 40%,但任务完成率只下降 2%,这个数据是你在实验里实测的。
准备建议
- Go 语言重点复习并发与内存管理。不要只背 goroutine 和 channel 的语法,要能画出 goroutine 泄漏的典型场景(比如
for循环里启动 goroutine 但 channel 没有接收方),并说出排查工具(go vet、pprof、goleak测试库)。手写一个带超时控制的 worker pool,这是高频考题。
- RAG 项目要准备量化指标。面试官一定会问“你怎么知道你的 RAG 效果好”,不要只说“感觉回答更准了”。提前准备 3 个指标:召回率(Recall@K)、答案准确率(人工标注 50 条评测集)、端到端延迟(P95)。每个指标要有优化前后的对比数据,哪怕数据是模拟的也要逻辑自洽。
- 手撕算法题按 LeetCode 146 变体练习。带过期时间的 LRU 比原题多一个维度,建议用
map[key]*entry+ 双向链表实现,entry 里存储expireAt时间戳。get时先检查是否过期,过期则删除并返回 -1;put时同理,如果 key 存在但已过期,视为新插入。注意并发安全,面试时可以用sync.Mutex包裹,并主动说明“如果要求更高性能,可以用分片锁或sync.RWMutex区分读写”。
结果反馈
三面通过,约一周后收到 HR 通知进入最终流程。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。