月之暗面 Agent 开发一面:27 问只考记忆,挂面复盘
Agent 开发岗(大模型应用落地)
岗位:月之暗面(Kimi)· Agent 开发岗 轮次:一面技术面,结果:挂 一句话定性:这是一场「单点深挖型」面试,全场只考记忆和上下文一个主题,换个方向问六遍,考你是真做过还是背过。 素材时间线:2026 年 7 月的一手挂面复盘(牛客),整理时间 2026-09-28
0. 一分钟速览
| 项目 | 内容 |
|---|---|
| 公司 / 岗位 | 月之暗面(Kimi)· Agent 开发岗 |
| 形式 | 线上单面,1 位技术流面试官,全场约 27 问 |
| 有手撕吗 | 有。重排链表(LeetCode 143) |
| 有八股吗 | 少。八股只作为记忆话题的引子出现 |
| 考察重心 | 短期记忆实现、历史压缩、总结触发机制、向量召回、RAG 组件、Claude Code 架构 |
| 难度感受 | 单题不难,难在同一个主题被换了六种问法盘问,任何背过的部分都会露馅 |
| 结果 | 挂。挂点集中在触发机制和工程细节层 |
| 价值 | 这是了解「深挖型面试」长什么样的最好样本 |
1. 面试流程与时间分配
流程:自我介绍 → 短期记忆实现 → 历史压缩与总结 → 向量召回历史对话 → RAG 组件细节 → Claude Code 架构 → 手撕 → 反问
| 环节 | 面试官在听什么 | 挂点常出现在哪 |
|---|---|---|
| 短期记忆 | 滑动窗口、截断策略有没有真的写过 | 只说「保留最近 N 轮」说不出 token 预算怎么分配 |
| 历史压缩 | 总结的触发机制和增量策略 | 说不出「为什么按 token 数触发而不是按轮次」 |
| 向量召回 | 相似度检索的原理和组件选型 | cosine 讲不清几何意义、答不出为什么不用 BM25 |
| RAG 组件 | 切分、Embedding、Milvus、Rerank 的实操 | 只背过流程名词,说不出参数和调试经历 |
| Claude Code | harness 概念、记忆分层设计 | 没拆过 Claude Code 的结构 |
原帖作者的形容:「面试官是典型的技术流,说话不快,但每个问题都像手术刀——先切进去,再搅一搅,看看你到底是真懂还是背的。」「面试官揪着记忆这一个点,换了六种姿势盘问我。」
2. 追问机制:一个主题的六层问法
把这场面试的追问路径拆出来,是准备任何「深挖型面试」的模板:
- 第一层问方案:「多轮对话的短期记忆怎么实现?」
- 第二层问参数:「滑动窗口开多大?token 预算怎么分?」
- 第三层问触发:「历史压缩的总结什么时候触发?为什么按 token 数不按轮次?」
- 第四层问取舍:「增量摘要和全量摘要各什么时候用?」
- 第五层问替代:「向量化召回历史对话,cosine similarity 的原理?为什么不用 BM25?」
- 第六层问迁移:「Claude Code 的记忆是怎么设计的?harness 是什么?」
第六层是最狠的一问:把你聊了半小时的「记忆」话题甩到一个具体产品上,看你能不能把方案层的东西落到真实系统里。挂在这层的人最多。
3. 逐题要点:记忆主线
3.1 短期记忆实现
问法:「多轮对话的短期记忆怎么实现?」
答题要点:短期记忆的载体就是上下文窗口里的对话历史,工程问题是窗口有限。三个基础手段按层次说:滑动窗口(保留最近 N 轮)、截断(超预算丢最老内容)、摘要压缩(把老历史压成总结文本)。落点给分配方式:系统提示词、检索结果、当前轮、历史各占多少 token 预算,说得出预算分配就是做过的人。
3.2 总结的触发机制(本场挂点之一)
问法:「历史压缩的总结什么时候触发?」
答题要点:常见触发条件是「当前上下文用量超过阈值」。追问的关键题:**为什么按 token 数触发而不是按轮次?**因为每轮的长度差异极大,按轮次触发时,长回复场景会等很久才压缩(窗口已经爆了),短回复场景又压缩得太频繁(浪费一次模型调用和延迟)。按 token 数触发直接对准资源约束,压缩时机可控。
再加一层:触发后做增量摘要(老摘要加新丢弃内容合成新摘要)还是全量重摘要,增量省成本但有误差累积,全量准确但贵,按对话重要程度选。
3.3 向量召回历史对话
问法:「历史对话存下来做检索,cosine similarity 的原理?为什么不用 BM25?」
答题要点:cosine 相似度衡量两个向量方向的夹角,把语义编码进向量后,方向接近意味着语义接近,它能处理「说法不同但意思相同」的历史表述。不用 BM25 的原因:关键词匹配对口语化、换说法的历史对话召回差,用户这轮说「那个方案」,BM25 没法匹配到三轮前讨论「技术路线」的内容,向量可以。加分边界:精确词(型号、人名、代码标识符)向量检索反而弱,生产里混合检索更稳,主动说出这个边界比硬撑「向量万能」好。
3.4 RAG 组件细节
问法:「切分怎么做?Embedding 用的什么?向量库为什么选 Milvus?Rerank 起什么作用?」
答题要点:这四个子题连问,每个都要有具体答案:切分讲策略(按语义边界、重叠窗口)和 chunk 大小的量级;Embedding 讲选型依据(中文效果、维度、成本);Milvus 讲选型理由(规模、索引类型、部署形态);Rerank 讲它解决「召回了但排序不对」的问题,交叉编码器比向量内积准但慢,所以只精排前几十条。
坑:四个子题里有任何一个答「这个当时是同事负责的,我不太清楚」,这场面试基本就结束了。单点深挖型面试就是在找这种边界。
4. Claude Code 与 harness
问法:「用过 Claude Code 吗?它的记忆是怎么设计的?harness 是什么概念?」
答题要点:Claude Code 的记忆分层次——会话内上下文、项目级配置文件(CLAUDE.md,跟着仓库走)、用户级全局配置(跨项目生效),三层的写入时机和生效范围各不相同。harness 指包在模型外层的工程结构:工具注册、权限控制、上下文管理、循环调度,模型负责推理,harness 负责把推理变成可靠的动作。这题的准备方式只有一个:真的拆一遍 Claude Code 的行为,读一遍它的配置体系。
5. 手撕:重排链表
LeetCode 143,原地重排单链表。标准解法三步:找中点、反转后半段、双指针交错合并。原帖作者用数组存节点再按下标重排的取巧做法,被面试官当场识破。深挖型面试的手撕也在验证真实性——取巧解法能过评测机,过不了面试官。
6. 复盘:挂在哪里,怎么补
原帖作者的自评挂点,值得对照自查:
- 触发机制层没准备:方案名词都会,「为什么这样设计」答不出,第三层开始崩;
- 组件细节有空白:四个 RAG 子题答崩一个,后面面试官的追问就更狠;
- 产品迁移没练过:聊了自己项目的记忆方案,被问到 Claude Code 的设计时接不住。
补法按这三条来:
- 自己项目里的每个机制,把「为什么这样做、不这样做会怎样」写成一句话答案,背下来;
- RAG 全链路(切分、Embedding、向量库、Rerank)每个组件准备一个参数级的细节;
- 拆一个真实 Agent 产品(Claude Code 是最常被考的),把它的记忆分层和 harness 结构说清楚。
单点深挖型面试在 Kimi 这类产品公司会越来越常见——他们的业务就是长上下文和记忆,面试官问的就是自己每天在解决的问题。
相关题目:站内题库的「Agent 的记忆系统怎么设计」「上下文压缩怎么做」「Rerank 的作用是什么」都对应这场面试的原题。