
字节笔记本
2026年10月6日 · 约 5 分钟读完
DeepSeek Harness 的 goal 机制实录
在 agent 的日常使用里,最尴尬的时刻之一是模型干到一半停下,人得守在旁边一句一句喊继续。DeepSeek 开源的 agent 框架 deepseek-harness 为此内置了一套 goal 机制:把一句目标交给 harness,由系统而不是人来负责让任务接着跑。本文基于仓库 web 端的 goal 多轮测试快照和对应的会话日志,把一次完整的目标驱动执行从头到尾拆开看。

一句话立一个 goal
入口是一条斜杠命令。用户输入 /goal 加目标原文,界面立刻生成一张 goal 卡片:Status 为 active,Rounds 显示 0/256,Activation 显示 armed,并给出三个管理命令:/goal edit 修改目标、/goal pause 暂停、/goal clear 清除。
对照仓库文档,卡片上每个字段都有明确含义。目标的持久状态分四种:active、paused、blocked、complete;armed 则是进程内的激活标记,表示续跑通道已就绪,harness 获准为这个 goal 开启下一个轮次。256 是本次部署配置的轮次上限,防止目标失控无限循环。
注入而不是回忆:跨轮怎么续
goal 创建后,真正的机制开始运转。会话日志显示,harness 会往下一轮的消息队列最前面塞入一段 goal_round 注入文本,要点包括:当前轮次编号(如 Round 1/256)、目标原文,以及一组行为约束:在同一会话里继续朝目标推进;以工作区、工具结果和会话持久状态为准,不要轻信模型自己之前的叙述;声称完成之前先收集证据、读取当前 goal、再用工具标记完成;如果还有活没干完,就保持 active 留给下一轮。
这个设计的关键在于:跨轮驱动指令由系统注入,而不是指望模型记得。每一轮开始时目标原文都会重新出现在上下文里,配合逐轮递增的编号,模型不需要从冗长对话史里自己找回方向。这和把目标写进系统提示词有本质区别:goal 是事件溯源的持久状态,每次变更都会落一条 goal/change 会话事件,编辑、暂停、清除都有对应的命令和审计记录,会话可以整体回放。
两次 turn 的完整实录
测试用的目标是个刻意设计的多轮任务:每个 turn 随机挑工作区里的一个包,输出它的文件结构,做完就停,等系统开下一轮。

turn 1:模型先列出 packages 目录,确认有 4 个候选包(ui-conversation、session-reference、token-meter、skill-filesystem)。第一次随机抽取用了 shuf,这个命令在 macOS 上不存在,该次工具调用直接失败;模型随即在思考里承认这一点,换成 Python 的 random.choice 完成抽取,选中 packages/context/session-reference,用 find 列出真实文件树整理输出,然后按目标要求停手。
turn 2:由 harness 自动开启,模型重新拿到目标注入。这次随机抽取又抽中了与第一轮相同的包,模型主动重抽一次并排除已覆盖的包,选中 packages/llm/token-meter,输出结构后先调用 get_goal 核对目标状态,再调用 update_goal 把 goal 标记为 complete。界面上随之出现 tool-goal complete 的上下文注入,目标闭环。
账单:跨轮续跑的成本
界面底部的统计面板给出了这次会话的完整账单:2 个 turn、12 个步骤,缓存命中率 91%,输入约 113K token,输出约 2.4K token;模型为 DeepSeek-V4-Flash,权限模式是 Workspace Write,上下文占用仅 9%。
输入远大于输出,而且九成输入吃到缓存,这正是 goal 机制敢把轮次上限放到 256 的底气:每轮重复注入的目标原文、工具定义都属于稳定前缀,天然命中前缀缓存,跨轮的边际成本主要是模型真正干活产生的那部分输出。
三个值得抄走的设计
其一,目标与对话分离。goal 是持久状态而不是聊天记录里的一句话,有自己的生命周期和修订号,改目标、暂停、清除都有明确命令。
其二,轮次由系统开。模型只负责干完一轮就停,下一轮的开启、目标原文注入、轮次编号全部由 harness 完成,权责清晰,模型不会越权给自己续命。
其三,完成必须过工具。标记完成要走 update_goal 并携带确切的 id 与修订号,仓库的工具目录文档还要求完成前先取证,堵住了模型口头宣布自己做完了的口子。
这批素材来自 deepseek-harness 仓库的 web 端测试快照(tests/snapshots/goal-multi-turn-actions),想看全程可以拉起仓库的 Web UI 自行复现,跑法就是 README 里的 npx @deepseek-ai/dsh web。



