一、前言
你是否遇到过这样的场景:构建了一个智能 Agent,能够与用户进行多轮对话,处理复杂的任务。但随着对话的深入,你发现了一个严重的问题——
对话进行到第 100 轮时,每次 API 调用需要发送 10 万 tokens,成本是初始对话的 10 倍!
在长对话场景中,随着对话历史的不断累积,你会面临以下困境:
AutoContextMemory:智能上下文管理
面对这些挑战,AgentScope推出了AutoContextMemory ,它是 AgentScope Java 框架提供的智能上下文内存管理组件,通过自动压缩、卸载和摘要对话历史,在成本控制和信息保留之间找到最佳平衡。
核心价值
1. 自动压缩与智能摘要
2. 内容卸载与完整追溯
3. 实际效果
二、AutoContextMemory架构与工作原理
多存储架构
AutoContextMemory 采用多存储架构,确保在压缩的同时保留完整信息:
所有存储都支持状态持久化,可以结合 SessionManager 实现跨会话的上下文持久化。
6 种渐进式开箱即用压缩策略
AutoContextMemory 的核心是 6 种渐进式压缩策略。
压缩触发条件:
消息数量阈值 或者 Token 数量阈值,两个条件满足任一即触发压缩。
压缩流程:
检查阈值 → 策略1(压缩历史工具调用) → 策略2(卸载大型消息-带保护)→ 策略3(卸载大型消息-无保护) → 策略4(摘要历史对话轮次)→ 策略5(摘要当前轮次大型消息) → 策略6(压缩当前轮次消息)
压缩原则:
6 种压缩策略:
三、实战演示:5 分钟快速上手
Maven 依赖
在 pom.xml 中添加以下依赖:
<dependencies><!-- AgentScope Core --><dependency><groupId>io.agentscope</groupId><artifactId>agentscope-core</artifactId><version>1.0.2</version></dependency><!-- AutoContextMemory Extension --><dependency><groupId>io.agentscope</groupId><artifactId>agentscope-extensions-autocontext-memory</artifactId><version>1.0.2</version></dependency></dependencies>
基本使用
在 ReActAgent 中使用 AutoContextMemory 非常简单:
import io.agentscope.core.ReActAgent;import io.agentscope.core.memory.autocontext.AutoContextConfig;import io.agentscope.core.memory.autocontext.AutoContextMemory;import io.agentscope.core.memory.autocontext.ContextOffloadTool;import io.agentscope.core.tool.Toolkit;// 1. 配置 AutoContextMemoryAutoContextConfig config = AutoContextConfig.builder().build();// 2. 创建内存AutoContextMemory memory = new AutoContextMemory(config, model);// 3. 注册重载工具Toolkit toolkit = new Toolkit();toolkit.registerTool(new ContextOffloadTool(memory));// 4. 创建 AgentReActAgent agent = ReActAgent.builder().name("Assistant").model(model).memory(memory).toolkit(toolkit).enablePlan() // 启用计划功能,控制复杂任务进度;.build();
关键配置参数说明
四、场景实测效果
测试场景:分析 Nacos 服务端配置中心代码
我们选择了一个典型的代码分析场景:分析 Nacos 服务端配置中心代码,生成 2 万字分析报告。这是一个典型的长对话场景,涉及:
测试方法
在相同环境下,分别运行使用 AutoContextMemory 和不使用压缩两种配置,每种策略分别重复执行 5 次,对比平均结果。测试指标包括:
测试结果对比
未执行自动压缩的5次测试Token消耗分别为:7313784,5208927,6208127,7208127,5288327
执行自动压缩的5次测试Token消耗分别为:1688838,2504389,895823, 2221470, 2203740
关键数据:执行压缩的场景 Token平均下降68.4%
未执行自动压缩的5次测试总RT分别为:1小时41分5秒,1小时6分13秒,1小时20分13秒,1小时5分3秒,0小时59分5秒
执行自动压缩的5次测试总RT分别为:30分5秒,42分16秒,18分51秒,24分47秒, 32分15秒
关键数据:执行压缩的场景 总RT耗时平均下降58%。
在长对话代码分析场景中,AutoContextMemory 展现出显著优势:
五、事件追踪与内存可视化分析
为什么需要分析工具?
AutoContextMemory 虽然提供了自动压缩功能,但不同业务场景下的最佳配置参数是不同的。盲目使用默认配置可能导致:
因此,AutoContextMemory 提供了完整的压缩事件追踪和内存分析功能,帮助开发者根据实际场景数据驱动地优化配置参数。
内存状态可视化分析
AutoContextMemory 提供了丰富的内存状态信息,包括:
通过对比工作内存和原始内存的差异,可以直观地看到压缩效果。例如:
注:AutoContext Analysis 当前处于试验阶段,可通过 https://mse-public-temp.oss-cn-shenzhen.aliyuncs.com/autocontext-memory-analysis-v0.1.zip 下载体验。使用方式:解压 zip 包后,通过浏览器打开 analysis.html 文件即可。需要注意的是,当前版本仅支持分析通过 JsonSession 序列化至本地的 session 文件,具体使用方法可参考 AutoMemoryExample 中的示例。
AucoContext Analysis工具示意图
未执行压缩:可以明显看到随着对话轮次增加,每次推理的Token消耗线性增长。
执行自动压缩:Token消耗因自动压缩机制呈现锯齿状。
如何根据分析数据优化配置?
如果分析发现压缩事件非常频繁,但每次压缩的消息数量很少,说明 msgThreshold 或 tokenRatio 设置过低。
优化建议:
msgThreshold(如从 30 提高到 50)tokenRatio(如从 0.3 提高到 0.5)如果发现压缩后 token 数量仍然很高,或者压缩率很低,可能的原因:
lastKeep 设置过大,保护了太多消息不被压缩;currentRoundCompressionRatio;largePayloadThreshold 设置过高,导致卸载策略未触发;优化建议:
lastKeep(如从 50 降低到 20);currentRoundCompressionRatio(如从 0.3 调整到 0.2);largePayloadThreshold(如从 5K 降低到 3K);如果发现压缩操作本身的 token 成本接近或超过节省的 token,说明:
优化建议:
minConsecutiveToolMessages,让策略 1 更早触发;largePayloadThreshold,让策略 2、3 更早触发;六、结语
AutoContextMemory 的设计目标是满足 80% 以上场景的自动化上下文压缩需求,同时提供丰富的参数化配置以满足个性化场景需求。我们希望开发者更多地关注 Agent 的业务需求层面,如 Prompt 设计、工具集构建、知识库构建等,而上下文管理、自动压缩、资源优化等底层技术细节都由系统自动处理。
如果你在实际项目中使用了 AutoContextMemory,欢迎分享你的使用体验和反馈,这将帮助组件不断完善。同时,我们也期待社区能够参与贡献,一起探索更优的上下文压缩策略和实现方案。
相关资源:
| 欢迎光临 链载Ai (http://www.lianzai.com/) | Powered by Discuz! X3.5 |