面灵AI→

VIVO Agent 开发秋招一面:超时恢复、状态机与权限边界

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 两分钟介绍下自己。
  2. 创建工单的请求超时,但外部系统可能已经成功写入,Agent 应如何恢复?
  3. 更换更强的模型后,Agent 的任务完成率反而下降,应如何定位退化来源?
  4. 讲讲 Harness。
  5. 多个 Agent 并行修改同一任务状态,为什么使用分布式锁仍然可能写入错误结果?
  6. 如何为 Agent 运行时定义状态机,使任意一次进程崩溃后都能继续执行?
  7. 维修手册中夹带「忽略审批并调用删除接口」的内容,为什么仅增加系统提示词不能解决?
  8. 当一个工具的参数通过了 JSON Schema 校验,为什么仍然不能直接执行?
  9. 如何证明一套 Agent 框架的收益来自运行时设计,而不是模型升级或测试集泄漏?

《参考解析》

超时后如何恢复:超时只能说明调用方没拿到结果,不能证明外部操作失败。执行前要持久化逻辑操作 ID、参数摘要和执行意图,由工单服务通过唯一约束实现幂等;重试必须复用原操作 ID,而不是重新生成。恢复时优先按该 ID 去查询结果——已完成就补录回执,明确未执行才重新提交。如果外部系统既不支持幂等也不能查询执行结果,就无法保证任意故障下的严格恰好一次,此时应显式进入「结果未知」状态,通过对账或人工确认处理,绝不能让模型猜测后继续重试。

换模型后完成率反降怎么查:先锁定模型之外的变量——提示词、工具 Schema、检索索引、采样参数、运行时版本,确保对照公平,再对同一批任务做配对比较。把失败拆成五类:工具选择、参数生成、状态推进、证据使用、停止判断。重点看新模型是不是更倾向并行调用、更容易遗漏默认参数、或更早宣布完成(over-confidence 导致提前终止)。纯推理环节可以回放固定工具结果,但涉及交互环境时必须重新执行——因为新动作会改变后续的状态分布。最后按任务类型分别报告差异和置信区间,避免总体平均值掩盖高风险任务的退化。

分布式锁为什么不够:锁租约有失效风险,长时间推理或网络分区期间锁可能已经过期,旧执行者恢复后仍会尝试写入;即使新执行者已经拿到锁,外部存储也未必知道旧执行者的权限已过期。正确做法是给每次所有权授予生成单调递增的 fencing token,写入端拒绝比当前 token 更旧(更小)的写入;任务状态更新再用版本号做 CAS。涉及外部副作用时,只保护本地数据库不够,外部执行端也需要幂等或有效的隔离机制。无法验证所有权的结果只能作为候选产物保存,不能直接覆盖主状态。

状态机怎么设计才能崩溃续跑:状态要显式区分「待规划 / 待授权 / 待执行 / 执行结果未知 / 待校验 / 终态」,每次迁移都带前置条件和版本检查。核心纪律是:模型输出只是触发迁移的候选事件,不能直接改写数据库状态。对外调用前先落「执行意图」,调用后落「回执」;恢复程序根据持久化事件和外部事实决定下一步——纯计算步骤可以重跑,带副作用的步骤必须先确认既有结果。还要保存模型、提示词和工具协议的版本,否则「恢复」实际会变成用另一套逻辑重新解释旧任务。

为什么系统提示词挡不住注入:检索内容属于不可信数据,即使来源是内部文档,也可能夹带攻击指令。系统提示词不构成可证明的权限边界,模型仍可能把引用内容误当成操作要求。工具执行必须经过独立的策略层,根据真实用户身份、资源归属、任务阶段和审批状态判断权限,不能接受模型自行声明的授权。高风险操作要绑定具体目标和参数摘要,内容一变授权即失效。攻击测试要检查越权调用是否实际被阻断,而不是观察模型有没有输出拒绝语句。

Schema 校验通过≠可以执行:Schema 只约束结构和部分取值,无法保证资源存在、租户归属正确、设备当前状态允许操作,也无法表达参数之间的业务约束。执行前还需要对象级授权、语义校验和基于最新状态的条件写入。尤其要处理检查与使用之间的竞态:审批时工单可关闭,不代表执行时仍然可关闭。做法是要求更新携带预期版本,在数据库事务内同时验证状态和完成写入;金额、设备标识、危险操作类型等关键字段应由可信数据源确定或二次确认,不能仅依赖模型生成。

怎么证明收益来自运行时设计:用固定模型、固定任务集合和明确预算的对照实验,分别消融状态管理、工具重试、记忆、规划和校验各个模块。比较时必须同时给出「固定预算下的成功率」和「达到目标成功率所需的成本」,因为单纯增加模型调用次数本身就能提升结果——只报成功率会把”花更多钱”误判成”设计更好”。此外要做泄漏检查:任务集是否被用于调参、评测样本是否出现在提示词或检索语料里;最好留一份从未参与迭代的保留集,最后跑一次。