调用OpenAI GPT-3 API仅获部分补全?补全内容被截断问题咨询
出现JSON补全截断的情况,主要有以下几个原因:
默认生成长度限制:OpenAI Completion API的
max_tokens参数默认值较小(text-davinci-003默认是16),远不足以生成完整的Hue灯光配置JSON列表。当生成的内容达到默认令牌上限时,模型会直接停止输出,导致JSON结构不完整。上下文令牌窗口限制:text-davinci-003的总上下文窗口(提示文本+生成内容)最多支持4096个令牌。如果你的HEADER提示文本已经占用较多令牌,留给生成内容的空间会被压缩,可能导致生成到一半就被截断。
模型自动停止判断:模型可能误判输出是否完成,比如在生成JSON的部分结构后,认为已经满足基础要求,提前终止了生成。
解决方法
针对这些问题,可以通过以下方式修复:
显式设置足够的
max_tokens
在调用Completion.create()时,指定足够大的max_tokens值,确保能容纳完整的JSON内容。例如:completion = openai.Completion.create( model="text-davinci-003", prompt=HEADER, max_tokens=200 # 足够生成两个完整的灯光配置JSON )设置明确的停止条件
使用stop参数指定JSON列表的闭合符号],让模型只有在生成完完整的列表结构后才停止:completion = openai.Completion.create( model="text-davinci-003", prompt=HEADER, max_tokens=200, stop="]" )注意:设置
stop="]"后,需要手动在输出末尾补上],或者调整提示文本让模型自然闭合结构。优化提示文本减少令牌占用
简化HEADER中的冗余描述,去掉重复的规则说明,减少提示文本的令牌数,给生成内容留出更多空间。例如可以把HEADER简化为:Hue范围0-65535:红0、橙7281、黄14563、绿23665、蓝43690、紫50971、粉54612;饱和度/亮度0-254。 返回包含2个JSON的列表,每个JSON含light_id(0/1)和color(含hue、saturation、brightness),只输出JSON,无其他内容。检查令牌使用情况
使用OpenAI的tiktoken库计算提示文本的令牌数,确保提示令牌数 + max_tokens不超过4096的上限:import tiktoken encoding = tiktoken.encoding_for_model("text-davinci-003") prompt_tokens = len(encoding.encode(HEADER)) print(f"提示文本令牌数:{prompt_tokens}")
内容的提问来源于stack exchange,提问作者shantanuo

