无需重发全部提示,通过GenAI API(GPT、Claude)高效维护对话上下文
多轮对话上下文高效管理方案(针对GPT/Claude API)
一、官方支持的会话状态优化方案
1. OpenAI(GPT):无原生会话存储,可通过压缩/增量方式替代
OpenAI目前没有提供服务器端会话状态保留功能,但可以通过以下方式减少令牌消耗:
- 对话摘要压缩:当对话历史达到一定长度时,将早期对话内容总结为精简的系统提示,替代原始长历史。比如每积累4轮对话后,生成一段核心内容摘要,保留最近2轮对话+摘要,大幅降低令牌发送量。
示例代码:# 当对话历史条目超过6条时触发压缩 if len(conversation_history) > 6: # 提取需压缩的早期对话 early_dialogues = conversation_history[:-4] # 生成摘要请求 summary_prompt = f"请提炼以下对话的核心信息,用于后续对话上下文:{early_dialogues}" summary_resp = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": summary_prompt}]) summary_content = summary_resp['choices'][0]['message']['content'] # 重构对话历史:摘要+最近4轮对话 conversation_history = [{"role": "system", "content": f"对话历史摘要:{summary_content}"}] + conversation_history[-4:] - 状态本地化存储:如果对话涉及特定任务(如工具调用、用户偏好记录),将关键状态(已完成步骤、用户核心需求)存储在本地数据库,每次API调用仅发送当前消息+必要状态信息,而非全量历史。
2. Anthropic(Claude):原生支持会话令牌(Session Tokens)
Claude提供了会话令牌功能,可直接复用之前的上下文,无需重复发送全部历史:
- 使用逻辑:首次调用API发送初始对话后,从响应中提取
session_token;后续调用仅发送新用户消息,并附带该令牌,Claude会自动关联之前的会话上下文。
示例代码(伪代码):
注意:会话令牌存在有效期限制,且单个会话的上下文长度仍有上限,超出后需结合摘要压缩使用。# 首次对话请求 initial_resp = anthropic.Claude.create( model="claude-3-sonnet-20240229", messages=[{"role": "user", "content": "请教多轮对话的令牌优化方法"}] ) session_token = initial_resp['session_token'] # 后续对话:无需发送历史,仅传新消息+会话令牌 follow_up_resp = anthropic.Claude.create( model="claude-3-sonnet-20240229", messages=[{"role": "user", "content": "这种方式的有效期是多久?"}], session_token=session_token )
二、通用低成本上下文管理策略
- 关键信息过滤:仅保留对话中的核心需求、决策节点,删除冗余寒暄、重复表述等非必要内容,减少每次发送的令牌数。
- 分层上下文设计:将对话分为长期上下文(用户固定偏好、基础需求)和短期上下文(当前会话即时问题),长期上下文存储在本地,每次调用仅附加必要的长期信息+最新短期对话。
- 动态历史裁剪:在本地存储完整对话历史,每次API调用时根据令牌预算,动态发送最近N轮对话(而非全量),或优先保留高价值对话内容。
内容的提问来源于stack exchange,提问作者endale
相关产品推荐
相关产品推荐

