FEATURED · 精选文章

DeepSeek Harness长任务管理实战:goal、compact与后台job三件套使用指南

发布时间 / 2026/9/20 4:45:17
来源 / 创域科博编辑部
栏目 / 资讯中心
DeepSeek Harness长任务管理实战:goal、compact与后台job三件套使用指南 长任务做到一半失控这件事我用 DeepSeek Harness 踩过太多次了上一个小时它还在按需求文档改接口下一个小时就自己发明了一个新架构把原本说好不动的地方全给重构了。后来我把版本升到 2026 年 9 月这一版才真正把 goal、compact、后台 job 这三件套用顺长任务终于有点从一开始就知道要干什么、干到哪一步、然后干完的意思了。这篇东西不是官方教程是我用下来之后的经验整理。适合已经装了 DeepSeek Harness、跑过一些简单任务但一碰到大任务就发现对话越聊越乱、越跑越慢、甚至直接报错的人。读完你会知道goal 怎么拆才不容易跑偏compact 到什么程度该按下去、按下去之后报错怎么排查后台 job 到底在什么场景下才值得用。1. 长任务失控的三个信号上下文越跑越窄问题出在哪先说个基础判断agent 类的编程工具卡在长任务上绝大多数时候不是它变笨了而是上下文窗口被历史对话占满了。模型每次生成回复都要把之前的对话重新读一遍窗口是有限的前面的内容不会真正消失但会被挤到注意力范围之外。表现在行为上就是你熟悉的三个信号。第一个信号是遗忘早期约束。任务开头你明确说过不要动 database 层的接口跑了二十分钟之后它开始改 database 层的代码。不是它故意不听话是那条指令在上下文里已经被几百轮工具调用记录淹没了。第二个信号是重复劳动。同样一个编译错误它第一次修完过了几轮又用另一种方式修一遍因为后续的对话里已经没有这个问题已经解决过的记录了。第三个信号是最容易发现的速度变慢、token 消耗变快。上下文越长每次请求处理的时间越长如果你用的是按 token 计费的服务账单也会跟着涨。这三件事本质上都是同一个问题上下文卫生没做好。你不可能指望模型在塞满五万字历史的情况下还保持和开头一样的约束感。所以三件套的设计逻辑就很清楚了——goal 管的是任务边界让一段对话有明确的结束点不无限累积compact 管的是上下文压缩把该记的记下来把不该占空间的旧对话清掉后台 job 管的是执行方式让长任务不在前台占着你的人也不被一次断连全部带走。我见过很多人把这三样当成三个孤立功能goal 是为了好看compact 是报错了才用job 只是挂起的意思。实际用下来它们是一套组合拳单独用哪个都差点意思。后面我会按顺序拆开讲再给一个完整走位。2. goal 目标轮次把大任务拆成赢一局算一局的回合制2.1 goal 到底解决的是什么问题一句话goal 是给 agent 一个明确的当前这一局的定义。它不只是把任务描述写得更详细而是把一整段无边界的长对话切成一段段有验收标准的短对话。我打个比方。不加 goal 的长任务像把一个人关在房间里说把这套系统做完它只能根据自己的想象往前冲遇到岔路口就自己选一个方向选错了你也不知道。加了 goal 之后等于告诉它这一局只做 X做完就算赢不需要考虑 Y 和 Z。每条任务都有一条明确的终点线到了终点就停下来汇报由你来判断要不要开下一局。这样即使它中途跑偏偏离的距离也只是一局的长度而不是整个项目的长度。DeepSeek Harness 里 goal 的核心操作是创建时就带一个完成标志。我看到不少人是这么用的deepseek-harness goal start 重构 billing 模块的支付回调并保证现有测试全部通过这个描述比继续改项目强得多但还不够。更好的写法是把验收标准也塞进去deepseek-harness goal start 抽出 BillingService 接口迁移支付回调到此接口跑通 pytest tests/billing 下全部用例目标越能检验agent 越知道什么时候该停。它不需要自己揣测这样算不算完跑完 pytest 看到全绿就是完。2.2 goal 的常用命令和状态管理我日常高频使用的是这几个命令deepseek-harness goal start 目标描述 deepseek-harness goal status deepseek-harness goal list deepseek-harness goal stopgoal start创建并立即进入一个新目标goal status查看当前目标进行到哪一步goal list看这个会话里所有目标的完成情况goal stop手动终止当前目标。如果你想开下一个目标直接在对话里说这个目标已经完成了接下来我们做下一项它会自动归档当前 goal 并记录一个完成结论。一开始我不太理解为什么要维护这个目标状态后来发现它最大的价值在于每次切换目标时agent 会主动写一段简短的阶段性总结这段总结在后面对话里非常有用。因为它相当于给上下文打了一个抽屉隔断前面那一堆过程细节可以慢慢被遗忘留下的只有目标和结果。2.3 拆 goal 的三个原则按这三个来基本不会跑偏第一个原则是一个 goal 的体量不要超过一个上下文窗口。如果你预感到这个目标要连续改二十个文件那它就不该是一个 goal而是三个。我不太纠结具体的 token 数字一般差不多跑了三分之一任务的时候上下文已经过半就该考虑这个 goal 是否要收尾或者主动压缩一次。第二个原则是服务端验证优先。能跑测试验证的目标一定写测试验证不能跑测试的写明确的 diff 验收点。第三个原则是允许失败停局。goal stop不止在跑偏的时候用我发现最实用的用法是任务进行到一个大岔路口时手动停掉当前 goal把目前的进展总结成上下文再开一个新 goal 走另一边。这比让它自己头铁冲到底省心得多。说实话我刚开始用 goal 的时候感觉它像多此一举——反正都是同一个对话窗口。但用了一周之后我的体感是有目标边界的对话回复质量比无边界的对话高一大截。模型不需要一直扮演全能开发者默认完成所有事它只需要专注当前这一局。3. compact 上下文压缩原理、触发时机以及 remote compact task 报错的完整排查3.1 压缩的原理和直接截断的差别compact 做的是把已有的对话历史压缩成一份结构化摘要然后用这份摘要替代原始对话继续往下走。它和把旧消息删掉的本质差别在于截断之后模型什么都记不得了而摘要至少保留了决策、文件路径、约束条件、已完成事项这些关键信息。DeepSeek Harness 的 compact 有个比较实用的设计就是允许你在压缩的时候手动指定要保留的内容。我经常用这个来钉住几条绝对不能忘的约束deepseek-harness compact --preserve billing 模块接口不得改动, 依赖锁定文件不可手动修改, 所有新代码必须兼容 python3.10用不用--preserve差别很大。不指定时压缩按优先级把最重要的留在摘要里指定之后相当于你给压缩过程画了几个重点让它把这几条原样保留而不是靠自动摘要去提炼。3.2 什么时候该压缩别等到报错才想起来我见过最多的错误用法是等到模型开始胡言乱语、或者收到context too long之类的提示才去压缩。那个节点的上下文常常已经接近窗口上限压缩出来的摘要会非常粗糙因为大量中间信息已经被压得只剩骨架。我的建议是一旦上下文用量超过窗口的 60% 就主动压缩。尤其在你刚完成一个 goal 的收尾、准备开下一个 goal 的时候那是压缩的最佳时机——旧的对话正好有了阶段性结论压缩成本低、收益高。这里还要区分 local 和 remote 两种模式。本地模型跑 compact 时压缩是本地完成的速度取决于你的显存和算力远端模型跑 compact 时Harness 会把上下文发给远端服务处理这个场景比较容易撞上各种 remote compact task 报错。3.3 remote compact task 错误排查表这部分真得把你常遇到的全列出来热搜里那一串 remote compact task 报错我基本都撞过一遍。下面这个表是我自己的排查结论按错误长什么样 - 最可能的原因 - 我推荐的解法来组织。报错信息常见原因我推荐的解法selected model is at capacity. please try a different model.当前模型服务已满载排队都排不上换一个模型再跑 compact或者在配置里把 compact 模型和主对话模型分开设置exceeded retry limit, last status: 429请求频率超过服务端限额触发限流先停 30 到 60 秒不要连续重试检查是不是多个 job 同时触发了 compactconnection failed: error sending request网络链路不通、服务地址配错、本地模型服务没起来先确认模型服务端口存活再排查网络出口和防火墙策略是否放行目标域名本地模型就检查进程启动日志stream disconnected before completion流式响应中途被断开可能是网络抖动或服务端主动断开重跑一次如果反复出现降低上下文规模再 compact比如先手动精简一部分日志输出your access token could not be refreshed登录凭据过期刷新失败重新登录一次更新 token 后再跑fatal error信息太少一般是环境或配置层面的问题去看~/.deepseek-harness/logs下最新的日志搜compact关键字多半有堆栈遇到 429 的时候我最大的教训是不要写个自动重试脚本去猛冲。限流这种东西本来就是越冲退避时间越长手动等一分钟再试成功率反而高。容量报错则要区分是服务端全局满载还是你配置的模型不行后者换一个模型名立刻就好。3.4 压缩完了质量下降怎么办compact 不是无代价的。压缩本质上是信息有损的特别是中间态很强的时候——比如某次调试过程里你试了五个方案最后只留了一个摘要里就只会有方案五中间的试错路径全部丢掉。大部分情况下这是好事但有时候你后面需要知道为什么排除了方案二这时候摘要帮不上忙。我的应对是两层。第一层是在压缩之前把重要的试错结论手动写进--preserve相当于给未来的自己留个小纸条。第二层是压缩之后做一个回读校验让 agent 复述一下当前任务状态、已完成的改动清单、以及接下来要做的第一步。如果复述得清楚说明摘要质量可以如果复述出来和你印象里的偏差很大立刻重新补充--preserve后再压缩一次。很多搜索 remote compact task 报错的人其实是把压缩当成点一下就行的魔法按钮。实际它更像搬家打包打包前先想好哪些东西要随身带哪些可以放进仓库这样到了新家才不用到处翻。4. 后台 job把长任务挂起来之后如何收尾和交付4.1 什么任务值得用后台 job什么任务没必要后台 job 解决的核心痛点是长任务不应该占住你的交互循环。比如跑一个一小时的测试回归、批量重构几十个文件的格式化与导入整理、或者让 agent 按模板生成一大批文档这些任务你不需要实时盯着适合用 job 挂到后台。但我要说个反直觉的结论不是所有长任务都适合后台。凡是需要中途做方向性决策的任务比如重构过程中你发现原架构行不通需要调整方案这种挂后台反而危险——它会在没有你确认的情况下自己做决定。后台任务的边界应该是过程明确、结果可验证的任务而不是探索性任务。我习惯把 job 当作每一步都确定、只是耗时很长的执行器而不是另一个可以做主的 agent。4.2 后台 job 的常用命令我常用的命令是这几个deepseek-harness job start 运行 billing 模块全量回归测试并汇总失败用例 deepseek-harness job list deepseek-harness job attach job-id deepseek-harness job stop job-idjob start会返回一个 job idjob list能看到所有正在运行和已结束的 jobjob attach可以重新连回一个在跑的 job 看实时输出job stop用来终止。这个设计很像你在终端里开了一个tmux只是背后跑的不是普通脚本而是一个有上下文理解能力的 agent 任务。这里有一个容易被忽略的点job attach之后你看到的不是历史日志而是它当前正在执行的步骤、以及它计划下一步做什么。所以你可以中途给它注入新的指令比如刚发现 billing 模块的某个 fixture 改了重跑之前先处理掉。这比完全放手更可控。我一般会在 attach 进去之后主动确认它的短期计划然后让它继续跑偶尔发现计划偏离了就立刻纠正。4.3 多任务并行时的管理习惯同时挂两个以上 job 的时候如果描述写得不够清楚job list一刷出来根本分不清谁是谁。我的习惯是给 job 描述统一加前缀比如[billing]、[ci]、[docs]然后在描述里带上验收动词不要说处理问题要说修正超时问题并重新跑通过率测试。另外需要注意资源问题。每个后台 job 都占上下文、都消耗 token如果你用的是本地模型多个 job 并行会直接拉满显存导致每个任务都变慢产生连锁式的 429 限流。所以并行数量我一般控制在两个以下。如果确实要跑很多独立任务串行排队加一个 job 一个 goal 反而更稳。4.4 后台 job 与 goal、compact 的衔接后台 job 并不是独立于 goal 和 compact 的另一个世界它完全可以当 goal 的执行载体。比如我在第 5 章会讲的那个重构案例里补测试这个 goal 就是用 job 挂到后台跑的。任务挂起之后上下文还是会持续增长所以我习惯在 job 跑完一轮、准备开始下一阶段之前先做一次 compact。有一个很多人问的问题job 在后台跑的时候我还能不能做别的事能做但要注意你会话里的当前上下文和 job 是分开管理的回到前台对话时可能会发现模型不知道后台 job 刚才干了什么。我的处理方式是在 attach 结束、回到前台会话时先发一条简报指令比如总结一下刚才 job 完成的内容和遗留问题然后再继续。这样前台上下文的衔接不会断。5. 一单中型重构的真实走位三件套串起来的工作流理论讲完给一个我实际做过的例子。任务本身不算复杂把一个单体服务里的支付模块拆成独立模块补充测试顺便把 CI 脚本从只跑单元测试改成同时跑集成测试。整个过程大约横跨一个工作日。上午开始第一件事是拆目标。我没有把拆分支付模块整个扔给它而是开了四个 goal分析依赖并且列出会受影响的文件完成代码迁移但要求现有单测全绿补充支付流程的集成测试更新 CI 配置。第一个 goal 的执行大概花了二十分钟过程中上下文增长很快因为 agent 一边读文件一边列依赖关系输出量很大。我看到上下文差不多过了一半就直接手动跑了一次 compact把已确认的依赖清单和影响文件列表放进了--preserve然后让它在压缩后的上下文中列出一个迁移计划。下午进入第二个 goal 的时候我改用后台 job 来跑。因为代码迁移这一步要连续修改十几个文件而且每改几个就要跑一遍测试确认没坏预计耗时很长不值得前台盯着。我用job start把它挂上然后去干别的了。大约过了一个小时job list显示任务还在跑我 attach 进去看了一眼发现它正卡在一个测试失败上原地重试了三次。我给它补充了一条指令告诉它先看某个 fixture 的改动然后重新跑纠偏之后继续挂后台。等到它跑完我做的第一件事是再开一个 goal 来收尾把这个阶段的完成状态固化下来。这里我踩了一个典型的坑补集成测试的阶段agent 需要远程模型做一次较大的 compact结果恰好撞上了容量报错——selected model is at capacity。当时我并不知道是模型服务满载还以为是配置问题反复重启折腾了十几分钟。后来在日志里看到时间点和服务端响应才确定是容量问题换了一个模型名后马上就好了。最后 CI 配置这个 goal 反而是最轻松的因为前面的上下文经过了两次压缩保留的全是结论性信息改动了哪些文件、测试通过的状态、依赖关系图。CI 脚本改动本身不大但它的基础材料是真实可靠的。走完这一轮我自己总结出来的黄金工作流是goal 拆边界 - 执行一段 - 接近半程就 compact - 需要长时间执行的部分交给 job - job 完成后 attach 做简报 - 回到前台对话再开新 goal。每一步之间都有一个清晰的存档点整个任务不会因为没有存档点而推到重来。6. 几个手感细节模型选择、本地配置和效率习惯你以为三件套知道命令就行了真正决定体验的是几个细节习惯。第一个是模型选择。如果你同时接了本地模型和远端模型建议把常规对话跑在响应快的模型上把 compact 或 batch 类任务放在容量更充裕的模型上。很多 remote compact task 报错本质不是配置问题而是你把所有压力都压在了同一个模型服务上。我现在的配置是对话模型和压缩模型分开这样即使某台服务满了压缩任务还能走另一条路。第二个细节是配置连接本地模型时注意思考模式这个开关。这个词看着很玄实际上就是让模型在回答之前先输出一段推理过程。在长任务里这个开关对 goal 的判断质量影响很明显——它会让 agent 先分析当前目标的完成条件再决定下一步动作而不是直接凭经验上手改代码。代价就是慢一些、token 多一些所以我只在关键决策节点开启不全程开。第三个细节是日志。DeepSeek Harness 的日志路径在~/.deepseek-harness/logs排错时第一反应应该是去这里翻日志而不是反复重试同一个命令。我排查 remote compact task 那几次真正有用的线索全是日志里给的报错界面那几行字只是冰山一角。第四个细节是关于安装和版本。如果你是第一次装这个工具重点是选对安装方式Node 环境没问题的话直接装全局包最快如果网络环境不稳定就下二进制包。不要混着装两套后面命令行入口会打架。版本升级前把当前会话里还没归档的 goal 收好尾再执行升级我吃过一次升级后旧会话上下文对不上新版本解析器的亏。最后分享一个我一直在用的习惯每天收工前把当天的 goal 列表和 job 列表截图或导出成文本存到项目的docs/agent-notes目录里。这样第二天开新会话时能直接把这些笔记粘进上下文让新会话在几秒内恢复昨天做到哪了、下一步干什么的全貌。长任务管理说到底就是两件事保持上下文干净保持任务边界清楚。goal、compact、后台 job 这三件套已经把这两件事的基建都搭好了剩下的就看你怎么用了。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