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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:12:42