如何让大模型输出合法的 JSON 格式?
为确保大语言模型(LLM)稳定输出合法的JSON格式,可采用以下方法,结合提示工程、解码约束、后处理和模型优化策略
1.提示工程
通过设计精准的Prompt引导模型输出JSON结构,这是最直接且低成本的方法。
1)通过指令限制模型输出
强制模型仅输出JSON,禁止其他文本。
2)fewshot示例
在Prompt中明确要求输出JSON,并提供完整的示例(包含所有字段和格式符号)。
2.约束解码
在模型生成过程中强制模型遵循json语法,确保输出内容的合法性。
1)动态Token屏蔽
在生成每个Token时,仅允许符合JSON语法的字符。例如:
第一个Token必须是{
字符串需用双引号包裹
Key后必须跟冒号,值后必须跟逗号或}
使用工具
LM-Format-Enforcer:基于JSON Schema动态过滤无效Token。
Outlines:通过语法规则约束生成过程。
2)固定结构插入(比较工程)
预先生成JSON的固定部分(如括号、字段名),仅让模型填充内容,常搭配文本解析工具使用。
3.后处理与验证
1)表达式修正
使用正则表达式修复缺失的引号、逗号等。
2)JSON验证与重试
解析失败时触发模型重试,减少无效输出。
使用工具:strict-json库自动处理重试和局部修正
4.模型微调与工具集成
1)模型微调
上述方法均在现有模型基础上通过prompt优化或者调整解码策略使模型输出json格式,针对于特定场景,可以通过模型微调来让模型自发地学习到特定的pattern
2)框架集成
使用LangChain等框架内置的JSON输出解析器