LLM 消息截断:问题样例与方案对比
0x01 问题是什么
尾部截断导致 JSON 解析失败,页面把整段消息当成空数组,连截断前的内容也不展示。
例如,gen_ai.input.messages 收到以下内容(合成样例):
text
[{"role":"user","parts":[{"type":"text","content":"请分析这段日志...[truncated 100 chars]1
| 页面现状 | 期望效果 |
|---|---|
| 对话历史为空 | 显示“请分析这段日志”,标注“内容已截断” |
已核验样本的输出可以正常显示,尚未复现输入截断导致输出同时空白。 恢复只利用留存数据,被截掉的尾部无法补回。
0x02 需要覆盖的 Case
以下用简化 JSON 表示解析边界,期望结果尚待库验证。
| Case | 收到的数据 | 期望结果 |
|---|---|---|
| 完整消息 | [{"text":"完整内容"}] | 正常展示 |
| 字符串截断 | [{"text":"保留这段 | 保留“保留这段”,提示截断 |
| 容器未闭合 | [{"text":"完整内容"}, | 保留完整消息,提示截断 |
| 参数值缺失 | [{"arguments":{"count": | 标注参数不完整,可查看原文 |
| 一般格式错误 | [{oops | 展示原文和解析异常提示 |
0x03 业界已有方案
| 方案 | 环境 | 处理方式 | 适用性 |
|---|---|---|---|
| partial-json | JS / TS | 直接解析不完整 JSON,可配置允许的截断类型 | 前端优先评估,贴合尾部截断场景 |
| jsonrepair | JS / TS | 修复引号、括号、逗号和截断,输出合法 JSON 字符串 | 通用修复候选,需确认修复是否改变原意 |
| jiter | Python | 部分解析,可选择舍弃或保留未结束的字符串 | 适合在后端统一处理 |
0x04 建议
优先用 partial-json 验证上述 Case,仅允许不完整字符串、数组和对象,避免推测补齐数字、布尔值和 null。
text
标准解析成功 → 正常展示
失败且识别到截断 → 移除已识别的尾部标记 → 部分解析 → 展示 + 截断提示
仍然失败 → 原文 + 异常提示1
2
3
2
3
输入、输出独立处理,任一侧异常不影响另一侧展示。选型与开发待验证,业务标识和真实消息内容均不入文档。