小米 AI Agent 三面:压力面,全程问“你踩过什么坑”
- 轮次
- 三面
- 结果
- 通过
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 在你的 Agent 项目中,遇到过最大的工程挑战是什么?如何解决?
- Agent 系统如何实现“多租户隔离”?
- 模型资源和沙箱资源怎么划分?
- 如何设计 Agent 的“状态管理”,以便在服务重启后能恢复任务?
- 如果并发 1000 个沙箱实例,你怎么设计资源池和调度策略?
- 如何评估 Agent 生成代码的质量?用过哪些指标或方法?
- 在长周期任务中,如何避免 Agent“行为漂移”?
- 设计一个“代码审查 Agent”,如何确保它不会漏掉关键安全漏洞?
- 你对 RAG 的未来发展怎么看?RAG 和长上下文模型会是替代关系吗?
- 你刚才提到做了上下文压缩,具体怎么实现的?压缩提示词怎么写的?
- 如果压缩后丢失了关键信息导致 Agent 出错,怎么发现和补救?压缩失败怎么回退?
- 沙箱选型怎么做的?
- 容器重启后会话状态怎么恢复?
- 并发 1000 个沙箱怎么扛?
- Agent 系统可观测性怎么做?任务失败怎么做归因?
- 多 Agent 并发修改同一文件怎么防冲突?
- 用户重复创建任务怎么幂等?
- 手撕:二叉树层序遍历。
《参考解析》
1. 多租户隔离与模型、沙箱资源的划分。 隔离分层做:身份与数据层用租户 ID 贯穿所有存储(行级过滤或独立 schema、对象存储前缀分区),并做成不可绕过的中间件;运行时用独立内核的沙箱加命名空间、只读根文件系统、cgroup 限额与 seccomp 白名单,并去掉全部 capability;网络默认断网或走白名单代理,禁止内网网段与云元数据地址;密钥每租户独立。模型资源是配额与优先级问题:按租户分配额桶(QPS、并发、token 速率),用排队加优先级保证小租户不被饿死,交互式与批量任务分池;沙箱资源是容量与生命周期问题:按租户限制并发与总配额,用完即销毁,靠预热池摊平冷启动并按租户记账。两者都要有明确的超额策略:排队、降级或拒绝并给出可重试时间。
2. 状态管理与服务重启恢复。 原则是进程无状态、状态外置、每步可检查点。会话状态拆四份:会话元数据、消息历史(按轮次存,便于重放与审计)、任务中间产物(大对象放对象存储只留引用)、执行进度(已完成步骤、下一步、失败与重试次数)。存储按访问模式选:热状态放 Redis 并设计重建路径,长期放数据库,事件日志可用 append-only 形式以便从任意时刻重放。恢复要区分可重放与不可重放:纯读与确定性计算可以重放;有副作用的写操作靠幂等键与外部状态确认来保证不重复执行。检查点粒度权衡成本与收益,一般以子任务完成、工具调用前后、长模型调用结束为界。恢复还要处理陈旧:任务有租约与心跳,失联超阈值由巡检接管,并用 CAS 把状态从 running 改成可重试。
3. 并发 1000 个沙箱的资源池与调度。 核心是冷启动延迟与利用率的平衡。池化分层:预热池按历史并发的分位数预留、热池在跑、回收池待重置或销毁,峰值靠现场创建溢出。调度按任务类型分队列(交互式短任务优先、长任务单独队列),租户配额加公平调度,同租户会话尽量落同一节点提高缓存命中,任务要有超时与抢占。密度控制靠压测出单机安全水位并留余量,避免节点过载引发任务迁移的连锁雪崩。池空且创建受限时,入口就该排队或拒绝并告知可重试时间。冷启动优化靠镜像分层与预拉取、精简初始化、microVM 快照恢复,以及把起环境与跑任务解耦。最后按池命中率、平均等待时长、单机密度、失败率与 OOM 次数持续调参。
4. 长周期任务的行为漂移与代码审查 Agent。 治理是目标与状态显式化加周期校准:目标、约束与验收标准写进不可压缩的常驻区;每完成一个里程碑让模型复述当前目标与下一步并与计划比对,不一致就纠正;关键分支回计划层;用确定性检查替代模型自省;压缩时保留关键实体与数字作为锚点。代码审查 Agent 防漏检靠多引擎与可验证清单:静态分析跑确定性规则(污点传播、危险函数、依赖漏洞、密钥扫描),模型负责语义级问题(越权、错误处理、并发与事务、业务逻辑漏洞);把 OWASP 清单拆成逐项可回答的问题(不是“找安全问题”,而是“用户输入是否进入 SQL 或命令拼接,如何证明”),每条结论必须带文件行号与证据;高风险改动强制多种检查叠加;每次漏检回流成规则或评测样例,并用已知漏洞集做回归报召回率。
5. 上下文压缩、信息保真与回退。 压缩分层做:结构化任务状态(目标、约束、已完成、待办、关键实体与证据位置)由代码维护、永不压缩;近期若干轮保留原文;更早历史做摘要;工具大结果只留摘要与引用、原文可回查。摘要提示要写成有输出契约的抽取任务而不是“请总结一下”:固定字段输出、明确不确定的信息不要猜、保留数字与专有名词;更好的做法是分块摘要再合并。发现丢失靠三道:压缩前后对关键实体与数字做一致性校验;高风险动作前做约束自检;线上监控压缩后紧跟的失败率、重试率与用户纠正率。补救与回退要预先设计:压缩只替换注入内容、原始历史保留,检测到丢失就从原文重取或重新压缩;压缩失败要能退化为不压缩加硬裁剪的兜底路径,而不是直接报错。
6. 可观测性、归因、并发写冲突与幂等。 可观测性要能回答“这一次为什么失败”:Trace 按请求、轮次、步骤三层记录(步骤层含模型调用的输入摘要、输出、用量、耗时,工具调用的参数、结果摘要、重试与错误),加指标(成功率、P95 延迟、首 token 时间、工具成功率、token 与成本、队列深度)与结构化日志,三者用同一 traceId 串起来。归因靠逐层排除与回放:换上下文或提示看是不是模型能力问题、核检索是否召回证据、核工具是否成功且参数正确、看规划与路由是否走错分支;延迟分解判断是容量问题还是逻辑问题。多 Agent 并发写同一文件靠按任务分目录避免同写,必须共写时用版本号 CAS,或让各 Agent 输出补丁由单个合并者串行应用。幂等靠业务唯一键加状态机:用“用户 ID 加意图加参数哈希”或客户端 requestId 建唯一约束,重复请求直接返回已有任务;状态流转用 CAS。
7. 二叉树层序遍历。 用 BFS 加队列:根入队,循环里先记录当前队列长度(本层节点数),弹出恰好这么多节点收集值并把非空左右子节点入队,循环结束把本层结果加入输出,空树返回空数组。要点是先取 size 再遍历,否则会把下一层节点混进本层;入队前判空避免 null 进队列。常见追问的扩展:锯齿形输出就在偶数层反转本层结果;要求 O(1) 额外空间可用 Morris 风格或给节点加 next 指针在已有层上串链。复杂度是时间 O(n)、空间 O(w)。面试时先把边界(空树、单节点、只有左或只有右的退化链)讲出来,通常比代码本身更能体现熟练度。