结构化输出在流式过程中会出现暂时不合法的中间态
别名: 流式非法中间态 · 半截 JSON · partial parse
概念解释
JSON 正往外冒,花括号还没闭合,下游的表单解析器已经按「一份结构」去吃,当场报错,界面红成失败。再过两秒,括号补上,本来会是合法对象。暂时不合法的中间态(illegal intermediate states)指的是:结构化输出在流式过程中必然经过不能被解析器接受的前缀;把前缀当成品送进下游,失败是协议错误,不是模型不会写。
看起来像不像终稿,是给人看的。这里的接收者是解析器和会被解析器绊倒的人。
机制
自回归按 token 长,合法结构按闭合的树长。任意真前缀在闭合前都可能不是合法 JSON、不是可编译代码、不是对齐的表格。流式若把每个前缀广播给同一条「结果」通道,下游没有「还在长」的类型,只能当损坏的成品。人看见红字,会把暂时的语法失败读成任务失败,提前丢弃或改提示,把本会成功的生成切掉。
增量解析、长度前缀、先出 schema 再填值,都是在给中间态一个合法类型。没有类型,中间态只能是错误。
怎么研究
对 JSON / 表格 / 代码三种结构,比较:每个前缀都送进解析器 vs. 仅在闭合或检查点送入 vs. 增量解析器。因变量:误报失败次数、被误报吓停的比例、终稿合法率。自变量:结构深度、是否在 UI 上显示解析错误。
要把「中间态解析失败」和「终稿非法」分开。前者在流式下是期望事件。
边界
纯散文没有解析器,中间态问题弱,只剩给人看的未完成态。用户明确只要看字、不会把半截贴进编译器时,可以显示原文,但不要提供「作为 JSON 插入」的动作。工具调用协议若规定增量事件,应走增量,而不是伪装成一次完整 payload。中止发生在未闭合时,半截结构的归属是下一层问题。
怎么落地
- 结构化结果在闭合前不要进入会解析的通道;过程中给人看的是只读前缀,动作为「等待结构完整」。
- 若要增量消费,使用增量解析器或检查点(每个完整元素),不要用一次性 parse。
- 中间态的红字应标成「尚未闭合」,不要标成「生成失败」。
- 验证:把半截 JSON 送到产品实际的下游。若下游报失败且人据此停掉,中间态被当成了终局。等到闭合再送,同一下游应接受。