DeepSeek Harness:自修改AI Agent的运行时架构革命
从DeepSeek Harness到Cordis:一场静默的架构革命
DeepSeek Harness的发布在AI社区引发了不小的震动,但真正值得关注的,或许不是它作为编程智能体的功能,而是其底层架构所蕴含的深刻变革。这个名为Cordis的内核,源自Koishi生态,以依赖注入和可逆副作用为核心,为AI Agent的自我修改提供了可能。本文将从Harness的设计出发,深入剖析Cordis的机制,并探讨其背后的理论支撑——一篇名为《A Programming Paradigm for Spatiotemporal Composability》的论文,如何为动态组合提供了形式化的基础。

插件化:一切皆可插拔的设计哲学

DeepSeek Harness(简称dsh)的设计理念可以概括为“一切皆插件”。无论是模型接入、工具注册表、会话日志,还是审批策略,甚至驱动智能体运转的主循环,都被设计为可插拔的组件。这种设计并非简单的模块化,而是通过Cordis内核实现了一种动态的组合能力。
在dsh中,每个具体组件都是一个插件,它们通过服务与事件协作,在配置层自由组合。这意味着,用户可以根据需求,通过修改配置来更换搜索引擎、接入自己的模型服务,而无需改动框架代码。更关键的是,插件的卸载机制是完备的:当卸载一个插件时,它注册的所有服务、事件监听器、副作用都会被自动撤销,不留任何残余。
这种设计并非易事。传统的插件系统,如VSCode的扩展机制,虽然支持动态安装,但卸载时往往需要重启整个宿主进程。论文中统计了VSCode安装量前100的扩展,其中87个包含可执行代码,移除它们都需要重启。这背后的根本原因在于,VSCode的扩展机制缺乏对动态组合的理论支撑,尤其是时间维度的可组合性。
Cordis内核:依赖注入与可逆副作用
Cordis的核心是一套以依赖注入和可逆副作用为核心的插件与上下文内核。它负责插件的加载、卸载和依赖关系管理。在Cordis中,每个副作用都被建模为Γ → Γ × (Γ → Γ)类型的函数:作用于当前上下文,返回修改后的上下文,同时返回一个显式的逆函数。运行时将这些逆函数累积到一个复合函数上,卸载时一次性执行,从而恢复到组合之前的状态。
这种设计的关键在于,逆函数由调用方在施加副作用的那一刻提供,而不是事后回忆或系统推导。这保证了每个原子副作用都有一个明确的撤销路径。更重要的是,复合操作的逆由组合自动得出,开发者只需为每个原子操作编写逆函数,任何由这些操作拼成的复合操作,其逆函数会自动派生。这与VSCode的deactivate钩子形成鲜明对比:后者将副作用的产生与销毁分离,导致清理不完整且难以验证。
四档模式:从标准到创造的灵活配置
dsh的界面提供了四档模式选择器,展示了插件化架构的灵活性。标准模式功能最全,适合日常使用;PTC模式让模型生成代码来组合多轮工具调用,提高了效率;极简模式只保留一个终端和一个文本编辑器,系统提示词只有一句话,适合跑基准测试。这三种模式都是在既有插件树上做加减法,通过配置实现。

而第四档“创造模式”则完全不同。它是一组自指的Cordis工具,是高级入口。选择这一预设后,Agent可以检查当前运行时的插件树,并动态挂载或卸载临时插件。模型可以临时写一个事件监听器、注册一个新工具、提供一个服务,任务完成后再将其卸掉。这听起来像是让汽车在高速公路上给自己换发动机,因此项目默认关闭此模式,信任等级等同于shell访问权限。临时插件只存在于进程内存中,不写文件、不装包、不改配置,重启即消失。
自修改Agent的挑战与Cordis的应对
自修改式Agent的难点之一,是如何在修改后干净地移除组件。一次自我修改留下的事件监听器、打开的连接、注册的服务,如果没有明确的回收路径,系统运行几小时后就会变成一堆无人认领的残留。dsh的做法是将动态插件纳入已有的插件生命周期,跑在Cordis的Context和Effect机制下,注册项有确定的清理路径。
这种机制的设计依据,正是DeepSeek同步发布的论文《A Programming Paradigm for Spatiotemporal Composability》。论文指出,软件工程的基石是组合,但传统的组合是静态的,而现代软件越来越需要动态组合。操作系统和容器编排提供了粗粒度的替代方案,但存在明显缺陷:每次重启都会丢弃全部进程本地的累积状态,重建它们要花数秒到数分钟;容器级编排无法表达共享同一地址空间的组件之间的依赖,还会引入网络开销。
理论支撑:效应与余效应的运行时具体化
论文的技术路线是将效应(effect)和余效应(coeffect)这两个类型系统里的经典概念,从编译期的静态标注提升为运行时的机制。效应系统描述计算对环境做了什么,余效应系统描述计算需要环境提供什么。这两套系统恰好对应动态可组合性的两个维度:时间维度和空间维度。
可逆副作用处理时间维度。每个副作用被建模为Γ → Γ × (Γ → Γ)类型的函数,运行时将逆函数累积到累加器上,卸载时整体作用。逆函数由调用方在施加副作用时提供,且复合操作的逆自动派生。这种设计避免了VSCode deactivate钩子的缺陷,后者将销毁与产生分开,容易遗漏。
反应式余效应处理空间维度。组件声明自己需要的依赖规格,上下文每变化一次,系统就对照规格将变化分类为激活、去激活或中性。依赖未就绪时组件不激活,依赖被撤走时组件被反应式地去激活。在此基础上,论文还引入了余效应隔离和余效应拦截两个机制,分别用于多租户和横切元数据。
汇流性定理:动态历史不留痕迹
论文最重的定理是汇流性。它表明,无论系统经历了怎样一串激活与去激活,最终静止时的状态,等同于一次性执行同样的指令、每个最终激活的组件按依赖顺序加载一次且从未卸载所得到的状态。这意味着,推理一个Cordis应用可以当它是静态装配的来推理,组件作者只需看静止状态,不必回放加载历史。
dsh的插件树能被层层叠加的配置任意覆盖而不产生顺序依赖的怪象,靠的就是这条定理。它保证了动态组合的可靠性,使得自修改Agent的运行时重构成为可能。
未来展望:自演化Agent harness
论文的结论部分,作者指出了未来验证方向:超越人工策划的插件生态,实现自演化的Agent harness。即AI Agent持续地生成并替换自己harness的组件,人类监督很少。Cordis的机制可以验证快速组件替换下完整恢复的时间性保证,以及拓扑频繁变化下依赖协调的空间性保证。
dsh的创造模式就是第一个产品形态。虽然它还远谈不上安全无忧,论文也承认语言级的访问控制在恶意组件面前不成立,真正的沙箱需要语言之外的执行边界。但它展示了这套架构真正想抵达的地方:智能体不只是使用能力,也能在受控边界内重新组合自己的运行时。
这种能力,或许正是下一代AI Agent的基石。当Agent能够自我修改、自我优化,其潜力将远超当前静态的模型调用。而Cordis所提供的动态组合框架,为这种自演化提供了坚实的地基。