Python 如何管理 AI 多轮对话上下文:消息窗口、摘要与历史记录 聊天功能看起来只是不断发送 messages但真正做成可维护的多轮对话需要处理历史消息、上下文长度和会话隔离。为什么要管理上下文单轮请求只需要发送当前问题多轮对话则需要让模型知道之前发生过什么。如果每次都把所有历史消息完整发送可能出现请求内容越来越长响应速度变慢上下文超过限制无关历史影响当前回答不同用户的会话互相混淆因此多轮对话的核心不是无限保存消息而是保留当前任务真正需要的信息。一、用列表保存一段会话最简单的方式是使用列表messages[{role:system,content:你是一个专业的技术助手。}]defadd_message(role:str,content:str):messages.append({role:role,content:content})每次用户提问时先保存用户消息再调用模型最后保存模型回答。二、封装一次完整对话fromopenaiimportOpenAI clientOpenAI(api_keyyour-api-key,base_urlhttps://your-api-domain.com/v1,)messages[{role:system,content:你是一个专业的技术助手。}]defchat(user_input:str)-str:messages.append({role:user,content:user_input})responseclient.chat.completions.create(modelyour-model-name,messagesmessages,)answerresponse.choices[0].message.content messages.append({role:assistant,content:answer})returnanswer这样可以保留上下文但消息会不断增长所以还需要设置窗口大小。三、只保留最近几轮消息deftrim_messages(messages:list[dict],max_messages:int10)-list[dict]:system[itemforiteminmessagesifitem[role]system]history[itemforiteminmessagesifitem[role]!system]returnsystemhistory[-max_messages:]调用前处理messagestrim_messages(messages,max_messages10)这种方法实现简单适合短对话和上下文关系不复杂的场景。四、为什么简单截断有时不够如果较早的消息包含重要信息直接删除可能导致模型忘记用户的目标已经确定的方案项目约束已完成的步骤这时可以把较早内容压缩成摘要再保留最近几轮原始消息。五、使用摘要保存长期信息可以设计一个会话对象classConversation:def__init__(self):self.summaryself.recent_messages[]defbuild_messages(self):messages[]ifself.summary:messages.append({role:system,content:f历史摘要{self.summary}})messages.extend(self.recent_messages)returnmessages摘要中建议只保留当前目标已确认事实关键约束待处理事项不要把所有原文重新复制进去否则摘要就失去了作用。六、给每个用户单独保存会话多用户应用不能共用一个全局messages列表。可以使用会话 IDsessions{}defget_session(session_id:str)-list[dict]:ifsession_idnotinsessions:sessions[session_id][{role:system,content:你是一个专业的技术助手。}]returnsessions[session_id]调用时messagesget_session(user-001)messages.append({role:user,content:我的问题})实际项目中session ID 应该来自登录用户、会话令牌或业务请求而不是直接使用用户输入作为唯一标识。七、会话持久化如果只保存在内存中程序重启后历史会丢失。小型项目可以使用 SQLite 保存消息CREATETABLEmessages(idINTEGERPRIMARYKEYAUTOINCREMENT,session_idTEXTNOTNULL,roleTEXTNOTNULL,contentTEXTNOTNULL,created_atREALNOTNULL);查询某个会话时按created_at排序再根据窗口策略取最近消息。八、上下文管理的几个注意点1. 系统提示词不要重复堆叠每次构建消息时保持一份清晰的系统提示即可。2. 不要无限保存原始消息要设置窗口、摘要或过期策略。3. 会话之间必须隔离不要让不同用户共享同一个消息列表。4. 摘要要定期更新历史变长后再生成一次更短的摘要。5. 注意隐私数据保存前应考虑脱敏、权限和过期删除。九、推荐的管理顺序可以按这个顺序实现列表保存消息保留最近几轮增加会话 ID使用摘要保存长期信息用 SQLite 或其他存储持久化增加过期和清理机制先解决会话隔离和长度控制再考虑复杂的记忆系统。十、结语多轮对话上下文管理的核心是保存有用的信息删除无关的历史控制消息长度隔离不同会话必要时使用摘要对于 Python AI 项目来说合理的上下文管理可以让聊天功能更稳定也方便后续接入数据库、缓存和权限控制。免责声明本文内容仅用于技术交流与经验分享具体实现请结合项目实际情况调整。