DeepSeek Harness深度解析:老套路的新生态

近日,DeepSeek AI 开源了名为 DeepSeek Harness(预览版)的 Agent 框架,短短时间内 GitHub Star 数已逼近 10 万,引发国内技术圈的广泛关注。连华尔街见闻这类投资媒体也第一时间进行了报道。
本文基于B站UP主「小马哥」技术周报第87期的深度拆解,从软件工程视角剖析 DeepSeek Harness 的设计本质、与竞品的异同,以及它真正的差异化优势所在。

Harness 的本质:又一个 Agent 工具箱
首先要厘清一个概念。「Harness」原意是马鞍、缰绳,引申为「约束脱缰野马」的机制——用它来控制 AI 不受控的行为。但正如小马哥所强调的,没有任何软件能真正约束住大模型的幻觉,所谓 Harness 更准确的定位应该是一个「Agent 引擎」或「标准化工具箱」。
把 DeepSeek Harness 放到当前 Agent 产品的大图景中对比就会发现,它与 Codex、Claude Code、Pi(现更名 Codewell)等产品在本质上没有区别。它们的核心都是围绕大模型的 Function Call / Tool Call 机制展开,通过扩展手段来丰富能力。
Function Call 是 OpenAI 在 2023 年 6 月引入的核心能力,后被业界广泛采纳并演化为 Tool Call。其原理是:开发者预先向大模型声明一组可调用的函数签名(包含函数名、参数描述、返回值类型),模型在推理过程中判断何时需要调用外部工具,并生成结构化的 JSON 调用请求,由宿主程序执行后将结果回传给模型继续推理。这一机制是当前所有 Agent 框架的基石——它让大模型从「只能生成文本」进化为「能操作外部世界」。MCP(Model Context Protocol)是 Anthropic 提出的开放协议,试图标准化 Tool Call 的发现与调用方式;A2A(Agent-to-Agent)则是 Google 提出的 Agent 间通信协议。无论协议名称如何变化,底层逻辑始终是:模型决策 → 结构化调用 → 执行反馈 → 模型继续推理的循环。
无论是 Codex 的 skills、MCP、A2A,还是 Harness 的 plugin,本质上都是扩展机制。小马哥的判断很直接:这些工具的差异主要在「扩展机制的组织方式」上,而非底层原理。
核心组件构成
通过让 Harness 自我介绍(它的文档本身就是很好的素材来源),可以梳理出这个框架的核心能力:
- 依赖注入(DI):类似 Spring 的控制反转
- 依赖查找:类似 Java JNDI 的 context.lookup 机制
- Tool 注入与注册
- 事件分发:Event Sourcing 观察者模型
- 生命周期管理
这些几乎全是软件工程中的经典模式。依赖注入和控制反转是 Martin Fowler 在 2004 年正式命名的设计模式,其核心思想是将对象创建的控制权从对象本身转移给外部容器。在 Agent 框架的语境下,这意味着工具、插件、事件处理器都可以像 Spring Bean 一样被容器统一管理和编排,实现组件间的松耦合和灵活组装。这也意味着开发者可以轻松替换某个工具实现(比如将搜索引擎从 Google 切换为 Bing),而无需修改框架的其他部分——这正是依赖注入在企业软件中被证明有效的核心价值。
从代码看设计:处处是 Spring 与 Pi 的影子

