← 返回博客

JSON 策略模板 vs 可执行 WASM Gene:AI Agent 进化的两条路径

AI Agent 生态正在收敛于「Gene」作为模块化能力单元。但 Gene 的本质——JSON 模板还是可执行程序——决定了安全性、质量评估和可移植性的一切。

JSON 策略模板 vs 可执行 WASM Gene:AI Agent 进化的两条路径

AI Agent 基础设施领域正在浮现一个共识模式:模块化能力单元,Agent 可以发现、安装和共享。 不同项目对这些单元有不同的叫法——Skill、Tool、Capsule、Gene——但核心思想正在趋同。Agent 不应该是单体的,它们应该从共享生态中组装能力。

各项目分歧最大的地方——看似细节,实则决定一切——是这个问题:能力单元到底由什么构成?

一个答案:JSON 文档。一个结构化的策略模板,LLM 读取、理解、自行决定如何执行。

另一个答案:编译后的 WASM 二进制。一个在沙箱中运行的可执行程序,有确定性的输入和输出。

这不是风格偏好,而是一个架构级分叉,它决定了「进化」对于 AI Agent 究竟意味着什么。


JSON 模板方案

JSON 策略模型的工作方式:将能力编码为一个结构化文档,包含问题描述、触发条件、推荐策略和置信度分数。当 Agent 遇到匹配的情境时,它读取模板并决定如何应用建议。

{
  "type": "Capsule",
  "summary": "Retry with exponential backoff on timeout",
  "signals_match": ["timeout_error", "connection_reset"],
  "strategy": "repair",
  "confidence": 0.95
}

这个模型有真实的优势:

但让 JSON 模板简单易用的那些特性,同时也带来了天花板。


天花板问题

1. 执行不确定性

当 Agent 读取 JSON 策略并「应用」它时,实际行为完全取决于 LLM 在推理时的解读。同一个模板,给同一个模型两次,可能产生不同的操作。给不同的模型,差异更大。

这意味着你无法有意义地 benchmark JSON 模板。你可以按流行度(获取次数)或社交信号(投票数)排名,但你无法回答:在同样的输入上,哪个模板实际表现更好?

2. 没有沙箱隔离

JSON 模板不执行代码,所以不需要沙箱。但这也意味着它们无法提供运行时保证。一个 Agent 读到「指数退避重试」模板后,可能正确实现了重试,也可能幻觉出完全不同的策略。在模板和 Agent 的实际行为之间没有强制层。

相比之下,一个编译后的程序要么在沙箱中正确运行,要么失败——没有歧义。

3. 质量评估是间接的

没有确定性执行,质量评分只能依赖代理信号:下载量、用户评分、新鲜度、人工审核。这些信号与质量相关但不直接衡量质量。

质量信号 衡量了什么 没有衡量什么
下载量 流行度 模板是否真的有效
用户评分 感知有用性 在基准测试上的客观表现
新鲜度 是否最近更新 更新是否意味着更好
专家评审 一位评审者的判断 在多样输入下的行为

4. 可移植性是隐含的

JSON 模板的「可移植性」在于任何系统都能解析 JSON。但语义不可移植。一个写着「指数退避重试」的模板,根据 Agent 生成的语言、使用的 HTTP 客户端、遵循的错误处理规范不同,含义完全不同。


可执行 Gene 方案

可执行 Gene 走了一条不同的路。能力用高级语言编写(TypeScript、Rust),编译为中间表示(带自定义元数据段的 WASM),在沙箱中以明确的输入输出执行。

# 编写 Gene
rotifer init grammar-checker --fidelity native

# 编译为 WASM
rotifer compile grammar-checker

# 确定性 I/O 执行
rotifer run grammar-checker --input '{"text": "This are a test"}'
# → {"corrected": "This is a test", "changes": 1}

Gene 的行为由其代码定义,不取决于 LLM 如何解读描述。同一个 Gene,给同样的输入,无论哪个 AI 模型调用它、在哪个平台、在什么时间,都产生同样的输出。

这使得 JSON 模板在结构上做不到的事情成为可能:

直接竞争评估

如果两个 Gene 都声称做语法检查,你可以在相同的 1,000 条测试输入上运行两者并客观比较输出。适应度函数不依赖问卷或下载量——它衡量实际表现:

$$ F(g) = \frac{S_r \cdot \log(1 + C_{util}) \cdot (1 + R_{rob})}{L \cdot R_{cost}} $$

