如何使用ChatGPT API实现带对话历史的聊天应用且节省Token?
关于ChatGPT对话历史保留的解决方案
官网内部端点的使用风险
官网主界面用到的对话ID相关端点是OpenAI的内部私有接口,完全不建议你去调用:
- 没有官方文档支撑,接口参数、鉴权逻辑随时可能变更,今天能用明天就失效,维护成本极高
- 直接调用私有接口违反OpenAI服务条款,账号存在被封禁的风险,得不偿失
- 鉴权需要模拟官网会话流程,操作复杂度远高于官方公开API,毫无必要
可行的替代方案
方案一:使用官方Assistants API(最推荐)
OpenAI专门推出了assistants API来解决持久会话问题,帮你托管对话历史,无需每次发送完整上下文:
- 先创建一个Assistant,定义基础配置:
from openai import OpenAI client = OpenAI() assistant = client.beta.assistants.create( name="自定义应用助手", instructions="你是一个协助用户解决问题的专业助手", model="gpt-3.5-turbo" ) - 为每个用户创建独立的Thread(线程),绑定专属会话:
thread = client.beta.threads.create() - 用户发送新消息时,只需将这条消息添加到对应Thread,无需携带历史内容:
message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="用户的新问题内容" ) - 运行Assistant生成回复,它会自动读取Thread内的所有历史消息:
run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id )
这种方式Token仅消耗在新消息和生成的回复上,彻底避免重复发送历史的浪费,且是官方支持方案,稳定靠谱。
方案二:自行精简上下文(适合不想用Assistants API的场景)
若你想自主存储完整历史,又不想每次发送全量内容,可尝试精简上下文:
- 只保留最近3-5轮对话,根据应用场景调整轮数,平衡上下文完整性与Token消耗
- 用GPT模型对历史对话生成摘要,将摘要+最新消息一同发送给API,减少冗余内容
- 手动提取对话核心信息,比如用户核心需求、之前的关键结论,剔除无关闲聊内容
内容的提问来源于stack exchange,提问作者Michael Commons
相关产品推荐
相关产品推荐

