面试面经 · 深信服
【深信服】【Agent 开发】【暑期实习二面】面经(八股+大模型项目+手撕)
深信服 Agent 开发 暑期实习二面
背景:海外一年制硕士,主要投递方向为后端与大模型应用开发,此前已通过一面。
题目摘要
- Go 语言基础:goroutine 与 channel 的底层实现,GMP 模型简述,以及
select的随机性原理。 - MySQL 与 Redis 八股:MySQL 的
RR隔离级别下如何解决幻读(MVCC + Next-Key Lock),Redis 的持久化机制对比(RDB vs AOF),以及缓存穿透的解决方案。 - Agent 项目深挖:围绕一个基于大模型的客服 Agent 项目,追问 RAG 检索策略、Function Calling 的容错设计、多轮对话的上下文管理,以及推理成本优化手段。
- 手撕算法题:「合并区间」(LeetCode 56)。给定一组区间,合并所有重叠区间。关键思路:按左端点排序,遍历时维护当前合并区间的右边界,若下一区间左端点小于等于当前右边界则合并,否则开启新区间。时间复杂度 O(n log n)。
项目深挖
面试官对项目细节的追问非常密集,几乎每个技术选型都会被追问“为什么”和“如果遇到 XX 问题怎么办”。
追问 1:你的 RAG 方案中,混合检索(BM25 + 向量检索)的融合策略是什么?
参考回答方向:先分别用 BM25 和向量检索召回 Top K 文档,然后采用 RRF(Reciprocal Rank Fusion)进行分数融合,公式为 score = Σ 1/(k + rank),其中 k 通常取 60。相比加权求和,RRF 不需要调权重,且对不同检索器的分数尺度不敏感。同时,在召回后增加一个基于 cross-encoder 的重排序阶段,虽然会增加约 20ms 的延迟,但能显著提升 Top 1 准确率。
追问 2:Function Calling 如果模型返回了不存在的函数名或参数格式错误,你怎么处理?
参考回答方向:我实现了三层容错。第一层是 Schema 校验,在调用前用 JSON Schema 对模型输出做校验,不合法则直接重试一次,并附带错误信息提示模型修正。第二层是函数注册表兜底,如果重试后依然非法,则返回一个默认的 fallback 函数,比如“转人工客服”。第三层是日志埋点,所有失败的调用都会记录下当时的输入和模型输出,用于后续分析是 prompt 问题还是模型能力边界问题。
追问 3:多轮对话的上下文管理,你怎么控制 Token 成本?
参考回答方向:我采用的是“滑动窗口 + 摘要压缩”的分层策略。对话前 10 轮保留原始内容,超过后每 5 轮对更早的对话用一个小模型(如 Qwen-1.5B)生成摘要,并将摘要作为系统提示词的一部分。同时,对用户输入做意图识别,如果当前问题与历史无关(如打招呼),则直接跳过上下文拼接。实测在 20 轮长对话中,Token 消耗降低了约 40%,而关键信息召回率保持在 90% 以上。
准备建议
- 八股要“透”不要“背” :MySQL 和 Redis 是必考项,但面试官更关注你是否理解机制背后的原理。建议自己画一遍
RR隔离级别下SELECT加锁的流程图,以及 Redis AOF 重写的过程,能讲清楚“为什么”比背出定义有用得多。 - Agent 项目必须准备“失败案例” :面试官对项目深挖的切入点多是你如何应对异常情况。建议提前梳理项目中 2-3 个真实踩坑的点,例如“向量检索召回不准”“模型 Function Calling 幻觉”等,并准备好具体的排查过程和最终解决方案。
- 手撕算法重点刷“排序 + 区间”类题目 :二面的算法题难度适中,但很看思路是否清晰。建议把
合并区间、会议室 II、插入区间这类题集中练习,熟练掌握排序后贪心/双指针的套路,同时注意边界条件(如空数组、区间完全覆盖等)。
结果反馈
一面通过后约 5 天收到二面通知,整体面试体验流畅,面试官对项目细节的追问很有深度,但不会刻意刁难。目前已收到 HR 后续流程通知,等待三面中。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。