赞助商LobeHubLobeHub了解更多
ddshfind
登录

第 8 课:自我演化:智能体改造自己

一句话版:DSH 里有一组需要显式启用的「自指 Cordis 工具」,让智能体能检查自己的实时运行时、在运行中给自己挂载或卸载插件;再配上 Code Mode(run_code 工具 + 生成的 SDK),智能体甚至可以自己写代码、自己装上、不好用自己拆——而这一切不会自毁,因为底层是 Cordis 的时空可组合性:装上能拆、拆下无痕。


1. 用户故事:一个发现自己缺工具的智能体

深夜,一个被派去整理老项目的智能体正在干活。它今天已经第四次做同一件事了:找到配置文件、解析它的格式、把关键字段写进汇总表。它忽然意识到一件事——「我缺一个工具,一个能把配置解析成结构化数据的工具。」

它没有去论坛求助,也没有等着人类工程师来救,而是做了一件以前只有人类工程师才会做的事——改造自己

  1. 检查:先用 cordis_inspect 看看自己现在装了哪些插件、注册了哪些工具,确认「配置解析」确实没人提供;
  2. 生成:自己写了一段 JavaScript,实现配置解析逻辑;
  3. 装上:用 cordis_mount 把这段代码挂载成一个插件,当场获得一个新工具;
  4. 反馈:接下来几轮任务里用这个工具干活——结果发现某个字段的解析逻辑有 bug,老出错;
  5. 拆掉:用 cordis_unmount 把这个临时插件卸下来,改好代码,重新挂载一个新版本。

整个过程里,DSH 一次都没重启,会话没有中断,其他插件毫发无损。这就是本课的标题——自我演化:智能体改造自己。下面这张图就是这个循环:

检查运行时自指工具生成新插件自己写代码挂载到运行中装上运行 & 反馈不好用就换自我演化循环动态组合保证:装上能拆、拆下无痕

运行中的智能体自己改造自己——自指 Cordis 工具 + 时空可组合性

🎁 打个比方:这就像一个外科医生自己给自己做手术——先照镜子(检查运行时),再给自己移植器官(挂载插件),发现排异就拆掉(卸载插件)。听起来很科幻?DSH 把它变成了一个真实、可操作、而且有安全兜底的功能。


2. 自指 Cordis 工具:检查、挂载、卸载

DSH 把这套能力做成了三个面向模型的工具,合称自指 Cordis 工具(self-referential Cordis toolset)。「自指」的意思是:这些工具操作的不是某个外部系统,而是智能体自己所在的运行时。仓库根 README 里有一句最精炼的官方总结:

Self-referential Cordis tools are opt-in. They let the agent inspect its live runtime and mount or unmount plugins while it runs. —— 来源:仓库根 README.md(DeepSeek Harness)

三个工具分工明确,就像三把「手术刀」:

工具作用(来自官方 README)白话
cordis_inspect当前进程运行时的只读报告:服务、全部存活插件、已注册工具、临时插件列表先照照镜子:我身上现在装着什么?
cordis_mount立即求值模型编写的 JavaScript,不保存到任何位置;代码必须返回一个仅存于内存、以 dyn-1dyn-2…… 跟踪的临时插件当场给自己装一个新零件
cordis_unmount卸载一个临时插件,并只在其拥有的 effect 完全停稳后才返回;它不能移除 Loader 插件、已配置插件或已安装插件把装上的零件拆下来,拆到彻底干净

⚠️ 注意最后一条的边界:cordis_unmount 只能拆 cordis_mount 装的临时插件——正式安装的插件它动不了。自指的力量是有的,但边界画得清清楚楚。

临时插件的一生

那「临时插件」到底是个什么存在?官方 README 把它的生命周期写得很明白(来源:packages/extensions/tool-cordis/README.zh.md):

临时插件只存在于共享 DSH 进程内存中。它可跨后续轮次保持活跃,也可能影响同一进程中的其他会话,但会在 cordis_unmount、工具集卸载或 DSH 重启后消失。它不会创建插件文件、安装任何包、修改 cordis.yml 或个人/项目配置、跨重启存续,也不能自动转为正式插件。

拆开看三句话:

  • 活在内存里:不落盘、不装包、不改任何配置——文件系统纹丝不动;
  • 随时可消失:卸载、工具集卸载、DSH 重启,都会让它消失,而且系统绝不会自动恢复它;
  • 不能转正:实验成果想保留?得让智能体走常规开发流程,把它实现成正式的本地、项目或仓库插件。

所以对智能体来说,这套工具的行为就像「草稿纸上的实验」:随便写、随便改、随便扔;正事(正式插件)永远走正规流程。


3. Code Mode:让智能体「写程序」而不是「逐个发指令」

自指工具解决了「装/拆」,但还差一半:智能体写出来的代码,怎么跑起来? 答案是 Code Mode——它让模型写程序,而不是逐个发工具调用

先看原生模式(native)的痛点。DSH 默认把每个工具以 JSON Schema 函数定义的形式通告给模型,模型每步发出一个工具调用,而每一个中间 tool-result 都会在下一次请求时重新进入模型上下文。如果一件活要五步工具调用,模型就得来回五趟,每趟都拖着前面所有中间结果——token 开销大,而且模型没法组合工具:遍历结果集、按中间值分支、扇出、后处理,这些在「一步一调用」的模式里都做不了。

Code Mode 换了一个思路,基于一个很朴素的观察:LLM 写代码的能力,强于发工具调用的能力——因为它们见过数百万行真实代码,而人为构造的工具调用序列相对少得多。

官方描述(来源:packages/core/tools/README.zh.md):

codeboth 模式下,注册表为当前作用域公开保留的 run_code 传输和按所加载运行时语言生成的确定性 SDK……只有程序的外层日志与返回值会重新进入模型上下文。

