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

调用OpenAI GPT-3 API仅获部分补全?补全内容被截断问题咨询

为什么text-davinci-003生成的Hue灯光JSON会被截断?

出现JSON补全截断的情况,主要有以下几个原因:

  • 默认生成长度限制:OpenAI Completion API的max_tokens参数默认值较小(text-davinci-003默认是16),远不足以生成完整的Hue灯光配置JSON列表。当生成的内容达到默认令牌上限时,模型会直接停止输出,导致JSON结构不完整。

  • 上下文令牌窗口限制:text-davinci-003的总上下文窗口(提示文本+生成内容)最多支持4096个令牌。如果你的HEADER提示文本已经占用较多令牌,留给生成内容的空间会被压缩,可能导致生成到一半就被截断。

  • 模型自动停止判断:模型可能误判输出是否完成,比如在生成JSON的部分结构后,认为已经满足基础要求,提前终止了生成。

解决方法

针对这些问题,可以通过以下方式修复:

  1. 显式设置足够的max_tokens
    在调用Completion.create()时,指定足够大的max_tokens值,确保能容纳完整的JSON内容。例如:

    completion = openai.Completion.create(
        model="text-davinci-003",
        prompt=HEADER,
        max_tokens=200  # 足够生成两个完整的灯光配置JSON
    )
    
  2. 设置明确的停止条件
    使用stop参数指定JSON列表的闭合符号],让模型只有在生成完完整的列表结构后才停止:

    completion = openai.Completion.create(
        model="text-davinci-003",
        prompt=HEADER,
        max_tokens=200,
        stop="]"
    )
    

    注意:设置stop="]"后,需要手动在输出末尾补上],或者调整提示文本让模型自然闭合结构。

  3. 优化提示文本减少令牌占用
    简化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,无其他内容。
    
  4. 检查令牌使用情况
    使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:52:51