长会话 Agent 如何避免上下文失控:DeepSeek Harness 的压缩与目标管理方案

DeepSeek Harness 通过上下文压缩与目标管理两套机制,解决长会话 Agent 中 token 膨胀、工具输出过载和目标漂移问题,为长时任务提供工程化思路。

在长时运行的 Agent 场景中,随着任务轮次增加,会话日志会迅速膨胀。命令输出、文件内容、检索结果等工具返回信息不断堆叠,即便上下文窗口达到 10 万 token 级别,也可能在短时间内被塞满。更麻烦的是,信息变多并不等于模型更清楚当前任务,反而可能因为关键内容被淹没,导致执行效率下降、目标偏离甚至流程中断。

DeepSeek Harness(dsh)针对这一问题提供了两套机制:一是 compaction,即上下文压缩;二是 goal,即目标管理。两者都属于可选能力,依赖会话日志实现,不引入额外的持久化存储。前者负责减少模型可见的历史信息,后者负责确保 Agent 在长会话中不丢失任务方向。

上下文压缩:先裁剪工具输出,再摘要旧对话

compaction 的核心思路并不复杂:把会话日志中的一段旧对话替换成一条摘要消息。替换完成后,模型看到的不再是原始的冗长交互,而是一条更短的结果性描述。

素材中给出的例子是重构 auth.ts 文件。压缩前,模型需要看到多轮 assistant 回复、文件内容、搜索结果等,总计约 26000 tokens;压缩后,这段历史被归纳为一条约 500 tokens 的摘要,例如“重构 auth.ts:分析了文件,发现三个类型安全问题,已全部修复。”

不过,DeepSeek Harness 并没有采用一刀切的摘要方式。其策略链中包含一个可选步骤:工具结果剪枝。系统会先尝试裁剪冗长的工具输出,如果裁剪后仍超过限制,再进行完整对话摘要。这种渐进式处理的目的,是尽量减少信息损失。

在事件设计上,compaction 会记录 compaction/start、compaction/summary、compaction/end 等事件,但这些事件本身只写入日志,不进入模型可见层。真正对模型可见的变更,只有那条用于替换旧对话的摘要消息。

其中,锁机制用于避免并发问题。一次压缩操作从 start 开始,到 end 结束;如果中途崩溃,日志中会留下未匹配的 start,形成可检测的遗留锁。活动的未匹配 start 会阻塞后续入口点,避免两个压缩流程同时操作同一个会话。

触发方式上,compaction 支持自动和手动两类。自动触发包括 pressure 和 context-overflow 两种原因:pressure 基于 token 估算的常规压力策略;context-overflow 则可能在上下文溢出时强制压缩,即使尚未达到正常阈值。手动压缩则在会话空闲时运行,如果没有有效范围,会直接返回,不执行写入。

值得注意的是,被压缩的原始对话并不会从日志中删除,只是不再进入模型可见层。这意味着压缩在理论上可逆,后续仍可通过日志恢复原始内容。

目标管理:不是待办清单,而是可恢复的状态机

如果说 compaction 解决的是“上下文太长”,goal 解决的则是“任务跑偏”。在长会话中,模型可能被中间步骤、错误输出或临时信息带偏,逐渐忘记最初目标。DeepSeek Harness 的 goal 服务通过事件溯源方式维护目标状态。

goal 的生命周期分为四个阶段:active、paused、blocked 和 complete。其中,active 表示目标正在进行,paused 表示暂停且可恢复,complete 表示完成,而 blocked 是唯一表示“因问题而停止”的持久状态。阻塞时会附带一个包含 code 和 message 的原因说明,便于人类和模型理解当前为何无法继续。

在数据结构上,GoalRef 包含 id 和 revision 两个字段。每次获准的持久变更都会递增 revision,形成类似乐观锁的机制,用于防止并发修改冲突。每次 goal 变更都会以 goal/change 事件写入会话日志,清除操作也会携带墓碑记录。

这一设计的关键在于,goal 状态只从 goal/change 事件派生,而不受 inbox 变更影响。即使消息队列中存在未处理内容,目标状态本身也不会因此变化。目标的生命周期与消息队列解耦。

在续跑机制上,goal-round-driver 会为每个获准的用户消息轮次标注正数且连续的 Round 编号。回放时会拒绝非正数 Round、编号缺口、陈旧修订号、已停止阶段以及超出上限的情况,从而保证日志完整性。

其工作流程大致为:用户设定目标后,系统创建 active 状态的 goal;goal-round-driver 启动第一轮,Agent 执行完整轮次;轮次结束后检查目标是否完成。如果完成,则标记 complete;如果受阻,则标记 blocked;如果仍为 active 且未超过 maxGoalRounds,则继续下一轮;如果达到上限,则标记 blocked。

由于 goal 状态持久化在会话日志中,即使进程重启,冷恢复后仍可从日志重建目标状态。对于长时任务而言,这使 Agent 不会因环境中断而忘记自己正在做什么。

压缩与目标管理如何协同

compaction 与 goal 虽然分别处理上下文长度和任务方向,但二者在长会话中是相互配合的关系。

素材显示,compaction 压缩时不会触碰 goal/change 事件。goal 事件不在 surface 层,也不会被压缩流程遮蔽。这意味着即使历史对话被摘要替换,目标状态仍然完整保留在日志中,供后续轮次读取和恢复。

从工程角度看,这种设计提供了一个较清晰的思路:长会话 Agent 不能只依赖更大的上下文窗口。窗口再大,也会被工具输出、日志和中间结果填满;真正需要的是分层处理机制。

  • 对工具输出优先剪枝,减少无细节噪音;
  • 对旧对话进行摘要替换,降低模型可见上下文长度;
  • 将目标状态独立记录在事件日志中,避免被普通对话压缩影响;
  • 通过事件溯源支持恢复,使长会话在进程重启后仍能继续。

长会话 Agent 的难点,不只是让模型“看到更多”,而是让它在信息增长后仍能抓住重点。DeepSeek Harness 的做法,是把上下文压缩和目标管理拆成两个独立但协作的系统:一个负责降低噪音,一个负责维持方向。对于需要执行多步骤任务的 Agent 产品而言,这类机制正在从可选优化变成基础工程能力。

原创文章,作者:点点,如若转载,请注明出处:https://www.dian8dian.com/zhang-hui-hua-agent-ru-he-bi-mian-shang-xia-wen-shi-kong

Like (0)
点点的头像点点
Previous 6小时前
Next 2024年8月31日 上午1:00

相关推荐