Python 如何管理 AI 多轮对话上下文:消息窗口、摘要与历史记录
📅 2026/8/2 4:40:32
👁️ 次浏览
聊天功能看起来只是不断发送 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 项目来说合理的上下文管理可以让聊天功能更稳定也方便后续接入数据库、缓存和权限控制。免责声明本文内容仅用于技术交流与经验分享具体实现请结合项目实际情况调整。
1. 项目概述与核心价值最近在帮朋友处理一个棘手的项目,他们想把运行在VMware ESXi上的几十台虚拟机,整体迁移到Proxmox VE 8平台上。这其实是一个挺典型的场景,无论是出于成本控制、技术栈统一,还是对开源方案的信赖,…
📅 2026/8/2 4:40:32
1. 项目概述:为什么GPU版PyTorch是深度学习的“入场券” 如果你刚开始接触深度学习,或者刚从TensorFlow转向PyTorch,那么安装GPU版本的PyTorch可能是你遇到的第一个“硬骨头”。这不仅仅是点几下鼠标、敲几行命令那么简单。我见过太多新手&a…
📅 2026/8/2 4:39:30
最近在英雄联盟电竞圈,一个关于选手Rank分数的讨论又火了起来。起因是有人质疑TheShy的韩服分数“只有”1500分,而另一位选手“许哥”(通常指Xiaohu)则被拿来对比,称其“从来没下过2000分”。一时间,“1500…
📅 2026/8/2 4:39:30
1. 从批处理到流处理:为什么Spark Streaming是实时计算的“定海神针”如果你用过Spark做批处理,那你一定体验过它处理海量离线数据时那种“力大砖飞”的快感。但数据世界不是静止的,业务对时效性的要求越来越高,报表从T1变成小时级…
📅 2026/8/2 5:25:00
1. 从“1秒看懂”到“真正会用”:为什么555定时器值得你花时间“1秒看懂555定时器”——这个标题听起来很诱人,对吧?它抓住了我们面对复杂技术时,总想快速掌握核心的普遍心理。但作为一个在电子设计领域摸爬滚打多年的工程师&…
📅 2026/8/2 5:25:00
1. 从“点亮”到“玩转”:Grove环形LED的硬件入门新视角如果你刚开始接触硬件开发,或者玩过Arduino、树莓派但总觉得连线麻烦,那“Grove”这个名字你应该不陌生。它是一套标准化的电子模块接口系统,核心思想就是把复杂的杜邦线连接…
📅 2026/8/2 5:25:00
1. 项目概述:为什么备份是机器人的“生命线”干了这么多年自动化集成,经手的ABB机器人少说也有上百台了。从最早的IRC5到现在的OmniCore,系统换了好几代,项目现场也跑遍了天南海北。但无论技术怎么变,有一个话题永远是…
📅 2026/8/2 5:25:00
1. 项目缘起:当开发板不再满足于“开发”作为一名嵌入式开发者和硬件爱好者,我手头总有几个“吃灰”的开发板。Wio Terminal 就是其中之一,它集成了屏幕、按键、传感器和无线模块,功能强大,但完成几个示例项目后&#…
📅 2026/8/2 5:25:00
1. 项目概述:SD Storage Board是什么?如果你玩过树莓派、ESP32或者STM32这类嵌入式开发板,大概率会接触到一个外设:SD卡槽。但很多时候,开发板自带的SD卡接口要么没有,要么用起来不方便,比如需要…
📅 2026/8/2 5:24:00
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/2 1:22:12
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/2 0:02:59
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/2 1:22:12