如何让大语言模型输出JSON格式

提示词明确要求JSON

这是最直接的方法,直接在提示词中提要求,类似这样:

请描述这张图片,输出用JSON格式

就可以让LLM输出JSON格式

当然,这种方法不是100%让结果是JSON,有时候结果会是Markdown,有时候干脆就不是结构化的文本。

提示词中给出JSON样例

给出JSON样例的好处,是可以让LLM在生成的JSON中使用指定的key name。

例如,提示这么写:

描述这张图片,输出为JSON格式,例如{“desc”: “somebody is dancing”, “character_count”: 3}

产生的结果真的就包含desc和character_count两个key。

这是一个业内公认的方法,但是,在实操过程中,我发现对llama 3.2 vision使用这招产生非JSON输出的概率反而更大了,可能因为『描述图片内容』这个任务不容易让LLM上道输出指定的JSON。

指定结果开头字符为{

前面的方法,有可能结果虽然包含JSON,但是在JSON之前还要加一段废话,为了强制LLM只输出JSON,还有一招,就是在提示词中要求LLM输出以{开头(当然JSON也可以是以[开头),这样更大概率输出的就只有JSON。

上面这些都是在提示词上做文章,除此之外,在模型参数上也可以做一些trick。

调整模型参数

对于OpenAI的API,可以通过调整 logit_bias 来操纵输出token的概率,比如下面的配置,可以增加 {} 字符的输出概率,减少 ''' 的输出概率,从而增大输出为JSON的概率。

1
2
3
4
5
6
7
logit_bias: {
"90": 10, // token ID for "{"
"92": 10, // token ID for "}"
"19317": -10, // token ID for "'''"
"19317": -10, // token ID for "'''"
"74694": -10 // token ID for "```"
}

llama 3.2没有对等的logits_bias参数,但是我试了一下调整 temperature 和 top_p 参数,降低temperature和top_p的值,可以让模型少点『创意思维』,老老实实规规矩矩输出,似乎(我只敢说似乎)能够让模型更大概率遵守提示词以JSON格式输出。

重试