面试面经 · 快手
【快手】【Agent 开发】【暑期实习HR面】面经(八股+大模型项目+手撕)
海外一年制硕士,投递快手 Agent 开发暑期实习,简历过筛后约到 HR 面(实际是技术初面 + HR 混合面,面试官为团队一线开发)。
题目摘要
- Go 语言基础:
slice与array的区别,slice扩容机制,map是否并发安全,如何实现一个并发安全的 map。 - MySQL / Redis 八股:MySQL 索引为什么用 B+ 树而不是 B 树或哈希;Redis 缓存穿透、击穿、雪崩的区别与应对;Redis 分布式锁的实现与续期问题。
- Agent 项目深挖:RAG 检索链路中召回率低怎么排查;Function Calling 的 schema 设计原则;多轮对话上下文怎么管理、超长上下文如何压缩;推理成本优化有哪些手段。
- 手撕算法:给定一个字符串数组,找出所有由相同字母异位词组成的组(LeetCode 49 变体)。关键思路:对每个字符串排序后作为哈希 key,或用 26 位质数乘积作为 key 避免排序开销;遍历一次分组,时间复杂度 O(n·k log k) 或 O(n·k)。
- 场景设计:如果让你设计一个 Agent 的工具调用失败重试机制,你会考虑哪些点。
项目深挖
追问一:你提到 RAG 召回率不理想,具体怎么定位问题?
参考回答方向:先分层排查,不要一上来就调参。第一步看是召回阶段还是排序阶段的问题——把 ground truth 文档喂给模型,如果模型能答对,说明是召回没捞回来;如果还是答错,说明是生成或 prompt 的问题。召回阶段再拆:query 改写是否丢失语义、embedding 模型是否适配中文/领域语料、chunk 切分粒度是否合理(切太碎丢上下文,切太大引入噪声)、top-k 是否太小。可以引入混合检索(BM25 + 向量)提升召回,再用 rerank 模型精排。回答时要给出你实际做过的对比实验数据,哪怕是小规模评测集。
追问二:Function Calling 的 schema 你怎么设计?工具多了怎么办?
参考回答方向:schema 描述要精确,字段类型、枚举值、必填项写清楚,描述里写清楚"什么时候该调用这个工具",而不是只写工具功能。工具数量多的时候不能全塞进 prompt,一是 token 成本高,二是模型选择准确率会下降。常见做法是分层路由:先用一个轻量分类模型或规则把用户意图路由到工具子集,再在子集里做 Function Calling。另外要处理模型幻觉调用不存在的工具、参数类型错误的情况,加一层参数校验和兜底。
追问三:多轮对话上下文怎么管理?上下文超了怎么办?
参考回答方向:短期用滑动窗口保留最近 N 轮,长期用摘要压缩——把早期对话用模型总结成一段话保留关键信息。更精细的做法是按信息类型分层:用户偏好、任务状态、历史事实分别存储,需要时再检索注入。上下文超限时不要简单截断,优先保留 system prompt、当前任务相关的历史、最近几轮对话;中间久远的内容压缩或丢弃。可以提到用 Redis 存会话状态、设置 TTL,避免无限增长。
准备建议
- 八股要能讲出"为什么"而不只是"是什么"。比如 B+ 树,不能只背"叶子节点存数据、非叶子存索引",要能说清楚为什么范围查询友好、为什么磁盘 IO 次数少、和 B 树的区别在哪。Redis 缓存三兄弟要能结合具体业务场景说应对方案,而不是背定义。
- Agent 项目要准备"数据 + 取舍"。面试官最反感只讲架构图不讲效果。提前整理好:你的 RAG 评测集多大、召回率/准确率提升了多少、推理成本降了多少、为什么选这个方案而不是另一个。哪怕数据不完美,真实的对比和取舍过程比漂亮数字更有说服力。
- 手撕算法保持手感,重点练哈希和双指针。实习面试手撕难度一般在中档,异位词分组、两数之和变体、滑动窗口这类高频题要能 15 分钟内 bug-free 写完。写之前先和面试官确认边界条件(空数组、大小写、字符集范围),写完主动跑几个测试用例。
一面整体偏基础 + 项目,没有特别刁钻的题,面试官会顺着简历往下问,答不上来会给提示。一面通过,3 天后约下一面。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。