Skip to content

LLM 消息截断:问题样例与方案对比 ​

0x01 问题是什么 ​

尾部截断导致 JSON 解析失败,页面把整段消息当成空数组,连截断前的内容也不展示。

例如,gen_ai.input.messages 收到以下内容(合成样例):

text
[{"role":"user","parts":[{"type":"text","content":"请分析这段日志...[truncated 100 chars]
页面现状期望效果
对话历史为空显示“请分析这段日志”,标注“内容已截断”

已核验样本的输出可以正常显示,尚未复现输入截断导致输出同时空白。 恢复只利用留存数据,被截掉的尾部无法补回。

0x02 需要覆盖的 Case ​

以下用简化 JSON 表示解析边界,期望结果尚待库验证。

Case收到的数据期望结果
完整消息[{"text":"完整内容"}]正常展示
字符串截断[{"text":"保留这段保留“保留这段”,提示截断
容器未闭合[{"text":"完整内容"},保留完整消息,提示截断
参数值缺失[{"arguments":{"count":标注参数不完整,可查看原文
一般格式错误[{oops展示原文和解析异常提示

0x03 业界已有方案 ​

方案环境处理方式适用性
partial-jsonJS / TS直接解析不完整 JSON,可配置允许的截断类型前端优先评估,贴合尾部截断场景
jsonrepairJS / TS修复引号、括号、逗号和截断,输出合法 JSON 字符串通用修复候选,需确认修复是否改变原意
jiterPython部分解析,可选择舍弃或保留未结束的字符串适合在后端统一处理

0x04 建议 ​

优先用 partial-json 验证上述 Case,仅允许不完整字符串、数组和对象,避免推测补齐数字、布尔值和 null。

text
标准解析成功 → 正常展示
失败且识别到截断 → 移除已识别的尾部标记 → 部分解析 → 展示 + 截断提示
仍然失败 → 原文 + 异常提示

输入、输出独立处理,任一侧异常不影响另一侧展示。选型与开发待验证,业务标识和真实消息内容均不入文档。