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

如何借助OpenAI API突破GPT-3(text-davinci-003)最大Token限制生成完整回复

解决text-davinci-003超出Token限制生成完整回复的方法

针对text-davinci-003这类Completion接口模型,要突破Token限制生成完整回复,核心思路是分批次续接上下文,结合Token计数判断是否需要继续生成,具体实现步骤如下:

关键前提

text-davinci-003的最大上下文Token是4096(prompt+生成内容总和),字符串长度不等于Token数,必须用OpenAI官方的tiktoken库准确统计Token数量。

实现方案

1. 安装依赖库

pip install tiktoken

2. 基础续生成逻辑

核心是每次生成后检查是否因Token限制被截断(finish_reason为"length"),如果是,就把原prompt+已生成内容作为新的prompt继续请求,直到生成完成。

示例代码:

import openai
import tiktoken

# 初始化对应模型的Token编码器
encoding = tiktoken.encoding_for_model("text-davinci-003")

def generate_full_response(prompt, model="text-davinci-003", max_total_tokens=4096):
    full_response = ""
    current_prompt = prompt
    
    while True:
        # 计算当前prompt的Token数
        prompt_tokens = len(encoding.encode(current_prompt))
        # 剩余可分配给生成内容的Token额度
        available_tokens = max_total_tokens - prompt_tokens
        
        if available_tokens <= 0:
            raise ValueError("Prompt已超出最大上下文Token,请拆分后重试")
        
        # 发送生成请求
        response = openai.Completion.create(
            model=model,
            prompt=current_prompt,
            max_tokens=available_tokens
        )
        
        chunk = response.choices[0].text.strip()
        full_response += chunk
        
        # 判断是否生成完成
        finish_reason = response.choices[0].finish_reason
        if finish_reason != "length":
            break
        
        # 更新prompt,续接已生成内容继续请求
        current_prompt = prompt + full_response
    
    return full_response

# 使用示例
prompt = "你的超长prompt内容..."
full_text = generate_full_response(prompt)
print(full_text)

3. 超长Prompt的拆分处理

如果Prompt本身就超过4096 Token,需要先把Prompt拆分成逻辑连贯的多个片段,依次处理:

  • 先发送第一个片段,获取回复后,把「历史上下文+当前片段+回复」作为新的上下文,再拼接下一个片段继续请求
  • 重复上述步骤直到所有片段处理完毕,最后整合所有回复

示例代码:

def process_long_prompt(prompt_parts):
    full_context = ""
    full_response = ""
    
    for part in prompt_parts:
        # 构建当前请求的prompt
        current_prompt = full_context + part
        prompt_tokens = len(encoding.encode(current_prompt))
        available_tokens = 4096 - prompt_tokens
        
        if available_tokens <= 0:
            raise ValueError("单个Prompt片段过长,请进一步拆分")
        
        response = openai.Completion.create(
            model="text-davinci-003",
            prompt=current_prompt,
            max_tokens=available_tokens
        )
        
        chunk = response.choices[0].text.strip()
        full_response += chunk
        
        # 更新上下文,保留对话逻辑连贯性
        full_context = current_prompt + chunk
    
    return full_response

# 使用示例
prompt_parts = ["第一段核心内容...", "第二段补充说明...", "第三段具体需求..."]
full_text = process_long_prompt(prompt_parts)

注意事项

  • 每次请求的max_tokens必须根据当前prompt的Token数动态计算,避免触发超限错误
  • 仅当finish_reason为"length"时才需要续生成,其他值(如stop)代表生成已完成
  • 拆分Prompt时要保证逻辑连贯,避免上下文断裂导致回复质量下降

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:15:15