内容提要
Cordis是DeepSeek Harness的底层框架,支持自演化Agent组件热替换不停服。它通过数学逆操作实现组件卸载无残留,两阶段撤回处理依赖,响应式依赖表管理状态。已在Koishi运行四年,4000插件验证,现用于Agent运行时,实现工具插件动态加载替换,无需重启。
延伸解读
热替换的难点:依赖与状态
文章指出,Agent自修改组件时,难点在于组件间存在动态依赖关系,且修改会改变系统状态。传统热替换要么需要手写迁移函数,要么只支持函数级补丁,无法处理组件级接口变更。Cordis通过数学逆操作和两阶段撤回,解决了卸载无残留和依赖一致性问题,使得热替换后系统状态依然正确。
左逆与两阶段撤回的设计逻辑
Cordis只要求每个操作有左逆,即能撤销本次修改即可,不要求双逆。这降低了实现复杂度。对于依赖关系,采用两阶段撤回:先停止提供key,触发依赖方卸载,待其完成后,再执行自身的逆操作。这种设计避免了在卸载过程中因依赖缺失而导致的错误。
生产验证:Koishi四年运行
Cordis已在Koishi框架中运行四年,拥有超过4000个插件,验证了其稳定性和实用性。在Koishi中,插件热替换无需重启,依赖管理自动处理,即使依赖暂时不可用,插件也会等待而非崩溃。这一长期运行经验为DeepSeek Harness的Agent运行时提供了可靠基础。
Q&A
Cordis框架是什么?它主要解决什么问题?
Cordis是DeepSeek Harness的底层核心机制,是一套专门处理时空可组合性的元框架。它主要解决自演化Agent在运行时动态加载、卸载和替换组件时,如何保证系统状态正确、依赖关系一致且无需重启的问题。
Cordis如何实现组件卸载无残留?
Cordis通过数学逆操作实现组件卸载无残留。每个操作都记录其逆操作,组件卸载时按逆操作的反序执行,确保所有状态修改被撤销。具体通过ctx.effect函数维护累积逆,形成LIFO撤销链。
Cordis如何处理组件间的依赖关系?
Cordis使用响应式依赖表管理状态。每个组件声明自己需要的key,系统维护依赖表,当依赖表变化时,检查所有组件的依赖是否满足,并触发相应的启动、关闭或重载。对于有环的依赖,在加载时直接报错阻止启动。
Cordis的两阶段撤回机制是什么?
两阶段撤回用于处理组件卸载时的依赖问题。当组件B要卸载时,先停止对key k的提供,使依赖它的组件A的依赖状态变为不满足,触发A开始卸载。等A彻底卸完后,B才执行自己的逆操作回收资源。
Cordis在Koishi中应用的效果如何?
Cordis在Koishi中运行了四年,积累了超过4000个插件,插件可以日常热替换而无需重启服务,插件清理自动完成,依赖拓扑真实存在,系统持续运行四年没有出现因依赖解析错误导致的全局崩溃。
Cordis如何支持Agent运行时中的工具插件动态加载替换?
在DeepSeek Harness中,LLM生成新的工具插件并加载,旧版本的同名工具被卸载,所有依赖该工具的技能自动更新依赖引用,整个过程无需重启服务。这得益于Cordis的组件级逆操作和响应式依赖表。
Cordis的热模块替换与传统的module.hot.accept有何不同?
Cordis的热模块替换不需要开发者手写module.hot.accept,它通过组件级别的逆操作自动构成模块级别的回滚单元,配置变化时自动计算差集,只卸载受影响的组件并重装,其他保持运行,且具有事务性保证。