常见的 Tool Calls 参数约束方式

导航栏:首页 / AI开发参考资料 / OpenAI API 兼容格式参考资料 / 请求格式概览

在定义工具的参数时,我们可以通过了多种约束机制,帮助 AI 模型更准确地理解和生成参数。

以下是最常用的几种约束方式,每种都配有详细的解释和实际应用场景示例。

请注意:以下约束方式为 JSON Schema 标准约束,AI模型通常会遵循这些约束,但建议在生产环境中增加校验作为兜底,确保AI模型生成的响应信息,的确遵守了这些约束。


1. type(类型约束)

作用:明确指定参数的数据类型,防止 AI 生成错误类型的值。

类型值含义适用场景
"string"字符串设备名称、状态描述、颜色名称等
"integer"整数亮度级别、温度值、数量等离散数值
"number"数字(整数或浮点数)精确的温度值、湿度百分比等连续数值
"boolean"布尔值(true/false)开关状态、启用/禁用标志等
"array"数组多个颜色值、多个设备ID列表等
"object"对象复杂的配置参数、坐标信息等

示例:定义一个整数类型的亮度参数

"brightness": {
  "type": "integer",
  "description": "LED亮度,0-100之间的整数"
}

实际效果:当用户说”把灯调亮”时,AI 会返回类似 85 的整数值,而不会返回 "很亮"(字符串)或 85.5(浮点数)。

2. enum(枚举值)

作用:把参数的候选取值限定在预定义的几个值里,避免模型生成 五花八门、代码无法处理的说法。

示例:LED 开关控制

"action": {
  "type": "string",
  "description": "LED控制动作",
  "enum": ["on", "off"]
}

实际效果:

用户指令AI 生成的参数
“打开LED”"on"
“把灯关掉”"off"
“启动LED”"on"(通过语义理解映射)
“熄灭灯光”"off"(通过语义理解映射)

关键点:即使用户使用同义词或不同表达方式,AI 也会将语义映射到 enum 中预定义的值。如果没有 enum,AI 可能会生成 "open"、"start"、"close" 等多种不同的值,导致 ESP32 程序无法处理。


3. minimum / maximum(数值范围)

作用:对数字类型参数设置上下限,确保 AI 生成的数值在硬件可接受的范围内。

示例:LED 亮度级别(本节重点)

"level": {
  "type": "integer",
  "description": "亮度级别,1-5级,其中1为最暗,5为最亮",
  "minimum": 1,
  "maximum": 5
}

实际效果:

用户指令无约束时 AI 可能返回有约束时 AI 返回
“调到最亮”10 或 100 或 2555
“调到最暗”0 或 11
“中等亮度”50(百分比思维)3

为什么重要:本程序的亮度控制函数只接受 1-5 的范围。如果 AI 返回 100,程序要么报错,要么产生不可预期的行为。通过 minimum 和 maximum,我们在源头上就约束了 AI 的输出。

平台支持提醒(重要):minimum / maximum 并不是在所有平台下都生效。因此不要把这两个字段当成”一定不会越界”的保证。


4. minLength / maxLength(字符串长度限制)

作用:标注字符串的最小、最大长度,引导模型生成长度合适的文本。

示例:设备名称

"device_name": {
  "type": "string",
  "description": "设备名称,用于在APP中显示",
  "minLength": 1,
  "maxLength": 20
}

实际效果:

用户指令AI 生成的参数是否符合约束
“命名为客厅灯”"客厅灯"(3个字符)符合(1 ≤ 3 ≤ 20)
“命名为我的超级智能多功能客厅主照明灯”会被截断为 "我的超级智能多功能客"(15个字符)符合(不超过20)
“命名为空”""(0个字符)不符合(小于1),AI 会重新生成

应用场景:在需要将设备名称显示在 OLED 屏幕或手机 APP 上的场景中,限制长度可以确保 UI 显示正常,不会出现文字截断或溢出。

实用提醒:

  1. 可选的固定名称用 enum;
  2. 用户自由输入的名称,把长度要求写进 description。
  3. 模型响应的字符长度校验和截断交给设备代码进行二次确认,确保满足要求。

5. pattern(正则表达式)

作用:标注字符串需要满足的格式(例如时间、编号格式),引导模型按格式生成。

示例:时间格式(HH:MM)

"time": {
  "type": "string",
  "description": "定时时间,格式为HH:MM,例如07:30",
  "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
}

实际效果:

