博客

用 DeepSeek Harness 跑一个多智能体协作场景:调研 + 写作实战走查

快速回答

DeepSeek Harness(dsh)不只是「一个 agent」,它自带一套多智能体协作原语,能让一个主 agent 拆分任务、派出子 agent 并行干活、再汇总产出。本文用一个具体场景——「让 dsh 自动调研两个技术方案,并产出一篇对比文章」——走查它四大协作能力:

  • goal:跨轮次的目标管理,长任务不丢状态,暂停 / 恢复 / 标记完成。
  • subagent / subagent_fork:持久子 agent 分工,子 agent 可以续跑、可以并行、结算时自动通知主 agent。
  • workflow:脚本化多 agent 编排,把「先调研、再写作、再校对」的流程固化成可复用脚本。
  • session fork:会话分叉恢复,一条路径走死了,从某个检查点 fork 出另一条。

下面不是「我跑出来的输出」,而是**「你可以怎么搭」**——每一步给结构、给思路、给可用的工具,避免你从头踩坑。

场景设定

假设我们要让 dsh 干这样一件事:

调研「SQLite 与 DuckDB 在本地数据分析场景的取舍」,产出一篇面向开发者的技术对比文章,结构包含背景、性能特征、适用场景、结论。

这个任务天然适合拆成多个 agent 协作:

  1. 一个 agent 负责调研:搜集资料、抓取文档、整理论据。
  2. 一个 agent 负责写作:基于调研材料组织成文章。
  3. 一个 agent(可选)负责校对:检查事实、补内链、统一语气。
  4. 主 agent 负责编排:把上面串起来,控制节奏和验收。

第一步:用 goal 做跨轮次目标管理

长任务最大的坑是「做一半上下文丢了」。dsh 的 goal 工具(create_goal / get_goal / update_goal)就是干这个的:把目标做成带状态的对象,跨轮次、跨子 agent 存活。

你可以这样建目标:

text
create_goal:产出一篇「SQLite vs DuckDB」技术对比文章
  子目标 1:完成资料调研,输出 3 个对比维度的事实清单
  子目标 2:完成初稿,1500 字以上
  子目标 3:完成校对,补充内链与结论

要点:

  • goal 是跨轮次的,主 agent 的上下文被压缩、会话被 fork 之后,目标状态还在。
  • 每个子目标可以独立暂停 / 恢复 / 标记完成——哪一步卡住了,只处理那一步,不用重来整个任务。
  • dsh 的 goal 需要「直接人类权威」才能 pause / resume,这个设计刻意防止 agent 自己无限改目标——对长任务是个很好的刹车。

为什么值得这么做:多智能体场景里,「谁在推进什么」必须是一个外部可见的状态,而不是藏在某个 agent 的上下文里。goal 就是这个「外部可见状态」。

第二步:用 subagent / subagent_fork 做持久子 agent 分工

调研和写作是两个能力要求不同的活,用一个 agent 顺序做既慢又容易互相污染上下文。dsh 提供两种子 agent 原语:

工具 特点 适用
subagent 一次性子 agent,跑完即止 快速查一个东西、跑一段独立小任务
subagent_fork 持久子 agent,可以续跑、可以被其他 agent 消息唤醒 需要多轮迭代、需要长期跟踪一个子任务的场景

在「调研 + 写作」场景里,推荐这样分工:

  • 调研子 agent(subagent_fork):拿到子目标 1。它自己循环调用 web_fetch / web_search 搜集资料,把关键事实写进工作目录的 research/notes.md。因为它是持久的,主 agent 可以随时发消息让它「再补查一下性能基准」。
  • 写作子 agent(subagent_fork):拿到子目标 2。它从 research/notes.md 读材料,组织成文章。写完初稿后把稿件写到 draft/article.md
  • 主 agent:只做编排——分派任务、收子 agent 的结算通知、检查产出、必要时补一条消息让某个子 agent 返工。

设计要点:

  • 子 agent 之间有明确的信息边界:调研 agent 的产出是文件,写作 agent 从文件读。这样它们不共享上下文,各自上下文干净、省 token。
  • 持久子 agent 的「可续跑」是重点:调研 agent 不用一次性干完,它可以先产出第一版,主 agent 看过缺口后再让它补。这是 subagent_fork 比一次性 subagent 强的地方。
  • 结算自动通知:子 agent 干完会自动通知主 agent,主 agent 不用轮询。

第三步:用 workflow 把流程固化成脚本

跑通一次之后,你肯定不想每次手动重建这套分工。dsh 的 workflow 工具就是脚本化多 agent 编排:把「调研 → 写作 → 校对」定义成一个可复用流程,一次定义、反复执行。

可以这样设计 workflow 的结构:

