标准答案

  1. 工具名称应表达一个单一动作,描述包含用途、适用条件、必填参数、枚举、单位和失败语义,避免一个工具承担查询、修改和发送多个副作用。
  2. 参数 Schema 负责类型和形状,执行器还要检查当前用户、资源归属、状态、范围、幂等键和速率限制;模型传来的权限字段不能作为授权依据。
  3. 返回结果区分成功、可重试失败、不可重试失败和需要人工确认,并只返回模型完成下一步所需的最小字段,避免泄露内部数据。

题目解析

工具描述太模糊会导致模型选错工具或传错参数,描述太长又会占用上下文。应通过真实任务样本观察选择准确率和参数校验失败率。

读工具和写工具要分开,写工具最好先返回预览或待确认对象。服务端在执行时重新加载资源状态,防止模型使用过期上下文造成错误写入。

工具返回的错误文本也属于不可信输入。不要把 SQL、内部路径、密钥或完整堆栈直接返回给模型和用户。

代码示例

工具声明用于引导模型,真正权限检查发生在服务端执行器。

TypeScript
const tools = [{
  name: 'get_order_status',
  description: '读取当前用户有权访问的订单状态,不执行写操作',
  inputSchema: {
    type: 'object',
    required: ['orderId'],
    properties: { orderId: { type: 'string' } }
  }
}]

async function executeGetOrder(userId: string, orderId: string) {
  return orderRepository.findVisibleToUser({ userId, orderId })
}

常见误区

  • 把 Schema 校验当成权限校验。
  • 使用一个“万能工具”让模型传入任意 URL、SQL 或动作名。
  • 返回完整数据库记录和内部错误,扩大了数据泄露面。

作者信息