面试面经 · 腾讯
【腾讯】【大模型开发】【暑期实习HR面】面经(八股+大模型项目+手撕)
腾讯 大模型开发 暑期实习 HR面 面经
背景:海外一年制硕士,主攻 NLP 与分布式系统,此前有一段中小厂大模型平台开发实习。
题目摘要
- 编程语言基础(Go):goroutine 与 channel 的原理、GMP 模型简述、内存逃逸分析场景。
- MySQL/Redis 八股:MySQL 事务隔离级别与 MVCC 实现、索引失效场景;Redis 持久化机制(RDB/AOF 混合)、缓存穿透与布隆过滤器。
- 大模型项目深挖:基于开源 LLM 的 RAG 问答系统,涉及向量检索、重排序、上下文窗口管理、Function Calling 实现天气查询。
- 手撕算法:LeetCode 146 LRU 缓存(要求手写双向链表 + 哈希表,分析 get/put 时间复杂度)。
- 场景设计:若将大模型响应延迟从 2s 降至 500ms,你会从哪些层面优化(提示:推理侧、检索侧、缓存侧)。
- 工程实践:如何评估 RAG 系统的检索质量?你用过哪些评估指标或工具。
项目深挖
追问 1:你的 RAG 系统在检索阶段如何解决“query 与文档表述不一致”的问题?
- 参考方向:先说明基础方案是向量检索(如 BGE-M3 embedding),但仅靠向量召回会漏掉同义改写或专业术语。我的方案是两层召回:第一层用向量检索取 Top 50,第二层用 BM25 取 Top 20,合并后经 reranker(如 bge-reranker-base)精排取 Top 5。同时,对 query 做了轻量级改写,比如把“苹果股价”改写为“Apple Inc. 股票价格”,这一步用了一个小模型(如 Qwen-1.5B)做 prompt 模板填充,成本极低但命中率提升明显。
追问 2:Function Calling 具体怎么实现的?如果模型返回了非法的 JSON 参数怎么办?
- 参考方向:实现上采用 OpenAI 兼容的 tools 协议,将函数 schema 注入 system prompt,模型输出为结构化 JSON,然后通过 JSON Schema 校验。非法 JSON 的兜底策略分三层:第一层是正则提取代码块中的 JSON 片段;第二层用
json.loads失败后,调用一个轻量级修复模型(如 GPT-3.5-turbo 或本地 7B 模型)做单轮修正;第三层若仍失败,则放弃工具调用,直接返回模型原生回答并附带提示“当前无法获取实时数据”。重点强调修复过程的延迟开销,通常控制在 200ms 内。
追问 3:上下文管理是怎么做的?长对话会不会导致 token 溢出?
- 参考方向:采用滑动窗口 + 摘要压缩的双层策略。窗口大小为 8K tokens,超过后触发摘要模型(如 ChatGLM3-6B)对最旧的消息做压缩,生成 200 字摘要存入系统消息。同时,对工具调用结果(如天气 JSON)做字段裁剪,只保留关键字段。追问成本优化时,补充了 KV Cache 复用策略——对历史轮次的 prompt 部分不重复计算,实测可减少 30% 推理开销。
手撕算法:LRU 缓存
题意:设计一个 LRU(最近最少使用)缓存数据结构,支持 get(key) 和 put(key, value) 操作,且平均时间复杂度均为 O(1)。
关键思路:使用哈希表(map[key]*Node) + 双向链表(头尾哨兵节点)。get 时若 key 存在,将节点移到链表头部;put 时若 key 已存在则更新值并移到头部,若不存在则插入头部,若容量超限则删除尾部节点。注意边界:链表为空时的指针操作、容量为 0 的防御。
面试官追问:能否用 Go 的 container/list 实现?答:可以,但需要自己维护 map 到 list.Element 的映射,且需要将 value 包装成结构体以存储 key,否则删除时无法 O(1) 拿到 key。
准备建议
- 八股要结合项目讲:不要背“MVCC 是什么”,而是说“我在项目里用 MySQL 存对话记录,遇到并发写时通过调整隔离级别到 Read Committed 解决了死锁,原因是 RR 下间隙锁导致”。面试官更在意你是否真的用过,而不是背得多熟。
- 大模型项目必须有数据支撑:提前准备几个数字——RAG 的命中率(如 Recall@5 从 0.72 提升到 0.85)、端到端延迟(如 2.1s 降至 0.8s)、成本(如每千次请求 token 消耗减少 40%)。没有真实数据就做一轮离线评测,用公开数据集(如 Natural Questions)跑一遍,不要只讲“效果不错”。
- 手撕算法刷高频题即可:LRU、TopK、反转链表、层序遍历、最长回文子串,这五类覆盖了 90% 的大模型岗位手撕题。建议每题手写两遍,第一遍 15 分钟内完成,第二遍用 Go 或 Java 的并发/容器特性优化写法(如 Go 的
sync.Map不适合此场景,要说出原因)。
结果反馈
一面通过,约 3 天后收到二面(技术面)通知。整体面试节奏较快,HR 面更侧重项目真实性与沟通逻辑,不深究技术细节,但会通过追问验证你是否亲手做过。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。