微信扫码
添加专属顾问
我要投稿
处理LLM生成的JSON数据时的救星来了!试试json-repair,让结构化输出更可靠。 核心内容: 1. JSON在LLM输出中的优势与常见问题 2. json-repair库的介绍及其功能 3. 使用json-repair自动修复JSON的实践指南
笔者最近在用 Python 开发 AI 相关服务时,就深刻体会到了让 LLM 返回 JSON 的便利。然而,实践中也遇到了一个令人头疼的问题:LLM 本质上是概率模型,即使你在 Prompt 中反复强调、明确要求(比如叮嘱它生成的 JSON 必须能 json.loads
成功解析),它有时还是会输出格式错误的 JSON。常见的翻车情况为:
}
或方括号 ]
\”
),导致解析中断这些问题不仅影响程序解析,还经常导致整个流程中断。起初,我以为只能通过不断调整 Prompt、增加 Retry 机制来曲线救国。但后来读到 Google 出的《Prompt Engineering 白皮书》时,注意到里面提到了一个工具 —— json-repair
,用于自动修复 LLM 输出的非法 JSON!它的出现,大大降低了处理这类 Bad Case 的心智负担和代码复杂度。
于是我对这个库进行了深入研究,并整理了这篇文章,希望能帮到遇到同样困扰的你。
json-repair
json-repair
是一个修复无效 JSON 的 Python 库。
值得一提的是,这是一个相对较新的库。作者在 Readme 中明确提到,开发它的初衷正是为了解决 LLM 返回 JSON 格式不规范的问题——这与我们的需求不谋而合。
库的功能如下:
为了修复损坏的 JSON,json-repair 内部实现了一个基于 BNF的简单解析器。它按照以下语法规则来理解和修复 JSON:
<json> ::= <primitive> | <container>
<primitive> ::= <number> | <string> | <boolean>
; Where:
; <number> is a valid real number expressed in one of a number of given formats
; <string> is a string of valid characters enclosed in quotes
; <boolean> is one of the literal strings 'true', 'false', or 'null' (unquoted)
<container> ::= <object> | <array>
<array> ::= '[' [ <json> *(', ' <json>) ] ']' ; A sequence of JSON values separated by commas
<object> ::= '{' [ <member> *(', ' <member>) ] '}' ; A sequence of 'members'
<member> ::= <string> ': ' <json> ; A pair consisting of a name, and a JSON value
json-repair
使用非常简单,就是一个函数:repair_json
,你可以通过官方提供的 Playground 实验一下 https://mangiucugna.github.io/json_repair/。
这里我们以未转义正确转义双引号的 JSON 为例(LLM 很容易返回这种 JSON 结构):
可以看到,repair_json
函数成功地将未转义的双引号修复为 \"
,使得后续的 json.loads
调用能够顺利进行。请注意:repair_json
返回的仍然是一个字符串,你需要再次使用 json.loads
或类似的库将其转换为 Python 对象。
注意,虽然
json-repair
非常强大,但也不是万能的,如果 JSON 字符串的损坏程度非常高,例如完全丢失了根对象的括号或是结构极其混乱以至于无法推断出原始意图,那就无法修复了,另外json-repair
是一个后处理工具,用于抢救有问题的输出。它不能解决 LLM 产生格式错误JSON的根本原因。最佳实践仍然是结合优秀的 Prompt Engineering 和可能的模型微调,来尽量提高原始输出的质量。
json-repair
的优势在于:它提供了一个通用、健壮且专注于修复的解决方案。它不依赖特定的 Prompt 或模型,而是直接处理输出字符串,尝试将其恢复为标准的、可被 json.loads 等标准库解析的格式。它作为现有流程(Prompt优化、模型选择)的一个补充,提供了一层可靠的保障。
为了验证 json-repair
在实际应用中的效率,我进行了一个简单的 Benchmark 测试。 测试设置:输入 1000 条轻微损坏的 JSON 字符串,模拟常见的 LLM 输出错误,然后测量 json-repair
对于不同类型的 JSON 修复的耗时情况。
从测试结果来看,repair_json
的性能表现非常出色:
repair_json
经过了良好的优化,即使面对复杂的 JSON 破损情况,也能保持高性能。与许多需要正则表达式或复杂解析的解决方案相比,它的性能表现值得肯定。
在开发涉及 LLM 的应用时,强烈建议大家尽可能地让模型输出结构化数据,尤其是 JSON 格式。这不仅能有效降低模型产生幻觉的风险,还能显著提高返回数据的可靠性和下游程序的可操作性。
然而,由于 LLM 的内在机制,即使精心设计了 Prompt,输出的 JSON 仍有一定概率存在瑕疵。因此,在工程实践中,引入像 repair_json
这样的库,对 LLM 的输出进行自动化的健壮性处理,是一个非常务实且高效的做法。
从实际测试和使用来看,repair_json
具有修复成功率高、处理速度快的优点,非常值得在各类需要处理 LLM 输出 JSON 的系统中考虑集成,作为一道可靠的保险。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-27
AI 新闻小助手 100% 纯提示词实践
2025-05-26
驯服 AI 代理:Google研究员提出11 个让它更聪明的提示技巧
2025-05-25
Augment官方:11种提示词技巧,打造更出色的AI编程智能体
2025-05-24
我用Dify把飞书表格的「AI提示词库」打包成了MCP Server给AI使用和管理
2025-05-23
人力资源提示词:培训开班讲话稿
2025-05-21
让 AI 更懂你的需求!一文看懂如何在 Trae IDE 中巧用上下文
2025-05-19
90%的人写不好提示词,都是因为踩了这三个坑!
2025-05-19
智能即压缩。但prompt能力的关键,是敢于啰嗦。
2025-02-01
2024-09-18
2025-01-08
2024-08-23
2024-07-26
2025-01-17
2024-12-26
2024-08-23
2024-07-02
2024-10-17
2025-04-21
2025-03-31
2025-03-29
2025-03-17
2025-02-06
2025-01-10
2024-12-25
2024-11-20