AI 工具调用参数怎样用枚举收窄输入
如果一个工具参数实际只允许 summary、detail 两种模式,就不要把它声明成“任意字符串”。在 JSON Schema 中加入 enum,可以把允许值写进工具契约;但它只是输入约束,不能替代服务端在执行前的最终校验。模型仍可能返回格式错误、未知字段或不在集合中的值,分发器必须先拒绝,再决定是让调用方澄清还是重试。
官方参考入口:https://huggingface.co/docs/hugs/guides/function-calling。Hugging Face 的工具调用文档把工具参数表示为 JSON Schema,并展示了用 enum 约束温度单位的方式。
把枚举当作“可执行接口的白名单”,把校验放在工具真正执行之前;非法值返回结构化错误,暂时性下游故障才进入重试。
先把开放字符串收窄成工具契约
假设工具负责生成一份报告,mode 只允许摘要或详细两种模式。工具声明应同时表达对象类型、属性类型、枚举集合和必填字段。若调用方还需要禁止额外字段,可以配合 additionalProperties: false;是否支持严格模式则取决于具体模型和提供方,不能只因为字段写进 Schema 就假设所有服务都会替你拦截。
# 这是发送给模型的工具参数契约,不是报告生成函数本身。
report_tool = {
"type": "function",
"function": {
"name": "create_report",
"description": "按指定模式生成一份报告",
"parameters": {
"type": "object",
"properties": {
"topic": {"type": "string", "description": "报告主题"},
"mode": {
"type": "string",
"enum": ["summary", "detail"],
"description": "只能选择摘要或详细模式"
}
},
"required": ["topic", "mode"],
"additionalProperties": False
},
# 是否开启严格工具调用,要按所用提供方的接口能力决定。
"strict": True
}
}
enum 的作用是让一个实例只能等于列出的值;它不会把 "Summary" 自动转成 "summary",也不会把中文“摘要”自动映射成内部值。建议把稳定的机器值放在枚举数组里,再用 description 解释给模型和开发者看。

枚举校验必须挡在真实工具之前
模型输出的工具参数通常还要经历 JSON 解析、Schema 校验和函数分发。任何一个环节失败,都不应直接把未确认的参数传给真实工具。下面的示例用 jsonschema 表达执行边界:解析失败、枚举不匹配和额外字段都返回结构化错误,只有校验通过才进入注册表。
import json
from jsonschema import Draft202012Validator
# 只保留业务允许的模式,避免把模型输出直接当成可信输入。
REPORT_SCHEMA = {
"type": "object",
"properties": {
"topic": {"type": "string", "minLength": 1},
"mode": {"type": "string", "enum": ["summary", "detail"]}
},
"required": ["topic", "mode"],
"additionalProperties": False
}
def dispatch_report(arguments_text, create_report):
# 工具调用参数常以 JSON 字符串到达,先解析再校验。
try:
arguments = json.loads(arguments_text)
except json.JSONDecodeError:
return {"ok": False, "kind": "invalid_json", "message": "工具参数不是合法 JSON"}
# 第一道白名单检查:非法枚举值不会进入 create_report。
errors = list(Draft202012Validator(REPORT_SCHEMA).iter_errors(arguments))
if errors:
return {
"ok": False,
"kind": "schema_rejected",
"message": errors[0].message
}
# 只有完整通过 Schema 后,才把已知字段交给真实工具。
return {"ok": True, "result": create_report(arguments["topic"], arguments["mode"])}
这里的关键不是使用某一个 Python 校验库,而是把“校验通过”作为分发前置条件。生产代码还应限制工具名、检查当前用户是否有权限,并对下游工具返回值做独立的错误处理。JSON Schema 只能约束结构和取值,不会替你完成授权、业务状态检查或敏感操作确认。

