Skip to content

工具边界:模型可以提议,执行器负责授权 ​

工具描述是模型的路由提示,不是权限授予。执行器必须在服务端重新校验工具名称、参数、用户身份、租户、资源范围和当前业务状态。查询、计算和草稿生成通常可以自动执行;写库、删除、付款、发消息和执行命令需要更强的幂等、确认、审计或人工接管。

第一个可运行实验:只允许受控工具 ​

保存为 boundary.py,用 Python 3.12 运行。

python
TOOLS = {'get_profile': 'read', 'update_profile': 'write'}

def authorize(call, user, confirmed=False):
    if call['name'] not in TOOLS:
        return 'unknown_tool'
    if call.get('tenant') != user['tenant']:
        return 'tenant_denied'
    if not isinstance(call.get('user_id'), str):
        return 'invalid_args'
    if TOOLS[call['name']] == 'write' and not confirmed:
        return 'needs_confirmation'
    return 'allowed'

user = {'tenant': 't1'}
assert authorize({'name': 'get_profile', 'tenant': 't1', 'user_id': 'u1'}, user) == 'allowed'
assert authorize({'name': 'update_profile', 'tenant': 't1', 'user_id': 'u1'}, user) == 'needs_confirmation'
assert authorize({'name': 'shell', 'tenant': 't1', 'user_id': 'u1'}, user) == 'unknown_tool'
assert authorize({'name': 'get_profile', 'tenant': 't2', 'user_id': 'u1'}, user) == 'tenant_denied'
print('tool boundary passed')

工具返回内容在回填模型前仍是不可信输入,需做长度限制、脱敏和来源标记。工具错误应分为参数、权限、限流、超时、未知执行状态和业务拒绝,不能全部包装成“请重试”。

变体实验 ​

把 update_profile 改成删除操作,要求确认摘要绑定具体用户和字段。再让工具结果包含一段“忽略系统规则”的文本,确认它不会改变执行器权限。

练习 ​

  1. 为每个工具声明参数 schema、返回形状、超时和副作用等级。
  2. 设计低风险工具自动执行、高风险工具人工确认的路由。
  3. 说明为什么沙箱、审计和租户隔离不能由模型提示词代替。

用心记录每一步成长