标准答案
- 工具名称应表达一个单一动作,描述包含用途、适用条件、必填参数、枚举、单位和失败语义,避免一个工具承担查询、修改和发送多个副作用。
- 参数 Schema 负责类型和形状,执行器还要检查当前用户、资源归属、状态、范围、幂等键和速率限制;模型传来的权限字段不能作为授权依据。
- 返回结果区分成功、可重试失败、不可重试失败和需要人工确认,并只返回模型完成下一步所需的最小字段,避免泄露内部数据。
题目解析
工具描述太模糊会导致模型选错工具或传错参数,描述太长又会占用上下文。应通过真实任务样本观察选择准确率和参数校验失败率。
读工具和写工具要分开,写工具最好先返回预览或待确认对象。服务端在执行时重新加载资源状态,防止模型使用过期上下文造成错误写入。
工具返回的错误文本也属于不可信输入。不要把 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 或动作名。
- 返回完整数据库记录和内部错误,扩大了数据泄露面。