Agent工具定义、注册与安全控制有哪些?
工具定义格式、注册机制与调用安全控制详解
原题:在AI Agent系统中,如何设计和实现可供Agent调用的外部工具(如搜索、计算器、数据库接口)?请说明工具定义格式、注册机制与调用安全控制。
Agent · 美团真题
回答与解析
1. 工具定义
每个工具声明稳定名称、用途、JSON Schema 参数、返回 Schema、权限等级、副作用、超时和幂等要求。描述应清楚区分相似工具,并限制枚举、范围和额外字段。Schema 校验只能保证结构,不能证明业务语义或授权正确。
2. 注册与发现
注册表保存工具实现、版本、Schema、所有者和策略。启动时可以通过显式配置或装饰器注册,但生产环境不应无条件扫描并暴露任意函数。给模型的工具列表应根据用户、租户、任务和当前授权动态裁剪。
3. 执行链路
模型产生 tool call 后,服务端依次做:解析参数、Schema 与业务规则校验、身份和资源权限检查、风险分级、幂等与预算检查、执行、结果脱敏和结构化回传。模型不能绕过服务端直接访问数据库或网络。
计算器等工具不得对模型文本直接使用 eval。应采用语法解析器和运算符白名单,或在受限进程/容器内执行,并限制 CPU、内存、文件、网络和运行时间。数据库工具优先使用参数化查询和只读账号。
4. 副作用与失败处理
- 只读、可逆和高风险写操作采用不同策略;高风险调用先 dry-run,再由用户或授权系统确认精确目标。
- 超时、限流、权限拒绝和业务失败返回可区分的错误码,重试必须有上限、退避和幂等保护。
- 审计日志记录经脱敏的调用者、工具版本、参数摘要、结果状态和耗时。
结论:模型只负责提出调用意图,工具注册表、权限策略和隔离执行层决定它能否以及如何执行。
口语版讲法(约4分钟)
- 工具定义格式:用OpenAI Function Calling规范写JSON Schema
- 注册机制:用装饰器模式自动收集
- 安全控制:输入校验、沙箱、权限分级
- 执行流程与错误处理
Agent 工具设计我会分四层讲:工具怎么定义,怎么注册和发现,怎么执行,最后怎么做安全控制。核心原则是,模型可以决定“想调用什么”,但不能绕过后端的校验、权限和执行边界。
工具定义上,一般用 Function Calling 或兼容的 JSON Schema。一个工具至少要有 name、description、parameters 和返回格式。name 要稳定,description 要写清楚适用场景,parameters 里要定义类型、必填字段、枚举值、最大最小值。比如搜索工具的 limit 不能让模型随便传 10000,数据库查询工具也不能让模型直接传任意 SQL。工具描述写得越模糊,模型越容易选错工具。
注册机制上,我会做一个 Tool Registry。每个工具注册时带上 schema、实际执行函数、权限等级、超时时间、是否有副作用、是否支持重试等元信息。实现上可以用装饰器,也可以启动时扫描配置文件或服务发现。这样新增工具不需要改 Agent 主流程,而且可以灰度上线、临时禁用、按用户权限暴露不同工具。
执行流程是:模型输出 tool call,框架解析工具名和参数;先检查工具是否存在,再做 schema 校验和权限校验;通过后调用真实后端服务;拿到结果后转成结构化 observation 返回给模型。工具异常不要直接把堆栈丢给模型,而是返回可理解的错误,比如错误类型、是否可重试、建议下一步。
安全控制是重点。我通常会分几类。先看输入安全,做 schema 校验、长度限制、枚举限制、注入过滤。接着是权限控制,用户能不能查这个订单、这个 Agent 能不能写数据库,都要在后端判断,不能相信模型自己判断。然后是副作用控制,读操作和写操作要分级;发邮件、下单、转账、删数据这类高危工具,要有 dry-run、人工确认或二次授权。再看资源控制,工具要有超时、限流、熔断和重试策略。最后是审计,记录 trace id、调用人、参数摘要、工具结果、耗时和状态,便于追责和回放。
如果多个工具要协作,还要有编排能力。简单场景可以让 ReAct 一步步调用;复杂场景我更倾向用状态机或 DAG,把依赖关系固化下来,避免模型把顺序搞错。比如“查库存、锁库存、创建订单、发支付链接”这种流程,不能让模型自由组合,必须由业务流程控制。
所以工具调用的关键不是把 API 暴露给模型就完了,而是给模型一个受控接口:它能选择工具,但工具的参数、权限、副作用和执行结果都由工程系统兜底。
关键一句:高危工具不能交给模型自由调用,必须用权限、副作用分级、dry-run 和人工确认控制。
面试官还可能这样问
- 问法 1 · 场景切入
假设咱们做一个智能客服,Agent 需要调用查订单、查库存、算优惠这些工具。你怎么设计一套机制,让 Agent 能准确识别该用哪个工具,并且调用的时候不出安全问题?
- 问法 2 · 层层追问
Agent 系统里怎么让模型知道它能调用哪些外部功能?……那这些工具的定义格式一般长什么样?……注册进去之后,调用时怎么防止它执行恶意操作?
- 问法 3 · 直球架构
设计一个可供 Agent 调用的外部工具系统,包括工具的定义 Schema、注册机制,以及调用时的安全控制。你具体怎么实现?