You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenAI函数调用数组枚举值限制失效及Schema报错求助

解决OpenAI函数调用中数组元素超出预设枚举的问题

1. 先修正Schema里的低级笔误

你代码里required字段写的是["datasets"],但实际定义的参数是things,这会让模型对必填参数产生混乱,必须先改过来:

functions = [
    {
        "name": "get_something_work_related_that_is_redacted",
        "description": "仅从指定枚举列表中选元素,绝对不能生成列表外的内容。",
        "parameters": {
            "type": "object",
            "properties": {
                "things": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "enum": ["A", "B", "C", "D", "E"]
                    },
                    # 可选:限制数组长度,减少模型乱生成的可能
                    "minItems": 1,
                    "maxItems": 5
                }
            },
            "required": ["things"]  # 这里改成正确的参数名
        }
    }
]

2. 把函数描述写得更强硬明确

模糊的描述容易让模型“走神”,直接把规则写死:

# 修改后的description
"description": "获取工作相关内容,必须严格从枚举列表[A,B,C,D,E]中选择元素组成数组,**绝对不能生成任何不在列表里的值**,数组里的每一个元素都得是列表内的成员。"

3. 强制模型调用指定函数

调用API时设置function_call参数,让模型必须用你的函数,不能自己瞎输出:

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",  # 优先用带函数调用优化的新版本模型
    messages=your_messages,
    functions=functions,
    function_call={"name": "get_something_work_related_that_is_redacted"}  # 强制触发该函数调用
)

4. 加一层本地验证兜底

就算做了上面的约束,模型偶尔还是可能出错,所以拿到结果后自己再检查一遍:

import json

def check_things_valid(things):
    allowed = {"A", "B", "C", "D", "E"}
    return all(item in allowed for item in things)

# 解析API返回的函数参数
func_args = response["choices"][0]["message"]["function_call"]["arguments"]
things_list = json.loads(func_args)["things"]

if not check_things_valid(things_list):
    # 验证失败,要么重新请求模型(可以追加提示告知模型出错了),要么抛出错误
    print("发现非法元素,重新请求模型...")

关于之前{"items": false}报错的原因

OpenAI函数调用只支持JSON Schema的子集,items: false这种写法不在官方支持范围内,所以会触发无效Schema的报错,别用这种方式,老老实实按官方支持的特性来做约束。

内容的提问来源于stack exchange,提问作者Sachin Shankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:55:15