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
相关产品推荐
相关产品推荐

