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

知乎热榜6个月前发布 NIUC!
826 0 0

段小草的回答

如果是使用 GPT API,那么官方是已经专门支持了 JSON 格式输出的:response_format={ "type": "json_object" } 。看一下官方文档[1]

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

使用 Chat Completion 时,可以通过在 system message 中指定要求模型始终返回一个符合用例的 JSON 对象。这种方法通常有效,但有时模型可能会生成无法解析为有效 JSON 对象的内容。

为了避免这些错误并提升模型性能,在使用 gpt-4o、gpt-4-turbo 或 gpt-3.5-turbo 时,可以将 response_format 设置为 { “type”: “json_object” } 以启用 JSON 模式。在 JSON 模式下,模型只能生成能解析为有效 JSON 对象的字符串。

重要提示:

  • 使用 JSON 模式时,一定要通过对话中的某条指令(如system message)明确指示模型生成 JSON。如果没有明确指示生成 JSON,模型可能会生成大量空白字符,导致请求一直运行到达 Token 限制。为防止忘记这一点,如果上下文中没有出现“JSON”这个词,API 将会抛出错误。
  • 如果 finish_reason 为 length,表示生成内容超过了 max_tokens 或对话超出了 Token 限制,此时返回的 JSON 可能不完整(被截断)。为防止这种情况,解析响应前先检查 finish_reason。
  • JSON 模式不能保证输出符合任何特定的模式,但能保证生成的 JSON 是有效的且解析时没有错误。
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo-0125",
  response_format={ "type": "json_object" },
  messages=[
    {"role": "system", "content": "You are a helpful assistant designed to output JSON."},
    {"role": "user", "content": "Who won the world series in 2020?"}
  ]
)
print(response.choices[0].message.content)

这个示例的返回内容中包含一个 JSON 对象,如下所示:

"content": "{\"winner\": \"Los Angeles Dodgers\"}"`

当使用 function calling 功能时,JSON 模式是默认开启的。

参考[2]

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

如果不是直接使用 GPT API,可以看一下官方是否支持类似的格式,否则就是在考验模型的指令遵循能力了,将 JSON 的返回格式要求写在 system message 里,如果结构不太复杂,内容不长的话,0.5B 模型也可以完成不错的指令遵循:

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

再就是,如果使用 JSON 模式,后续大概率是会有相应处理的,可以在解析 JSON 的阶段增加错误处理,再次重复生成不成功的请求。

© 版权声明

相关文章

暂无评论

暂无评论...