NiceOffer

面试面经 · 地平线

【地平线】【Agent 开发】【暑期实习二面】面经(八股+大模型项目+手撕)

地平线面经Agent 开发实习

地平线 Agent 开发 暑期实习二面面经

背景:海外一年制硕士,主修计算机,一段大模型 Agent 相关项目经历(RAG + Function Calling),一面通过后约一周收到二面通知。

题目摘要

  1. Go 语言基础:goroutine 与 channel 的底层实现、内存逃逸分析、defer 执行时机与参数求值
  2. MySQL/Redis 八股:InnoDB 索引结构为什么选 B+ 树、事务隔离级别与 MVCC 实现、Redis 持久化机制对比(RDB vs AOF)、缓存穿透/击穿/雪崩的应对
  3. Agent 项目深挖:RAG 检索质量优化、Function Calling 的意图识别与参数约束、多轮对话上下文管理策略、推理成本优化方案
  4. 手撕算法题设计一个支持 insertdeletegetRandom 的 O(1) 数据结构(类似 LeetCode 380),关键思路是哈希表 + 动态数组,删除时与末尾元素交换再 pop,保证数组连续性

项目深挖

追问 1:你的 RAG 系统在检索质量上做了哪些优化?

参考回答方向:从召回和重排两个层面回答。召回阶段用了混合检索(BM25 + 向量检索),通过加权融合得分;重排阶段用 cross-encoder 模型对 top-K 结果精排。另外针对领域术语做了 query 改写(如将缩写展开为全称),以及基于文本块重叠的切分策略减少语义断裂。如果面试官追问效果提升多少,建议准备具体数字(如 Recall@5 从 78% 提到 86%)。

追问 2:Function Calling 的意图识别失败时怎么处理?

参考回答方向:分三层兜底。第一层是模型输出解析失败(如 JSON 格式错误),用正则 + 修复策略,必要时重新调用模型只生成参数;第二层是意图置信度低,设置阈值,低于阈值时触发澄清追问而不是直接执行;第三层是参数校验失败(如必填参数缺失),与用户确认并引导补全。同时强调在 prompt 中给出清晰的 function 描述和 few-shot 示例能显著降低失败率。

追问 3:多轮对话中如何管理上下文,控制 token 成本?

参考回答方向:核心是分层上下文管理。系统指令和工具定义常驻,对话历史按时间衰减截断,最近 N 轮完整保留,更早的做摘要压缩。针对 Agent 场景,只保留与当前任务相关的工具调用结果,不相关的直接丢弃。另外,设置了 token 预算(如 4K),超预算时优先裁剪工具返回的冗长内容。如果项目里用了缓存(如 semantic cache),可以提一下命中率数据,会加分。

手撕算法题

题意:实现一个数据结构,支持在平均 O(1) 时间复杂度内完成 insert(val)remove(val)getRandom()(等概率返回一个已有元素)。

关键思路

  • 哈希表存 val -> index,动态数组存元素值
  • insert:检查哈希表是否存在,不存在则 append 到数组末尾并记录索引
  • remove:先查哈希表拿到索引,将数组末尾元素移到该位置并更新哈希表映射,然后 pop 末尾,删除哈希表记录
  • getRandom:直接随机取数组下标

坑点:删除时一定要先处理被交换元素在哈希表里的映射,再删除目标元素,否则会留下脏数据。面试时先讲清楚思路再写代码,边写边解释,写完主动跑一个简单用例验证。

准备建议

  1. Agent 项目必须准备量化数据。面试官会问"优化了多少"、"对比 baseline 提升多少",提前跑好评测并记住数字(如检索准确率、端到端任务成功率、平均响应延迟),比空谈方案有说服力得多。
  2. Go 语言基础按"底层原理"深度复习。不要只背概念,能画出 goroutine 的 GMP 模型、解释 channel 的发送/接收阻塞机制、说清 defer 的参数是立即求值而函数体是延迟执行。这部分是二面区分度最高的考点。
  3. 算法题按 LeetCode 中高频设计题刷。重点练"哈希表 + 数组/链表"组合拳的题目(LRU、O(1) 插入删除随机取),这类题能同时考察数据结构选型和边界处理能力。建议每道题先口头讲思路再写代码,模拟真实面试节奏。

结果反馈

二面整体节奏偏快,项目深挖占了大半时间,算法题顺利写完,面完第三天收到 HR 通知通过,约了终面时间。

想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。