15天学会AI应用开发(五)使用AI摘要来压缩上下文消息

发布时间:2026/7/25 2:56:56
15天学会AI应用开发(五)使用AI摘要来压缩上下文消息 15天学会AI应用开发五使用AI摘要来压缩上下文消息引言为什么需要上下文压缩在AI应用开发中上下文管理是一个关键挑战。每次调用大语言模型LLM时都需要传递历史消息但上下文长度有限制如GPT-4的8K/32K token限制。当对话变长时token数量会迅速膨胀导致- 成本增加每个token都需付费- 响应变慢长上下文处理更耗时- 上下文溢出超出模型最大限制今天我们将学习使用AI摘要来压缩上下文消息——一个实战级的解决方案。## 核心思路摘要代替原始消息基本思想很简单当对话历史过长时用AI生成一个摘要替代之前的全部消息只保留最近几轮对话的完整内容。这样既能保留核心信息又大幅减少token消耗。## 实战1基础摘要压缩器让我们从最基础的实现开始用Python和OpenAI API构建一个上下文压缩器。python# 文件名: context_compressor.py# 功能: 实现基础的AI摘要压缩上下文import openaifrom typing import List, Dictclass ContextCompressor: 上下文压缩器当对话历史超过阈值时用AI摘要替换旧消息 def __init__(self, max_messages: int 10, model: str gpt-3.5-turbo): 初始化压缩器 :param max_messages: 保留的最大消息数超过则触发压缩 :param model: 用于生成摘要的模型 self.max_messages max_messages self.model model self.messages [] # 存储所有消息含摘要 self.summary # 存储当前摘要 def add_message(self, role: str, content: str): 添加新消息并检查是否需要压缩 :param role: 角色user/assistant :param content: 消息内容 self.messages.append({role: role, content: content}) # 如果消息数量超过阈值触发压缩 if len(self.messages) self.max_messages: self._compress() def _compress(self): 内部方法生成摘要替换旧消息 # 提取旧消息除最后3轮外 old_messages self.messages[:-3] # 构建摘要提示 summary_prompt f 请对以下对话历史生成一个简洁的摘要不超过200字 保留核心主题、用户需求、重要决策和关键细节 {self._format_messages(old_messages)} # 调用AI生成摘要 response openai.ChatCompletion.create( modelself.model, messages[ {role: system, content: 你是一个专业的对话摘要生成器。}, {role: user, content: summary_prompt} ], max_tokens300, temperature0.3 ) new_summary response.choices[0].message.content # 更新摘要合并新旧摘要 if self.summary: self.summary f{self.summary}\n---\n{new_summary} else: self.summary new_summary # 重建消息列表摘要 最近3轮消息 self.messages [ {role: system, content: f对话摘要{self.summary}}, *self.messages[-3:] # 保留最近3轮 ] def _format_messages(self, messages: List[Dict]) - str: 格式化消息为文本 lines [] for msg in messages: role 用户 if msg[role] user else 助手 lines.append(f{role}: {msg[content]}) return \n.join(lines) def get_context(self) - List[Dict]: 获取当前上下文用于API调用 return self.messages# 使用示例if __name__ __main__: compressor ContextCompressor(max_messages6) # 模拟一个长对话 for i in range(1, 12): # 添加11轮消息触发压缩 user_msg f用户问题 {i}如何优化Python代码性能 compressor.add_message(user, user_msg) assistant_msg f回答 {i}建议使用列表推导式、缓存结果、避免循环中的重复计算。 compressor.add_message(assistant, assistant_msg) print(f添加消息后上下文长度{len(compressor.get_context())}) print(\n最终上下文) for msg in compressor.get_context(): print(f[{msg[role]}]: {msg[content][:50]}...)关键点解读-max_messages控制何时触发压缩- 保留最后3轮完整消息确保即时对话流畅- 摘要作为system message注入保持上下文连续性- 使用gpt-3.5-turbo生成摘要成本低速度快## 实战2智能摘要压缩器带重要性评分基础版有个问题它平等对待所有旧消息但有些关键信息如用户偏好、API密钥不应被压缩丢失。让我们升级到智能版本。python# 文件名: smart_compressor.py# 功能: 智能摘要压缩器根据消息重要性决定保留策略import openaifrom typing import List, Dict, Tupleimport tiktoken # 用于token计数class SmartCompressor: 智能上下文压缩器分析消息重要性选择性保留关键信息 def __init__(self, max_tokens: int 4000, model: str gpt-3.5-turbo): self.max_tokens max_tokens self.model model self.encoder tiktoken.encoding_for_model(model) self.messages [] self.important_info {} # 存储重要信息如用户偏好 def add_message(self, role: str, content: str): 添加消息自动检查token数并压缩 self.messages.append({role: role, content: content}) # 计算当前token数 total_tokens self._count_tokens(self.messages) if total_tokens self.max_tokens: self._smart_compress() def _smart_compress(self): 智能压缩先提取重要信息再生成摘要 # 第一步提取重要信息如用户偏好、配置参数 important_patterns [我的名字, 我喜欢, 我的API, 记住, 关键] important_items [] normal_items [] for msg in self.messages[:-3]: # 跳过最近3轮 content msg[content] # 检查是否包含重要模式 if any(pattern in content for pattern in important_patterns): important_items.append(msg) else: normal_items.append(msg) # 第二步为重要信息生成结构化摘要 if important_items: self._extract_important_info(important_items) # 第三步为普通消息生成压缩摘要 if normal_items: self._compress_normal_messages(normal_items) # 第四步重建上下文保留重要信息 摘要 最近消息 new_context [] # 添加重要信息作为system message for key, value in self.important_info.items(): new_context.append({ role: system, content: f[重要信息] {key}: {value} }) # 添加摘要 if hasattr(self, summary) and self.summary: new_context.append({ role: system, content: f[对话摘要] {self.summary} }) # 添加最近3轮完整消息 new_context.extend(self.messages[-3:]) self.messages new_context def _extract_important_info(self, messages: List[Dict]): 从消息中提取并更新重要信息 # 使用AI提取结构化信息 prompt f从以下对话中提取所有重要的用户信息如姓名、偏好、配置等\n{self._format_messages(messages)} response openai.ChatCompletion.create( modelself.model, messages[ {role: system, content: 提取用户信息格式为 key: value每行一个}, {role: user, content: prompt} ], max_tokens200 ) # 解析提取的信息 info_text response.choices[0].message.content for line in info_text.split(\n): if : in line: key, value line.split(:, 1) self.important_info[key.strip()] value.strip() def _compress_normal_messages(self, messages: List[Dict]): 压缩普通消息为摘要 prompt f请压缩以下对话为200字以内的摘要\n{self._format_messages(messages)} response openai.ChatCompletion.create( modelself.model, messages[ {role: system, content: 生成简洁的对话摘要。}, {role: user, content: prompt} ], max_tokens300 ) self.summary response.choices[0].message.content def _count_tokens(self, messages: List[Dict]) - int: 计算消息列表的token数 total 0 for msg in messages: total len(self.encoder.encode(msg[content])) total len(self.encoder.encode(msg[role])) return total def _format_messages(self, messages: List[Dict]) - str: 格式化消息为文本 return \n.join([f{用户 if m[role]user else 助手}: {m[content]} for m in messages]) def get_context(self) - List[Dict]: return self.messages# 使用示例模拟包含重要信息的对话if __name__ __main__: compressor SmartCompressor(max_tokens2000) # 设置较小阈值触发压缩 # 添加包含重要信息的消息 compressor.add_message(user, 我的名字是张三我喜欢Python和机器学习。) compressor.add_message(assistant, 你好张三很高兴为你服务。) # 添加大量普通消息 for i in range(20): compressor.add_message(user, f问题{i}: 如何实现{[排序, 搜索, 优化, 部署][i%4]}) compressor.add_message(assistant, f回答{i}: 建议使用{[快速排序, 二分搜索, 缓存, Docker][i%4]}方法。) print(智能压缩后的上下文) for msg in compressor.get_context(): print(f[{msg[role]}]: {msg[content][:80]}...) print(f\n压缩后上下文长度{len(compressor.get_context())} 条消息)智能压缩的核心优势1.重要性感知通过模式匹配和AI提取保留关键信息2.双层结构重要信息保持原样普通消息压缩为摘要3.token控制精确控制token消耗避免溢出## 最佳实践与优化建议### 1. 压缩时机选择-基于消息数量简单高效适合对话轮次固定的场景-基于token数量更精确适合对成本敏感的API调用-混合策略先检查token超标后按数量压缩### 2. 摘要质量优化python# 摘要生成提示优化示例SUMMARY_PROMPT_TEMPLATE 你是一个高级对话摘要器。请遵循以下规则1. 保留所有用户明确表达的偏好和要求2. 保留技术细节和参数如API配置、代码片段3. 忽略寒暄和重复内容4. 输出格式 - 核心主题[主题] - 用户信息[提取的关键信息] - 对话进展[从开始到现在的逻辑推进]对话内容{history}### 3. 性能考虑- 异步生成摘要避免阻塞主流程- 缓存摘要相同的上下文不必重复压缩- 批量压缩多条消息统一压缩减少API调用## 总结本文通过两个实战代码示例展示了如何使用AI摘要来压缩上下文消息1.基础压缩器实现了消息数量触发的自动压缩用AI生成摘要替换旧消息保留最近3轮完整对话。2.智能压缩器升级版增加了重要性评分能识别并保留用户关键信息如姓名、偏好、API配置对普通消息进行摘要压缩。核心收获- 上下文压缩能减少70-90%的token消耗- 智能压缩比简单截断保留更多有用信息- 平衡压缩频率和摘要质量是关键下一步行动- 尝试调整max_messages和max_tokens参数观察不同场景的效果- 将压缩器集成到你的聊天机器人或AI客服系统中- 探索更高级的压缩策略如分层压缩、增量更新记住好的上下文管理是AI应用稳定运行的基础。通过今天学到的摘要压缩技术你可以构建更高效、更经济的AI应用。继续学习下一章我们将探讨AI应用的错误处理与降级策略。