工具声明与候选集
工具要交给模型,须先转换为模型可理解的形式。本页讲一个工具由哪几项描述、说明怎么写模型才能正确使用、为什么一次请求不应给出全部工具,以及引用应在什么时点校验。
1一个工具由哪几项描述
名称、说明、输入结构、产出——四项各管一件事,缺一项模型便难以正确使用。
名称(name)
这个工具的唯一标识:模型提出调用时靠它指名,宿主解析时也靠它对应到服务器上的某个工具。同一台服务器内不可重名。
说明(description)
一段自然语言,写清这个工具做什么、什么时候应使用。它会原样进入提示词——模型判断「是否应当调用这个工具」,依据就是这段说明。
输入结构(inputSchema)
用 JSON Schema(一种描述 JSON 数据结构的规范)写出参数名、类型、是否必填。模型据此填写参数,宿主据此校验参数。
产出(content)
返回的是内容数组,每项可以是文本、图像或资源引用,并带一个「是否出错」的标记,用来区分「工具正常返回了空」与「工具自己报错了」。
发现结果之所以必须是机器生成的,正因为它要同时喂给模型与校验器两处。
2说明是写给模型看的:怎么写才用得对
说明不是注释,而是这个工具交给模型的唯一一份使用说明,模型据以判断的就是它。
| 该写什么 | 为什么 | 反例 |
| 什么时候该用、什么时候不应使用 | 模型据此判断要不要发起调用 | 只写工具内部怎么实现,模型看不出适用场景 |
| 边界与单位 | 避免模型用它去做超出能力范围的事 | 不写「只给提示、不给最终答案」,于是被当成答案源 |
| 参数含义与取值范围 | 模型要据此填参数 | 参数名缩写成单个字母,模型无从推断 |
| 与相邻工具的差别 | 两个工具说明重叠时模型会选错 | 两个工具都写「查询信息」,模型只能随机选一个 |
说明写坏有两类典型后果:说明过宽,模型在不应调用的场景误调;说明与实际行为不符,模型调用后才发现取不到所需内容。前者增加无效调用,后者污染回答。因此说明的验收标准不是「表述通顺」,而是「按其描述调用不会出错」。
3候选集:一次只给必要的工具
把全部工具不加筛选地交给模型,既危险也低效。应先划定一个候选子集,再让模型在子集内选择。
为什么不应全部给出
工具越多,选错的概率越高;模型可用的动作越多,一次误判的后果也越大。此外,每条工具声明都占用上下文窗口(context window),几十个工具即数千个词元,成本与延迟都切实存在。
如何划定
按场景、角色或任务先划定一个候选子集,只把子集内的工具转换为工具声明,随本次提问发出。模型只能在子集内选择,子集外的工具它根本看不到。
这对应哪条原则
最小权限原则(least privilege:只授予完成当前任务所必需的权限):先按用途划定上限,再让模型在上限之内自主决定。它是工具调用上的第一道防线,且在模型出场之前就已生效。
候选集决定的是「最多能用哪些」,模型决定的是「本次用哪个」。前者属配置期问题,后者属运行期问题——把两者分开,事后才能追溯一次调用为何发生。
4引用在什么时候校验
一条引用(「工具名@服务器名」这样的写法)要过四类检查。原则是:能在配置期发现的错误,就不应留到运行期。
| 检查 | 检查的内容 | 放在哪个时点 |
| 格式 | 写法是否符合引用格式 | 解析时立即拒绝,并给出可用写法 |
| 存在 | 这台服务器登记过吗 | 配置期;查不到就按不存在处理 |
| 可用 | 它当前是否已连接 | 配置期从严;运行期也要判一次 |
| 在清单内 | 这个工具在最近一次发现结果里吗 | 配置期;清单每次连接都会刷新 |
配置期从严、运行期从简:前者查的是稳定事实(改一次管很久),后者只判断当前是否可用。若在运行期把四道检查都重做一遍,每次提问都要多一次完整校验,服务器瞬时抖动还会把正常的提问判为失败。
也要承认这条局限:校验只发生在保存那一刻,此后服务器断开、改名或被删除,引用不会随之改变,调用即失败——这不是校验遗漏,而是检查时与使用时的时间差(TOCTOU,time-of-check to time-of-use)所致。
这套取舍可概括为:把能当场判定的错误推到离出错者最近的位置。配置错误应在配置者眼前报错,而不是变成用户看到的一段答非所问。
5本课要求:引用怎么写
本课用「工具名@服务器名」这一写法把工具与它所在的服务器绑成一条引用。
| 写法 | 是否接受 | 说明 |
knowledge_search | 接受 | 内置项:检索课程材料,不需要服务器 |
formula_hint@campus-tools | 接受 | 标准引用:服务器须已登记且已连接 |
Formula_Hint@campus-tools | 拒绝 | 大写字母不接受;工具名须以小写字母开头 |
formula-hint@campus-tools | 拒绝 | 工具名一段不允许连字符(服务器名一段允许) |
formula_hint | 拒绝 | 缺少「@服务器名」,看似工具名却不是引用 |
两段分别定规矩是有理由的:工具名来自服务器,字符集由协议与实现约定,收紧一些更可控;服务器名由人命名、需要可读,因此放宽到允许连字符。