NiceOffer

面试面经 · 文远知行

【文远知行】【Agent 开发】【暑期实习三面】面经(八股+大模型项目+手撕)

文远知行面经Agent 开发实习

海外一年制硕士,投递文远知行 Agent 开发暑期实习,三面技术面,面试官是 Agent 平台方向的工程师,全程约 70 分钟,无自我介绍环节,直接进项目。

题目摘要

  1. Go 语言基础slice 的底层结构与扩容策略;map 并发读写为什么会 panic,sync.Map 适用于什么场景;context.WithCancel 的传播机制与 goroutine 泄漏的常见成因。
  2. MySQL / Redis 八股:聚簇索引与回表,EXPLAINtype 各档位的含义;RR 隔离级别下间隙锁如何解决幻读;Redis 大 key 的危害与排查手段;缓存与数据库一致性方案(旁路缓存 + 延迟双删)的取舍。
  3. Agent 项目深挖:RAG 检索链路的分段策略、召回与重排;Function Calling 的工具描述设计与多轮工具调用状态机;长对话上下文压缩策略;单次请求的 token 成本与延迟拆解。
  4. 手撕算法:给定一个字符串 s 和一个单词字典 dict,返回 s 能否被空格拆分成字典中的单词序列(LeetCode 139 单词拆分)。要求先讲思路再写代码,并分析复杂度。

项目深挖

追问一:你的 RAG 系统里,chunk 是怎么切的?切完之后召回效果不好,你从哪几个维度排查?

参考回答方向:先讲切分策略本身——固定长度切分会导致语义截断,按标题层级 / 段落切分再叠加滑动窗口重叠(overlap 一般取 chunk 的 10%~20%)是常见做法,代码类文档可以按函数 / 类边界切。排查维度分三层:一是切分粒度,chunk 太大导致噪声多、太小导致语义不完整,可以做粒度消融实验;二是召回层,看是 embedding 模型对领域词不敏感,还是 top-k 太小、相似度阈值卡太死,可以引入 BM25 做混合检索;三是重排层,cross-encoder 重排能把粗排的噪声压下去,但要算清楚它带来的额外延迟。最后落到指标上:用命中率(recall@k)和 MRR 量化,而不是凭感觉说"效果变好了"。

追问二:Function Calling 在多轮里怎么管理状态?如果模型连续调用同一个工具、参数还不对,你怎么处理?

参考回答方向:状态管理上,工具调用结果要以 tool role 的消息回填进对话历史,维护一个显式的调用栈或状态机,避免模型"忘记"自己已经调过什么。对重复调用,可以在工具描述里写明前置条件,或者在编排层做去重——同一轮内相同 (tool_name, args) 直接复用上次结果。参数不对属于典型的 schema 约束问题,靠 prompt 约束不可靠,应该在工具定义里用 JSON Schema 把必填项、枚举值、格式写死,并在执行前做参数校验,校验失败时把错误信息作为 observation 回灌给模型让它自我修正,同时设置最大重试次数(一般 2~3 次)防止死循环。可以补一句:生产环境更倾向用结构化输出(如 constrained decoding)替代纯 prompt 约束。

追问三:长对话上下文越来越长,token 成本和延迟都上去了,你怎么优化?

参考回答方向:分几个层面答。一是上下文压缩,对历史轮次做摘要,保留最近 N 轮原文 + 更早轮次的摘要,摘要本身也要控制长度;二是分层记忆,把稳定信息(用户画像、任务目标)放 system prompt,把易变信息放对话尾部,利用注意力对首尾更敏感的特性;三是缓存,对 system prompt 和固定前缀做 prompt caching,能显著降首 token 延迟和成本;四是模型路由,简单意图用小模型、复杂推理才上大模型。最后给一个量化口径:把单次请求拆成 prompt token、completion token、工具调用耗时、检索耗时四块,分别看优化空间在哪,而不是笼统说"变快了"。

手撕算法

题目:单词拆分。给定非空字符串 s 和非空单词列表 wordDict,判断 s 能否被空格拆分为一个或多个字典中出现的单词。字典中的单词可以重复使用。

关键思路:定义 dp[i] 表示 s 的前 i 个字符能否被拆分。转移时枚举分割点 j,若 dp[j] 为真且 s[j:i] 在字典中,则 dp[i] 为真。字典用哈希集合存储,查询 O(1)。时间复杂度 O(n²)(每个位置枚举分割点并做子串哈希),空间 O(n)。优化点:内层循环可以从 i 往前遍历,且子串长度超过字典中最长单词长度时直接 break,剪掉大量无效枚举。面试官追问了"如果要求返回所有拆分方案"——那就是回溯 + 记忆化(LeetCode 140),要注意用 memo 避免重复子问题导致的指数级爆炸。

准备建议

  1. 把项目里的每个数字都变成可解释的。面试官不会满足于"用了 RAG 提升了效果",要准备好召回率、延迟、token 成本的具体数值和对比基线,哪怕是自己离线评测的小样本数据。没有数字的项目描述在深挖环节会立刻露馅。
  2. 八股不要背结论,背因果链。比如间隙锁,要能讲清楚"RR 下如何用间隙锁防幻读 → 间隙锁带来什么代价 → 为什么很多团队线上用 RC",把知识点串成决策链,而不是孤立的名词解释。
  3. 手撕题按"思路 → 边界 → 复杂度 → 优化"四步走。先口述思路再动手,主动说出空串、字典含单字符、超长字符串等边界,写完主动分析复杂度并给出剪枝优化,比闷头写完等面试官问要加分得多。

三面通过,HR 三天后约了终面(交叉面)。

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