在提取自定义 POJO 时,实际上是 JSON,然后会被解析为 POJO。建议在模型配置中启用“JSON 模式”,这样,大语言模型(LLM)将被迫返回有效的 JSON。不然的话,大模型返回的 JSON 字符串可能是格式错误的,如缺少一个引号,或缺少一个括号等等。
注意:
JSON 模式与工具/函数调用是相似的功能,但它们具有不同的 API,且用于不同的目的。
JSON 模式在你始终需要大语言模型以结构化格式(有效的 JSON)返回响应时非常有用。此外,通常不需要状态/记忆,因此与大语言模型的每次交互都是相互独立的。例如,你可能希望从文本中提取信息,比如文本中提到的人员列表,或者将自由形式的产品评论转换为结构化形式,包含诸如 String productName、Sentiment sentiment、List claimedProblems 等字段。
另一方面,当大语言模型(LLM)需要执行某些操作(例如查询数据库、搜索网络、取消用户的预订等)时,工具/函数会很有用。在这种情况下,会向大语言模型(LLM)提供一系列带有预期 JSON 模式的工具,它会自主决定是否调用其中任何工具来满足用户的请求。
此前,函数调用常被用于结构化数据提取,但现在我们有了 JSON 模式功能,它更适合这一用途。
以下是启用 JSON 模式的方法:
对于OpenAI
对于支持结构化输出的较新模型(例如,gpt-4o-mini、gpt-4o-2024-08-06):
OpenAiChatModel.builder()
//...
.supportedCapabilities(RESPONSE_FORMAT_JSON_SCHEMA)
.strictJsonSchema(true)
.build();对于较旧的模型(例如,gpt-3.5-turbo、gpt-4):
OpenAiChatModel.builder()
//...
.responseFormat("json_object")
.build();对于Azure OpenAI:
AzureOpenAiChatModel.builder()
//...
.responseFormat(new ChatCompletionsJsonResponseFormat())
.build();对于Vertex AI Gemini:
VertexAiGeminiChatModel.builder()
//...
.responseMimeType("application/json")
.build();或者通过从 Java 类中指定一个明确的模式:
VertexAiGeminiChatModel.builder()
// ...
.responseSchema(SchemaHelper.fromClass(Person.class))
.build();来自一个 JSON 模式:
VertexAiGeminiChatModel.builder()
// ...
.responseSchema(Schema.builder()...build())
.build();对于谷歌 AI Gemini:
GoogleAiGeminiChatModel.builder()
// ...
.responseFormat(ResponseFormat.JSON)
.build();或者通过从 Java 类中指定一个明确的模式:
GoogleAiGeminiChatModel.builder()
// ...
.responseFormat(ResponseFormat.builder()
.type(JSON)
.jsonSchema(JsonSchemas.jsonSchemaFrom(Person.class).get())
.build())
.build();来自一个 JSON 模式:
GoogleAiGeminiChatModel.builder()
//...
.responseFormat(ResponseFormat.builder()
.type(JSON)
.jsonSchema(JsonSchema.builder()...build())
.build())
.build();对于Mistral AI:
MistralAiChatModel.builder()
//...
.responseFormat(MistralAiResponseFormatType.JSON_OBJECT)
.build();对于Ollama:
OllamaChatModel.builder()
//...
.responseFormat(JSON)
.build();注意:对于其他模型提供商,如果基础模型提供商不支持 JSON 模式,那么使用提示词工程实现 JSON 模式是最佳选择。此外,你还可以尝试降低温度值以获得更高的确定性。