NiceOffer

面试面经 · 唯品会

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

唯品会面经Agent 开发实习

海外一年制硕士,投递唯品会 Agent 开发暑期实习,三面为技术终面,面试官是 Agent 方向的技术负责人,全程约 70 分钟,无自我介绍寒暄,直接进入项目与八股交替提问。

题目摘要

  1. Go 语言基础:slice 的扩容机制、map 是否并发安全、context 的取消传播、defer 与返回值的关系。
  2. MySQL / Redis 八股:聚簇索引与回表、explain 中 type 与 key_len 的含义、Redis 缓存穿透/击穿/雪崩的区分与各自解法、Redis 分布式锁的续期问题。
  3. Agent 项目深挖:RAG 检索链路的分段与召回策略、Function Calling 的工具描述与参数校验、多轮对话的上下文裁剪与摘要、推理成本优化(缓存、模型分级、prompt 压缩)。
  4. 手撕算法:LRU 缓存。题意:设计一个数据结构,支持 get(key) 和 put(key, value),容量满时淘汰最久未使用的键,要求两个操作均为 O(1)。关键思路:哈希表存 key 到双向链表节点的映射,双向链表维护访问顺序,get 命中后把节点移到头部,put 时若超容量则删尾部节点。面试官要求手写双向链表而不是直接用 container/list。
  5. 开放题:如果让你给唯品会的商品导购场景设计一个 Agent,你会怎么拆工具、怎么控制幻觉。

项目深挖

追问一:你的 RAG 项目里,召回率上不去的时候你具体动了哪一层?

参考回答方向:不要泛泛说"调了参数"。分层拆——文档解析层(PDF 表格被截断、标题层级丢失导致 chunk 语义不完整)、切分层(固定长度 vs 按语义/标题切,overlap 设置)、embedding 层(中文场景换 bge 系列、对比不同模型在自有评测集上的 recall@k)、检索层(向量召回 + BM25 混合、加 rerank 模型)。重点讲你建了一个 50~100 条的小评测集,每次改动都跑一遍 recall@5 和 MRR,而不是凭感觉。面试官通常接着问"rerank 模型加进去延迟涨了多少,你怎么权衡",要能报出数量级。

追问二:Function Calling 里模型选错工具、或者参数格式不对,你怎么处理?

参考回答方向:分三层。第一层是工具描述本身——名称和 description 要写清楚适用边界,参数用 JSON Schema 严格约束类型和枚举,别让模型自由发挥;第二层是运行时校验,参数进业务前做 schema 校验,失败则把错误信息回灌给模型让它重试一次,设最大重试次数防止死循环;第三层是兜底,重试仍失败就降级到规则匹配或直接返回澄清话术。可以补一句:工具数量超过一定量级后,全量塞进 prompt 会稀释注意力,考虑按意图先做工具召回。

追问三:多轮对话上下文越来越长,成本和延迟都上来了,你怎么管?

参考回答方向:区分"必须保留"和"可以压缩"。系统 prompt、当前工具调用结果、最近 N 轮原文保留;更早的历史做滚动摘要,摘要本身也要控制长度。另外把稳定的前缀(系统 prompt、工具定义、few-shot)放在前面,利用 KV Cache / prompt caching 命中,能省掉重复计算。如果面试官追问"摘要会不会丢信息",可以答:关键实体和用户显式约束(预算、尺码、品牌偏好)单独抽成结构化 slot 存着,不依赖摘要。

手撕算法细节

LRU 这题三面还在考,说明面试官看重基础数据结构的熟练度。写的时候注意几个点:map[int]*Node 存的是指针,删除时要先断链表再删 map;用虚拟头尾节点(dummy head/tail)可以省掉大量边界判断;get 未命中返回 -1 这种约定要跟面试官确认。写完后面试官追问了"如果改成 LFU 呢",只需要口述思路:额外维护 freq 到双向链表的映射,再加一个 minFreq 变量。

Go 八股部分被追问了 map 并发写为什么会 panic,答了运行时检测到并发写会直接 throw,正确做法是加锁或用 sync.Map,并说明 sync.Map 适合读多写少、key 相对固定的场景,不是万能替代。

准备建议

  1. 把项目里的每个数字都变成可回答的。recall@k、P99 延迟、token 消耗、成本下降比例,面试官一定会挑一个问"这个数怎么来的"。没有真实数据就自己搭评测集跑一遍,别编。
  2. 八股不要背结论,背因果。比如缓存穿透讲清楚"查不存在的 key 导致请求打到 DB",再讲布隆过滤器或空值缓存的取舍,比背三个名词有用得多。MySQL 索引部分能手画 B+ 树结构、说清回表代价。
  3. 手撕题按类型刷,不按题号刷。LRU/LFU、TopK、滑动窗口、二叉树遍历、并发控制(Go 的 channel 实现限流)这几类各刷透 3~5 道,写的时候刻意练"先讲思路再写代码",面试官更看重沟通。

面试结束当天收到 HR 反馈三面通过,约 5 个工作日后沟通实习时间与薪资。

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