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

程序化调用ChatGPT:如何无需重发历史消息延续对话?

OpenAI API对话延续与会话状态问题解答

核心结论

重复发送完整历史消息并非唯一方案,但OpenAI的基础chat.completions API本身没有内置的服务器端会话状态保留机制——GPT模型本身是无状态的,每次请求都是独立处理,必须提供足够的上下文才能理解对话逻辑。

替代方案

1. 使用对话摘要压缩历史

将过往对话的核心内容生成一段简洁的摘要,替代完整的对话历史,从而减少每次请求的token消耗和资源占用。示例流程:

  • 每次收到助手回复后,调用GPT生成当前对话的核心摘要
  • 后续请求时,仅携带系统提示、对话摘要和新的用户消息

示例代码:

from openai import OpenAI

client = OpenAI()

# 初始对话
initial_messages = [
    {"role": "system", "content": "你是一个擅长用创意风格解释编程概念的诗意助手。"},
    {"role": "user", "content": "写一首解释编程递归概念的诗。"}
]
completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=initial_messages
)
initial_response = completion.choices[0].message.content

# 生成对话摘要
summary_completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": f"请总结以下对话的核心内容:\n用户:{initial_messages[1]['content']}\n助手:{initial_response}"}
    ]
)
conversation_summary = summary_completion.choices[0].message.content

# 后续对话使用摘要
continued_completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "你是一个擅长用创意风格解释编程概念的诗意助手。"},
        {"role": "user", "content": f"对话摘要:{conversation_summary}\n我的新问题:能详细说说递归如果处理不当会导致无限循环的原因吗?"}
    ]
)

2. 使用OpenAI Assistants API(推荐)

Assistants API是OpenAI专门为持久会话设计的解决方案,它会在OpenAI服务器端存储对话线程(Thread),你只需要向线程添加新消息,无需重复发送历史内容。示例流程:

  • 创建一个Assistant(定义角色、模型等)
  • 创建一个Thread(会话线程)
  • 向Thread添加用户消息
  • 运行Assistant获取回复

示例代码:

from openai import OpenAI
import time

client = OpenAI()

# 创建助手
assistant = client.beta.assistants.create(
    name="编程诗意助手",
    instructions="你是一个擅长用创意风格解释编程概念的诗意助手。",
    model="gpt-3.5-turbo"
)

# 创建会话线程
thread = client.beta.threads.create()

# 添加初始用户消息
client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="写一首解释编程递归概念的诗。"
)

# 运行助手获取初始回复
run = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)
while run.status != "completed":
    run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)
    time.sleep(1)
initial_messages = client.beta.threads.messages.list(thread_id=thread.id)
initial_response = initial_messages.data[0].content[0].text.value

# 添加后续问题并获取回复
client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="能详细说说递归如果处理不当会导致无限循环的原因吗?"
)
followup_run = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)
while followup_run.status != "completed":
    followup_run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=followup_run.id)
    time.sleep(1)
followup_messages = client.beta.threads.messages.list(thread_id=thread.id)
followup_response = followup_messages.data[0].content[0].text.value

补充说明

  • 基础chat.completions API的无状态设计是为了保证请求的独立性和灵活性,但确实会带来历史消息重复传输的开销。
  • Assistants API不仅支持会话状态存储,还支持工具调用、文件检索等高级功能,适合需要长期会话的场景。

内容的提问来源于stack exchange,提问作者user118967

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:44:54