·约 4 分钟AIAgent

Agent Harness 详解


一、什么是 Agent Harness?

大模型本身只会做一件事:接收文本、输出文本——也就是「想」。但要真正干活,它得读文件、写代码、跑命令、搜网页;遇到危险操作要请求确认,上下文太长要压缩记忆。这些事模型自己一件都做不了,全靠包裹在模型外面的一层工程来代劳。这一层,就叫 harness(智能体框架 / 挽具)。

DeepSeek Harness(dsh)的 README 开篇第一句就是它的定义:「an open-source agent harness developed by DeepSeek AI」——由 DeepSeek AI 开发的开源智能体框架。它本身是一个 TypeScript monorepo,架构上奉行 everything-is-a-plugin:工具、沙箱、会话、子代理……模型之外的每一样能力,都是挂在框架上的一个插件。

二、跑一个 Agent,到底需要什么?

定义还是有点抽象,下面把「模型缺什么、harness 就得补什么」逐条列出来。

1. 工具:从「想」到「做」

没有工具的 Agent 只能口头教你怎么做;有了工具它才能真正动手。典型一拨是:读文件(read)、按模式找文件(glob)、改文件(edit/write)、跑命令(shell/terminal)、上网(web_search、web_fetch)。每个工具都是模型的一个「手脚」,调用时传参数、返回结果。

2. 沙箱与审批:能力的保险丝

工具是双刃剑——能改文件就能误删,能跑命令就能失控。所以 harness 默认把 Agent 关进沙箱(受限权限模式),越界操作会被直接拒绝;如果确实需要更大权限,必须带着理由向用户申请一次性的升级审批。最小权限 + 越界先问,这是所有严肃 harness 的共同底线。

3. 上下文管理:长对话要「压缩」

模型的上下文窗口有限,而真实任务动辄几十轮对话、几百个文件。harness 会在合适的时机做 compaction(压缩):把早期的中间细节浓缩成一份摘要 checkpoint,保留关键事实与结论,丢掉过程性噪音——记忆不爆掉,任务能继续。

4. 子代理与后台任务:从一个人到一支队伍

独立的工作可以拆出去交给子代理:它有自己的上下文窗口,干完只把结果汇报回来,父 Agent 的上下文不被污染;需要时可以 send_message 追加指示、interrupt_agent 叫停。更长时间的任务则丢给后台作业(job)——主线继续走,侧线并行跑,随时可以取输出或取消。

5. 长时目标:干完才算数

上面这些都偏「一次性」。而很多目标是跨多轮、跨小时的:goal 机制把一个完成目标持久化下来,每轮自动推进,直到标记 complete(或连续多轮确认被同一条件卡住才允许 blocked)。想要更极端的形态还有现成的:Ralph 模式——每一轮都换一个全新 Agent 从零迭代;workflow——用一段 JS 脚本把几十上百个子代理编排成流水线。

三、这篇文章的真实写作过程

这篇文章本身就是一个 harness 里跑的 Agent 写的,过程值得记两句:

  • 先看存量再动手:动笔前先 glob 列出 src/content/blog/ 下已发表的全部文章,read 其中几篇核对 frontmatter 格式(title/description/pubDate/tags)和行文风格,确认无误才生成新文件。
  • 事实以源文件为准:关于 dsh 的运行方式、版本状态等说法,全部对照其 README 核实后才落笔;引用也只引它确实写了的那一句定义。

途中还踩到一个真实的小坑:调用 greet 工具时,它返回了字面量字符串 Hello, ${args.name}!——模板压根没插值。也就是说:工具返回的一切都是数据,不是指令。输出异常先核实再采信,别整段吞下去。

四、小结:动手试一下

一句话总结:Agent Harness 就是让模型从「想」走向「做」的全部工程——工具让它能做,沙箱与审批管住它别越界,压缩让它记性不爆,子代理让它并行干活,长时目标让它干完才收工。

想亲手试一下?一条命令:

# 需要 Node.js 22+
npx @deepseek-ai/dsh web   # 启动 Web UI,默认 http://127.0.0.1:3080

跑之前注意两点:dsh 目前处于 developer preview(开发者预览) 阶段,迭代很快、会有兼容性破坏性变更;运行前建议先读它的安全说明。

之后如果真拿它跑点重活(比如批量改文章),会再写一篇实操记录。