Spring AI 更新:支持OpenAI的结构化输出,增强对JSON响应的支持

news/2024/11/16 19:50:44/文章来源:https://www.cnblogs.com/didispace/p/18351981

就在昨晚,Spring AI发了个比较重要的更新。由于最近OpenAI推出了结构化输出的功能,可确保 AI 生成的响应严格遵守预定义的 JSON 模式。此功能显着提高了人工智能生成内容在现实应用中的可靠性和可用性。Spring AI 紧随其后,现在也可以对OpenAI的结构化输出完美支持了。

下图展示了本次扩展的实现结构,如果对于当前实现还不够满意,需要扩展的可以根据此图来着手理解分析进行下一步扩展工作。

使用样例

通过Spring AI,开发者可以很方便的来构建针对 OpenAI 结构化输出的请求和解析:

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);

通过 OpenAiChatOptions中指定ResponseFormat来让OpenAI返回JSON格式。

Spring AI还提供了BeanOutputConverter来实现将JSON出转换成Java Bean,比如下面这样:

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);

如果你整合了Spring AI针对OpenAI的Spring Boot Starter模块,那么也可以通过下面的方式来自动配置默认的JSON返回格式:

spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-4o-minispring.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

今天的分享就到这里,感谢阅读!码字不易,点赞、关注、收藏支持一下!随便转载,标注下出处链接即可。

如果您学习过程中如遇困难?可以加入我们超高质量的Spring技术交流群,参与交流与讨论,更好的学习与进步!更多Spring Boot教程可以点击直达!,欢迎收藏与转发支持!

欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780752.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CryptoHouse:由 ClickHouse 和 Goldsky 支持的免费区块链分析服务(ClickHouse 博客)

我们很高兴地宣布 CryptoHouse,在 crypto.clickhouse.com 上可访问,这是一个由 ClickHouse 提供支持的免费区块链分析服务。https://crypto.clickhouse.com/现有的公共区块链分析服务通常需要定时、异步查询,而 ClickHouse 提供实时分析,通过即时查询响应来普及访问权限。用…

chatgpt这么火,现在AI搜索引擎有哪些呢?

常用国外的AI搜索引擎:ChatGPT (OpenAI):一个基于自然语言处理的AI助手,能够回答问题、生成文本内容并执行多种语言任务。 Google Bard:Google的AI驱动搜索引擎,集成了自然语言处理技术,旨在提供更加智能和个性化的搜索体验。 Microsoft Bing (AI-Powered):微软将OpenAI…

[python] Python并行计算库Joblib使用指北

Joblib是用于高效并行计算的Python开源库,其提供了简单易用的内存映射和并行计算的工具,以将任务分发到多个工作进程中。Joblib库特别适合用于需要进行重复计算或大规模数据处理的任务。Joblib库的官方仓库见:joblib,官方文档见:joblib-doc。 Jolib库安装代码如下:pip in…

【数据结构】【模板】哈夫曼树

哈夫曼树 定义 带权路径长度:结点的权值乘以结点到跟的距离。 树上所有结点带权路径长度之和最小的二叉树称为哈夫曼树。 性质哈夫曼是满二叉树。 来自维基百科:原序列构成哈夫曼树的所有叶子结点。 离根结点越近,点权越大。 非叶子结点的点权之和就是所有叶子结点的带权路径…

线性筛法

接到主的任务,要求找出来 \([1, n]\) 中的质数。 并被告知 \(n = 10\)。 考虑 \(1\)。 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\…

解决uwsgi -ini uwsgi.ini 重启服务无效果

更新了前端代码,重启服务无效果 具体log日志 your processes number limit is 95696 your memory page size is 4096 bytes *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers ***detected max f…

「代码随想录算法训练营」第三十四天 | 动态规划 part7

198. 打家劫舍题目链接:https://leetcode.cn/problems/house-robber/ 文章讲解:https://programmercarl.com/0198.打家劫舍.html 题目难度:中等 视频讲解:https://www.bilibili.com/video/BV1Te411N7SX 题目状态:有点思路但不全。思路: 这次的dp[i]数组表示在到第i个房间…

洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子

洛谷P2731题解传送锚点摸鱼环节 [USACO3.3] 骑马修栅栏 Riding the Fences 题目背景 Farmer John 每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。 题目描述 John 是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。 John 的农场上…

运用Npcap库实现SYN半开放扫描

Npcap 是一款高性能的网络捕获和数据包分析库,作为 Nmap 项目的一部分,Npcap 可用于捕获、发送和分析网络数据包。本章将介绍如何使用 Npcap 库来实现半开放扫描功能。TCP SYN 半开放扫描是一种常见且广泛使用的端口扫描技术,用于探测目标主机端口的开放状态。由于这种方法并…

js模拟Sleep/Delay

原文链接 https://www.51cto.com/article/767574.html 我的总结 看上去比较好的方式: 1.用递增的setTimeOut。 2.用async/await。 最后结论截图 翻译 搜索 复制