Python调用ChatGPT API问题:无对话上下文,问答无法关联历史
问题分析与解决方案
问题原因
你的代码存在两个核心问题导致上下文丢失和输出异常:
- 接口使用错误:
gpt-3.5-turbo属于聊天模型,应当调用openai.ChatCompletion.create接口,而非补全接口openai.Completion.create。补全接口不支持对话消息列表的格式,自然无法保留上下文。 - 响应提取错误:补全接口用
choices[0].text提取内容,但聊天模型的响应需要从choices[0].message['content']获取。另外代码中多余的self.dialog[-1]["prompt"] = True会破坏对话消息结构。
修正后的代码
import openai class ChatGPT: def __init__(self, api_key, role): openai.api_key = api_key # 初始化对话消息列表,系统角色定义模型行为 self.dialog = [{"role": "system", "content": role}] def ask(self, question): # 添加用户问题到对话列表 self.dialog.append({"role": "user", "content": question}) # 调用聊天接口,传入完整对话消息列表 result = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=self.dialog, max_tokens=1024, n=1, stop=None, temperature=0.5, ) # 正确提取助手响应内容 answer = result.choices[0].message['content'].strip() # 将助手响应添加到对话列表,保留上下文 self.dialog.append({"role": "assistant", "content": answer}) return answer, self.dialog # 加载API密钥 with open('api.key', 'r') as api_key_file: API_KEY = api_key_file.read().strip() # 创建ChatGPT实例,指定系统角色 chat_gpt = ChatGPT(API_KEY, "你是一个专业的助手,能准确回答用户的问题") # 终端交互循环 while (question := input('\n> ')) != 'X': answer, dialog = chat_gpt.ask(question) print(f"\n助手:{answer}") # 打印最新的对话记录(用户问题+助手响应) print("最新对话:", dialog[-2:])
关键修改说明
- 替换接口为
openai.ChatCompletion.create,使用model参数指定gpt-3.5-turbo。 - 用
messages参数传入完整的对话消息列表,确保模型能获取历史上下文。 - 修正响应提取方式为
result.choices[0].message['content']。 - 删除破坏对话结构的
self.dialog[-1]["prompt"] = True语句,保持对话列表的标准格式。 - 优化变量命名为中文更易读(也可保留原德语命名,根据需求调整)。
内容的提问来源于stack exchange,提问作者Situ
相关产品推荐
相关产品推荐

