面试面经 · 快手
【快手】【大模型开发】【暑期实习三面】面经(八股+大模型项目+手撕)
快手 大模型开发 暑期实习三面面经
背景:海外一年制硕士,主修 NLP,一段中小厂大模型应用实习,投递快手大模型平台部。
题目摘要
面试时长 70 分钟,整体节奏快,面试官是部门资深工程师,会打断追问细节,不满足于"背出来的答案"。
- Go 语言基础:goroutine 与 channel 的底层实现,GMP 调度模型中的 work stealing 机制,以及 map 并发读写为什么 panic(不是死锁而是 fatal error)。
- MySQL/Redis 八股:MVCC 快照读与当前读的区别,RR 隔离级别下幻读如何被间隙锁解决;Redis 持久化 RDB vs AOF 的取舍,以及大 key 删除对主线程的阻塞问题。
- RAG 项目深挖:针对简历中一个法律文档问答项目,追问 chunk 切分策略、检索召回率优化、多轮对话中的 query 改写方案。
- Function Calling 实现细节:如何让 LLM 稳定输出结构化函数调用参数,JSON 格式错误时的兜底策略。
- 上下文管理:长对话场景下 token 超限的处理方案,以及不同压缩策略(摘要 vs 滑动窗口)的优缺点。
- 手撕算法:题目是"寻找旋转排序数组中的最小值 II"(LeetCode 154),要求写出可运行的 Go 代码并分析边界情况。
项目深挖
追问一:你的 RAG 系统在 chunk 切分时,为什么选择 500 字 + 50 字重叠?这个参数是怎么定出来的?
参考回答方向:先说明 500 字是参考了 embedding 模型的最大输入长度(如 bge-large 是 512 token),同时结合业务文档的段落平均长度。重叠窗口是为了避免语义断点——如果一刀切在句子中间,检索时可能漏掉关键实体。然后补充说明实际做过小规模 A/B 实验:对比 300/500/800 字三档,用 Recall@5 和人工标注的答案相关性做评估,500 字在效率和准确率上平衡最好。最后可以提一句,如果文档有明显标题结构,会优先按标题切分,而不是纯固定长度。
追问二:你说多轮对话中做了 query 改写,具体怎么实现的?改写失败会怎样?
参考回答方向:先给出两阶段方案——第一轮用 LLM 根据历史对话生成独立 query,同时附带一个规则兜底(如果当前 query 包含指代词或省略成分,强制走改写;否则直接透传)。然后重点讲改写的 prompt 设计,要求输出 JSON 格式({"rewritten_query": "..."}),并限制改写后长度不超过原文 1.5 倍,防止发散。追问到失败场景时,回答:如果 LLM 返回格式错误,会重试一次并把 temperature 降到 0;仍然失败则退回原始 query,同时记录日志用于后续优化。这里可以补充一个细节——实际工程中,改写失败率大约 3-5%,对最终答案质量的影响在可接受范围内,因为检索环节本身有容错。
追问三:你的 Function Calling 方案里,如果模型返回的参数 JSON 里有非法值(比如超出枚举范围),你怎么处理?
参考回答方向:分三层兜底。第一层,在 prompt 里明确给出每个参数的取值范围和枚举值,并要求模型先输出思考过程再输出 JSON(虽然会增加 token,但能显著降低格式错误率)。第二层,解析 JSON 后用 JSON Schema 做校验,非法值直接丢弃该次调用并返回给模型一条错误消息,让模型重新生成。第三层,如果连续两次校验失败,放弃 function call,改用普通文本回复。这样既保证可靠性,又不至于让用户等待过久。
手撕算法详解
题目:寻找旋转排序数组中的最小值 II。给定一个可能包含重复元素的旋转排序数组(如 [3, 4, 5, 1, 2],或 [2, 2, 2, 0, 2]),要求返回最小值。
关键思路:二分查找的变种。维护 left 和 right 指针,取 mid。比较 nums[mid] 与 nums[right]:
- 如果
nums[mid] > nums[right],说明最小值在右半部分,left = mid + 1。 - 如果
nums[mid] < nums[right],说明最小值在左半部分(含mid),right = mid。 - 如果相等,无法判断,只能
right--缩小范围(因为nums[mid]和nums[right]相等,至少可以排除right位置)。
时间复杂度平均 O(log n),最坏 O(n)(全重复元素时)。面试时我一开始没处理相等情况,面试官提示后补上了。注意 Go 里 for left < right 的循环条件,以及 right-- 不会跳过最小值(因为 nums[mid] == nums[right],最小值如果等于这个值,right 位置丢掉也无妨)。
准备建议
- Go 语言别只背概念,要能写出可运行的并发代码。面试前手写一个 worker pool(用 channel 分发任务、sync.WaitGroup 等待完成),再写一个带超时控制的 context 使用示例。GMP 模型至少能画出示意图并解释 P 的本地队列和全局队列的交互。
- RAG 项目要准备"为什么是这个参数"的量化依据。面试官对"我试过几个值,最后选了效果最好的"这种回答很满意,但你要能说出具体评估指标(Recall@K、答案准确率)和对比结果。建议把项目中的关键实验数据整理成表格,背熟。
- 算法题刷到"能默写"的程度。快手三面手撕题不会太难,但会考变种和边界条件。LeetCode 的二分查找专题(33、81、153、154)全部手写一遍,重点记忆重复元素时的处理逻辑。另外建议用 Go 刷题,熟悉 Go 的语法陷阱(如
for循环无while、切片边界)。
结果反馈
三面结束当晚收到 HR 通知通过,约在一周后安排 HR 面。整体感受:快手的大模型岗位面试偏工程落地,对实习项目的追问非常细,建议准备时多从"线上跑起来会遇到什么问题"的角度复盘自己的项目。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。