面灵AI→

美团 AI 应用开发一面面经(通过)

轮次
一面
结果
通过
时间
2026-10
来源
牛客网

《面试题目》

  1. 介绍一下你的实习经历,讲讲项目整体架构。
  2. 直接说你遇到最坑的地方是什么?(追问:用户问「怎么退款」和「退款到哪了」总是撞在一起,怎么拆?)
  3. Transformer 的注意力机制是怎么工作的?
  4. 多轮对话的状态怎么存?
  5. 手撕:最长无重复子串。
  6. 反问环节。

《参考解析》

召回串味的定位与拆解。「怎么退款」和「退款到哪了」撞在一起,本质是两类意图的知识形态完全不同:前者要的是流程说明(政策、步骤、条件),后者要的是个人订单状态查询(要查库、需要身份与订单号)。把它们塞进同一个向量索引,靠语义相似度去区分是无效的,因为这两句话的字面与语义都很接近。正确的拆法是先分类再路由:在检索之前加一层意图识别(规则 + 小模型或 LLM 分类都行),把查询分到「政策问答」「订单查询」「投诉」「闲聊」等路由,各路由走各自的工具与知识库——政策类走向量检索,订单类走结构化查询接口,两者根本不在一个空间里竞争。追问里还提到「长答案做句子级切片」,解决的是另一个问题:整篇政策文档切块后,一个 chunk 里可能既有退款条件又有退款时限,向量表征被平均掉,检索时命中率下降;按句子或语义单元切成更小的检索单元、并把父段落一起带回来(小块检索、大块返回),既提高召回精度又不丢上下文完整性。落地时再叠一层重排(rerank)和答案里显式标注来源,效果才算稳。

Transformer 注意力与 KV 缓存。自注意力做的事是:把每个 token 的输入映射成 Query、Key、Value 三组向量,用 Q 与所有位置的 K 做点积得到相关性权重,经缩放(除以维度的平方根,避免点积过大导致 softmax 饱和)和 softmax 归一化后,对 V 做加权求和,得到当前位置的上下文表示。多头注意力是把这套计算并行做几组、再把结果拼接投影,让不同的头关注不同的关系(语法、指代、位置等)。它是全连接式的两两交互,所以能一次看到全序列、天然并行,代价是计算与显存随序列长度平方增长,这也是长上下文昂贵的根源。KV 缓存是自回归生成时的优化:生成第 t 个 token 时,前面 t−1 个位置的 K 和 V 与本次查询无关、结果不变,把它们缓存下来就不必每步重算整个前缀,解码从「每步重算全序列」变成「每步只算新 token 的 Q」,把单步计算量从 O(n²) 压到 O(n),代价是显存占用随序列长度线性增长。面试里能补一句「KV 缓存是拿显存换延迟,长上下文推理的显存瓶颈主要在这里」,比只背公式更有区分度。

多轮对话的状态怎么存。关键是把「会话状态」和「模型上下文」分开,别把状态写在 prompt 里当成唯一真相。做法是:用一份结构化的槽位(slot)保存对话推进出来的确定信息——用户身份、订单号、问题类型、已确认的条件、待补充的字段,落到 Redis 或数据库,按会话 id 索引;每次进入模型时只带最近几轮原文加当前槽位,而不是把全部历史都塞进去。这样做的收益有三点:状态可以被代码读写和校验(必填槽位缺了就主动追问),不用担心模型「忘了」;上下文长度可控,成本与延迟稳定;会话中断后可以恢复,也能支持人工接管时看到完整状态。槽位的更新要收敛:由模型输出结构化的抽取结果、再由代码校验后写入,而不是让模型直接改状态——否则多轮里状态会被幻觉污染。至于过期策略,按业务设 TTL,并区分「会话级状态」(关掉就丢)与「用户级长期偏好」(需持久化)。

手撕最长无重复子串。滑动窗口加哈希:维护左指针 left 和一张「字符 → 最近出现下标」的表,右指针从左到右扫描,遇到字符已经出现过且其下标不小于 left,就把 left 移到该下标加一的位置,每步用 right - left + 1 更新答案。时间 O(n)、空间 O(字符集大小)。现场最容易卡的两处:一是右指针「回退」——正确做法是左指针跳跃,右指针永不停;二是更新 left 时要取 max(left, lastIndex+1),否则当字符上次出现在窗口之前时会把窗口错误地缩小。写完后主动补一句边界:空串返回 0、全相同字符返回 1、Unicode 情况下用字符集数组或 Map 而不是 26 长度的数组。

讲项目的取舍。这场面试里最值得学的是答法:面试官打断了「讲架构」的长篇,直接要「最坑的地方」,然后顺着追问了二十分钟。这说明项目题考的不是覆盖面,而是你在一个具体问题上的深度——能不能讲清现象(谁和谁混了)、怎么定位(看了什么数据、排除了哪些可能)、试过哪些方案为什么不行、最后选了哪条以及代价是什么。反过来,把架构、技术栈、模块名一次铺开,既占时间又给了对方一堆可以随便挑的追问点。所以准备项目时,每个项目挑一到两个「有取舍、有数据、能复盘」的点深挖,比记住十个模块名有用。