真实面经题目 · 原创解析

Agent 工具调用限制中间件应如何设计,才能约束候选工具范围、调用预算、权限校验和循环停止条件?

这题考 Agent 工具调用限制中间件。重点是 runtime/executor 如何通过 allowlist、预算、权限、参数校验、循环检测和停止条件约束工具调用,而不是只在 prompt 里提醒模型少调用。

出现于:字节跳动 · 后端开发

60 秒回答模板

我会把工具调用限制放在 Agent Runtime 的 tool executor 前,做成策略中间件。每次 tool call 先经过 allowlist 校验,确认当前用户、任务类型、会话状态是否允许使用该工具;再经过预算控制,包括总调用次数、单工具次数、token、费用、耗时和并发数;然后做权限与参数校验,防止访问越权资源或执行危险操作;最后做循环检测和停止条件判断,例如相同工具相同参数重复调用、连续失败、没有信息增益、达到最大步骤数。策略命中后不要只抛异常,而要返回结构化原因,让 Agent 可以复用已有上下文、请求用户授权、缩小查询范围、换只读工具或正确终止。

考点 运行时强制
难度 真实面经题
回答目标 展示你能把 Agent 工具调用控制设计成运行时治理能力,兼顾安全、成本、可恢复性和任务完成率。

深入解析

01

中间件位置

限制逻辑应放在 tool executor 的统一入口,而不是写进每个工具或完全依赖模型自觉。prompt 可以引导行为,但不是安全边界;工具内部能做权限,但很难感知整个会话预算和循环状态。executor 前的中间件能看到用户身份、任务上下文、工具名、参数、历史调用和剩余预算。

02

动态 allowlist 和权限

allowlist 不应只是静态工具列表,而应按用户、租户、任务类型、环境、数据域和工具风险等级动态计算。普通问答只允许读工具,运维或审批任务才允许写工具,生产写操作可能需要人工确认。权限还要深入参数层,允许 file.read 不代表能读任意路径。

03

预算和成本控制

预算要分全局和局部。全局控制一次任务最多多少步、多少工具调用、多少费用和总耗时;局部控制某个工具、某类工具或某个资源最多访问多少次。高成本外部 API、写操作、长查询和大文件读取要更严格,低成本缓存读可以更宽松。

04

循环和无进展检测

Agent 失控常见表现是相同工具相同参数反复调用,或在几个工具之间切换但状态没有变化。中间件可以记录调用签名、参数归一化哈希、输出摘要哈希、失败码序列和上下文状态 diff,连续无新增信息或同错重复时触发 loop stop。

05

结构化恢复协议

拦截后系统要返回 denied、budget_exceeded、permission_required、loop_detected、unsafe_args 等 code,以及 retryable、requiredPermission、remainingBudget、safeAlternative。这样 Agent 可以降级、请求授权、缩小范围或解释无法继续,而不是直接崩溃。

易错点

  • 只在 prompt 里写不要重复调用工具,没有 executor 级强制控制。
  • 只限制调用次数,不限制费用、耗时、并发、参数范围和权限边界。
  • 拦截后直接抛异常,导致 Agent 无法降级或向用户解释。
  • 把所有工具用同一预算处理,忽略高风险写工具和低风险读工具的差异。

面试官追问

如何区分必要多步搜索和失控循环?

看每一步是否引入新约束、新证据或状态推进。连续相同参数、相同失败码、输出未被消费、上下文 diff 很小更像循环;不同子目标或高风险交叉验证不应直接拦截。

allowlist 是配置中心下发还是代码内置?

基础安全边界可代码内置,高频业务策略适合配置中心和权限系统动态下发。关键是策略版本可追踪、灰度可控,并能按用户、租户、任务和环境计算。

预算耗尽时应该继续回答还是失败?

取决于任务类型和风险。低风险问答可以基于已有证据给不确定回答;高风险动作应停止并说明需要更多权限或人工确认。返回值要让 Agent 知道剩余预算和建议动作。

写工具和读工具限制有什么不同?

写工具需要更强权限、幂等校验、二次确认、审计和回滚策略;读工具重点控制数据权限、频次、成本和敏感信息暴露。两者不能用同一阈值处理。