NiceOffer

面试面经 · 唯品会

【唯品会】【Agent 开发】【暑期实习HR面】面经(八股+大模型项目+手撕)

唯品会面经Agent 开发实习

背景

海外一年制硕士,后端开发方向,有一段中小厂 Java 实习和两个 LLM Agent 相关个人项目。投递的是唯品会 Agent 开发暑期实习,整体面试风格偏工程落地,没有太多虚的,问的都是能直接写代码或讲清楚原理的东西。

题目摘要

  1. Java 基础:ConcurrentHashMap 在 JDK 8 中的锁机制变化,以及为什么放弃分段锁;volatile 的可见性与禁止重排序底层实现。
  2. MySQL 八股:给一张订单表,写 SQL 查询每个用户最近一笔订单,并说明如何用索引优化;追问联合索引最左匹配原则的底层原因。
  3. Redis 八股:缓存穿透、击穿、雪崩的区别及解决方案,重点问布隆过滤器误判率如何计算。
  4. Agent 项目深挖:RAG 检索召回率低怎么排查,Function Calling 的 tool 描述如何设计,上下文超长时的截断策略与成本计算。
  5. 手撕算法:给定一个整数数组和 target,返回所有和为 target 的不重复组合(数字可重复使用),要求输出组合列表而非个数。

项目深挖

追问 1:你项目里 RAG 检索效果不好时,是怎么定位问题的?

参考回答方向:先区分是召回问题还是生成问题。召回侧看检索 top-k 结果的相关性,如果相关性差,检查 chunk 切分粒度是否合适(比如把完整文档切成固定 500 字可能导致语义断裂),embedding 模型是否匹配领域(代码/法律文本用通用模型效果差)。再检查 query 改写策略——用户原始 query 往往口语化,需要先用 LLM 做意图改写,提取关键词和实体。如果召回没问题但生成答案差,通常是 prompt 中 context 组织方式问题,比如相关段落被截断或排序不当。还要量化指标,不能靠感觉,至少统计 hit rate 和 MRR。

追问 2:Function Calling 的 tool 定义有什么坑?

参考回答方向:tool 描述要像写 API 文档一样精确,模型是靠 description 来决定是否调用以及传什么参数的。常见坑是 description 太模糊导致模型不知道该用哪个 tool,或者参数约束不严导致传入非法值。实际做法是给每个 tool 写清楚适用场景和反例,比如"当用户询问天气时调用此工具,不要用于查询历史天气"。参数层面,required 字段必须明确,枚举值要写全,type 要严格。另外需要注意 tool 数量——一次请求塞 20 个 tool 定义会显著增加 token 消耗且降低选择准确率,需要做 tool 预筛选,比如先用一个轻量分类器判断意图再决定带哪几个 tool。

追问 3:上下文超长你怎么处理的,成本怎么估算?

参考回答方向:有两条路——压缩和裁剪。压缩指对历史消息做摘要,用 LLM 把多轮对话提炼成要点,但摘要本身有成本和信息损失,所以只在会话确实很长时才触发。裁剪是更激进的策略,直接丢弃不重要的消息,比如系统消息和工具结果可以截断,用户消息保留最近 N 轮。成本估算是按 token 数算的,需要统计每轮对话平均 token 数、tool 定义固定开销、system prompt 开销,然后用公式:单次请求成本 = 输入 token 数 / 1000 × 输入单价 + 输出 token 数 / 1000 × 输出单价。实际优化中,将 tool 返回结果截断到前 2000 字符,可以减少约 30% 的输入 token。

手撕算法详解

题目:组合总和(LeetCode 39 变体)。给定一个无重复元素的数组 candidates 和一个目标数 target,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。要求返回所有不重复的组合,且组合内按非递减顺序排列。

关键思路:这是典型的回溯 + 剪枝问题。先对数组排序,排序有两个作用——方便剪枝(当前元素大于剩余 target 时直接跳出循环)和保证组合内顺序。递归函数传三个参数:当前起始索引(保证不回头选之前的元素,从而避免重复组合)、当前路径、剩余目标值。每次递归从 start 开始遍历,跳过重复元素(如果原数组有重复需要先排序再跳过),当剩余值小于 0 剪枝,等于 0 时把路径加入结果。时间复杂度最坏 O(2^n),但排序加剪枝后实际运行很快。面试时先写暴力回溯版本,再主动提剪枝优化,并分析为什么排序后可以提前终止。

准备建议

1. 项目要准备量化指标和失败案例

HR 面虽然是 HR 面,但唯品会的流程里技术面试官也会参与部分轮次。项目里的每个模块都要能说出具体数字——RAG 的召回率从多少提升到多少、Function Calling 的调用准确率、延迟从多少降到多少。没有量化指标的项目在面试官眼里等于没做。同时准备一个"踩坑-排查-解决"的故事,比顺利做出来更有说服力,也能体现问题定位能力。

2. Java 并发和 MySQL 索引是高频区,刷题要控制时间

这次面试 Java 基础只问了 ConcurrentHashMap 和 volatile,但 MySQL 索引和 SQL 写了一个完整场景题。建议把《Java 并发编程实战》里 ConcurrentHashMap 相关章节和 MySQL 联合索引的底层 B+ 树结构彻底吃透。算法题控制在 15 分钟内写完,因为面试官还要留时间问项目和反问,写太久会压缩后面的环节,给面试官留下代码能力不扎实的印象。

3. 反问环节准备 2-3 个有深度的问题

不要只问"实习生转正率"或"几点下班"。问 Agent 开发团队目前用的是哪个框架(LangChain 还是自研)、生产环境中 Function Calling 的兜底策略是什么、团队对 RAG 和长上下文模型的使用边界怎么划分。这些问题能体现你真正理解 Agent 开发的工程难点,也能帮自己判断这个团队的技术栈是否匹配。

结果反馈

一面通过,约 5 天后二面(技术终面),面试官说后面还有一轮 HR 面,整体流程推进速度正常。

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