先记住这个答案
在工具input_schema的字符串字段上声明pattern与minLength/maxLength,并在description中写明预期语法和正反例。模型会据此生成较规范参数,但pattern只管格式不管语义,调用前必须在服务端二次校验。失败时返回可修正示例,让模型改写而非直接报错。
- 用pattern和长度边界收窄合法输入
- description中给正反例比只写一句有效
- 正则只管格式,语义仍需服务端校验
格式约束的双层机制:描述引导与正则声明
工具schema对自由文本的约束核心,是把“任意字符串”收敛成下游解析器能处理的格式子集。pattern正则限定字符集合与结构,但过强会让模型频繁生成不合规参数。更可靠的是同时在description中给出语法和一两句具体示例,让模型看到真实合法形态。minLength防空值,maxLength防超长解析。
对查询语句这类开放字段,正则只限字符集,真正决定格式的是模型对描述的解读。把描述写成“支持空格分隔关键词,可用lang:python限定语言,未知关键词将报错”,等于给模型一个推断边界。模型输出是概率采样,正则不会在推理中执行,所以约束分两层:描述引导生成,正则作服务端校验声明,二者必须配合。
代码搜索工具的query字段约束工程
代码搜索工具的query字段约束:minLength为3,maxLength为200,pattern限制英数字、下划线、连字符与空格,description写明支持lang:python。用户问“超时设置”时,模型可能生成timeout,也可能生成中文串超时设置被拒。服务端硬校验拦住后者。
失败时把tool_result返回,附可接受示例“请用英文,试写timeout”,模型通常下一轮修正。maxLength挡住超长输入。允许一次重试,若再次失败则结束并记录样本,避免无限循环。
约束易失效的条件与应对
失效情形常见三种:模型遵循度弱时乱传;用户语言与字符集不匹配导致生成被拒;正则写得太紧误杀本可修正的合法表达。边界在于schema的约束强度不能超过下游解析器的宽容度,否则许多合法请求被无谓拦截。
对策是放宽pattern字符范围,服务端先做归一化(全角转半角、去多余空白),无法解析再让模型澄清。失败反馈应给出可复用修正模板,不能只说“格式错误”。判断操作性:一条失败调用能否在两次消息内被修正,若不能则需重设计字段或描述。
容易答错的地方
- 只用pattern就能解决问题
- 正则只能匹配字符形态,句子级语法和意图乃至模型对正则的推断偏差仍会导致不合规参数。必须配合描述中的示例和长度边界,并在服务端再次解析确认,不能把schema正则当作唯一校验。
- description写得越详细越好
- 过长的描述会让模型抓不住重点,反而增加生成错误。应把关键语法放最前,示例紧跟其后,控制在一两句内。比起长段落,少数具体正反例对模型引导作用更明显。
面试官还会怎么问?
为什么自由文本不用enum枚举?
enum适用于有限且稳定的取值集合,查询语句是开放集合无法枚举。用enum会迫使模型补一个不存在的词或直接拒绝调用。应依靠pattern、长度和描述引导,必要时附加“若不符合预期请向用户询问”指令。
校验失败后应如何反馈给模型?
返回结构化错误并附一条可接受示例,例如“参数含不支持的字符,请改用这种写法:...”。让模型有参照就能修正,错误信息不能暴露内部堆栈,只说约束要求。
pattern约束应该放在客户端还是模型输入?
模型侧无法执行正则,它是通过schema文本间接理解。因此pattern要在schema中声明,并在服务端做硬校验,两者缺一不可。客户端校验只省往返,服务端才是最终防线。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。