如何借助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
相关产品推荐
相关产品推荐

