摘要

长周期自主 Agent 普遍面临上下文窗口溢出难题:持续多轮工具调用、历史对话与返回结果不断累积,极易触发模型长度限制,造成任务中断、状态丢失。Hermes 提出一套分层式上下文压缩体系,通过网关前置过滤、多层级触发压缩、结构化摘要、边界保护算法,在大幅削减 Token 消耗的同时,最大限度保留任务关键信息,避免 Agent “失忆”。本文完整拆解这套架构的运行流程、三大触发时机、核心压缩组件、边界约束策略,附带可落地的工程实现思路,适合开发长期运行代码代理、自动化工作流、多轮工具调用智能体的技术团队参考。在多模型混合部署场景中,可借助 Treerouter 统一调度入口,配合上下文压缩体系完成跨模型会话管理。

一、整体架构:双层压缩流水线

Hermes 采用网关层 + Agent 内部双层压缩架构,实现前置拦截与动态补救结合,整体数据流如下:

  1. 入站消息抵达网关,执行会话健康检查(Session Hygiene),默认阈值设置 85%。当上下文占用达到窗口上限的 85%,启动预压缩流程;
  2. 流量经过安全校验后送入 Agent 运行时;
  3. Agent 内部维护 ContextCompressor,在工具循环(tool loop)内部执行动态压缩,默认触发阈值 50%;
  4. 组装完整请求,调用大模型;
  5. 根据模型返回状态、会话 Token 占用,执行响应后压缩或者错误恢复压缩。

两层压缩分工清晰:网关侧负责提前规避超限,尽可能拦截昂贵的大模型调用;Agent 内部压缩负责实时动态调优,适配工具持续输出带来的上下文膨胀。两套机制相互配合,避免单次触发剧烈截断破坏会话连续性。

二、三大压缩触发时机:预检、响应后、错误恢复

架构设计三类触发入口,覆盖所有上下文溢出风险场景,形成闭环防护。

2.1 Pre-flight:请求发送前预检压缩

在向 LLM 发起调用之前,预先统计当前会话总 Token。一旦占用抵达阈值,先执行压缩,再发起请求,避免无效调用浪费算力。 工程上区分两级阈值:

  • 预警阈值:会话占用达到窗口 80%,启动轻量级摘要;
  • 硬阈值:会话占用达到窗口 85%,强制深度压缩。

预检压缩最大价值:防止直接触发 413 / context overflow,不会向模型发送注定失败的请求。

2.2 Post-response:模型返回之后压缩

最常用的压缩时机。当模型输出结果返回、一轮工具循环结束之后执行压缩。 每一轮对话、每一组工具调用完成后,及时精简历史记录,防止上下文持续膨胀。优势在于:拥有本轮完整输入与输出信息,摘要质量更高;缺点是无法阻止本轮调用超限,更多用于为下一轮任务腾出窗口空间。

2.3 Error recovery:超限报错后的补救压缩

当调用直接返回上下文溢出错误时启动应急压缩。 很多架构缺少这一层容错逻辑,一旦触发超限直接终止会话。Hermes 设计降级方案:捕获长度报错后,立刻执行激进压缩,清理非关键历史信息,重构消息序列后重试调用。

关键原则:压缩不能等同于粗暴截断。单纯丢弃早期消息会破坏任务依赖链,导致 Agent 遗忘前置约束,这也是大量简易上下文管理方案失效的根本原因。

三、核心组件:ContextCompressor 工作流程

ContextCompressor 是整套方案的核心,遵循「先剪枝 → 再摘要 → 最后重组消息」标准化流程:

  1. 计数判定:统计当前全部上下文 Token,判断是否抵达压缩阈值;
  2. 消息分层剪枝
    • 优先保留:系统提示词、当前任务目标、最新一轮用户消息、最近一轮模型回复;
    • 可降级压缩:较早的工具调用记录、中间推导过程、冗长工具返回文本;
    • 允许剔除:已经完成、不再产生影响的历史子任务日志。
  3. 分段摘要生成 使用辅助轻量模型,对可压缩区块生成结构化摘要。摘要要求输出结构化格式,保留关键参数、执行结果、失败标记,禁止生成自由文本散文;
  4. 消息结构重组 将摘要替换原始长文本,维持完整的对话角色序列(user / assistant / tool),保证消息数组结构合规,满足 OpenAI、Anthropic 等模型协议要求;
  5. 校验与兜底 如果摘要失败,启用 fallback 策略:直接执行安全长度截断,严格遵守边界规则,绝不破坏最新一轮交互。

摘要规范要点

