面试面经 · 滴滴
【滴滴】【Agent 开发】【暑期实习二面】面经(八股+大模型项目+手撕)
海外一年制硕士,投递滴滴 Agent 开发暑期实习,二面约 60 分钟,面试官是 Agent 平台侧的工程师,全程围绕项目 + 基础 + 一道手撕展开。
题目摘要
- Go 语言基础:
slice的底层结构、扩容规则,以及append在函数传参时为什么"改了又好像没改";map并发读写为什么会 panic,sync.Map的适用场景。 - MySQL / Redis 八股:聚簇索引与回表的代价,联合索引最左前缀在
where a=? and c=?下的命中情况;Redis 缓存穿透/击穿的差别与各自解法,zset跳表为什么不用红黑树。 - Agent 项目深挖:RAG 链路的召回质量怎么评估、Function Calling 的失败重试与幂等、多轮对话的上下文裁剪策略、单次请求 token 成本怎么压。
- 手撕算法:给一个整数数组
nums和整数k,求所有长度为k的连续子数组的最大值,返回这些最大值的数组(滑动窗口最大值)。关键思路是用单调递减双端队列存下标,队首即当前窗口最大值,入队前把比当前元素小的全部弹出,窗口滑出时判断队首下标是否过期,整体 O(n)。 - 场景设计:如果 Agent 要调用一个"查询订单状态"的工具,用户连续追问三次,怎么设计缓存和工具调用去重。
项目深挖
追问一:你的 RAG 召回率怎么量化?上线后掉点了怎么定位?
参考回答方向:先说清楚评估集怎么来的——从真实 query 里采样,人工标注"正确 chunk",算 Recall@k 和 MRR,不要只讲"感觉答得还行"。掉点定位要分层:先看是 embedding 模型换了、还是切分策略变了、还是索引没重建;再对比 query 改写前后的召回差异。可以补一句:线上用 LLM 做相关性打分(LLM-as-judge)做粗筛,但最终以人工抽检为准,因为 judge 本身有偏好。面试官想听的是你有没有"可观测"的意识,而不是堆术语。
追问二:Function Calling 里模型给的参数是错的,或者工具超时了,你怎么处理?
参考回答方向:分三层。第一层是 schema 校验,用 JSON Schema 或 Pydantic 在调用前拦截类型/必填项错误,直接把错误信息回灌给模型让它重生成,而不是抛异常。第二层是超时与重试,读操作可以指数退避重试,写操作必须带幂等键(比如 request_id),避免重复下单。第三层是兜底,重试 N 次仍失败就降级成"告知用户稍后再试"或转人工,不能让 Agent 卡死。这里可以主动提一句:工具描述(description)写得好不好,直接决定模型选对工具的概率,很多人忽略这点。
追问三:多轮对话上下文越来越长,token 成本怎么控?
参考回答方向:不要只说"截断"。可以讲分层策略——系统提示词和工具定义是固定开销,尽量精简;历史对话用滑动窗口 + 摘要,把较早的轮次压成一段 summary;RAG 召回的 chunk 做重排后只保留 top-3,而不是全塞进去。再进一步:对稳定前缀做 prompt caching(如果用的模型支持),能显著降本。最后给个数字感:优化前后单请求 token 从 X 降到 Y,成本降了多少,比空谈"优化了上下文"有说服力。
准备建议
- 把项目里的每个数字都准备好:召回率、QPS、token 消耗、延迟 P99、成本降幅。面试官追问时最怕听到"大概""差不多",一个具体数字能撑起整段对话,也逼你回头把监控和评估补上。
- Go 的 slice/map 别只背结论,动手写一遍:自己写个 demo 验证
append扩容后的地址变化、for range里取地址的坑、map并发写的 panic 复现。八股答得再熟,被要求"写个例子"时卡壳就很减分。 - 手撕按题型刷,不要按题号刷:滑动窗口、双指针、单调栈/队列、TopK 这几类高频,每类吃透 3-5 道,重点是能边写边讲清边界条件(空数组、k 大于长度、k=1)。Agent 岗的手撕通常不难,考的是代码整洁和沟通,写完主动跑两个用例。
一面通过后第 3 天约的二面,二面结束当天晚上收到 HR 反馈进入下一轮。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。