借鉴 Spring 的依赖注入思想
DeepSeek Harness 的插件注册机制,本质上就是一个 Function Call。通过 inject 注入功能,把工具组件注入到 context 上下文中。这与 Spring 的依赖注入(DI)、控制反转(IoC)思想如出一辙。
Spring Framework 自 2003 年由 Rod Johnson 创建以来,已成为 Java 企业开发的事实标准,其 IoC 容器是整个框架的核心。DI 带来三个关键好处:松耦合(组件间不直接依赖具体实现)、可测试性(可轻松替换为 mock 对象)、可配置性(通过配置而非代码改变行为)。Harness 将这套思想移植到 Agent 领域,意味着 Agent 的各个功能模块都可以被灵活替换和组合。例如,你可以在开发环境中用一个模拟的 LLM 客户端替换真实的 API 调用,从而在不消耗 Token 的情况下测试整个 Agent 的工具调用链路。
有意思的是,Spring 的 DI 大多是运行时完成的,而 Harness 更偏向编译式的组织编排。它甚至采用了类似 XML 配置的方式来声明组件 ID 和元信息——这与 Spring 的独立 context XML 配置极为相似。值得一提的是,Spring 作者 Rod Johnson 近年在 GitHub 上大量提交 TypeScript 代码,这或许也是设计思想相通的一个佐证。
此外,Harness 中的「依赖查找」机制类似 Java 的 JNDI(Java Naming and Directory Interface),允许应用程序通过名称查找对象和资源。典型用法是 context.lookup("jdbc/myDataSource")——应用程序不需要知道资源的具体实现细节,只需通过标准化的名称即可获取。在 Agent 框架中,这种模式允许插件在运行时动态发现和获取其他已注册的工具或服务。这种机制兼顾了声明式编排(在配置中预先定义组件关系)和运行时动态绑定(根据实际环境选择具体实现)两种范式,在企业级应用中尤为重要——比如同一个 Agent 应用在测试环境和生产环境中可能需要连接不同的数据源或使用不同的模型端点。
与 Pi/Codewell 的高度相似
小马哥指出,DeepSeek Harness 多多少少借鉴了 Pi(Codewell)的设计——两者底层核心都是 TypeScript 实现。写一个 Pi 的 extension 和写一个 Harness 的 plugin,从位置约定、导入方式、事件机制到生命周期,几乎是同一套逻辑:
- 插件有统一签名(context + apply)
- 事件用
on表达(类似 JS 的 onClick) - 通过约定目录(extension 目录)加载,类似 Java 的 ServiceLoader
Java 的 ServiceLoader 是 JDK 内置的服务提供者接口(SPI)机制,通过在 META-INF/services/ 目录下放置以接口全限定名命名的配置文件来声明实现类,运行时自动扫描加载。JDBC 驱动的自动发现就是 SPI 的经典应用——开发者只需在 classpath 中放入驱动 JAR,无需手动调用 Class.forName() 注册,ServiceLoader 会自动扫描并加载所有实现了 java.sql.Driver 接口的类。这种「约定优于配置」(Convention over Configuration)的思想深刻影响了后来的 Spring Boot 自动配置和 Maven 的目录结构约定。Harness 通过约定的 extension 目录来加载插件,本质上是同一套思路的 TypeScript 版本实现——开发者只需将插件放到指定目录,框架启动时自动发现并注册。
差异仅在于配置和加载方式的细微不同,都没有逃脱 Function Call / Tool Call 这个大框架。
生命周期与状态机(Fiber)
Harness 的 Fiber 是插件的实体状态机,管理 Pending、Loading、Active、Failed、Dispose、Unload 等状态。这套设计在 Java 的 OSGi(bundle 机制)里早已成熟——install、start、active、resolve 等状态一一对应。
OSGi(Open Services Gateway initiative)是 Java 平台上的动态模块化系统规范,最早于 1999 年提出,Eclipse IDE 的插件系统是其最著名的实现。OSGi 的 bundle 有严格的生命周期状态机:INSTALLED → RESOLVED → STARTING → ACTIVE → STOPPING → UNINSTALLED。每个 bundle 声明自己导出和导入的包(通过 Export-Package 和 Import-Package 头),由容器管理类加载隔离和版本冲突解决。这套机制解决了 Java 长期以来的「JAR Hell」问题——即不同库依赖同一个库的不同版本而导致的类冲突。OSGi 的设计虽然在规范严谨度上甚至比 Harness 更强(比如支持同一个包的多版本共存),但因其复杂性在业界的采用率一直不温不火,这或许解释了 Harness 选择了更轻量的实现方式——保留状态机的核心价值(可预测的生命周期管理),但降低使用门槛。
而 Effect 则用于回调销毁、资源释放,处理工具用完后的清理动作。这在 Agent 场景中尤为重要:一个工具可能打开了数据库连接、创建了临时文件或持有了 API 会话,Dispose 状态确保这些资源在 Agent 任务完成后被正确回收,避免资源泄漏——这在长时间运行的服务端 Agent 中是生产级可靠性的基本要求。
Harness 真正的差异化:面向服务端的 Agent