落地到模型面前,长这样:

  • run_code 工具:一个保留的工具入口,接收 { code, description } 两个参数,把一段程序交给代码运行时执行;
  • 生成的 SDK:DSH 根据当前可见的工具集合,生成一份 TypeScript 声明(默认语言,也支持 Python)——每个工具都变成程序里可调用、带精确类型的函数;
  • 模型写程序:在程序里 await tools.xxx(args) 调用工具,循环、分支、并发(Promise.all)全在程序内部完成,中间结果只存在于执行局部
  • 只有外层日志与返回值重新进入模型上下文:模型看到的,是它亲手 print 或 return 的那部分——上下文不再被中间结果淹没。

💡 打个比方:原生模式是「一步一问」——每走一步都要向模型请示一次;Code Mode 是「一次写一小段程序」——把一串活交给程序自己去编排,只有结果汇报回来。

把两件事拼起来看,闭环就完整了:Code Mode 负责「自己写」,自指工具负责「自己装、自己拆」——写出来的程序通过 run_code 执行,实验出来的工具通过 cordis_mount 挂载。缺工具 → 写工具 → 装工具 → 用工具 → 不好用 → 拆工具,这正是本课第一节故事背后的完整机制。


4. 为什么不会自毁:时空可组合性兜底

看到这里,一个理性的问题必然冒出来:让智能体随便改自己,难道不会自毁吗? 模型写的代码可能出错,装上一个坏插件怎么办?

答案分两层。

第一层,也是最根本的:每一次自我修改,本质上都是一次「动态组合」——而动态组合的安全性,正是第二章精读的 Cordis 论文的核心贡献。 还记得那套「时空可组合性」吗?它在这里逐一兑现:

  • 装上能拆(时间可组合性):Cordis 的每个效应都配了逆函数,卸载时按 LIFO 顺序完整恢复。落到自指工具上,cordis_unmount 会等插件的所有 effect 完全停稳才返回——拆得干干净净,不给上下文留残渣;
  • 拆下无痕(空间可组合性):临时插件不创建文件、不装包、不改配置;恢复一个持久化会话,只会重建对话历史,绝不会重建临时插件——系统里没有任何地方残留「上次自我修改」的痕迹。

所以「自毁」这个风险被结构性地消解了:装上的东西一定能拆下来,拆下来之后就像没装过一样。挂载一个坏插件的最坏结果,就是卸载它——不需要重启进程,更不会把「用来恢复系统的进程」本身改坏(还记得第二章说的吗:缺时间可组合性时,有缺陷的自修改可能连「救命稻草」都烧掉)。

第二层,是一个重要的诚实声明:这依然是开发级工具,不是安全边界。 官方明确说,沙箱只是「约束诚实代码」,信任等级与 bash 相当——挂载的插件能触达 Node,能访问真实的文件系统和网络。所以它需要显式启用,部署方启用它的慎重程度,应该和授予 bash 工具一样。

最后,把视线拉远一点。论文结论里指向的未来是:

自演化智能体框架——AI 智能体几乎不受人类监督,持续生成并替换自己的框架组件。

DSH 的这套机制,就是这个方向的雏形;而现实中最先落地的形态,是「模型合成的可复用工具」——第二章我们说过,它是「组件级自修改」的一种范围更窄的先行形态。今天,智能体写出的工具通过常规开发流程沉淀为正式插件、skill,供未来的任务复用;明天,当自指工具与 Code Mode 的闭环足够成熟,智能体就能在运行时持续地给自己换装——而那一天的根基,仍然是这一整章反复出现的四个字:装上能拆、拆下无痕


关键点回顾

这一课是第三章的收官,记住这五句话就够了:

  1. 自指 Cordis 工具 = 需显式启用的三件套——cordis_inspect(检查实时运行时:插件、服务、工具)、cordis_mount(挂载内存临时插件)、cordis_unmount(把临时插件拆到 effect 完全停稳)。
  2. 临时插件只活在进程内存——不创建文件、不装包、不改 cordis.yml,卸载、工具集卸载或 DSH 重启后消失,也不会自动转正;想保留实验成果,要走常规开发流程。
  3. Code Mode = run_code + 生成的 SDK——模型写程序来编排工具调用,循环、分支、并发在程序内部完成;只有程序的外层日志与返回值重新进入模型上下文,中间结果不回流。
  4. 不会自毁的根因是时空可组合性——装上能拆(逆函数 + LIFO 完整恢复)、拆下无痕(无文件、无配置、恢复会话也不重建临时插件);每次自我修改都是一次可回退的动态组合。
  5. 展望——论文结论指向无人监督的「自演化智能体框架」,DSH 的机制是雏形;现实中最先出现的是「模型合成的可复用工具」。

🎓 第三章学到这里,你应该能回答这几个问题:「DSH 是怎么启动的,为什么一次会话可以随时恢复、fork、回放?」「智能体循环如何运转,工具是如何被定义、执行和约束的?」「沙箱与审批如何划定『能碰』与『不能碰』的边界?」「智能体如何感知世界、如何管理目标与协作?」以及本课的核心——「它为什么能安全地改造自己?」如果都能答上来,恭喜你,你已经握住了 DSH 的全部核心概念。下一章「插件开发实战」,我们就要亲手写插件了——到那时你会发现,今天讲的「动态组合」不是抽象概念,而是你每天都要用的日常。

自测题 · 自我演化

完成作答后点击「提交答案」,可以查看对错与解析。

1. 关于「自指 Cordis 工具」,下列说法正确的是?
2. 智能体用 cordis_mount 挂载的「临时插件」,最准确的描述是?
3. 关于 Code Mode,下列说法正确的是?
4. 为什么智能体自我修改「不会自毁」?最根本的原因是什么?