DeepSeek Harness 实战与架构解析:让 Agent 从“会聊”到“能交付”

DSH(命令行叫 dsh)是 DeepSeek 推出的 Agent 运行环境。它给模型提供工具、沙箱、记忆和可组装的插件系统,让模型在一个受约束的执行环境里把任务从开始做到交付。本文从一次"整理周报"的任务出发,拆解 DSH 的六层结构,讨论 Super-agent 原型中的 Router/Worker、链式召回、事件驱动和端云协同,最后给出上手路径与局限。

一、从一个周报任务说起

周三下午,同事在群里丢来一句:"把上周的测试报告整理成一页周报,下班前给我。"

用聊天窗口里的 AI,流程通常是这样:打开对话框,描述需求,把散在三个目录里的 log 逐个打开、复制、粘贴进去;它回一段排版不错的文字;你复制出来改两个数字,再贴到群里。

模型负责"想",人负责"做"------搬运、核对、保存、重跑,大部分体力活还在人这边。

问题不是模型不够聪明,而是它没有手。

一个人通常只能同时跟进三到五个活跃会话。单任务上限取决于模型能力,多任务上限取决于人的注意力。多数人把这理解成产品体验问题:界面不好用、切换太麻烦,做个统一看板就好了。但再往下一层看,记忆、调度、审批、恢复都困在"一个会话"里,于是本该由系统承担的事,被交给了人。

DSH 想回答的就是这个问题:能不能把记忆、调度、审批、恢复从人身上挪进系统,让人只负责设定目标和验收结果?

二、DSH 是什么:模型之外的那一层

"Harness"原意是挽具------套在马身上的皮带和嚼子。马有力量,但力量要变成牵引力,需要挽具。模型是马力,Harness 是把马力接到犁上的那套东西。

具体来说,它补三样:

  • 手:读写文件、执行命令、搜代码、查网页、生成 Office 文档。模型只能输出文字,工具把文字变成动作。
  • 边界:沙箱决定它能碰到哪里,审批决定哪些动作要先问你。默认最安全,放宽需要主动操作。
  • 记忆:每一步写进只追加的会话日志。进程崩了能接着干,关掉窗口明天再来还记得,觉得哪一步不对可以回看原始输入输出。

核心机制可以概括为一句话:模型说"我要调用某个工具",Harness 执行它,把结果作为新事实追加进会话,再拿更新后的历史去请求模型。