这是全文最核心的洞见。DeepSeek Harness 没有做 TUI(Terminal UI),被不少用户吐槽「不如 Claude Code 好用」,但小马哥认为这恰恰点出了它的战略定位。
TUI 面向人,Harness 面向机器
Claude Code、Pi 这类 TUI 程序,本质是人机交互工具。你不会把它们部署到 Linux 生产服务器上——因为服务器上没人给你敲命令、没人回答「你是谁」这类交互问题。
TUI(Terminal User Interface)是介于纯命令行和图形界面之间的交互形态,使用 ncurses 等库在终端中绘制窗口、按钮等 UI 元素。TUI 的 buffer(缓冲区)限制源于终端仿真器的历史设计:早期 VT100 等硬件终端只有有限的显示内存(通常仅支持 24 行 × 80 列),现代终端虽已扩展,但 scrollback buffer 通常仍有上限(一般为几千到几万行)。更关键的是,TUI 是为人类交互设计的同步阻塞模型——它假设有一个人在屏幕前等待输出、键入输入,整个程序流程围绕「提问-等待-回答」的循环展开。而服务端程序需要的是异步、无人值守、高并发的通信模式(如 HTTP API、gRPC、消息队列),能够同时处理数百甚至数千个并发请求而无需人工干预。TUI 本质上不适合高效的机器间协作,这不是功能缺失,而是架构层面的根本差异。
而 DeepSeek Harness 具备部署在应用服务器上的能力。它的 plugin 主要用 TypeScript 编写,可以像 Tomcat 一样部署一个 Agent 应用,进行机器间的交互(走通讯协议或进程内外调用)。
Apache Tomcat 的核心设计是提供一个运行时容器,开发者将应用(WAR 包)打包部署其中,容器负责管理生命周期、线程池、连接处理、安全认证等基础设施,开发者只需专注于业务逻辑。Harness 面向服务端的定位与此高度类似:它充当 Agent 应用的运行时容器,开发者编写的 plugin 相当于部署的应用单元,Harness 负责 Agent 的生命周期管理、工具调用编排、事件分发和上下文管理。这种「容器 + 应用」的分层架构是企业级软件的黄金范式——J2EE(现 Jakarta EE)时代的 EJB 容器、Spring 的 ApplicationContext、Docker 的容器化部署都遵循这一思路。这意味着 Harness 的野心不止于开发工具,而是要成为 Agent 时代的应用服务器,就像 Tomcat 之于 Web 应用、Kubernetes 之于微服务一样。
服务端场景的想象空间
举个例子:你可以在自己租的服务器上部署 Harness,配合它内置的 job/cron 定时器工具,实现「每周五晚8点自动汇总邮件并生成周报」这类无人值守的自动化任务。这已经逃脱了「个人助手」的范畴,向服务端应用靠拢。
更进一步想象,在企业环境中,Harness 可以承载更复杂的场景:多个 Agent 实例协作处理客户工单,一个 Agent 负责理解需求、一个负责查询知识库、一个负责生成回复;或者作为 CI/CD 流水线的智能节点,在代码提交后自动进行代码审查、安全扫描和部署决策。这些场景都要求 Agent 以服务的形式 7×24 小时运行,能够通过 API 被其他系统调用,并具备故障恢复和横向扩展的能力——这正是 Harness 的服务端定位所瞄准的方向。
小马哥预判,国外厂商看到 DeepSeek 抢占了「服务器版」这个身位后,很可能也会跟进类似产品。而豆包、字节等国内产品也有向企业版、connector(连接器插件)方向演进的趋势。
TypeScript 生态的优势与局限
Harness 选择 TypeScript 作为插件语言,带来两大好处:
- 群体庞大:TS/JS 开发者众多,尤其是前端 No.1 的地位
- UI 组件整合无缝:像社区里的 Apollo(Walker)插件,能把可观测性做得非常直观——文本输入后直接 UI 渲染,无需像竞品那样嵌套浏览器
可观测性(Observability)是云原生领域的核心概念,由日志(Logs)、指标(Metrics)和链路追踪(Traces)三大支柱构成,CNCF(云原生计算基金会)将其列为云原生技术全景图的核心领域。在传统分布式系统中,OpenTelemetry 已成为可观测性数据采集的事实标准。然而在 Agent 领域,可观测性面临全新挑战:大模型的推理过程是「黑盒」的——你无法精确知道模型为何决定调用某个工具而非另一个;工具调用链可能是非确定性的——同样的输入在不同运行中可能产生不同的调用序列;Token 消耗和延迟也需要精细监控,因为每一次 LLM 调用都有实实在在的成本。Apollo 插件将可观测性做到 UI 渲染层面,意味着开发者可以可视化地看到 Agent 的每一步决策、每一次工具调用的输入输出、Token 消耗统计和整个推理链路的火焰图。这种透明度对于 Agent 应用的调试、优化和生产监控至关重要——没有可观测性,Agent 应用就是一个「盲盒」,出了问题无从排查。
但小马哥也直言其局限:扩展门槛偏高,需要懂编程。相比 skills 那种「任何脚本语言都能写」的标准化方案,Harness 的 plugin 对开发能力有更高要求。这也引出了 Agent 生态的一个核心张力:面向专业开发者的高度灵活性 vs 面向普通用户的低门槛易用性。Codex 的 skills 选择了后者(一个 Markdown 文件加几行 shell 脚本就能定义一个技能),而 Harness 选择了前者(完整的 TypeScript 模块需要理解 DI、生命周期、事件系统)。两种选择没有绝对优劣,取决于目标用户群体。
此外他还大胆预测:Java 在企业级整合场景会重新受到重视。当前 Agent 开发以 TypeScript 和 Python 为主,但要做企业级的遗留系统整合,Java 的工程能力(应用上下文管理、DI、Event Sourcing、配置、元编程)依然强大。全球财富 500 强企业中,超过 90% 的核心业务系统使用 Java 构建,银行核心系统、保险理赔平台、供应链管理系统大量运行在 Java 生态之上。当 Agent 需要与这些遗留系统交互时——读取 SAP 数据、调用 SOAP Web Service、操作 Oracle 数据库——Java 生态中成熟的连接器和适配器库是不可替代的优势。语言除性能外的核心价值在于可维护性——这也是为什么金融交易系统至今仍有用 Perl 写的,而没人真的用汇编去写业务逻辑。
给开发者的建议:别焦虑,看本质
面对 Pi、Claude Code、Harness 的选择纠结,小马哥给出了清醒的判断:工具本身不是最重要的,模型质量才是核心。
工具一旦被打包到本地,功能就被 fix 住了,它的提示词优化、上下文压缩策略都跟着版本走。真正值得关注的是三点:
- 保持谦虚:各行各业的创意(skills)不容小觑
- 学习用英语组织提示词:英语更严谨、Token 消耗更少、专业表达更精准
- 摸清技术本质:无论 LangChain、Spring AI 还是 Harness,本质都是「辅助大模型请求的上下文构建」——通过 tools 挂载、MCP、结构化输出、循环工程、Human-in-the-loop 等手段,引导模型朝期望结果输出
关于第二点值得展开解释:大模型的 Token 化(Tokenization)机制是理解其重要性的关键。以 GPT 系列使用的 BPE(Byte Pair Encoding)分词器为例,英文单词通常被编码为 1-2 个 Token(如 "function" = 1 Token,"implementation" = 1 Token),而中文由于 UTF-8 编码的特性,一个汉字通常消耗 2-3 个 Token(如「函数」= 4-6 个 Token vs "function" = 1 个 Token)。这意味着表达同样的语义,中文提示词可能消耗 1.5-2 倍的 Token 数量,直接影响 API 成本和上下文窗口的有效利用率。在上下文窗口有限的情况下(如 GPT-4 的 128K Token),Token 效率的差异意味着你能向模型提供的背景信息量有显著不同。此外,主流大模型的预训练语料中英文占比通常超过 60%,计算机科学的核心术语几乎全部源自英语(如 dependency injection、event sourcing、state machine),使用英文提示词可以避免翻译带来的语义损失,让模型更精准地理解技术意图。
关于第三点中提到的 Human-in-the-loop(人在回路中),这是 AI 系统设计中的一个重要范式:在自动化流程的关键决策节点引入人类审核和确认。在 Agent 场景中,这意味着当 Agent 要执行高风险操作(如删除文件、发送邮件、修改数据库)时,先暂停并请求人类确认。这种机制在提供自动化效率的同时保留了安全兜底,是当前 Agent 产品普遍采用的安全策略。
结语
DeepSeek Harness 在技术实现上并非「拯救世界」式的创新——它的插件机制、DI、事件系统、生命周期管理,都是软件工程沉淀多年的成熟策略。但它的两大真正优势不容忽视:
一是面向服务端 Agent 的战略定位,跳出了个人助手的红海;二是 DeepSeek 品牌的巨大人气与背后的资本实力,能迅速聚拢庞大的中国工程师队伍进行开源共建。
从更宏观的视角来看,Agent 框架的竞争正在从「谁的交互体验更好」转向「谁能率先成为 Agent 时代的基础设施」。就像 Web 时代的 Apache HTTP Server、Nginx 和 Tomcat 定义了 Web 应用的部署范式,Agent 时代也需要类似的运行时基础设施。Harness 选择面向服务端,实际上是在赌这场基础设施之争的方向。
正如小马哥所说:当你的软件视野足够宽广,看到问题本质就越轻松,那些眼花缭乱的 Agent 框架,始终在你的掌控之中。
相关推荐

无状态数据库:AI智能体记忆的轻量化方案详解
深入解析无状态智能体记忆数据库的设计原理与工程价值,探讨轻量化方案如何解决AI Agent记忆管理痛点,涵盖无状态架构优势、向量检索替代方案及实际落地挑战。

零框架实现RAG与Agent:AI工程师必备的底层能力
深入解析AI Engineer Notebooks开源项目,通过零框架方式从底层代码实现RAG检索增强生成、Agent智能体和Evals评估体系,帮助开发者摆脱框架黑盒,真正理解AI工程核心原理。支持Google Colab免费运行。

Gemini Omni 1.1 Flash深度解读:全模态+极速推理如何改变AI落地
深度解读谷歌Gemini Omni 1.1 Flash模型的全模态能力与极速推理特性,分析其产品定位、开发者应用场景、与GPT和Claude的竞品对比,以及对AI规模化落地的实际意义。