使用Django开发ChatGPT聊天机器人遇InvalidRequestError求助
Django + OpenAI API 报错解决:InvalidRequestError 问题处理
问题描述
基于Django框架开发聊天机器人时,调用OpenAI API频繁触发Internal Server Error,最终抛出以下错误:
openai.error.InvalidRequestError: This is a chat model and not supported in the v1/completions endpoint. Did you mean to use v1/chat/completions?
更换模型为gpt-4后问题仍存在。
报错栈信息
Internal Server Error: / Traceback (most recent call last): File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\Downloads\finalproject\finalproject\django_chatbot\chatbot\views.py", line 23, in chatbot response = ask_openai(message) ^^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\Downloads\finalproject\finalproject\django_chatbot\chatbot\views.py", line 9, in ask_openai response = openai.Completion.create( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\openai\api_resources\completion.py", line 25, in create return super().create(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\openai\api_resources\abstract\engine_api_resource.py", line 153, in create response, _, api_key = requestor.request( ^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\openai\api_requestor.py", line 298, in request resp, got_stream = self._interpret_response(result, stream) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\openai\api_requestor.py", line 700, in _interpret_response self._interpret_response_line( File "C:\Users\Nathan A\AppData\Local\Programs\Python\Python311\Lib\site-packages\openai\api_requestor.py", line 763, in _interpret_response_line raise self.handle_error_response( openai.error.InvalidRequestError: This is a chat model and not supported in the v1/completions endpoint. Did you mean to use v1/chat/completions?
原代码
from django.shortcuts import render from django.http import JsonResponse import openai openai_api_key = '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■j5LuDiSb' openai.api_key = openai_api_key def ask_openai(message): response = openai.Completion.create( model="text-davinci-003", prompt = message, max_tokens=150, n=1, stop=None, temperature=0.7, ) answer = response.choice[0].text.strip() return answer def chatbot(request): if request.method == 'POST': message = request.POST.get('message') response = ask_openai(message) return JsonResponse({'message': message, 'response': response}) return render(request, 'index.html')
解决方案
错误原因
openai.Completion.create对应文本补全接口(v1/completions),仅支持text-davinci-003这类传统补全模型;而gpt-4、gpt-3.5-turbo属于聊天模型,必须使用openai.ChatCompletion.create接口(对应v1/chat/completions)。原代码即使指定text-davinci-003,也可能存在运行时模型参数被覆盖的情况,导致接口不匹配。
修改步骤
- 替换接口调用方法:将
openai.Completion.create改为openai.ChatCompletion.create - 调整参数格式:聊天模型需要传入
messages列表,每个元素包含role(可选值:system/user/assistant)和content字段,不再使用prompt参数 - 修正响应解析:聊天模型的响应结果路径为
response.choices[0].message.content.strip(),注意是choices(复数)而非原代码的choice(单数)
修改后的代码
from django.shortcuts import render from django.http import JsonResponse import openai openai_api_key = '■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■j5LuDiSb' openai.api_key = openai_api_key def ask_openai(message): # 使用ChatCompletion接口适配聊天模型 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", # 可替换为"gpt-4" messages=[ {"role": "user", "content": message} ], max_tokens=150, n=1, temperature=0.7, ) # 解析聊天模型的响应结果 answer = response.choices[0].message.content.strip() return answer def chatbot(request): if request.method == 'POST': message = request.POST.get('message') response = ask_openai(message) return JsonResponse({'message': message, 'response': response}) return render(request, 'index.html')
内容的提问来源于stack exchange,提问作者Memetendo64
相关产品推荐
相关产品推荐