用户指令AI 生成的参数是否匹配正则
“早上七点半”"07:30"匹配
“晚上十一点”"23:00"匹配
“凌晨一点”"01:00"匹配
“二十五点”不会生成 "25:00"不匹配(小时不能超过23)

应用场景:定时任务、闹钟设置、预约开关等需要精确时间格式的场景。正则表达式确保 AI 生成的时间字符串可以被 sscanf() 等函数正确解析。

注意:

根据多方开发者反馈,包括 OpenAI 在内的主流 AI 厂商对正则表达式约束(pattern)的支持存在不确定性。虽然模型通常会尝试遵循 pattern 约束,但在复杂场景下可能出现不遵循的情况。有开发者指出虽然模型能看到 pattern 并尝试遵循,但可靠性不如 type、enum 等简单约束。

基于此,我们建议在条件允许的情况下,将 pattern 约束方式替换为更简单的约束方式,因为pattern约束的可靠性相对较低。


6. format(语义化格式)

作用:用预定义的语义格式提示常见数据形态(如日期、时间、邮箱、URI 等),比手写正则更直观,模型通常会尊重 format 提示。

format 值含义示例
"date"日期(YYYY-MM-DD)"2026-10-30"
"date-time"ISO 8601 日期时间"2026-10-30T08:00:00Z"
"time"时间(HH:MM:SS)"07:30:00"
"email"邮箱"user@example.com"
"uri"URI"https://..."

示例:定时任务的日期与时间

"scheduled_at": {
  "type": "string",
  "description": "定时执行时间",
  "format": "date-time"
}

说明:format 与 pattern 一样属于 软提示(默认模式下不强制校验),适合表达常见格式意图;严格校验仍需业务代码完成。若目标模型/模式不支持 format,可回退为 pattern。


7. description(语义引导)

归类说明:description 是 JSON Schema 的 元数据字段,本身 不是约束(没有任何强制/限制能力),只是给模型提供自然语言上下文。它之所以放在这里,是因为它往往是 最有效、最重要的引导手段,但请与真正的约束区分对待。

作用:虽然不是硬性约束,但清晰的自然语言描述是最关键的引导手段,能极大提升模型理解意图的准确性。通过清晰自然的描述 极大提升 模型理解意图的准确性,是性价比最高的”软性约束”。

示例:温度设置

"temperature": {
  "type": "integer",
  "description": "目标温度,单位摄氏度,范围16-30度。例如:用户说'有点冷'对应22度,'很热'对应26度",
  "minimum": 16,
  "maximum": 30
}

实际效果:

用户指令无 description 时 AI 可能返回有详细 description 时 AI 返回
“有点冷”随机值(如 18)22(根据描述中的示例推断)
“很热”随机值(如 30)26(根据描述中的示例推断)

最佳实践:在 description 中提供:

  • 单位信息(如”摄氏度”、”百分比”)
  • 具体示例(如”1为最暗,5为最亮”)
  • 映射关系(如”用户说’有点冷’对应22度”)

8. items(数组元素约束)

作用:当参数是数组时,用 items 定义每个元素的结构,并可配合 minItems / maxItems 限制数组长度。

示例:RGB 颜色列表

"colors": {
  "type": "array",
  "description": "要显示的颜色列表,最多3种颜色",
  "items": {
    "type": "string",
    "enum": ["red", "green", "blue", "yellow", "white"]
  },
  "minItems": 1,
  "maxItems": 3
}

实际效果:

用户指令AI 生成的参数
“显示红色和蓝色”["red", "blue"]
“显示彩虹色”["red", "green", "blue"](限制最多3种)
“不要显示颜色”不会生成 [](因为 minItems: 1)

应用场景:批量控制多个设备、设置多色呼吸灯效果、配置场景模式等需要列表参数的场景。


小结

约束类型作用典型应用场景
type限定数据类型确保 AI 返回整数而非字符串
enum枚举可选值开关状态、模式选择等离散值
minimum / maximum数值范围亮度级别、温度值等连续数值范围
minLength / maxLength字符串长度设备名称、显示文本等
pattern正则匹配时间格式、设备ID格式等
format语义化格式用预定义的语义格式提示常见数据形态
description语义提示提供单位、示例、映射关系
items数组元素结构颜色列表、设备列表等

最佳实践:组合使用类型 + 范围 + 描述 + 必填声明,可以让 AI 模型生成最准确、最可靠的参数。例如本节亮度控制的参数定义就同时使用了 type(integer)、description(语义说明)、minimum/maximum(范围约束)和 required(必填声明)四种约束方式。