拒绝、澄清和重试要使用不同错误模型
当 mode 收到 full 时,这是输入契约错误,不应把同一参数无限重试。可以把 kind 设为 schema_rejected,并告诉上层只接受哪些值;如果用户意图不明确,则让模型或用户重新选择。只有在枚举合法、工具已经开始执行之后出现网络超时、限流等暂时性故障,才适合按幂等策略重试。
| 情况 | 处理动作 | 是否重试原参数 |
|---|---|---|
| JSON 无法解析 | 返回 invalid_json,并记录原始调用 ID | 否,先修正输出 |
| 枚举值不在集合中 | 返回 schema_rejected,给出允许值 | 否,先澄清 |
| 枚举合法但下游超时 | 返回 transient_error,使用幂等键 | 可按策略重试 |
| 工具名不在注册表 | 拒绝调用并告警配置漂移 | 否 |
将错误类型分开后,调用方不会把“参数写错”误判成“服务暂时不可用”。日志里可以保留工具名、校验错误类型和调用 ID,但不要把口令、令牌或完整敏感参数原样写入日志。
枚举值是版本化接口的一部分
枚举并不是只影响提示词的装饰字段。删除或改名会让旧调用方失效;新增值虽然通常比删除更容易兼容,但旧版处理器可能仍然只认识原来的分支。对外接口可以使用稳定的机器值,例如 summary 和 detail,把展示文案放在描述或前端映射层,不要让中文显示名直接成为后端分支条件。
- 新增枚举值前,先确认所有执行器遇到未知值时会安全拒绝。
- 删除或改名时,保留一段兼容期,并在 Schema 和文档中同步标记。
- 需要跨版本协商时,可增加独立的能力字段,不要偷偷改变原枚举的含义。
- 测试至少覆盖每个合法值、一个非法值、缺失字段和额外字段。
两个容易混淆的问题
写了 enum,模型就一定不会返回非法值吗? 不一定。Schema 是模型可见的约束,也是本地校验的依据,但不同模型、模板和提供方对严格模式的支持不同。最终执行前仍要解析和校验。
enum 能代替业务规则吗? 不能。它适合表达有限集合,例如模式、单位和状态;库存是否足够、用户是否有权限、当前订单是否允许某动作,都需要在工具内部继续判断。
真正稳妥的做法是把枚举写进工具 Schema,把校验器放在分发器,把错误分成输入拒绝与下游暂时失败,再把枚举变更当成接口版本管理问题处理。
Embedding 结果怎样保留文本分块位置方便回溯
- 上一篇
- Embedding 结果怎样保留文本分块位置方便回溯
- 下一篇
- 多 Agent 移交怎样保留任务上下文
-
- 科技周边 · 人工智能 | 1小时前 | 人工智能 · 可观测性 · LLM 流式响应 日志脱敏 token用量 prompt_tokens completion_tokens
- LLM 请求怎样记录 token 用量而不泄露正文
- 413浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- RAG 系统怎样隔离文档中的指令性文本
- 390浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | 人工智能 · 语音转写 VAD 静音检测 Silero VAD
- 语音转写前怎样用 VAD 切除静音区
- 371浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- 连续批处理怎样平衡首 token 延迟
- 262浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- 生成式回答怎样设计成对比较评测
- 199浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 | rag · 向量检索 · RAG metadata filter 多租户检索
- RAG 检索怎样用元数据过滤租户内容
- 433浏览 收藏
-
- 科技周边 · 人工智能 | 1小时前 |
- RAG 文档切片怎样设置重叠区避免语义断裂
- 297浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 510次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 570次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 594次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 547次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 364次使用
-
- golangvalidator库参数校验实用技巧干货
- 2023-01-07 111浏览
-
- golang validator参数校验的实现
- 2023-01-07 258浏览
-
- Go 批量 CSV 导入怎么控内存:流式读取、资源预算和失败行回传实战
- 2026-07-20 407浏览
-
- Go JSON 严格解码上线后请求变 400:DisallowUnknownFields 的兼容性故障复盘
- 2026-07-26 174浏览
-
- Go 流式响应怎么做:ResponseController.Flush、SSE 与断开回收的取舍
- 2026-07-26 463浏览