text
workflow: research_then_write
  stage 1: research
    派发调研子 agent(subagent_fork)
    验收条件:research/notes.md 存在且非空
  stage 2: draft
    派发写作子 agent(subagent_fork)
    验收条件:draft/article.md 字数达标
  stage 3: review
    派发校对子 agent
    验收条件:返回「已通过」或修订列表

好处:

  • 可复用:下次换一个主题,只需要换调研 prompt 里的主题词,流程不用重写。
  • 有验收门槛:每个 stage 有明确的完成条件,避免「看起来跑完了但产出是空的」。
  • 可观测:流程卡在哪一步,一眼就能看到。

如果你不想要「编排」,workflow 也可以做成纯并行扇出——比如一次派 3 个调研子 agent 各自查一个子主题,全部回来后主 agent 统一汇总。

第四步:用 session fork 做分支与恢复

多智能体长任务跑一个多小时很正常,中途可能:网络断了、模型端超时、或者你想试试「换个写法会怎样」。dsh 的 session fork 就是为此设计的——这是它「会话日志即唯一事实来源」架构的免费派生品:fork 会话 = 从某条边界事件派生,天然一致,不需要额外的状态序列化。

两个典型用法:

  • 意外中断后恢复:会话停在某个工具调用,重启后 fork 一个新会话继续跑,不用从头再来。因为所有历史都能从日志重建。
  • 分支探索:文章初稿完成了,但你想试「如果换个角度重写第二部分会怎样」——在初稿完成那个节点 fork 出第二条线,两条线并行演化,都不影响主线。

提醒:fork 之后两个分支就是独立的会话了,它们的工具副作用(比如写文件)是否要合并,需要你自己在业务层处理。fork 给的是会话状态,不是文件系统的版本管理。

把这些接上 TeamoRouter

上面整套都依赖模型后端。dsh 默认把请求发到 DeepSeek 官方 API,通过两个环境变量就能切到 TeamoRouter——免代理直连、一个 key 路由多家模型、还能用免费档:

bash
export DEEPSEEK_API_KEY="sk-teamo-你的Key"
export DEEPSEEK_BASE_URL="https://api.teamorouter.cn/v1"

可选指定默认模型(用免费档先跑通):

bash
export DEEPSEEK_DEFAULT_MODEL="deepseek-v4-pro-free"

然后启动:

bash
npx @deepseek-ai/dsh web

浏览器打开 http://127.0.0.1:3080,新建会话,按上面的四步搭你的多智能体流程。多智能体意味着 token 消耗翻倍,用 DeepSeek V4(约 $0.14 / $0.28 每百万 token)跑,成本比旗舰模型低一个量级——这是「多 agent 全天跑」能成立的经济前提。详细配置见《DeepSeek Harness 接入 TeamoRouter》。

常见疑问

Q:subagent 和 subagent_fork 我该怎么选? 任务一次性、查完就走用 subagent;需要多轮迭代、需要被主 agent 中途追加任务、要长期跟踪子任务,用 subagent_fork。「调研 + 写作」场景两个都用得上:调研用 fork(要补查),一次性的小动作用 subagent。

Q:多 agent 会不会很烧 token? 会,多 agent 并行是 token 黑洞。两个缓解办法:一是信息边界用文件传,子 agent 之间不共享上下文;二是用便宜模型,DeepSeek V4 Flash 跑调研这类量大但要求不高的活,Pro 跑写作校对。TeamoRouter 的免费档每天各 200 次,可以先白嫖跑通流程。

Q:goal、workflow、subagent 各自管什么,会不会重叠? 不重叠,是三个层次:goal 管「要达成什么」(跨轮次的状态),subagent 管「谁在干」(执行者),workflow 管「按什么顺序干」(流程编排)。三个可以组合用:workflow 定义流程 → 流程里派 subagent → 每个 subagent 对着 goal 的子目标干活。

Q:session fork 之后两个分支怎么选? 两个分支是独立会话,各自演化。建议:主线保持默认路径,分支专门用来试「如果」。试完好的结论人工合并回主线(比如把分支产出的段落粘进主线工作区)。别指望 fork 自动合并。

Q:这套东西现在能上生产吗? dsh 还是 Developer Preview,接口会变,做生产依赖要追版本。但个人开发、团队内部跑「调研 + 写作」这类工具链,现在就已经完全可用。

想低成本把上面的多智能体流程跑起来,到 TeamoRouter 注册拿一个 key,把 DEEPSEEK_BASE_URL 指过去,先在免费档里跑通「调研 + 写作」,再决定要不要切付费模型跑更大规模。

准备好接入了吗?登录控制台 · 购买额度 · 创建 API Key,三步即可开始。
用 DeepSeek Harness 跑一个多智能体协作场景:调研 + 写作实战走查 · TeamoRouter