AI Agent - Context Memory
你是否遇到过这样的场景:构建了一个智能 Agent,能够与用户进行多轮对话,处理复杂的任务。但随着对话的深入,你发现了一个严重的问题——
对话进行到第 100 轮时,每次 API 调用需要发送 10 万 tokens,成本是初始对话的 10 倍!
在长对话场景中,随着对话历史的不断积累,你会面临以下困境:
- 成本线性增长:每次 API 调用需要为所有历史 tokens 付费,成本随对话增长而线性上升;
- 性能下降:上下文越长,模型处理时间越长,响应变慢;
- 模型maxToken限制:当对话历史超过模型的最大上下文窗口(如 128K tokens)时,模型无法处理完整的上下文,导致请求失败;
- 信息丢失风险:简单上下文截断会丢失关键历史信息,影响 Agent 决策质量。
AutoContextMemory:智能上下文管理
AgentScope推出了AutoContextMemory,它是 AgentScope Java 框架提供的智能上下文内存管理组件, 通过自动压缩、卸载和摘要对话历史,在成本控制和信息保留之间找到最佳平衡。
两大核心机制
1. 自动压缩与智能摘要
- 当消息或 token 数量超过阈值时,自动触发 6 种渐进式压缩策略;
- 使用 LLM 智能摘要,保留关键信息而非简单截断;
- 无需人工干预,系统自动管理
2. 内容卸载与完整追溯
- 将大型内容卸载到外部存储,通过 UUID 按需重载;
- 所有原始内容保存在原始存储中,支持完整历史追溯;
- 不会因为压缩而丢失任何信息。
AutoContextMemory架构与工作原理
多存储架构
AutoContextMemory 采用多存储架构,确保在压缩的同时保留完整信息:
- 工作内存存储:存储压缩后的消息,直接参与模型推理,这是Agent实际使用的上下文
- 原始内存存储:存储完整的、未压缩的消息历史,采用仅追加模式,支持完整历史追溯
- 卸载上下文存储:以 UUID 为键存储卸载的消息内容,支持按需重载;
- 压缩事件存储:记录所有压缩操作的详细信息,用于分析和优化;
所有存储都支持状态持久化,可以结合SessionManager实现跨会话的上下文持久化。
6种渐进式开箱急用压缩策略
AutoContextMemory 的核心是 6 种渐进式压缩策略。
压缩触发条件
消息数量阈值或者Token数量阈值,两个条件满足任一即触发压缩
压缩流程
检查阈值 → 策略1(压缩历史工具调用) → 策略2(卸载大型消息-带保护)→ 策略3(卸载大型消息-无保护) → 策略4(摘要历史对话轮次)→ 策略5(摘要当前轮次大型消息) → 策略6(压缩当前轮次消息)
压缩原则
- 当前轮次优先:优先保护当前轮次的完整信息
- 用户交互优先:用户输入和Agent回复的重要性高于工具调用的中间结果;
- 可回溯性:所有压缩的原文都可以通过UUID回溯,确保信息不丢失;
6种压缩策略
- 压缩历史工具调用:查找历史对话中的连续工具调用消息(超过 6 条),使用 LLM 智能压缩,保留工具名称、参数和关键结果。轻量级策略,压缩成本低。
- 卸载大型消息(带保护):查找超过阈值的大型消息,保护最新的助手响应和最后 N 条消息,卸载原始内容并替换为预览和 UUID 提示。快速减少 token 使用。
- 卸载大型消息(无保护):与策略 2 类似,但不保护最后 N 条消息,仅保护最新的助手响应。更激进的压缩策略。
- 摘要历史对话轮次:对历史用户-助手对话对进行智能摘要,使用 LLM 生成摘要保留关键决策和信息。大幅减少 token 使用。
- 摘要当前轮次大型消息:查找当前轮次中超过阈值的大型消息,使用 LLM 生成摘要并卸载原始内容。针对当前轮次的优化。
- 压缩当前轮次消息:压缩当前轮次的所有消息,合并多个工具结果,保留关键信息。最后的保障策略,确保上下文不超限。
