<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>DeepSeek Harness on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/deepseek-harness/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Tue, 18 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/deepseek-harness/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Agent 开发 = Harness 开发！用软件的确定性驯服 LLM 的不确定性，这是我的 Harness 分类法！</title>
        <link>https://www.yesmiracle.net/post/20260818-agent-harness-classification/</link>
        <pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20260818-agent-harness-classification/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20260818-agent-harness-classification/cover.svg" alt="Featured image of post Agent 开发 = Harness 开发！用软件的确定性驯服 LLM 的不确定性，这是我的 Harness 分类法！" /&gt;&lt;p&gt;最近跟几个做 agent 的朋友聊天，大家不约而同都在感慨：&lt;strong&gt;我们哪是在开发 agent，我们分明在开发 agent 的 harness&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;每天的工作不是写 prompt，不是调模型，而是在建一套「软件系统」——工具定义、执行沙箱、状态管理、错误恢复、安全过滤、上下文窗口的切割与压缩……把 LLM 那团模糊的「我试试看」变成可靠的、可预测的、可回滚的自动化流水线。&lt;/p&gt;
&lt;p&gt;这让我忍不住想深入拆一拆：&lt;strong&gt;harness 到底是什么？它有哪些类型？&lt;/strong&gt; 更重要的是——&lt;strong&gt;DeepSeek 最近开源的 &amp;ldquo;Harness&amp;rdquo; 到底算 harness 还是 agent？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先说结论：&lt;strong&gt;软件工程师不会失业，反而会更被需要。因为 harness 没有银弹，每一种 agent 场景都需要专门定制的 harness。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;什么是-harness软件的确定性-vs-llm-的不确定性&#34;&gt;什么是 Harness？——软件的确定性 vs LLM 的不确定性&lt;/h2&gt;
&lt;p&gt;先给个定义。&lt;/p&gt;
&lt;p&gt;LLM 本质上是一个&lt;strong&gt;概率生成器&lt;/strong&gt;。同样的 prompt，这次给你 curl，下次给你 requests，下下次可能给你写个 &lt;code&gt;Invoke-WebRequest&lt;/code&gt;（PowerShell）。你用 Python 问的，它可能给你写个 Ruby 脚本出来。不是它叛逆，是你面对的是一个采样过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Harness&lt;/strong&gt; 就是套在 LLM 外面那层&lt;strong&gt;确定性壳&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它的职责很明确：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLM 说「读这个文件」→ harness 帮你完成实际的文件 I/O&lt;/li&gt;
&lt;li&gt;LLM 说「运行这个测试」→ harness 处理进程管理、超时、标准输出解析&lt;/li&gt;
&lt;li&gt;LLM 说有「python」这个工具 → harness 检查函数签名是否匹配、参数格式是否合法&lt;/li&gt;
&lt;li&gt;LLM 产生了 10 万 tokens 的思考链 → harness 决定什么该保留、什么该压缩、什么该存档&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;LLM 是那团火，harness 是那口锅。没有锅，火只能点着整个厨房。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这就是软件工程师的价值所在——我们用自己擅长的确定性工程去围堵 LLM 的随机性。&lt;/p&gt;
&lt;h2 id=&#34;我的-harness-七分法&#34;&gt;我的 Harness 七分法&lt;/h2&gt;
&lt;p&gt;把市面上各种 agent 拆开看 inner loop，harness 的类型其实非常清晰。&lt;/p&gt;
&lt;h3 id=&#34;1-编程-agent-harness&#34;&gt;1. 编程 Agent Harness&lt;/h3&gt;
&lt;p&gt;代表：Cursor、Claude Code、Aider、Continue.dev&lt;/p&gt;
&lt;p&gt;这类 harness 的核心循环是 &lt;strong&gt;「编辑 → 测试 → 编译 → 反馈」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;确定性层包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件系统操作（读写、找文件、git diff）&lt;/li&gt;
&lt;li&gt;LSP（语言服务器协议）集成——代码跳转、类型检查、自动补全&lt;/li&gt;
&lt;li&gt;测试运行器 + 错误解析器&lt;/li&gt;
&lt;li&gt;仓库上下文管理（repo map、索引、chunking）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的独特挑战在于：代码是一个&lt;strong&gt;高度结构化&lt;/strong&gt;的文本域。你不能简单地把整个 repo 塞进上下文，也不能随便编辑一个函数就指望编译通过。编程 agent harness 需要对 AST（抽象语法树）、依赖图、调用关系有第一手的、确定性的理解。&lt;/p&gt;
&lt;p&gt;Cursor 的自研索引、Claude Code 的 repo map——这些都是编程 harness 独有的工程创新。&lt;/p&gt;
&lt;h3 id=&#34;2-桌面界面-agent-harness&#34;&gt;2. 桌面/界面 Agent Harness&lt;/h3&gt;
&lt;p&gt;代表：Claude Computer Use、OpenAI CUA、UI-TARS、OmniParser&lt;/p&gt;
&lt;p&gt;核心循环：&lt;strong&gt;「截图 → 规划 → 点击/键盘 → 校验」（Observe → Plan → Act → Verify）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;确定性层包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;屏幕截图 + 坐标系统&lt;/li&gt;
&lt;li&gt;UI 元素检测（accessibility tree、OCR、元素识别模型）&lt;/li&gt;
&lt;li&gt;鼠标/键盘模拟（点击坐标、拖拽、快捷键）&lt;/li&gt;
&lt;li&gt;状态变化检测（元素是否存在、界面是否加载完成）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类 harness 最难的点在于：&lt;strong&gt;视觉空间的连续性和不确定性&lt;/strong&gt;。截图后点哪里？点了之后页面的变化是瞬时的还是要等的？元素有没有被遮挡？这些在代码域里能用类型检查解决的问题，在视觉域里全得靠 harness 去做「近似推理」。&lt;/p&gt;
&lt;h3 id=&#34;3-浏览器-agent-harness&#34;&gt;3. 浏览器 Agent Harness&lt;/h3&gt;
&lt;p&gt;代表：Browser Use、Playwright + LLM 范式、Stealth Browser Agent&lt;/p&gt;
&lt;p&gt;核心循环：&lt;strong&gt;「导航 → DOM 提取 → 交互 → 校验」（Navigate → Extract → Interact → Verify）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;确定性层包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无头浏览器控制（Page 对象、导航、等待）&lt;/li&gt;
&lt;li&gt;DOM 解析与元素定位（CSS 选择器、XPath、accessibility tree）&lt;/li&gt;
&lt;li&gt;JavaScript 执行引擎&lt;/li&gt;
&lt;li&gt;反检测/反封禁层（指纹伪装、请求模拟）&lt;/li&gt;
&lt;li&gt;Cookie/会话管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它和桌面 agent harness 最大的区别是：&lt;strong&gt;DOM 给了你一个结构化的「界面理解入口」&lt;/strong&gt;。浏览器 agent 不需要 OCR 猜「这个按钮的文字是什么」，DOM 已经告诉你了。但坏消息是：DOM 是网页开发者写的，有的写得规范，有的写得一塌糊涂。&lt;/p&gt;
&lt;h3 id=&#34;4-知识检索-harnessrag&#34;&gt;4. 知识/检索 Harness（RAG）&lt;/h3&gt;
&lt;p&gt;代表：各种 RAG 系统、上下文引擎、记忆系统&lt;/p&gt;
&lt;p&gt;核心循环：&lt;strong&gt;「索引 → 检索 → 排序 → 注入」（Index → Retrieve → Rank → Inject）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;确定性层包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文本分块（chunking 策略、重叠窗口）&lt;/li&gt;
&lt;li&gt;向量索引 + BM25 混合检索&lt;/li&gt;
&lt;li&gt;重排序（reranking）&lt;/li&gt;
&lt;li&gt;上下文窗口管理与压缩&lt;/li&gt;
&lt;li&gt;缓存策略（避免重复检索）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类 harness 的独特之处在于：&lt;strong&gt;它处理的是信息的不确定性，而非行为的不确定性&lt;/strong&gt;。LLM 的行为问题（写什么代码、点哪里）是决策性问题；而 RAG 面对的是事实性问题（正确答案在哪一篇文档里）。这两种不确定性的 harness 设计思路完全不同。&lt;/p&gt;
&lt;h3 id=&#34;5-安全护栏-harness&#34;&gt;5. 安全护栏 Harness&lt;/h3&gt;
&lt;p&gt;代表：Guardrails AI、Lasso Security、各类内容过滤器&lt;/p&gt;
&lt;p&gt;核心循环：&lt;strong&gt;「输入检查 → 工具调用监测 → 输出过滤」（Check → Monitor → Filter）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;确定性层包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入 sanitization（PII 脱敏、prompt injection 检测）&lt;/li&gt;
&lt;li&gt;工具调用权限验证（白名单、参数校验）&lt;/li&gt;
&lt;li&gt;输出过滤（敏感内容、代码注入）&lt;/li&gt;
&lt;li&gt;速率限制与用量控制&lt;/li&gt;
&lt;li&gt;审计日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;我自己的 ClawGuard 就属于这个分类&lt;/strong&gt;——在 eBPF 层面做 agent 行为的可观测性和安全拦截。不做 LLM 的决策，只做 LLM 行为的外围监视。这个分类里最大的挑战是：安全 harness 必须在&lt;strong&gt;不降低 agent 体验&lt;/strong&gt;的前提下做防护。&lt;/p&gt;
&lt;h3 id=&#34;6-多-agent-编排-harness&#34;&gt;6. 多 Agent 编排 Harness&lt;/h3&gt;
&lt;p&gt;代表：LangGraph、AutoGen、CrewAI、Semantic Kernel&lt;/p&gt;
&lt;p&gt;核心循环：&lt;strong&gt;「任务分解 → 委托 → 聚合 → 冲突解决」（Decompose → Delegate → Aggregate → Resolve）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;确定性层包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任务队列与调度（DAG 图、拓扑排序）&lt;/li&gt;
&lt;li&gt;Agent 间通信协议（消息格式、路由）&lt;/li&gt;
&lt;li&gt;状态共享（共享内存、事件总线）&lt;/li&gt;
&lt;li&gt;结果聚合与冲突判定&lt;/li&gt;
&lt;li&gt;超时与降级策略&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的核心挑战是：&lt;strong&gt;多个概率系统叠在一起的组合不确定性&lt;/strong&gt;。一个 agent 搞砸了，后面的恢复怎么做？两个 agent 给出了矛盾的结论，谁来仲裁？这已经不是单个 LLM 的随机性问题了，而是分布式系统中经典的「共识」问题。&lt;/p&gt;
&lt;h3 id=&#34;7-meta-harness框架型&#34;&gt;7. Meta-Harness（框架型）&lt;/h3&gt;
&lt;p&gt;代表：LangChain、Vercel AI SDK、LlamaIndex&lt;/p&gt;
&lt;p&gt;这类 harness 不直接服务终端用户，它提供的是&lt;strong&gt;构建所有上述 harness 的通用原语&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tool 定义与执行抽象&lt;/li&gt;
&lt;li&gt;Prompt 构建与模板化&lt;/li&gt;
&lt;li&gt;上下文窗口管理&lt;/li&gt;
&lt;li&gt;LLM Provider 抽象&lt;/li&gt;
&lt;li&gt;流式输出处理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的设计哲学：&lt;strong&gt;不替你决定怎么跑，只让你跑得更顺&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;那么-deepseek-harness-算什么&#34;&gt;那么 DeepSeek Harness 算什么？&lt;/h2&gt;
&lt;p&gt;回到用户说的那个点。8 月 13 日 DeepSeek 开源了 &lt;code&gt;deepseek-harness&lt;/code&gt;，MIT 许可，CLI 名字叫 &lt;code&gt;dsh&lt;/code&gt;。发布两天拿到 95,000 GitHub 星，铺天盖地的报道说「DeepSeek 开源了替代 Claude Code 的 agent」。&lt;/p&gt;
&lt;p&gt;但在它名字里是 &amp;ldquo;Harness&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;我看了它的代码。&lt;code&gt;dsh&lt;/code&gt; 包含：CLI 界面、工具系统（文件读写、代码执行、网络请求）、规划-执行循环、自我纠错机制。这些东西组合在一起，用户打开终端敲 &lt;code&gt;dsh &amp;quot;fix this bug&amp;quot;&lt;/code&gt;，它就开始工作——读代码、改代码、测试、再改。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我认为这已经是一个 agent 了，不是一个 harness。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的区分标准很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Harness&lt;/strong&gt; 是框架层、API 层、库——开发者拿来组合自己的 agent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent&lt;/strong&gt; 是面向终端用户的、有完整工作流的、可独立运行的实体&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;DeepSeek Harness 的 Agent 面&lt;/strong&gt;：&lt;code&gt;dsh&lt;/code&gt; CLI 是一个完整的编码 agent，用户不写一行集成代码就能用。
&lt;strong&gt;DeepSeek Harness 的 Harness 面&lt;/strong&gt;：同时它也提供了 Python SDK，开发者可以拿里面的 Tool 系统和规划引擎组装自己的 agent。&lt;/p&gt;
&lt;p&gt;所以合理的说法是：&lt;strong&gt;DeepSeek 开源了一个带完整 Agent 实现的 Harness 框架&lt;/strong&gt;。它既是一个可用的产品，又是一个可扩展的平台。&lt;/p&gt;
&lt;h2 id=&#34;为什么软件工程师不会失业&#34;&gt;为什么软件工程师不会失业&lt;/h2&gt;
&lt;p&gt;整理完这七类 harness，我的结论反而更坚定了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;没有银弹。&lt;/strong&gt; 编程 agent 的 harness 不能用在桌面 agent 上，浏览器的 DOM 引擎帮不了 RAG 的 chunking 策略。每一种场景都需要不同的确定性层设计。&lt;/p&gt;
&lt;p&gt;软件工程师不是在「被 AI 替代」，而是在&lt;strong&gt;替 AI 修路&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每多一类 agent 场景，就多一套 harness 需要设计&lt;/li&gt;
&lt;li&gt;每多一个 LLM 能力（多模态、长上下文、function calling），harness 就得重新适配&lt;/li&gt;
&lt;li&gt;每多一个安全漏洞曝光，harness 的安全层就得补一块&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每一段 harness 代码，都是软件工程师把 LLM 从「玩具」变成「工具」的过程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI 把生产力的天花板推高了，但真正摸到那个天花板的手，是 harness。而 harness，是软件工程师写的。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;最近也看到有人担心：「agent 能写代码了，软件工程师是不是要失业了？」&lt;/p&gt;
&lt;p&gt;我觉得恰恰相反。Agent 每多写一行代码，就更需要人在旁边写 harness。——因为 agent 产生的每一行代码都可能是对的但跑不起来的，每一个操作都可能是合理的但不符合基线的。&lt;strong&gt;概率需要确定性去兜底，这就是软件工程师的新战场。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我自己的 MCPZERO 和 ClawGuard 也在做这件事。前者给 agent 提供安全的外部通信底座，后者在 eBPF 层面做 agent 行为的可观测性。都是在 harness 层做功。&lt;/p&gt;
&lt;p&gt;说到底，&lt;strong&gt;AI 负责天马行空，我们负责铺铁轨。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 延伸阅读：我前面写过一篇 &lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20260814-agent-architecture-landscape/&#34; &gt;《Agent 架构全景图：从单次调用到多 Agent 协作的 8 种设计》&lt;/a&gt;，把 agent 内部的设计模式梳理了一遍。两篇配合看，你会发现 loop engineering 在讲 agent 怎么「想」，harness 在讲 agent 怎么「做」——一个管决策，一个管兜底，正好互补。&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        
    </channel>
</rss>
