NiceOffer

面试面经 · 黑芝麻智能

【黑芝麻智能】【Agent 开发】【暑期实习HR面】面经(八股+大模型项目+手撕)

黑芝麻智能面经Agent 开发实习

黑芝麻智能 Agent 开发 暑期实习 HR 面经

背景:海外一年制硕士,计算机相关专业,一段中小厂后端实习,无大厂实习经历。

题目摘要

整体面试节奏偏快,HR 面并非纯聊简历,而是穿插了技术基础考察和一道手撕题,实际时长约 50 分钟。核心考点如下:

  1. 编程语言基础(Go):考察 goroutine 与 channel 的使用场景、GMP 模型简述、map 并发安全如何处理。
  2. MySQL 八股:事务隔离级别、MVCC 实现原理、联合索引最左前缀原则、慢查询排查思路。
  3. Redis 八股:缓存穿透/击穿/雪崩区别及解决方案、Redis 持久化 RDB/AOF 对比、分布式锁实现方式。
  4. Agent 项目深挖:围绕 RAG 检索效果优化、Function Calling 的调用流程、上下文窗口管理策略、推理成本优化手段展开。
  5. 手撕算法题:题目是“实现一个带过期时间的 LRU 缓存”,要求写出 get 和 put 方法,时间 O(1)。
  6. 场景题:给定一个多 Agent 协作任务,如何设计消息传递机制和状态同步方案。

项目深挖

面试官对 Agent 项目非常感兴趣,追问细节较多,挑两个印象深刻的:

追问一:RAG 检索效果不好时,你具体怎么优化的?

我提到了三个层次:首先是召回阶段,从纯向量检索改为“向量 + 关键词”混合检索,用 RRF(Reciprocal Rank Fusion)合并结果,解决了专有名词召回不准的问题。其次是重排阶段,引入 cross-encoder 模型对 top-20 结果精排,虽然耗时增加约 30ms,但准确率明显提升。最后是查询改写,对用户原始问题先做意图识别,必要时拆解成多个子查询分别检索再合并。面试官追问了 RRF 的公式和为什么有效,答了核心思想是“排名靠前的文档在不同检索结果中越一致,越可能相关”。

追问二:Function Calling 的调用流程中,如果模型返回了不存在的函数名或参数格式错误,怎么处理?

我答了三个防线:第一层是 schema 校验,在调用前用 JSON Schema 严格校验模型输出,不合法直接返回错误信息让模型重新生成;第二层是异常兜底,如果函数执行抛出异常,将异常信息拼接到对话上下文中,让模型自行修正;第三层是超时控制,给每个函数调用设置 5 秒超时,超时后返回默认值并标记该轮调用失败。面试官比较认可,接着问了“如何防止模型反复调用同一个失败函数”——我补充了调用次数限制和上下文降权,即同一函数连续失败 2 次后,后续轮次不再将该函数列入候选。

手撕算法:带过期时间的 LRU 缓存

题意:设计一个数据结构,支持 get(key) 和 put(key, value, expireTime) 操作,get 时若 key 已过期则视为不存在,所有操作平均时间复杂度 O(1)。

关键思路:使用哈希表 + 双向链表实现基础 LRU,哈希表存储 key 到链表节点的映射。额外维护一个最小堆(或优先队列)存储过期时间,每次 get 和 put 时先清理堆顶已过期的节点。注意点:过期清理时需从哈希表和链表中同步删除;put 更新已有 key 时,需要同时更新链表位置和堆中的过期时间(采用懒删除,即堆中记录过期时间戳和 key,弹出时校验是否仍匹配)。

代码部分我用了 Go 实现,双向链表节点结构体包含 key、value、expireTime、prev、next 五个字段,哈希表存储 key 到 *Node 的映射,堆使用 container/heap 接口实现。面试官提示了边界条件:过期时间和 LRU 淘汰同时触发时,优先处理过期。

准备建议

  1. Agent 项目准备要落到细节:不要只讲“我用了 RAG”,必须能说出检索失败的案例和具体优化手段。建议提前准备 2-3 个失败案例,每个案例包含现象、原因分析、方案对比、最终效果数据。面试官会顺着你的回答连环追问,所以每个优化点都要准备“为什么这么做”和“有没有其他方案”两个角度。
  1. Go 语言基础要扎实:如果简历写了 Go,goroutine、channel、GMP 模型、sync.Map 底层原理是必问。建议把 Go 语言圣经对应章节过一遍,重点理解 channel 的阻塞机制和 select 的随机选择策略。手撕算法题可以用 Go 写,但要注意 Go 的 map 遍历无序性,别在实现里依赖遍历顺序。
  1. 八股要结合业务场景讲:MySQL 和 Redis 的问题不要只背定义。比如缓存穿透,不要只说“布隆过滤器”,要能说出“如果缓存 key 的 value 是空值,如何设计空值缓存策略”“布隆过滤器误判率怎么设”这类延伸问题。建议每个八股知识点准备一个“实际项目中怎么用”的例子,哪怕没做过也要能模拟。

结果反馈

一面通过,两天后约二面技术面,整体体验不错,面试官会引导思考方向,没有刻意刁难。

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