领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多OpenAI 最近推出了一项强大的功能,称为结构化输出,该功能确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显著提高了 AI 生成内容在实际应用中的可靠性和可用性。今天,我们很高兴地宣布 Spring AI (1.0.0-SNAPSHOT) 已完全集成支持 OpenAI 的结构化输出,以 Spring 原生方式为 Java 开发人员带来此功能。
下图显示了新的结构化输出功能如何扩展OpenAI Chat API
注意:Spring AI 已经提供了一个强大的与模型无关的结构化输出实用程序,可用于各种 AI 模型,包括 OpenAI。OpenAI 结构化输出功能提供了一种额外的、一致的但特定于模型的解决方案,目前仅适用于
gpt-4o
、gpt-4o-mini
及更高版本模型。
OpenAI 的结构化输出
功能保证 AI 模型将生成符合提供的JSON Schema的响应。这解决了 AI 驱动的应用程序中的一些常见挑战:类型安全:不再担心缺少必需的键或无效的枚举值;显式拒绝:基于安全性的模型拒绝变得可通过编程方式检测;简化的提示:无需使用过于具体的提示即可实现一致的格式。
Spring AI 允许开发人员以最少的配置来利用此功能。让我们探索如何在 Spring 应用程序中使用它。
您可以使用 OpenAiChatOptions builder 以编程方式设置响应格式,如下所示
String jsonSchema = """
{
"type": "object",
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"explanation": { "type": "string" },
"output": { "type": "string" }
},
"required": ["explanation", "output"],
"additionalProperties": false
}
},
"final_answer": { "type": "string" }
},
"required": ["steps", "final_answer"],
"additionalProperties": false
}
""";
Prompt prompt = new Prompt("how can I solve 8x + 7 = -23",
OpenAiChatOptions.builder()
.withModel(ChatModel.GPT_4_O_MINI)
.withResponseFormat(new ResponseFormat(ResponseFormat.Type.JSON_SCHEMA, jsonSchema))
.build());
ChatResponse response = this.openAiChatModel.call(prompt);
注意:您必须遵守 OpenAI JSON Schema 语言格式的子集。
Spring AI 提供了一个方便的BeanOutputConverter实用程序,它可以根据您的领域对象自动生成 JSON 模式并将结构化响应转换为 Java 实例
record MathReasoning(
@JsonProperty(required = true, value = "steps") Steps steps,
@JsonProperty(required = true, value = "final_answer") String finalAnswer) {
record Steps(
@JsonProperty(required = true, value = "items") Items[] items) {
record Items(
@JsonProperty(required = true, value = "explanation") String explanation,
@JsonProperty(required = true, value = "output") String output) {}
}
}
var outputConverter = new BeanOutputConverter<>(MathReasoning.class);
var jsonSchema = outputConverter.getJsonSchema();
Prompt prompt = new Prompt("how can I solve 8x + 7 = -23",
OpenAiChatOptions.builder()
.withModel(ChatModel.GPT_4_O_MINI)
.withResponseFormat(new ResponseFormat(ResponseFormat.Type.JSON_SCHEMA, jsonSchema))
.build());
ChatResponse response = this.openAiChatModel.call(prompt);
String content = response.getResult().getOutput().getContent();
MathReasoning mathReasoning = outputConverter.convert(content);
注意:确保使用@JsonProperty(required = true,…)
注解。这对于生成准确标记字段为必需的模式至关重要。OpenAI 要求结构化响应正确运行。
或者,当使用OpenAI 自动配置时,您可以通过以下聊天应用程序属性配置所需的响应格式
spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-4o-mini
spring.ai.openai.chat.options.response-format.type=JSON_SCHEMA
spring.ai.openai.chat.options.response-format.name=MySchemaName
spring.ai.openai.chat.options.response-format.schema={"type":"object","properties":{"steps":{"type":"array","items":{"type":"object","properties":{"explanation":{"type":"string"},"output":{"type":"string"}},"required":["explanation","output"],"additionalProperties":false}},"final_answer":{"type":"string"}},"required":["steps","final_answer"],"additionalProperties":false}
spring.ai.openai.chat.options.response-format.strict=true
使用结构化输出时,OpenAI 模型有时可能会出于安全原因拒绝执行请求。由于拒绝不一定遵循您在 response_format 中提供的模式,因此 API 响应包含一个名为refusal
的新字段,以指示模型拒绝执行请求。
Spring AI 将此拒绝字段映射到AssistantMessage的元数据。按refusal
键搜索。
我们正在探索将新的 OpenAI 特定结构化输出功能集成到 Spring AI 的与模型无关的结构化输出实用程序集中的可能性。
有关更多信息,请查看 Spring AI 和 OpenAI 参考文档。
Spring AI - 结构化输出 (博客)
Spring AI 博客
Spring AI 对 OpenAI 结构化输出功能的支持使 AI 驱动的应用程序更可靠、更易于开发。通过确保类型安全和一致的结构化格式,开发人员可以专注于构建创新功能,而不是与不可预测的 AI 输出作斗争。
我们可以重点介绍 Spring 开发人员的以下优势
请探索此新功能并分享您的经验。与往常一样,我们欢迎反馈和贡献,以帮助改进 Spring AI 并使其更强大、更易于使用。
随着我们继续增强 Spring AI 与尖端 AI 技术的集成,敬请关注更多更新!