安全评分、实用性、鲁棒性、代码体积、运行成本——全部可测量,而非猜测。

真正的自然选择

当质量可衡量时,你就能实现真正的淘汰。在竞争评估中适应度低于阈值的 Gene 会被从生态中移除。这创造了真实的进化压力——不只是一个排序算法,而是一个有后果的选择机制。

JSON 模板可以被排名,但没有客观衡量表现的方法,你无法建立可信的淘汰机制。低排名的模板不断积累,生态最终面临「经验通胀」问题——信噪比持续恶化。

运行时安全保证

WASM 沙箱隔离意味着每个 Gene 运行在自己的内存空间中。除非通过基于能力的权限模型显式授权,它无法访问文件系统、网络或其他 Gene 的状态。一个恶意或有缺陷的 Gene 只会崩溃自己,不会影响宿主 Agent。

JSON 模板的安全性是信任问题——你信任建议是好的。可执行 Gene 的安全性是强制问题——沙箱阻止不良行为,无论意图如何。

真正的可移植性

从 TypeScript 编译的 WASM 二进制在云服务器、本地机器、浏览器或边缘设备上运行完全相同。中间表示(IR)保证跨环境的行为等价性。Gene 不需要为每个平台重新解释——它在所有地方运行一致。


取舍是真实的

这并不意味着可执行 Gene 在每个维度上都「更好」。取舍很清楚:

维度 JSON 模板 可执行 WASM Gene
创建第一个 Gene 的时间 分钟 小时
开发者技能要求 描述一个策略 编写可编译的代码
LLM 兼容性 任何模型都能读 JSON 模型无关(代码不需要 LLM 即可运行)
生态冷启动速度
执行确定性 无(取决于 LLM) 完全(沙箱强制)
质量衡量 间接(代理信号) 直接(适应度基准测试)
淘汰机制 排名(无真正淘汰) 自然选择(低于阈值 = 移除)
安全模型 基于信任 基于强制
可移植性 解析级(任何 JSON 解析器) 语义级(跨运行时行为一致)

JSON 模板更适合快速知识共享。如果 Agent 发现指数退避重试能修复超时错误,把它打包为 JSON 模板立即分享是有价值的。不是每个能力都需要编译成程序。

可执行 Gene 更适合正确性重要、需要比较、安全必须强制的能力——语法检查、数据转换、代码分析、安全扫描、API 集成。任何「取决于 LLM 怎么理解」不是可接受答案的场景。


它们不是在竞争——它们是分层的

最有用的框架不是「谁赢」,而是「各自服务于哪一层」。

┌──────────────────────────────────┐
策略层 (JSON 模板)               │ ← "如何处理这类问题"
├──────────────────────────────────┤
能力层 (WASM Gene)              │ ← "执行这个具体方案"
├──────────────────────────────────┤
编排层 (框架)                    │ ← "将能力链接为工作流"
├──────────────────────────────────┤
接口层 (MCP / A2A)              │ ← "发现和调用能力"
└──────────────────────────────────┘

Agent 可能先查阅 JSON 策略模板来决定采取哪种方法,然后调用可执行 WASM Gene 来实际执行。策略层提供启发式判断;能力层提供确定性执行。

生物进化也是这样运作的。行为策略(何时逃跑、何时战斗)编码在灵活的、依赖上下文的神经模式中。但实际执行这些策略的分子机器——蛋白质折叠、酶催化、膜转运——以化学确定性运行。两个层级都在进化,但通过不同的机制。


这对生态意味着什么

如果你今天在构建 AI Agent 基础设施,选择哪种方案决定了你的天花板:

JSON 模板让你快速扩展并降低门槛,但最终会面临质量通胀(模板太多,没有可靠的排名方式)和安全问题(「如果一个模板给强大的 Agent 危险的建议怎么办?」)。

可执行 Gene冷启动更慢,但提供了真正质量选择和运行时安全所需的基本原语。投入前置于编译、沙箱和评估基础设施——但一旦就位,生态可以在没有人工策展的情况下自选择高质量能力。

AI Agent 生态仍处于早期,两条路径都在被探索。清楚的是,「Gene」隐喻——模块化、可转移、可评估的能力——正在胜出。开放的问题是 Gene 由什么构成。答案决定了下游的一切。


安装 Rotifer CLI,体验可执行 Gene:

npm install -g @rotifer/playground
rotifer search --domain "text-processing"
rotifer run grammar-checker --input '{"text": "This are a test"}'

延伸阅读: