段小草的回答
如果是使用 GPT API,那么官方是已经专门支持了 JSON 格式输出的:response_format={ "type": "json_object" }
。看一下官方文档[1]:
使用 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]:
如果不是直接使用 GPT API,可以看一下官方是否支持类似的格式,否则就是在考验模型的指令遵循能力了,将 JSON 的返回格式要求写在 system message 里,如果结构不太复杂,内容不长的话,0.5B 模型也可以完成不错的指令遵循:
再就是,如果使用 JSON 模式,后续大概率是会有相应处理的,可以在解析 JSON 的阶段增加错误处理,再次重复生成不成功的请求。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...