2023年,Luca Romagnoli在开发MAGDA——一款多智能体AI原生数字音频工作站时,遇到了一个反直觉的困境:模型明明理解要做什么,输出却像让厨师用Excel写菜谱。

他的团队最初用JSON编排工作流。指令、参数、嵌套条件,全部塞进键值对。3万行代码跑下来,Romeroli在博客里写了一句让同行失眠的话:「JSON开始感觉像是错误的抽象层。」

JSON的暴政:当结构化输出遇上过程逻辑

JSON的暴政:当结构化输出遇上过程逻辑

JSON的优势没人否认。机器可读、模式校验成熟、前后端通吃。问题是,它天生为「状态描述」设计,而非「动作序列」。

想象一个音乐生成场景:模型需要调用鼓机、合成器、效果器,按特定顺序叠加音轨,还要处理条件分支——「如果BPM超过120,切换鼓组」。用JSON表达,你得写嵌套的`if`对象、动作数组、引用ID,人类读不懂,模型也容易在深度嵌套里迷失。

Romagnoli的团队统计过,复杂工作流的JSON输出,模型幻觉率(生成无效结构)显著高于简单场景。不是模型变笨了,是表达媒介在拖后腿。

「我们不是在描述数据,是在编写程序。」这是他的核心洞察。JSON擅长说「这是什么」,但工作流需要说「先做这个,再做那个,如果X则Y」。

DSL的回归:小语法,大约束

DSL的回归:小语法,大约束

解决方案是倒退回更古老的思路:领域专用语言(DSL,Domain-Specific Language)。不是通用编程语言,而是为特定任务设计的微型语法——比如音频工作流专用的指令集。

Romagnoli设计的DSL长这样:一行一个动作,顺序即执行流,条件用缩进或简单标记表达。没有括号地狱,没有引号转义,模型生成时受语法约束,输出即合法代码

关键设计是「语法约束生成」。不是先让模型自由发挥再校验,而是在解码阶段就用上下文无关文法(CFG,Context-Free Grammar)限制token选择。模型每一步只能选语法允许的token,从根本上消灭幻觉。

这有点像给模型戴镣铐跳舞——但镣铐是定制的,舞步反而更自由。Romagnoli的实测数据:同样复杂度的任务,DSL的首次通过率比JSON高40%以上,解析失败导致的重试次数下降过半。

什么时候该换DSL?三条红线

什么时候该换DSL?三条红线

不是所有人都需要扔掉JSON。Romagnoli划了三条分界线:

第一,动作序列长度。如果工作流超过5-6个步骤,JSON的嵌套深度会让模型和人类同时崩溃。DSL的线性结构更耐操。

第二,条件分支密度。一旦`if/else`或循环成为常态,JSON的表达能力就像用螺丝刀撬核桃。DSL可以直接嵌入控制流关键字。

第三,领域稳定性。如果任务边界清晰、变化缓慢(音频制作、数据分析、DevOps流水线),投入设计DSL值得;如果需求每周大变,维护语法规则的成本会反噬收益。

MAGDA属于典型的第三条:DAW的工作流模式几十年没变,只是执行者从人类变成了AI。

被忽视的代价:DSL不是银弹

被忽视的代价:DSL不是银弹

Romagnoli没回避坑。DSL需要额外的基础设施:语法定义、解析器、错误恢复机制、调试工具。团队初期低估了「语法设计」本身的艺术性——太松则约束不足,太紧则模型创造力被掐死。

另一个隐形成本是生态隔离。JSON是通用货币,DSL是内部粮票。与外部系统对接时,往往需要双向转换层,这坨代码没人爱写。

他特别提到一个反模式:把DSL设计得太像自然语言。团队早期尝试过「伪英语」语法,以为对模型更友好,结果生成稳定性反而下降——自然语言的模糊性会渗透到执行层。

最终定稿的DSL刻意保持了「代码感」:动词开头,参数紧跟,拒绝任何可能被误解的弹性表达。

行业镜像:从ReAct到结构化革命的下一站

行业镜像:从ReAct到结构化革命的下一站

Romagnoli的实践踩中了一个更宏大的趋势。2022年ReAct论文(推理+行动)流行时,业界沉迷「让模型像人一样思考」,用自然语言拆解步骤。两年过去,共识在漂移:思考过程可以自由,但行动表达必须受控。

OpenAI的函数调用、Anthropic的Claude工具使用、Google的Gemini结构化输出,本质上都在收紧「行动层」的语法。Romagnoli的DSL是这条路的极端版本——不是预定义函数列表,而是预定义一门微型语言。

一个值得玩味的细节:MAGDA的DSL解析器最终用Rust重写,核心逻辑不到2000行。Romagnoli在文末晒了这个数字,语气带着产品经理特有的那种克制得意。

如果你正在用JSON硬撑一个越来越像程序的工作流,他的问题悬在那里:你确定困住模型的是能力,还是你选的表达方式?