程序化调用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.completionsAPI的无状态设计是为了保证请求的独立性和灵活性,但确实会带来历史消息重复传输的开销。 - Assistants API不仅支持会话状态存储,还支持工具调用、文件检索等高级功能,适合需要长期会话的场景。
内容的提问来源于stack exchange,提问作者user118967
相关产品推荐
相关产品推荐

