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

如何解决OpenAI API中的"InvalidRequestError:模型上下文长度超限"错误

解决OpenAI API上下文长度超限错误的建议

错误原因

你遇到的openai.error.InvalidRequestError是因为text-davinci-003模型的最大上下文长度为4097 tokens,而你的请求中prompt占用3377 tokens,加上设置的max_tokens=1024,总tokens达到4401,超出了模型限制。

具体修复方案

  • 缩减prompt长度

    • 截断历史消息:只保留最近的几轮对话,减少message_history的长度,示例代码:
      # 只保留最后3轮对话
      trimmed_history = message_history[-3:]
      prompt = '\n'.join([f"{m['role']}: {m['content']}" for m in trimmed_history])
      completion = openai.Completion.create(
          engine="text-davinci-003",
          prompt=prompt,
          temperature=0.7,
          max_tokens=1024,
          n=1,
          stop=None,
          timeout=60,
      )
      
    • 总结历史对话:将早期对话内容总结成简短摘要,替换原始长对话,既保留关键信息又降低token占用。
  • 降低max_tokens数值
    根据prompt的token数,计算剩余可分配的生成token数:4097 - prompt_token_count,将max_tokens设置为该值以内的数。比如你的prompt是3377 tokens,那么max_tokens最多设为720,修改代码:

    completion = openai.Completion.create(
        engine="text-davinci-003",
        prompt='\n'.join([f"{m['role']}: {m['content']}" for m in message_history]),
        temperature=0.7,
        max_tokens=720,  # 调整为符合限制的数值
        n=1,
        stop=None,
        timeout=60,
    )
    
  • 更换支持更长上下文的模型
    如果需要保留完整对话历史和足够生成长度,可以换成gpt-3.5-turbo-16k(最大上下文16384 tokens),该模型属于聊天模型,需使用ChatCompletion接口,示例代码:

    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-16k",
        messages=message_history,
        temperature=0.7,
        max_tokens=1024,
        n=1,
        stop=None,
        timeout=60,
    )
    
  • 提前计算token数
    使用OpenAI的tiktoken库提前计算prompt的token数,避免超限。安装tiktoken后,示例代码:

    import tiktoken
    
    def count_tokens(text, model="text-davinci-003"):
        encoding = tiktoken.encoding_for_model(model)
        return len(encoding.encode(text))
    
    prompt = '\n'.join([f"{m['role']}: {m['content']}" for m in message_history])
    prompt_tokens = count_tokens(prompt)
    max_allowed_tokens = 4097 - prompt_tokens
    if max_allowed_tokens <=0:
        # 处理prompt过长的情况,比如截断或总结
        pass
    else:
        completion = openai.Completion.create(
            engine="text-davinci-003",
            prompt=prompt,
            temperature=0.7,
            max_tokens=min(max_allowed_tokens, 1024),
            n=1,
            stop=None,
            timeout=60,
        )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:29