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

