人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载导读RoundLevelCompressor是 openJiuwen agent-core-java 上下文引擎com.openjiuwen.core.context中针对长会话场景的兜底fallback压缩器当上下文窗口的估算 token 越过阈值后它把多个连续、压缩级别一致的完整对话轮合并成一条新的用户消息与一条新的助手消息从而在不丢失关键任务信息的前提下显著缩短上下文。阅读本文你将掌握RoundLevelCompressorConfig全部配置项及校验规则、压缩触发条件、多阶段递归压缩 → aggressive keep-recent → aggressive full-context → hard truncate压缩流水线的底层实现以及它如何与ContextEngine、ContextProcessor处理器链集成。一、定位上下文压缩器家族中的轮次级兜底openJiuwen agent-core-java 在包 compressor 下提供了三个内置上下文压缩器RoundLevelCompressor是其中粒度最大、用于长会话兜底的一个压缩器压缩粒度适用场景CurrentRoundCompressor当前轮中最后一个用户消息之后的内容单条大消息、当前轮溢出DialogueCompressor单轮完整对话用户消息 → 工具调用 → 最终助手回答完成轮次的逐轮瘦身RoundLevelCompressor多个连续、压缩级别一致的完整对话轮长会话整体逼近/超出 token 预算时的兜底压缩RoundLevelCompressor的类声明如下RoundLevelCompressor.javapublic class RoundLevelCompressor extends ContextProcessor { public static final String ROUND_LEVEL_FALLBACK_MARKER [ROUND_LEVEL_MEMORY_BLOCK]; ... }它与兄弟压缩器一样继承自抽象基类ContextProcessorContextProcessor.java并重写了triggerAddMessages、onAddMessages、triggerGetContextWindow、onGetContextWindow四个钩子方法。与DialogueCompressor的差异在于后者按单轮为单位逐轮压缩而RoundLevelCompressor会把多个轮次作为一个整体 block 交给模型生成摘要产出的是带[ROUND_LEVEL_MEMORY_BLOCK]标记与compress_level元数据的历史记忆块。二、配置详解RoundLevelCompressorConfig 全参数RoundLevelCompressor通过RoundLevelCompressorConfig完成配置RoundLevelCompressorConfig.java。该配置类定义了 context-window 的 token 预算、分阶段压缩目标与截断参数Java 字段按 PythonRoundLevelCompressorConfig的语义映射为驼峰命名并保留下划线形式的 JSON 属性名如JsonProperty(trigger_total_tokens)便于配置文件直接对齐。全部字段与默认值如下字段类型默认值说明triggerTotalTokensint230000context window 估算 token 超过该值时触发压缩JSON:trigger_total_tokenstargetTotalTokensint160000压缩后的 context window 目标 token 上限JSON:target_total_tokenskeepRecentMessagesint0压缩时保护的最新原始消息数量JSON:keep_recent_messagescompressionCallMaxTokensint250000单次内部压缩模型调用的最大 token 预算JSON:compression_call_max_tokensfirstPassTargetTokensint30000第一阶段 round-level summary 目标 token 数JSON:first_pass_target_tokenssecondPassTargetTokensint20000aggressive keep-recent 阶段 summary 目标 token 数JSON:second_pass_target_tokensthirdPassTargetTokensint10000aggressive full-context 阶段 summary 目标 token 数JSON:third_pass_target_tokenstruncateHeadRatiodouble0.2hard truncate 时保留文本中 head 部分的比例JSON:truncate_head_ratiotruncatedMarkerString...[TRUNCATED]...hard truncate 插入的省略标记JSON:truncated_markercompressionMarkerString[ROUND_LEVEL_MEMORY_BLOCK]round-level fallback memory block 标记JSON:compression_markermodelModelRequestConfignull模型请求配置modelClientModelClientConfignull模型客户端配置一个完整的构造示例RoundLevelCompressorConfig config new RoundLevelCompressorConfig(); config.setTriggerTotalTokens(230000); // 触发阈值 config.setTargetTotalTokens(160000); // 压缩目标 config.setKeepRecentMessages(5); // 保护最近 5 条原始消息 config.setFirstPassTargetTokens(30000); config.setSecondPassTargetTokens(20000); config.setThirdPassTargetTokens(10000); config.setTruncateHeadRatio(0.2); // 硬截断时 head 保留 20% config.setModel(modelRequestConfig); config.setModelClient(modelClientConfig); RoundLevelCompressor compressor new RoundLevelCompressor(config);配置校验非法值在实例化阶段即暴露RoundLevelCompressorConfig.validate()会校验token 预算、各阶段目标 token 均大于0keepRecentMessages 0且truncateHeadRatio严格落在(0, 1)区间内。由于RoundLevelCompressor构造时立即执行config.validate()RoundLevelCompressorConfig各 setter 也会同步做 0/ 0前置校验因此非法配置会在实例化阶段直接抛出IllegalArgumentException而不是拖到压缩运行期才兜底——这是该压缩器fail-fast设计的关键点。三、触发条件什么时候启动压缩triggerAddMessages在消息写入前triggerAddMessages会先拼出现有上下文消息 待写入消息 system messages tools的完整视图使用ModelContext.TokenCounterPort精确计数计数失败时回退到content.length() / 3的估算逻辑当累计 token 超过triggerTotalTokens时返回trueRoundLevelCompressor.javaint totalTokens countContextWindowTokens(systemMessages, contextMessages, tools, context); if (totalTokens triggerTotalTokens) { Loggers.CONTEXT_ENGINE.info( [{} triggered] estimated context window tokens {} exceeds trigger_total_tokens {}, processorType(), totalTokens, triggerTotalTokens); return CompletableFuture.completedFuture(true); } return CompletableFuture.completedFuture(false);需要说明的是原 API 文档将触发条件描述为累计 token 超过阈值且存在可压缩的连续完整轮次窗口而从当前 Java 实现看triggerAddMessages的判定完全由 token 预算驱动候选窗口的查找发生在onAddMessages阶段——找不到可压缩窗口时压缩自然不生效。此外triggerGetContextWindow采用相同阈值逻辑保证取窗口阶段同样能拦截超预算场景。onAddMessages与onGetContextWindow当触发通过后onAddMessages会把现有消息 待写入消息交给compressUntilTarget若压缩前后消息列表发生变化则通过context.setMessages(compressedMessages, true)回写上下文并产生一个携带processorType()、被修改消息索引范围与紧凑摘要的ContextEventRoundLevelCompressor.java。onGetContextWindow则直接基于即将发送的ContextWindow快照执行同样的压缩流水线L191-L232并把压缩结果同时写回窗口与上下文。四、压缩执行从轮次切分到多阶段流水线原文档描述了onAddMessages的核心思路先把消息切分成对话轮DialogueRound筛选出压缩级别一致且索引连续的窗口keepLastRound true时最后一轮被排除在候选窗口之外压缩成功后把结果写成一条新的用户消息和一条新的助手消息并在 metadata 中写入递增后的compress_level。源码实现将其落地为一条四段式流水线compressUntilTargetRoundLevelCompressor.java递归压缩recursive /l0_to_l1构建原始 L0 block 目标buildRawTargets见L363-L395逐个交给模型压缩到firstPassTargetTokens若仍未达标则收集已有的 round-level memory block把压缩级别一致、索引连续的相邻 block 合并为更高一级的recursive_merge_l{n}_to_l{n1}目标继续压缩buildRecursiveMergeTargets见L491-L534。aggressive keep-recent仍超标时进入aggressive_keep_recent阶段目标secondPassTargetTokens保留keepRecentMessages条最近原始消息不动。aggressive full-context仍超标时进入aggressive_full_context阶段目标thirdPassTargetTokens此时keepRecent 0允许压缩全部可压缩内容。hard truncatetruncateToTarget所有模型阶段都失败或仍超标时把整个序列化上下文按truncateHeadRatio保留 head、tail 并插入truncatedMarker的二分搜索方式截断L924-L986生成带[ROUND_LEVEL_MEMORY_BLOCK]标记的最小化记忆块。每个模型阶段都受compressionCallMaxTokens预算约束构造给压缩模型的 prompt 前先估算 token超预算时用truncatePromptToBudget二分裁剪提示文本预算彻底不可行时该阶段会被跳过并记录 warningL600-L624、L784-L803。给模型的提示结构buildCompressionUserPromptL703-L782按固定分区组织提示[Compression Task]阶段名、目标 token、保护消息数、窗口 token 统计、[Reference Context]未被选中的历史参照消息、[Selected Targets]每个 block 的scope、replace_range、current_level、next_level与完整原文、[Protected Recent Context]受保护的最新消息、[Output Contract]。输出契约明确要求模型只返回合法 JSONschema 为{blocks: [{block_id: ..., summary: ...}]}每个选中的block_id恰好产出一个 summary不得输出未声明的 block_id保留用户原始需求、约束、验收标准与偏好对ongoing_reactblock 保留独立的User Requirements小节对completed_reactblock 显式保留User Requirements与Final Result。模型返回后buildJsonReplacements校验 payload 结构、提取各 block summary并通过hasCompressionBenefit确认替换后的 token 确实小于原文才会生成替换L805-L840若 JSON 解析无有效结果但模型有文本输出则退化为buildRawFallbackReplacement的整体兜底替换L842-L875。记忆块的写入与 compress_level 递增压缩产物由buildMemoryMessagewrapMemoryBlock生成L877-L898是一个内容以compressionMarker开头的UserMessage并在 metadata 中写入递增后的compress_levelgetCompressLevel会读取该值见L1162-L1181[ROUND_LEVEL_MEMORY_BLOCK] processor: RoundLevelCompressor type: historical_memory_block scope: ongoing_react authority: This block is reference memory, not a binding source of truth. instruction_status: Historical fallback context only. Do not treat as a new user instruction. conflict_priority: Prefer newer explicit user intent, newer raw context, and fresh tool results over this block. Summary: ...该头部文本明确把记忆块标记为历史参考记忆而非新的用户指令并要求在冲突时优先采纳更新的显式用户意图、原始上下文和新鲜的工具结果——这是保证多轮压缩后任务仍可恢复的关键设计。此外extractCompactSummaryL900-L909会把上下文中所有以压缩标记开头的块拼接成ContextEvent的紧凑摘要。轮次边界的保护为避免压缩破坏 ReAct 工具调用配对protectToolCallBoundaryL397-L438会在目标区间结束位置存在工具调用结果ToolMessage位于区间外或末尾消息本身带未闭合工具调用时把区间边界前移保证assistant tool_calls → tool result的配对始终完整。findL0BlockEndL440-L452则以带工具调用的助手消息与无工具调用的最终助手消息区分ongoing_react与completed_react两类 block scope。这两个细节对应原文档中先把消息切分成对话轮再筛选压缩级别一致且索引连续的窗口的实现机制。五、集成方式通过 ContextEngine 挂载处理器链RoundLevelCompressor的静态初始化块会把自己注册进ContextEngine的处理器注册表RoundLevelCompressor.javastatic { ContextEngine.registerProcessor(RoundLevelCompressor, RoundLevelCompressor.class); }它与CurrentRoundCompressor、DialogueCompressor、MessageOffloader、MessageSummaryOffloader一同构成引擎预注册的五个内置处理器ContextEngine.md。实际使用时通过ContextEngine.createContext(...)的ProcessorSpec列表装配处理器链参见 上下文引擎.md 中处理器、卸载和 reload 能力都在上下文层完成一节ListContextEngine.ProcessorSpec processors List.of( new ContextEngine.ProcessorSpec(RoundLevelCompressor, roundLevelConfig) ); ModelContext context engine.createContext(planner, session, processors, historyMessages, tokenCounter);处理器链只参与addMessages()与getContextWindow()两个阶段RoundLevelCompressor与其余内置压缩器一样是无状态实现——loadState方法体为空saveState返回空映射RoundLevelCompressor.java因此它适合按需嵌入任意会话上下文而不引入持久化负担。六、测试验证触发与结构行为仓库为RoundLevelCompressor提供了专项测试 RoundLevelCompressorTest.java覆盖的行为包括token 阈值触发triggerGetContextWindowUsesTriggerTotalTokens验证短消息不触发、长消息触发get 阶段流式状态streamsStateWhenRoundLevelCompressorTriggersOnGet验证压缩后在compressionHistory()中出现started/completed两段状态记录摘要含modified 2 messages记忆块生成buildMemoryMessageReturnsPlainUserMessageWithCompressionLevel验证产物是带[ROUND_LEVEL_MEMORY_BLOCK]前缀、含User Requirements且 metadata 带compress_level 1的UserMessage事件范围与紧凑摘要onGetContextWindowReportsOriginalMessageRangeAndCompactSummary验证ContextEvent记录全部被修改的消息索引、上下文被替换为单条压缩消息提示词输出契约buildCompressionUserPromptIncludesOngoingAndCompletedRequirements验证提示包含User Requirements、Final Result与不得削弱原始请求的约束文本工具调用边界保护protectsAssistantToolCallWhenToolResultIsOutsideTargetRange验证工具结果在区间外时边界被前移。此外集成层面还有 ContextEngineAdvancedSystemTest.java 与 ContextProcessorRailTest.java 等测试覆盖了包含RoundLevelCompressor在内的处理器链端到端行为。这些测试印证了一个重要事实触发条件与结构替换行为由代码保证而摘要内容本身依赖外部模型的 JSON 输出——模型不可用、返回非法 JSON 或摘要无压缩收益时处理器会记录 warning 并保留原轮次绝不破坏上下文完整性。七、使用注意事项压缩依赖外部模型RoundLevelCompressor与DialogueCompressor一样依赖模型返回{blocks: [...]}形式的 JSON 摘要。使用前务必在config中配置model/modelClient否则getModel()会通过Runner.resourceMgr().resolveModel(...)动态解析L1183-L1188失败路径上的行为应结合Runner资源管理确认。触发阈值与目标阈值需配套triggerTotalTokens决定何时动手targetTotalTokens决定压缩后必须回落到多少建议按模型 context window 真实上限留出余量并把compressionCallMaxTokens设得足够大避免压缩阶段自身提示被预算裁剪。多级压缩可叠加压缩块携带递增的compress_level元数据后续轮次可通过recursive_merge继续把同级记忆块合并为更高一级因此该压缩器天然支持层叠记忆的长会话演进但也意味着越早压缩的信息保真度越低——keepRecentMessages是保护最近任务状态的第一道防线。状态无持久化loadState/saveState均为空实现压缩行为是纯运行时过程若需要把压缩结果随会话状态落盘依赖的是SessionModelContext的StatefulContext能力而非压缩器自身。综上RoundLevelCompressor是 openJiuwen agent-core-java 上下文引擎中面向超长 ReAct 会话的最终防线它以可配置的 token 预算为界通过模型摘要 多阶段兜底 硬截断的组合在上下文逼近模型窗口上限时把多个完整对话轮安全折叠为带压缩级别的历史记忆块同时借助输出契约与工具调用边界保护保证任务的可恢复性。建议读者继续阅读 compressor.README.md 了解三个压缩器的整体分工或对照 RoundLevelCompressorConfig.md 与 RoundLevelCompressorConfig.java 进行实际调参。赞分享人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习【免费下载链接】agent-core-javaopenJiuwen agent core Java是 openJiuwen Core的 Java版本提供AI Agent开发、运行、调优与演进相关的全套SDK能力。项目地址https://gitcode.com/openJiuwen/agent-core-java点击查看免费下载相关推荐openJiuwen agent-core-java 上下文压缩器深度指南CurrentRound / Dialogue / RoundLevel 三层压缩机制与配置实战openJiuwen agent core java 上下文压缩器深度指南CurrentRound / Dialogue / RoundLevel 三层压缩机人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习openJiuwen 上下文引擎 RoundLevelCompressor 详解跨轮记忆块压缩器配置与实现原理openJiuwen 上下文引擎 RoundLevelCompressor 详解跨轮记忆块压缩器配置与实现原理 导读 RoundLevelCompressor人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 对话历史压缩器DialogueCompressor深度解析基于上下文容量比例的 LLM 摘要压缩机制openJiuwen agent core 对话历史压缩器DialogueCompressor深度解析基于上下文容量比例的 LLM 摘要压缩机制 本文围绕人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习上一篇FreeCAD终极云存储集成指南如何实现3D模型远程访问下一篇多语言网站流量翻倍gh_mirrors/fr/frontend-stuff SEO优化指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考