NiceOffer

面试面经 · 腾讯

【腾讯】【大模型开发】【暑期实习二面】面经(八股+大模型项目+手撕)

腾讯面经大模型开发实习

腾讯 大模型开发 暑期实习二面 面经

背景:海外一年制硕士,一段大模型 Agent 相关项目经历,无实习。

题目摘要

二面整体风格偏工程落地,面试官对项目细节追问非常深,八股比重低于一面。核心考点如下:

  1. Go 语言基础:goroutine 与 channel 的底层原理、内存逃逸分析、GMP 调度模型简述
  2. MySQL/Redis 八股:MVCC 实现机制、索引失效场景、Redis 持久化策略对比(RDB vs AOF)、缓存穿透/击穿/雪崩的工程解法
  3. RAG 项目深挖:检索质量优化、上下文窗口管理策略、Function Calling 的容错设计
  4. 推理成本优化:Prompt 压缩方案、缓存策略、模型选型考量
  5. 手撕算法:设计一个支持 get / put / getRandom 三个操作均为 O(1) 的数据结构(即插入、删除、随机获取一个已有元素)

项目深挖

面试官全程围绕我简历上的 Agent 项目展开,几乎没有给喘息机会。以下是我印象最深的三个追问方向:

追问一:RAG 检索质量差,你怎么定位和优化?

参考回答方向:先分模块定位问题——是召回阶段(检索结果不相关)还是生成阶段(模型没用好检索内容)。召回侧我会先看 embedding 模型对领域术语的编码效果,用 hit rate 和 MRR 量化评估;如果效果差,考虑混合检索(BM25 + 向量检索)并用 RRF 融合排序。生成侧常见问题是上下文被无关 chunk 干扰,我会做重排(rerank)截断,只保留 top-k 中最相关的片段。另外,chunk 切分策略也很关键,我调过不同 chunk size(256/512/1024),发现对长文档用「结构感知切分」(按标题/段落边界)比定长切分效果好很多。

面试官追问:如果检索结果本身是对的,但模型答错了怎么办? 我回答会检查 prompt 是否明确指示模型「仅基于给定上下文回答」,以及是否出现上下文过长导致模型注意力分散的情况,必要时做关键句提取压缩。

追问二:Function Calling 的容错怎么设计?

参考方向:Function Calling 在生产环境最大的坑是模型幻觉——模型可能生成不存在的函数名、参数格式错误、或者参数语义不对。我的方案分三层:第一层,在 system prompt 里给严格的 JSON Schema 定义,并给 1-2 个 few-shot 示例;第二层,代码层做防御性校验,解析失败就走「重试 + 降级」逻辑,重试一次还失败就返回兜底回复而非直接报错;第三层,对高频函数做参数白名单校验,比如查询天气的城市名,先比对城市库,不在库中就调模糊匹配或让用户确认。

面试官继续追问:如果模型反复调用同一个函数停不下来(死循环)怎么办? 我答设置单轮最大调用次数(如 5 次),超限强制终止并返回中间结果,同时记录日志用于后续分析。

追问三:上下文管理怎么处理超长对话?

参考方向:我的做法是分层管理——短期记忆(最近 N 轮完整对话)用滑动窗口保留;长期记忆(用户偏好、关键事实)通过摘要 + 向量检索的方式按需注入。具体实现上,每轮对话结束后触发异步摘要任务,把历史关键信息提炼成结构化字段存 Redis,下次请求时根据当前 query 做相关性检索,只注入命中的长期记忆片段。另外对超长文档,我用 MapReduce 式摘要,先分段总结再合并,避免直接塞进上下文。

面试官追问:摘要本身有信息损失,你怎么评估损失是否可接受? 我答做下游任务准确率的 A/B 测试,对比全量上下文和摘要上下文的效果差异,设定可接受的阈值。

手撕算法:O(1) 随机获取数据结构

题意:设计一个数据结构,支持插入、删除、随机获取一个元素,三个操作的平均时间复杂度均为 O(1)。元素唯一,重复插入不报错。

关键思路:核心是「数组 + 哈希表」组合。数组存元素,哈希表存元素到数组下标的映射。插入时 append 到数组尾部并记录下标;删除时先找到该元素在数组中的位置,与数组最后一个元素交换,然后 pop 尾部并更新哈希表中被交换元素的下标——这样避免数组中间删除带来的 O(n) 搬移。随机获取直接用 rand.Intn(len(arr)) 返回对应下标元素。

注意坑:删除不存在元素时的处理;数组为空时随机获取要报错或返回特定值;Go 实现时注意 slice 的底层共享问题。

准备建议

  1. 项目准备以「被追问到墙角」为标准。不要只准备自己讲什么,要预判面试官会怎么拆你的方案。对 RAG 项目,至少准备:检索质量如何量化评估、chunk 大小怎么调、rerank 要不要上、embedding 模型怎么选——每个问题都要能往下深挖两三层。建议找同学模拟面试,专门练追问环节。
  1. 算法题刷到「中等偏上难度」即可,但必须练熟与哈希表/堆/双指针组合的题。大模型岗位二面手撕算法一般不是 hard 题,但会考数据结构组合设计(LRU、LFU、O(1) 随机获取这类)。刷题时不要只背题解,要理解为什么选这个数据结构——面试官会问「为什么不用纯哈希表」「删除为什么必须交换」。
  1. Go 语言基础别只背概念,要能说出「为什么这么设计」。比如 goroutine 为什么轻量(用户态调度、初始栈 2KB 可动态增长)、channel 底层是什么(hchan 结构体 + 锁 + 条件变量)、GMP 模型解决什么问题(减少线程切换开销)。最好能结合自己项目的并发场景讲,比如「我在做异步摘要任务时开了 goroutine 池,用 channel 做任务分发,因为……」。

结果反馈

一面通过后约 4 天收到二面通知,面完 30 分钟后 HR 电话约三面时间。

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