面试面经 · 文远知行
【文远知行】【Agent 开发】【暑期实习HR面】面经(八股+大模型项目+手撕)
文远知行 Agent 开发 暑期实习 HR 面经
背景:海外一年制硕士,计算机方向,投递时无实习经历,但有 2 个个人项目(一个 RAG 问答系统,一个 Function Calling 的 Agent 原型)。
题目摘要
面试整体节奏快,技术面与 HR 面合并进行,总时长约 1 小时。以下为考点摘要:
- 编程语言基础(Go):问的是 goroutine 与 channel 的使用场景,以及如何避免 goroutine 泄漏。没有问语法细节,偏向工程实践。
- MySQL 八股:索引失效的常见场景(最左前缀原则、隐式类型转换、like 以 % 开头),以及 explain 中 type 字段的含义(ALL、index、range、ref、eq_ref、const)。
- Redis 八股:缓存穿透、击穿、雪崩的区别与解决方案,重点问到了互斥锁和逻辑过期两种解决缓存击穿方案的优缺点。
- Agent 项目深挖:围绕 Function Calling 的触发机制、上下文管理策略、推理成本优化三个方向展开追问。
- 手撕算法题:题目:给定一个无序整数数组,找出其中最长连续序列的长度。要求时间复杂度 O(n)。关键思路:用哈希集合去重,遍历每个元素时,仅当
num-1不在集合中才启动向后探测(num+1、num+2...),记录最大长度。核心优化是避免重复探测,保证每个元素只被访问常数次。 - 开放题:如果让你设计一个 Agent 的异常处理机制,你会考虑哪些方面?考察系统设计思维。
项目深挖
面试官对我简历上的 Agent 项目(一个基于大模型 API 的日程管理助手,支持自然语言创建/查询/修改日程,通过 Function Calling 调用外部日历接口)追问得非常细。
追问 1:你的 Function Calling 是怎么触发和选择的?如果模型返回了一个不存在的函数名,你怎么处理?
参考回答方向:我的项目里维护了一个 JSON Schema 列表,每次请求时随用户消息一起发给模型,由模型决定是否调用及调用哪个函数。对于不存在的函数名,我做了两层校验:第一层是正则匹配函数名格式,第二层是比对 Schema 列表,不匹配则直接丢弃该调用请求,并返回一条错误提示给模型,让它重新生成。关键点是不能让模型静默失败,要让模型感知到错误并自我纠正。
追问 2:你的上下文管理是怎么做的?如果对话轮次很多,token 超限了怎么办?
参考回答方向:我用了滑动窗口 + 摘要压缩的两级策略。前 10 轮对话完整保留,超过后每 3 轮做一次摘要,将历史对话压缩成结构化摘要(包含用户目标、已完成的函数调用、关键参数)。另外,Function Calling 的返回结果不会全部塞进上下文,只保留最近 2 次调用的结果,更早的存入本地缓存,当用户再次询问时通过查缓存恢复。面试官追问了摘要的生成成本,我补充说摘要本身也消耗 token,所以是异步触发的,且摘要模型用了更小的模型(如 7B 级别)来降低成本。
追问 3:你提到做了推理成本优化,具体做了什么?效果怎么衡量?
参考回答方向:三个优化点。第一,函数 Schema 按需加载,不是所有函数都随请求发送,而是基于用户消息的关键词做预筛选,平均减少 30% 的输入 token。第二,对常见意图(如"查天气")做了缓存,命中缓存直接返回结果,不调用大模型。第三,对简单请求使用更小的模型,复杂请求才用大模型,通过一个规则引擎做路由。效果衡量上,我统计了每轮对话的平均 token 消耗和响应延迟,优化后成本下降了约 40%,P95 延迟从 3.2s 降到 1.8s。面试官对"按需加载 Schema"这个点很感兴趣,追问了具体怎么做的预筛选,我回答用了一个轻量级的意图分类器(基于关键词 + 正则),准确率约 92%,失败时 fallback 到全量发送。
准备建议
- Go 语言不要只背语法,要准备并发模型的实际问题。文远知行作为自动驾驶公司,后端服务对并发和性能要求高,goroutine 泄漏、channel 死锁、context 取消传播是高频考点。建议自己写一个简单的并发任务分发器,理解 WaitGroup、errgroup、context 的协作方式。如果投 Java 岗,则重点准备 JVM 内存模型和线程池参数调优。
- Agent 项目必须能讲清楚"成本"和"失败恢复"两个维度。大多数面试者只会讲"我用 RAG 做了什么",但面试官真正关心的是你是否考虑过生产环境的问题。建议在项目中主动加入:token 成本统计、API 超时重试机制、模型返回异常时的降级策略。哪怕实现很粗糙,也要有数据支撑(比如"重试机制使成功率从 89% 提升到 97%")。
- 手撕算法题不要只刷热门题,要练"看似简单但有陷阱"的题。这道最长连续序列看似简单,但 O(n) 的要求会卡住很多只会排序解法的人。建议刷题时养成习惯:每道题先想暴力解,再想优化点在哪里(空间换时间?预处理?),面试时先讲思路再写代码,写完主动跑一个测试用例。
结果反馈
一面通过,约 3 天后收到二面通知,二面为技术面,方向是系统设计。
想系统备战大厂大模型/Agent 开发?NiceOffer 提供 SDE+LLM 双轨 1v1 陪跑,合同保底 40w 年薪,文末扫码咨询。