度小满 AI 全栈研发二面:AI Coding 工作流、长期记忆与多 Agent 闭环
- 轮次
- 二面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
实习
- 自我介绍
- 实习中的 AI Coding 工作流,是部门提供的现成工作流,还是你自己搭建的?
- 能否拆解一下这个工作流的具体步骤?
- 在这个工作流中,是否包含了大量人工交互的过程?
- 有哪些措施可以保证这个工作流运转的顺畅和准确性?
- 在代码生成阶段,你给 AI 提供了哪些辅助信息,让它能够比较准确地输出你想要的代码?
- 用于辅助 AI 理解代码架构的文档(TechDoc)是你自己生成的,还是团队的历史积累?
- 你了解这种文档动态维护的思路或流程吗?
- 在工作流的测试阶段,怎么保证测试的覆盖度?如何通过测试实现最终的兜底效果?
- Answer 追问 Query 的「数据埋点」思路是你提出的吗?为什么要设计这三态的逻辑?
- 对于数据上报,你们有什么措施来保证上报的质量和成功率?
- 假设基础设施没那么好,需要你额外去设计一套数据上报机制,你会采取哪些举措?
- 如果设计了重试机制,数据其实已经传上去了,但因为网络问题没收到 ACK 导致了重复上传(数据重复),这个问题你会怎么解决?
- 多模型切换重答功能,是系统自动切换的,还是用户可选的?
- 在多模型切换中,你负责搭建的状态机主要起到了什么作用?
- 切换模型进行重答时,会把上一个模型的上下文也带过去吗?
- 不同的模型上下文窗口大小不一样,如果从一个大窗口模型切换到一个小窗口模型(上下文不够用),你们是怎么处理的?
- 长期记忆裁剪具体是指什么?
- 除了重复对话的精简,从短期记忆提取到长期记忆的逻辑是怎样的?系统是怎么判断哪些内容应该进入长期记忆的?
- 如果提取新记忆时发现与历史长期记忆有冲突(例如:以前说喜欢某样东西,现在说不喜欢了),有什么解决冲突的逻辑?
- 项目中是如何通过耗时监控具体定位到性能瓶颈的?请讲一下你的分析思路。
- 渲染任务中,是不是有些任务实际是可以并行的,但原本被写成了串行?你是如何处理的?
- 你们的测试框架能够根据当前的需求,动态生成测试 Case 吗?
- 怎么评估测试 Case 的覆盖度?跑完测试后的结果比对(验证正确性)也是由 AI 来做的吗?
- 实际去跑测试的 Agent 和负责验证结果正确性的 Agent,是同一个还是相互隔离的?
- 既然设计了多个 Agent,它们之间有实现协同吗?还是需要人工干预传递数据?
- 如果最后负责验证的 Agent 发现测试结果不对,它会自动反馈给前面的步骤,让它重新写代码并重新测试吗(是否实现了自动闭环)?
反问
- 后续还有流程吗?(问 HR)
《参考解析》
-
「工作流是你搭的还是部门现成的」这类问题,答法决定整场面试的走向:最稳的结构是先给归属(哪部分是团队已有的、哪部分是我做的),再给边界(我负责的是哪几个环节、和谁协作),最后给证据(具体的产出、上线后的使用情况、遇到的问题)。拆解步骤时按「需求理解 → 方案设计 → 代码生成 → 自测 → 评审」分段,每段说清输入是什么、模型负责什么、人卡在哪一步。被追问「有多少人工交互」时不要粉饰——现阶段 AI Coding 一定是人机协作,关键是说清哪些环节必须人确认(接口契约、数据库变更、权限与安全)以及为什么。
-
保证工作流顺畅与准确,靠的是上下文供给和验证卡点,不是更会写提示词:上下文侧包括把相关代码文件、接口定义、目录结构与既有约定喂给模型,用 TechDoc 这类架构文档补足模型看不到的整体设计;约束侧要求最小改动、明确禁止改动的范围、固定输出模板(问题定位、修改位置、改前改后);验证侧必须有可执行的卡点——编译、静态检查、单测、集成测试,模型说了不算。TechDoc 的动态维护通常有两种思路:一是随代码评审同步更新(改动涉及架构或接口时必须带文档变更,否则不予合并),二是定期用脚本或 AI 对比代码与文档的差异并生成待确认的更新清单,人工审核后入库。被问到「了解这种思路吗」时,答「文档和代码同源、更新动作挂到已有的流程节点上,而不是靠人自觉」是加分项。
-
数据上报的质量和成功率,以及重复上传,要答成一条完整链路:上报侧做批量合并、本地落盘缓冲(进程崩溃可恢复)、异步发送不阻塞主流程、失败重试加退避与上限、采样与降级(高峰期限流,保证核心事件优先)。成功率要有观测:上报量、失败率、端到端延迟这几个指标,并做对账(服务端收到量与客户端发送量比对)。重复上传是重试机制的必然产物——客户端没收到 ACK 就无法区分「没发出去」还是「发出去但响应丢了」,所以去重只能放在服务端:每条事件带上全局唯一的 eventId(客户端生成 UUID 或业务主键),服务端按 eventId 做幂等写入(唯一索引或 Redis 去重窗口),重复的直接丢弃并正常返回成功。如果业务要求「至少一次」,就接受重复但保证幂等;要求「恰好一次」,就必须有服务端去重加客户端确认位点。
-
多模型切换的状态机,本质是把「切换中的会话」变成一个明确的状态集合:典型状态有「空闲」「生成中」「已中断」「重答中」「已切换」,事件是用户动作(中断、切换模型、重答)与系统事件(流结束、超时、失败)。状态机的价值有三个:防止非法转移(生成中直接切模型导致两路输出同时写回)、明确资源回收(旧请求要取消、旧连接要释放)、以及给前端一个确定的状态用于渲染按钮可用性。回答时补一条实现细节——状态用 Redis 存、转移用校验后原子更新(Lua 或乐观锁版本号),这样并发的两个操作只会有一个成功。
-
大窗口模型切到小窗口模型,处理上下文超限的优先级要讲清楚:不能简单截断最早的消息,那会丢掉最初的约束和任务目标。合理的顺序是先固定「永远保留」的部分(system prompt、任务目标与关键约束、最近 N 轮原文),对中间历史做压缩摘要(用模型把多轮对话压成结构化要点),再按需召回长期记忆或检索相关片段填充剩余预算;同时给目标模型留出输出空间(输入预算要按上限减去 max_tokens)。工程上还要在切换前预估 token 数并做校验,超了就降级策略(摘要、丢弃工具返回值的大段原文、只保留结论)。跨模型切换时历史消息格式要重新组装,把上一家的响应对象直接塞给下一家是最常见的翻车点。
-
长期记忆的提取与冲突消解,是记忆系统的两个核心问题:提取的触发点通常是「会话结束」「话题切换」或「积累到一定轮数」,由模型从对话中抽取候选事实(用户偏好、背景、约定),再按稳定性和可复用性打标签:长期有效的(身份、地域、习惯偏好)入库,一次性的(本次订单号、临时需求)不进。写入前要做去重与置信度判断,低置信度的先挂「待确认」。冲突消解不能只靠覆盖:更稳的做法是给记忆加上时间戳与来源,检测到新事实与旧事实矛盾时按「时间近的优先 + 显式确认优先」更新,同时把旧值标记为失效而不是物理删除,便于回溯;如果矛盾涉及对用户偏好这类主观信息,最好的做法是在对话中主动确认一次(「上次你说喜欢 A,现在改成 B 了吗」)。这里面试官往往想确认你有没有意识到「记忆矛盾不只是数据问题,还是产品体验问题」。
-
多 Agent 协同与验证闭环,要如实回答成熟度:比较合理的架构是执行与验证分离——执行 Agent 负责改代码、跑测试,验证 Agent 独立判断结果是否符合预期(只看需求与产物,不看执行过程的解释,避免被同一套上下文带偏),两者通过任务状态与结构化产物通信,而不是靠自由文本互相说服。是否自动闭环取决于风险:低风险、可自动验证的任务(单测通过与否)可以自动退回重跑,并设置最大轮次与熔断(同一问题连续失败三次就转人工);涉及业务语义或线上变更的必须有人确认。回答时把「哪些能自动、哪些必须人工、失败了怎么收敛」讲清楚,比宣称「全自动闭环」更可信。
-
耗时监控、串行改并行与测试覆盖度,三条都指向同一件事:可观测:定位瓶颈的做法是先分段埋点(请求进入、模型调用、工具调用、渲染、写库各段耗时),用 Trace 把一次请求串起来,看的是 P95/P99 而不是均值,再按维度下钻(哪个工具最慢、哪个模型最慢、哪个租户最慢),最后用火焰图或时间线看串行等待在哪里。发现可并行的任务被串行写死,处理方式是梳理依赖关系,把无依赖的调用改成并发(线程池或
CompletableFuture),同时限定并发度、加超时与降级,避免并行把下游打挂;有依赖的则考虑拆成两阶段或流水线。测试覆盖度不能只看行覆盖率,要按需求点与分支覆盖、异常与边界用例是否齐全来评估,并统计「AI 生成的用例被采纳了多少、补了多少人工用例」这类指标;让 AI 做结果比对是可行的,但要有确定性的断言作为真值,且验证 Agent 与执行 Agent 分离,否则会变成「自己批改自己的卷子」。