NiceOffer

面试面经 · 小鹏汽车

【小鹏汽车】【大模型开发】【暑期实习二面】面经(八股+大模型项目+手撕)

小鹏汽车面经大模型开发实习

海外一年制硕士,投递小鹏汽车大模型开发暑期实习,二面技术面约 60 分钟,面试官是做大模型应用落地的团队负责人。

题目摘要

  • Go 语言基础:slice 的底层结构、扩容规则、append 在函数传参时的坑;map 并发读写为什么 panic,怎么用 sync.Map 或分片锁规避。
  • MySQL 八股:聚簇索引与二级索引的回表过程;explain 里 type 从 ref 到 range 到 all 的差别;一条慢 SQL 的定位链路。
  • Redis 八股:缓存穿透/击穿/雪崩三件套的区分与各自解法;Redis 分布式锁为什么要用 SET NX PX 而不是 SETNX + EXPIRE。
  • RAG 项目深挖:文档切分策略怎么定的、召回率怎么评估、向量库选型理由、幻觉怎么压。
  • Function Calling / Agent:工具调用的参数校验、多轮工具编排、失败重试与幂等。
  • 手撕算法:LRU 缓存。要求 O(1) 的 get 和 put,用哈希表 + 双向链表实现;关键点是链表头尾哨兵节点省掉边界判断,get 命中后要把节点移到头部。

项目深挖

简历上写了一个基于 RAG 的汽车说明书问答系统,面试官几乎全程围着这个项目问,问题密度很高,记录三个印象最深的追问。

追问一:你的切分策略是什么,为什么这么切?

我最初答的是「按 512 token 固定长度切,重叠 64 token」。面试官追问:说明书里有大量表格和层级标题,固定长度切会不会把「某车型的胎压标准」和「另一车型的胎压标准」切到同一个 chunk 里,导致检索串味?

参考回答方向:先承认固定切分的缺陷,再给出改进思路——按文档结构切分(标题层级作为天然边界),表格单独抽成结构化 chunk 并在 metadata 里带上车型、章节路径;检索时用 metadata 做前置过滤(filter 后再做向量相似度),而不是纯靠语义相似度硬扛。可以补一句:重叠窗口的作用是防止答案被切断,但它解决不了语义串味,两者是不同的问题。

追问二:你怎么评估检索质量?召回率是多少?

这题是分水岭。很多人只做了「看起来还行」的主观评估。参考回答方向:构造一个几十到上百条的评测集,每条包含 query 和标准答案所在的 chunk id,然后算 Recall@k 和 MRR。如果没做过,就诚实说没系统评估过,但能讲清楚「应该怎么建评测集」——从真实用户日志里采样 query,人工标注 gold chunk。面试官其实更想看你知道评估这件事的存在,而不是编一个数字。

追问三:上下文塞不下的时候怎么办,推理成本怎么控?

参考回答方向:分三层讲。第一层是检索侧,控制 top-k 和 chunk 大小,用 rerank 模型把粗排的 20 条压到 3-5 条再进 prompt;第二层是 prompt 侧,历史对话做摘要压缩,只保留最近 N 轮原文 + 更早轮次的摘要;第三层是模型侧,简单意图走小模型或规则,复杂问题才路由到大模型,用 KV Cache 复用系统提示词前缀。能说出「rerank 是性价比最高的一环」这种判断,比罗列一堆优化手段更加分。

准备建议

  1. 把 RAG 项目的每个技术选型都准备好「为什么不是另一个」。面试官不会问你「用了什么」,而是问「为什么不用 X」。向量库为什么选这个而不是 FAISS/Milvus,切分为什么是 512 不是 256,embedding 模型为什么选它——每个决策点都要有一个能自圆其说的理由,哪怕是「当时时间紧,选了上手最快的,但如果重做我会考虑……」。
  1. 八股不要背结论,背因果链。比如缓存穿透,不要只答「布隆过滤器」,要能讲清楚:为什么会穿透(查询不存在的 key,缓存和 DB 都没有)→ 布隆过滤器怎么拦(用位数组判断 key 是否可能存在,有假阳性无假阴性)→ 它的代价是什么(不支持删除、需要预热)。面试官顺着问两层,背结论的人就露馅了。
  1. 手撕算法按「先讲思路再写代码」的节奏练。LRU 这种题,先花 30 秒说清楚数据结构选型(为什么是哈希表 + 双向链表,单向链表行不行),再动手写。写的时候注意边界:put 已存在的 key 要更新值并移到头部,容量满要删尾节点。写完主动跑一个例子验证,比等面试官挑错强。

结果

二面结束当天收到 HR 通知通过,约一周后三面(交叉面)。

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