工具声明与候选集
公开教程 · 无需登录

工具声明与候选集

工具要交给模型,须先转换为模型可理解的形式。本页讲一个工具由哪几项描述、说明怎么写模型才能正确使用、为什么一次请求不应给出全部工具,以及引用应在什么时点校验。

1一个工具由哪几项描述

名称、说明、输入结构、产出——四项各管一件事,缺一项模型便难以正确使用。

名称(name)

这个工具的唯一标识:模型提出调用时靠它指名,宿主解析时也靠它对应到服务器上的某个工具。同一台服务器内不可重名。

说明(description)

一段自然语言,写清这个工具做什么、什么时候应使用。它会原样进入提示词——模型判断「是否应当调用这个工具」,依据就是这段说明。

输入结构(inputSchema)

用 JSON Schema(一种描述 JSON 数据结构的规范)写出参数名、类型、是否必填。模型据此填写参数,宿主据此校验参数。

产出(content)

返回的是内容数组,每项可以是文本、图像或资源引用,并带一个「是否出错」的标记,用来区分「工具正常返回了空」与「工具自己报错了」。

服务器声明的 name 名称 唯一标识,调用时靠它指名 description 说明 给模型看:什么时候该用它 inputSchema 输入结构 参数名、类型、是否必填 转成 工具声明(tools 数组) 随提问一起发给模型 一个场景只带一个子集 项数越多,占用上下文越多 三项都来自发现结果 不由人手写——手写就会与 服务器的真实行为走偏 模型怎么用这份声明 读说明 → 判断是否调用 读结构 → 决定参数填什么 输出:工具名 + 参数对象 同一份结构宿主还要用一次: 执行前按它校验参数 模型填得对不对,由宿主判 说明决定「模型会不会选它」,结构决定「参数能不能被校验」——前者影响效果,后者影响安全
发现结果之所以必须是机器生成的,正因为它要同时喂给模型与校验器两处。

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拒绝缺少「@服务器名」,看似工具名却不是引用
两段分别定规矩是有理由的:工具名来自服务器,字符集由协议与实现约定,收紧一些更可控;服务器名由人命名、需要可读,因此放宽到允许连字符。