Hermes 要求摘要面向后续 Agent 执行,而非人类阅读:

  • 记录:工具名称、入参、返回结果、成功/失败状态;
  • 保留:任务约束、边界限制、已达成的阶段性结论;
  • 精简:冗长日志、堆栈详情、重复中间演算过程。

四、关键边界保护算法(工程重中之重)

上下文压缩最容易踩坑:盲目压缩破坏会话结构,导致工具调用失效。Hermes 定义多条强制约束规则。

4.1 尾部保护策略(Tail Token Budget)

无论如何压缩,必须预留尾部最小消息窗口:

  1. 保证最新一条用户消息位于消息队列末尾附近
  2. 保留紧邻用户消息的上一轮 assistant 回复;
  3. 不允许跨边界截断完整的一组 tool_call + tool_result

算法采用从后向前累计 Token:优先保护尾部交互,从更早的历史内容中释放空间。支持软上限浮动(允许阈值上浮 1.5 倍),避免频繁反复压缩造成抖动。

4.2 工具调用完整性约束

一组工具调用不能被拆分截断:

  • tool_call 和对应的 tool_result 必须成对保留或成对压缩;
  • 禁止只保留调用指令、删除返回结果,会造成 Agent 逻辑断裂;
  • 孤立无匹配的 tool_result 优先清理,避免消息结构错乱。

4.3 系统提示词永久保护

顶层系统 Prompt、任务初始框架禁止压缩、禁止截断。 任务规则、Agent 角色定义一旦丢失,后续所有轮次输出都会偏离目标。系统提示词计入基础占用,在计算可压缩空间时预先扣除。

五、会话存储与压缩协同方案

Hermes 支持两种会话运行模式:原地压缩、轮转会话。

  1. 原地压缩(in-place) 在当前会话对象上直接完成消息精简,适用于短中期任务;优点是实现简单,无会话切换开销;
  2. 轮转子会话(child session) 当历史信息体量过大、多次压缩收益有限时,新建子会话,将摘要信息继承至新会话,旧会话归档持久化存储。 适合持续运行数日的超长任务,防止单一会话累积过多历史碎片。

两种模式可动态切换:由压缩后的剩余可用窗口、预估后续任务长度自动判定。

六、工程落地常见误区与避坑

  1. 误区1:只用固定比例粗暴截断 单纯按百分比删除早期消息,极易删掉任务前置依赖条件。应当采用「尾部优先保护 + 结构化摘要」,而不是简单按序号切割消息数组。
  2. 误区2:只做请求前预检,缺少报错恢复分支 网络波动、单次工具返回超长文本会瞬间冲破阈值,缺少 error recovery 逻辑会直接造成任务宕机。
  3. 误区3:摘要使用自由自然语言 自由文本摘要容易丢失结构化参数,后续工具调用参数出错。必须强制结构化摘要模板。
  4. 误区4:多次连续压缩不做防抖 一轮任务反复触发压缩,摘要之上叠加摘要,信息持续衰减。需要设置压缩冷却窗口,限制短时间内最大压缩次数。
  5. 误区5:忽略消息协议格式 压缩重组之后破坏 role 顺序、tool 消息配对,调用模型直接报错。重组完成后必须执行消息结构校验。

七、参数参考与配置建议

结合实测数据给出一套可直接上线的基线参数:

  1. 网关会话健康检查阈值:85%
  2. Agent 内部工具循环压缩阈值:50%
  3. 尾部最小保护窗口:不少于 2 组完整交互轮次
  4. 连续压缩冷却时间:单次会话 30s 内最多触发一次深度压缩
  5. 摘要辅助模型:选用低成本高速模型,不占用主力推理算力
  6. 软上限浮动系数:1.5

团队可以基于主力模型上下文窗口大小、平均单轮工具返回长度微调阈值。面向代码代理、数据爬虫自动化 Agent,建议适当下调触发阈值,预留更多余量应对超长日志返回。

八、总结

长周期 Agent 的稳定性瓶颈不在于模型推理能力,而在于上下文可持续管理。Hermes 上下文压缩架构依靠网关预检、多时机触发机制、结构化摘要、严格的消息边界保护,构建一套完整的 Token 治理方案。这套方案不局限于单一模型,能够适配 GPT、Claude、开源大模型组成的混合智能体集群。

在构建生产级长任务智能体时,不要依赖模型原生超长上下文窗口被动承载历史信息,主动的分层压缩可以显著降低推理成本,同时大幅减少上下文溢出故障。搭配会话持久化、失败重试链路,就能实现可以稳定运行数日的自主 Agent 工作流。