lua 复制代码
你: 把 report/ 下的 csv 汇总成一份月报
  → read  report/*.csv
  → pwsh  统计行数、求和、去重
  → write report/2026-11.md
  → present report/2026-11.md
你: 收到一个可以打开的文件

这个循环叫 agent loop。听起来平平无奇,但它带来一个质变:任务长度可以超过一次回答的长度。一次回答最多几千字,一件真事往往要几十步。有了循环,几十步可以自己走完。

需要说明定位边界:DSH 不是模型,不是 IDE,也不是云端 SaaS。模型只是它调用的一个部件。读者如果熟悉工作流工具,可以把它理解成"模型驱动的、可组装的执行环境",而不是固定流程编排。

Agent Loop 核心循环
markdown 复制代码
【用户目标 / 验收标准】
          ↓
【模型请求调用工具】
          ↓
【Harness 执行:沙箱 + 审批】
          ↓
【结果追加进会话日志】
          ↓
【更新上下文】
          ↓
      任务完成?
       ├─ 否 → 回到【模型请求调用工具】
       └─ 是 → 【交付物呈现:文件卡片 / 结果】

三、围绕会话长出来的六层

DSH 的架构围绕会话长出来,拆开看是六层。理解这六层,后面的功能大多是变体。

层 管什么 一句话
会话 记忆 只追加的 JSONL 日志,默认 zstd 压缩;崩了能续,满了能压
循环 推进 模型请求 → 工具调用 → 观察结果 → 再请求
工具 执行 文件、命令、搜索、抓网页、Office、交付物呈现
沙箱与审批 安全 三档模式 + 审批策略,每会话独立、重启后还在
上下文 成本 先剪超大工具输出,再摘要旧历史,/compact 手动触发
交付 落地 文件以卡片挂在对话下,点开就能用

有一点值得单独说:它真的可以拆开重装。DSH 本体只提供骨架,能力几乎全由插件拼出来。一个 profile 就是一组插件按顺序叠起来的结果。结构主要是两个文件,放在 $DSH_HOME/profiles/「名字」/ 下:package.json 声明装了哪几组插件,cordis.patch.yml 写自己的覆盖。

yaml 复制代码
# 关掉用不上的插件,或者改它的配置
- id: ui-theme
  config:
    preference: dark
- id: dsh-market
  disabled: true

加载时从一个空配置开始,依次叠上每个 bundle 的补丁、你自己的补丁、home 级补丁、临时补丁。想知道最终叠成了什么,不用猜:

arduino 复制代码
dsh --dump-config

这意味着加功能不必等官方,删功能也不必忍着。想要飞书接入,装插件;想要逐处采纳的 diff 审阅,装插件;嫌某个界面元素烦,几行 YAML 关掉它。

它有三种外壳,内核是同一套:桌面 App、浏览器界面、命令行的 headless 模式。同一套 dsh-base,在桌面版里调好的行为,搬进 CI 时不容易变形。

四、Super-agent 原型:让"会话"成为实现细节

上一节的 DSH 仍然要求用户自己管会话。DeepSeek 在设计文档里给出的判断是:Session 应当是系统的实现细节,而不应是用户的认知负担。

这句话反过来说更有意思:如果多任务的上限取决于人的注意力,那说明系统没把该干的活干完。于是有了 Super-agent 这套架构探索,团队把它开源成了 dsh-superagent-prototype。据公开报道,原型把一批任务的 p95 完成时间从 29.5 分钟压到了 15.7 分钟。【发布前补:该数据来源链接】

注意,这一节讲的是原型和设计方向,不是当前下载即用的功能。几个主张值得逐条看。

1. 调度与执行分离:Router 与 Worker

引入两层:Router 判断一件事值不值得做、该交给谁、做到什么程度算完成,它不执行,只决策;Worker 拿到任务就执行,专注交付。

更本质地说,这是控制面与数据面的分工------分布式系统里的老概念,被搬到了 Agent 上。

2. 计算与状态分离:Agent as a Service

Worker 不是常驻的 Agent 实例,而是可调度、可替换的执行服务。

常驻实例听起来自然,也不用异步,但有个死结:实例不可替代。它挂了任务跟着挂,它慢了任务跟着慢,它的 Harness 过时了,任务只能跟着过时。把执行 Loop 做成无状态、状态放进数据库,今天用这个 Harness、明天换那个,对上层透明。并行度的上限,就从"你有几个实例"变成"你有多少算力"。

3. Router 凭什么知道派给谁

这是整套设计里最容易糊弄过去、也最关键的一环。

如果 Router 真能很轻量,小模型能不能担这个责任?在一个会话里用旗舰模型聊久了都会出幻觉,何况它要理解、调度、裁决全局上下文。更麻烦的是误判代价:一句"帮我把那个临时文件删掉",历史里恰好有个同名文件,删错的可能就是重要工作。这不是"答得不好",是不可逆。

所以 Router 可行的前提不是它多聪明,而是它看到的上下文有边界。

工作场景天然自带边界:A 专项群和 B 专项群讨论的事不一样,一个群本身就是一个自带边界的工作区;一个仓库、一个 PR、一张工单,同理。边界一旦可控,很多判断就不必交给模型猜:谁能访问、在哪个项目里访问,几条代码规则写死就行,回归到 workflow 的思路。

4. 链式召回:把上下文窗口当缓存

长任务必然沉淀出远超窗口的上下文。只压缩会丢早期信息,全塞进去又挤占窗口、稀释注意力。DSH 文档里有句话说得挺直接:浪费上下文窗口,就是浪费模型的智能。

它的解法是链式召回:系统里每个对象都有 ID,构成一张引用关系图;每次送给模型时只内联摘要和 ID,需要细节再现时顺着 ID 逐跳去取。上下文窗口从仓库变成了缓存。

5. 事件驱动与订阅直通

单会话时代,输入是你敲的那句话。长程时代,主要输入变成环境里发生的事:群里有人说话、CI 跑完了、有人提了 PR、监控报警了。

人只是其中一个来源,不再是唯一来源。于是要做三件事:把海量事件接进来(文档里叫 Trigger),筛出值得处理的,再决定往模型窗口里塞什么。

这里有个聪明的取舍:如果每条消息都让 Router 重新判断一次,Router 自己就成了瓶颈。所以同一个 IM 话题、同一个工作区、同一个 PR 下的消息构成一条 Thread,Router 与订阅过的 Thread 建立直接关系,后续消息由程序直送 Worker,不再经过 Router------只有没被订阅过的新消息才需要它判断。这套多对多订阅关系,思路和消息系统的发布订阅是一回事:先确定归属、建立订阅,之后按已有关系投递。

6. 独立巡检:故障不是崩了,是没进展

长期在线系统很难只靠内部逻辑保证可靠,通常要在外面放一个独立控制回路,像 k8s 的控制器。

Agent 场景的难点在于:很多故障不是进程挂了,而是任务原地打转。存活探测发现不了"模型在绕圈",也发现不了"方向已经偏了"。所以这套设计里有一个独立的 Watchdog Session,用定时消息驱动它巡检:系统层面查报错和恢复失败,业务层面让模型判断每个任务有没有实质进展、方向有没有偏。发现异常就介入,偶发故障就持续复查。

7. 全双工与多信道:前台不该被后台堵住

经典 ReAct 循环里,模型发起一次同步的工具调用后,整个循环就阻塞了,直到工具返回,期间会话听不进任何新输入。

解法是把耗时的命令和子任务改成异步的 start() 与 stop():start() 立刻返回"已启动",循环不再等它;后台跑完,结果作为一条新事件投递回会话;跑太久,模型可以主动 stop()。前台响应和后台执行从此解耦。

配套的还有信道差异:面向单人终端的输出直接搬进群聊,很容易变成信息过载。文档里有一条很实在的硬性规定------IM 场景单次回复不超过 100 词。【发布前补:官方文档出处】这类规则看着琐碎,却决定了它在群里是"同事"还是"噪音"。

8. 端云协同:Sandbox 是 Agent 的工具,不是容器

模型干活需要的上下文,很大一部分要靠工具调用从仓库、本地文件、依赖服务里取。也就是说,执行环境本身也是一种上下文。

常见做法是把代码拉进云端沙箱、重建环境再跑。但真实环境往往复制不了:未提交的本地修改、私有凭据、本地配置、只在特定网络里可达的服务。

既然环境难以同步,那就不让环境跟着计算上云:云端 Agent 通过端侧一个轻量 daemon 按需接入真实环境,daemon 不存会话状态,只执行命令、返回结果。Sandbox 于是从"Agent 的容器"变成"Agent 的工具"------不是 Agent in the Box,而是 Sandbox as the Agent Tool。个人设备也就成了它的一只手,天然支持 BYOM(带上你自己的机器)。

Super-agent 总览
markdown 复制代码
【事件源:IM / CI / PR / 监控】
            ↓
【Trigger:接入与筛选】
            ↓
【Router:值不值得做 / 交给谁 / 完成标准】
            ↓
【Thread 订阅关系】
   ├─ 已有订阅 → 【程序直送 Worker】
   └─ 新消息   → 【建立订阅】→【交给 Worker】
            ↓
【Worker 池:无状态、可替换执行】
            ↓
【状态库 + 链式召回:摘要 + ID】
            ↓
【Watchdog:巡检进展与方向】
            ↓
【异常介入 / 继续执行】

五、五个特点,一句话一个

  • 可组装:加功能不用等官方,删功能不用忍------几行 YAML 就是全部。
  • 安全是默认值:三档沙箱、两档审批,捆成"权限预设";故障安全的默认值是最严格的 read-only;策略每会话独立,A 会话放宽不会连累 B。
  • 扛得住长活:goal 默认最多自动续 256 轮,定时任务支持 cron 且重启后仍在,再加后台任务与上下文压缩,架构层面还有 Watchdog。【发布前补:256 轮出处】
  • 会分工:一两个独立子任务用 subagent(默认只许一层),几十个用 workflow 脚本扇出;再往上是 Router/Worker 那一层。
  • 能被嵌进去:headless 进 CI(不监听任何端口)、SDK 起 JSON-RPC、ACP 接编辑器、MCP 接外部工具。

六、上手:半小时到第一个真任务

安装

桌面版最省事,自带终端里就有 dsh,不用另配 Node。

arduino 复制代码
Deepseek Harness 桌面端安装地址 : https://www.deepseek.com/harness/

选工作区

工作区就是权限边界------你在哪个目录下启动,可写范围就是哪里。第一件事不是写提示词,是 cd 到该干的活那儿。

第一句话

别问"你能做什么",那只会换来一段自我介绍。给它一件能验收的小事,同时给三样东西:路径、验收标准、边界。

复制代码
读 reports/ 下这三个 csv,按月份汇总成一张表,写成 monthly.md。
金额保留两位小数,缺数据的行单独列在最后,别改原始文件。

你写得越像验收标准,它交付得越像成品。

选权限

读代码、做调研用 read-only + never;日常改代码用 workspace-write + ask;装依赖、动系统配置,用一次批准;容器或 CI 才用 danger-full-access。一个实用技巧:让它先在只读模式下出方案,你看完再放宽------很多返工,来自"它理解错了但已经把文件改了"。

三个立刻能用的场景

1. 整理混乱目录:"先给我一份移动清单,我确认后再动手。"这句话把不可逆操作拆成了"可审阅的提案 + 执行"。

2. 塞进 CI:

arduino 复制代码
dsh --profile headless "跑一遍测试,失败就定位到具体用例并给出建议,别改代码"

3. 每天替你盯一件事:"每天早上九点,看一遍 release/ 的变更,版本号有更新就汇总成三条要点。"

教它规矩:技能

反复交代的流程别每次粘贴,写成技能:

yaml 复制代码
---
name: weekly-report
description: 把本周变更整理成团队周报,按固定四段式结构
---
1. 读 `changes/` 下本周的 md
2. 按「进展 / 问题 / 风险 / 下周计划」归类,每条不超过 40 字
3. 输出到 `reports/weekly-<日期>.md`

放在 「项目」/.dsh/skills/(跟着仓库走)、「项目」/.agents/skills/(兼容别的 agent)或 ~/.dsh/skills/(自己的通用技能)。目录里只暴露名字和描述,正文用到才加载,放二十个也不容易撑爆上下文。

扩展它

界面侧边栏有"插件"页,命令行等价物是:

csharp 复制代码
dsh plugin --profile web add <包名>

第三方插件有索引站 dshopen.org:把飞书、钉钉、企微、Telegram 接进来派活和审批的;给对话加 Monaco 编辑器、逐处采纳或回滚的;把 MCP 配置粘进去先给风险提示再写入的。装完不满意,改 cordis.patch.yml 关掉就行,不用卸载。【发布前核实:dshopen.org 的性质与安全性说明】

七、局限与风险

好话说完了,该说问题。

Router 那一层还在原型里。 上下文边界回答了"为什么可能可行",但没有证明"一定可行"------边界之内仍然要判断,判断仍然会错,而错的代价不可逆。这是读到"Router 可以很轻量"时最值得追问的一句。

沙箱会先带来摩擦。 你可能会遇到"明明这个文件我能改,它却说没权限"。多数情况不是 bug,而是它在工作区之外。解法不是关沙箱,是把工作区设对,或者对那一次操作单独批准。

上下文是真花钱的。 让它"把这个文件读完再回答",五千行的文件一次读完,账单会提醒你。更好的问法是"先 grep 出相关函数,再读那三处"。

它会过度自信。 模型的通病,Harness 治不好。有用的办法是在提示里明确要求"改之前先读""结论要指出依据在哪个文件第几行"。

别在陌生仓库里关审批。 网上克隆来的项目,postinstall 能干任何事。danger-full-access 该留给容器,不该留给主力机。

最后一条比前面五条都重要:它的上限不在功能多少,在它能进哪些系统、以什么身份进、被谁信任。 模型会趋同,算力会变便宜,Harness 会开源,这些都可能贬值;而"这个 agent 能进哪些系统"不会自己变便宜。所以各家都在抢入口、抢协议、抢身份体系。

八、回到那句话

"帮我把上周的测试报告整理成一页周报。"

现在我大概会这么回:把报告目录指给它,说清楚周报长什么样、哪些数据不能动、什么时候要,然后把窗口最小化,去干别的。二十分钟后回来,文件挂在对话下面。

这件事的意义不在于省了二十分钟,而在于:过去只有"人能做"的那一类工作,现在有一部分可以交出去了------不是交给一个更聪明的聊天机器人,而是交给一个能被约束、能被审查、能被复盘的执行环境。

至于它接下来要变成什么样,DeepSeek 给的方向是:会话退成实现细节,记忆、调度、审批、恢复都归系统,人只管设定目标和验收结果。这条路走不走得通,还得看 Router 那一层怎么落地。

但有个判断标准现在就能用:当你开始把"描述需求"变成"描述验收标准",它就从玩具变成了工具。

相关推荐
LiaoWL12320 分钟前
NumPy 入门实战(二):向量化与余弦相似度——从 ndarray 到 Embedding
python·numpy·embedding
深蓝AI29 分钟前
一个项目五个 AI 同时干活,Claude Code 怎么让它们不互相打架
人工智能·程序员
forest_0941 分钟前
多 Agent 协作第二课:交叉验证≠独立验证
人工智能·python·算法·机器学习·prompt·agi
ZONGYUAN-ROOT1 小时前
【工具治理】Nginx换机丢16子域事故复盘
人工智能
dozenyaoyida2 小时前
AI与大模型新闻日报 | 2026-11-08
人工智能·搜索引擎·ai·大模型·新闻
泯泷2 小时前
AI Agent 工具设计:读完一百页 PDF,不等于真的看懂了
人工智能·llm·agent
泯泷4 小时前
AI 怎样"查资料"?——RAG 检索增强生成入门(三)
人工智能·llm
databook4 小时前
时间序列数据,先拆规律还是先查异常
python·数据挖掘·数据分析
Solange__4 小时前
Blender 3D模型优化:普通复制、共享网格、实例、合并怎么选?
人工智能·3d·ai·自然语言处理·编辑器·blender·材质