利用Spring Boot以及Spring AI构建生成式人工智能应用

spring+ai作为行业领导者,通过其强大、灵活的api和先进的功能,为各种行业提供了领先性的解决方案。在本专题中,我们将深入探讨spring+ai在各领域的应用示例,每个案例都将展示spring+ai如何满足特定需求,实现目标,并将这些lessons learned扩展到更广泛的应用。希望这个专题能对你有所启发,更深入地理解和利用spring+ai的无限可能。

Spring框架在软件开发领域已经有超过20年的历史,自Spring Boot 1.0版本发布以来已有10年。现在,无人会质疑,Spring创建了一种独特的风格,使开发者从重复任务中解放出来,专注于提供业务价值。随着时间的推移,Spring的技术深度不断增强,涵盖了广泛的开发领域和技术。另一方面,随着更多的专用解决方案得到尝试,概念的验证被创建,而最终在项目的保护下得到推广,其技术广度不断扩大。

Spring + AI项目是一个实例,根据其参考文档,该项目旨在简化当生成式人工智能层需求被引入应用时的开发过程。开发者再次从重复任务中解放出来,可以直接通过简单的接口与预先训练的模型(包含实际处理算法)进行交互。

通过直接通过Spring AI编程方式与生成式预训练的转换器(GPTs)交互,用户(开发者)不需要拥有广泛的机器学习知识。但作为一名工程师,我强烈认为,即使这些开发者工具可以方便快捷地使用并产生结果,我建议我们需要克制自己,警觉观察察尝试首先理解基本概念。此外,通过遵循这条路径,产出的结果可能会更有价值。

目的

本文介绍了如何将 Spring AI 集成到 Spring Boot 应用,并与 OpenAI 进行编程交互。我们假设设计一般来说是一种最先进的活动。因此,在实验过程中使用的prompt具有教导性,但应用性不大。此处的重点是通讯接口,即 Spring AI API。

实施前

首先要明确自身使用GPT解决方案的理由,除了希望提供更好的质量,节省时间和降低成本。

生产式人工智能据说擅长执行大量耗时的任务,速度更快,效率更高,生成结果。此外,如果这些结果进一步经过经验丰富且智慧的人类验证,获得有用结果的可能性会增加。

接下来,应抵制立即跳入实施的诱惑,至少要花一些时间熟悉一下一般概念。对生成式人工智能概念的深入探索远远超出了本文的范围。然而,出现在交互中的“主要角色”在下面简要描述。

舞台 – 生成式人工智能是人工智能的一部分
输入 – 提供的数据(输入)
输出 – 计算结果(输出)
大型语言模型(LLM)- 根据解释的输入产生输出的微调算法
提示词- 一种最先进的接口,通过它将输入传入模型
提示词模板 – 允许构造结构化参数化提示的组件
令牌 – 算法在内部将输入转换为令牌,然后使用这些令牌来编译结果,并最终从中构造输出
模型的环境窗口 – 模型限制每次调用的令牌数量的阈值(通常,使用的令牌越多,操作就越昂贵)

最后,可以开始实施,但随着实施的进行,建议回顾和优化前两个步骤。

提示词

在本次练习中,我们请求如下:

Write {count = three} reasons why people in {location = Romania} should consider a {job = software architect} job. These reasons need to be short, so they fit on a poster. For instance, "{job} jobs are rewarding."

上面内容代表了提示词模板。按照建议,应作为提示词的一部分提供清晰的主题,清晰的任务含义以及额外的有用信息,以提高结果的准确性。

提示词包含三个参数

count – 希望作为输出的原因数量
job – 感兴趣的领域或工作
location – 工作申请者所在的国家,城镇,地区等

概念验证

在这篇文章中,简单的概念验证目标如下:

将 Spring AI 集成到Spring Boot应用程序并使用它
允许客户端通过应用程序与 Open AI 进行通信
客户端向应用程序发出参数化的HTTP请求
应用程序使用一个提示词来创建输入,发送给 Open AI 并获取输出
应用程序将响应发送给客户端

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

利用Spring Boot以及Spring AI构建生成式人工智能应用图片

项目设置

Java 21
Maven 3.9.2
Spring Boot – v. 3.2.2
Spring AI – v. 0.8.0-SNAPSHOT (仍在开发,实验性)

代码实现

Spring AI 集成

通常,这是一个基本步骤,不一定值得一提。然而,因为 Spring AI 目前以快照形式发布,为了能够集成 Open AI 自动配置依赖,你需要添加一个引用到 Spring 快照仓库。

spring-milestonesSpring Milestoneshttps://repo.spring.io/milestonefalsespring-snapshotsSpring Snapshotshttps://repo.spring.io/snapshotfalse

下一步是添加 spring-ai-openai-spring-boot-starter Maven 依赖项。

org.springframework.aispring-ai-openai-spring-boot-starter0.8.0-SNAPSHOT

Open AI ChatClient 现在是应用程序类路径的一部分。它是用来向 Open AI 发送输入并获取输出的组件。

为了能够连接到AI模型,需要在 application.properties 文件中设置 spring.ai.openai.api-key 属性。

spring.ai.openai.api-key = api-key-value

它的值代表了用户的有效API密钥,用户将通过此密钥进行通信。通过访问[资源2],可以注册或登录并生成一个。

客户端 – Spring Boot应用程序通信

概念验证的第一部分是客户端应用程序(例如浏览器,curl等)与开发的应用程序之间的通信。这是通过一个 REST 控制器实现的,可以通过HTTP GET请求访问。

URL路径是 /job-reasons,还有之前在定义提示时概述的三个参数,这将导致如下格式:

/job-reasons?count={count}&job={job}&locatinotallow={location}

和相应的控制器:

@RestControllerpublic class OpenAiController { @GetMapping("/job-reasons")public ResponseEntity jobReasons(@RequestParam(value = "count", required = false, defaultValue = "3") int count, @RequestParam("job") String job, @RequestParam("location") String location) {return ResponseEntity.ok().build();}}

由于来自 Open AI 的响应将是一个字符串,因此控制器返回一个封装了字符串的ResponseEntity。如果我们运行应用程序并发出请求,当前响应体部分没有返回任何内容。

客户端 – Open AI 通信

Spring AI 目前主要关注处理语言并产生语言或数字的AI模型。在前一类别中, Open AI 模型的例子包括GPT4-openai或GPT3.5-openai。

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

为了与这些AI模型(实际上是指 Open AI 算法)进行交互, Spring AI 提供了一个统一的接口。

ChatClient接口目前支持文本输入和输出,并具有简单的契约。

@FunctionalInterfacepublic interface ChatClient extends ModelClient {default String call(String message) {Prompt prompt = new Prompt(new UserMessage(message));return call(prompt).getResult().getOutput().getContent();} ChatResponse call(Prompt prompt);}

确实如此,功能接口的实际方法通常是被使用的方法。

在我们的概念验证中,这正是我们所需要的,一种调用 Open AI 并发送目标参数化 Prompt 作为参数的方式。我们定义了以下的OpenAiService,在其中注入了一个 ChatClient 的实例。

@Servicepublic class OpenAiService { private final ChatClient client; public OpenAiService(OpenAiChatClient aiClient) {this.client = aiClient;} public String jobReasons(int count, String domain, String location) {final String promptText = """Write {count} reasons why people in {location} should consider a {job} job.These reasons need to be short, so they fit on a poster.For instance, "{job} jobs are rewarding.""""; final PromptTemplate promptTemplate = new PromptTemplate(promptText);promptTemplate.add("count", count);promptTemplate.add("job", domain);promptTemplate.add("location", location); ChatResponse response = client.call(promptTemplate.create());return response.getResult().getOutput().getContent();}}

如果应用程序正在运行,那么可以从浏览器执行以下请求:

http://localhost:8080/gen-ai/job-reasons?count=3&job=software%20architect&locatinotallow=Romania

这下面的结果被检索出来的结果:

利润丰裕的职业:软件架构师的工作提供了有竞争力的薪酬和出色的增长机会,确保在罗马尼亚的财务稳定和成功。
热门职业:随着技术需求的持续增长,软件架构师在罗马尼亚和全世界都备受追捧,提供了丰富的就业前景和就业保障。
创造性问题解决:软件架构师在设计和开发创新软件解决方案中扮演着至关重要的角色,使他们可以释放他们的创造力,并对各种行业产生重大影响。

这就是我们所期望的——一个简易的接口,通过它,可以要求 Open AI GPT模型写出一些原因,解释为何在特定地点的特定工作具有吸引力。

调整和观察

到目前为止,开发的简单概念验证主要使用了默认的配置。

ChatClient实例可以通过各种属性根据所需需要来配置。虽然这超出了本文的范围,但在这里举两个例子。

spring.ai.openai.chat.options.model 指定要使用的AI模型。默认为’gpt-35-turbo’,但’gpt-4’和’gpt-4-32k’指定的是最新版本。虽然这些版本都是可用的,但你可能无法使用按使用量付费的计划来访问这些版本,但 Open AI 网站上有更多的信息可以帮助你了解如何适应它。

另一个值得一提的属性是 spring.ai.openai.chat.options.temperature。根据参考文档,采样温度控制了“回应的创新性”。据说,较高的值会让输出“更随机”,而较低的值会“更专注和决定性”。默认值为0.8,如果我们将其降低到0.3,重启应用并再次使用相同的请求参数询问,下面的结果将被检索出来。

有利可图的职业机会:罗马尼亚的软件架构师工作提供有竞争力的薪水和极好的成长前景,对于寻求财务稳定和职业发展的个人来说,这是一个吸引人的职业选择。
具有挑战性和智能刺激的工作:作为一名软件架构师,你将负责设计和实现复杂的软件系统,解决复杂的技术问题,并与有才华的团队合作。这个角色提供了持续的学习机会和在尖端技术上工作的机会。
高需求和工作保障:随着对技术和数字化转型的依赖增加,各行各业对熟练软件架构师的需求在上升。选择在罗马尼亚的软件架构师工作确保了工作安全和广泛的就业选择,无论是在本地还是国际上。

可以看出,这种情况下的输出更具描述性。

最后一个考虑因素是与获取的输出的结构相关的。拥有将实际接收的有效载荷映射到Java对象(例如,类或记录)的能力将非常方便。截至目前,表示形式是文本形式,实现也是如此。输出解析器可能实现这一点,类似于Spring JDBC的映射结构。

在这个概念验证中,我们使用了一个BeanOutputParser,它允许直接将结果反序列化到Java记录中,如下所示:

public record JobReasons(String job, String location, List reasons) {}

通过将 {format} 作为提示文本的一部分,并将其作为指示提供给 AI 模型。

OpenAiService 方法变为:

public JobReasons formattedJobReasons(int count, String job, String location) {final String promptText = """Write {count} reasons why people in {location} should consider a {job} job.These reasons need to be short, so they fit on a poster.For instance, "{job} jobs are rewarding."{format}"""; BeanOutputParser outputParser = new BeanOutputParser(JobReasons.class); final PromptTemplate promptTemplate = new PromptTemplate(promptText);promptTemplate.add("count", count);promptTemplate.add("job", job);promptTemplate.add("location", location); promptTemplate.add("format", outputParser.getFormat());promptTemplate.setOutputParser(outputParser); final Prompt prompt = promptTemplate.create(); ChatResponse response = client.call(prompt);return outputParser.parse(response.getResult().getOutput().getContent());}

再次调用时,输出如下:

{"job":"software architect","location":"Romania","reasons":["High demand","Competitive salary","Opportunities for growth"]}

格式符合预期,但解释的原因似乎较少,这意味着需要进行额外的调整以达到更好的可用性。然而,从概念验证的角度来看,这是可接受的,因为焦点是形式。

结论

提示设计是任务的重要部分 – 提示越清晰,输入越好,输出的质量也就越高。

使用 Spring AI 与各种聊天模型进行集成非常简单 – 本篇文章展示了一个 Open AI 的集成。

然而,对于 Gen AI 或者几乎任何技术来说,首先至少要熟悉基本概念是非常重要的。然后,尝试理解如何进行通讯的魔法,最后再开始编写“生产”代码。

最后但同样重要的是,建议进一步探索 Spring AI API,以了解实现并随着其不断发展和改进保持最新状态。

以上就是利用Spring Boot以及Spring AI构建生成式人工智能应用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/421128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IGN评B社九大最佳游戏 《上古卷轴4:湮灭重制版》未入围
上一篇 2025年11月7日 09:21:32
参加VSCode线下技术交流活动的经验
下一篇 2025年11月7日 09:23:11

相关推荐

  • mysql索引类型有哪些 mysql创建不同索引的方法对比

    mysql索引类型有哪些 mysql创建不同索引的方法对比mysql索引类型有哪些 mysql创建不同索引的方法对比mysql索引类型有哪些 mysql创建不同索引的方法对比mysql索引类型有哪些 mysql创建不同索引的方法对比

    mysql支持多种索引类型,选择合适的索引类型可提升数据库性能。1.b-tree索引适用于等值、范围查询和排序,是innodb和myisam的默认索引;2.hash索引仅适合等值查询,不支持范围和排序,memory引擎支持显式创建;3.fulltext索引用于文本搜索,适合关键词查找;4.空间索引(…

    2026年9月23日 用户投稿
    000
  • Tableau的AI混合工具如何操作?生成智能数据可视化的实用指南

    Tableau的AI混合工具通过自然语言查询、自动解释和预测模型,降低数据分析门槛,帮助非技术用户快速获取洞察。首先,Ask Data支持用日常语言提问,自动生成可视化图表,显著提升数据探索效率;其次,Explain Data利用机器学习分析异常点,揭示潜在影响因素,将“是什么”转化为“为什么”;再…

    2026年9月23日
    000
  • mysql安装完成如何事件 mysql定时任务设置教程

    mysql安装完成如何事件 mysql定时任务设置教程mysql安装完成如何事件 mysql定时任务设置教程mysql安装完成如何事件 mysql定时任务设置教程mysql安装完成如何事件 mysql定时任务设置教程

    要使用mysql的事件调度器设置定时任务,首先需开启事件调度器,其次创建定时事件,再查看管理事件,最后注意权限与时间格式等问题。具体步骤如下:1. 开启事件调度器:通过命令或配置文件启用;2. 创建事件:使用create event定义执行频率与sql操作;3. 管理事件:可查看、修改或删除已有事件…

    2026年9月23日 用户投稿
    100
  • OpenAI 与微软达成重磅交易:股权结构再变,投资者面临稀释风险

    据《金融时报》披露,OpenAI 近期完成了一系列关键性交易,使其股权架构日趋复杂,同时也加剧了投资者对未来收益前景的担忧。在这些新协议推动下,OpenAI 的估值已飙升至5000亿美元,跃居全球最具价值的未上市企业之列。这一惊人估值的背后,是公司与英伟达和AMD两家芯片巨头达成的数十亿美元合作协议…

    2026年9月23日
    000
  • NS2版《无主之地4》突遭延期!预购将取消

    《无主之地4》现可提前购入,使用金币叠加限时优惠券后,标准版仅需244.5元(共节省 ¥53.5);超级豪华版为457.4元(总计优惠 ¥100.6)。 原计划于10月3日发布的《无主之地4》Nintendo Switch 2版本已确认延期。Gearbox Entertainment最新发布公告称,…

    2026年9月23日
    200
  • 如何在mysql中优化多表JOIN查询

    答案:优化MySQL多表JOIN需创建关联字段索引、提前过滤数据、选择合适JOIN类型与表序、利用EXPLAIN分析执行计划,并定期更新统计信息以提升查询效率。 在MySQL中优化多表JOIN查询,关键在于减少数据扫描量、提升连接效率,并合理利用索引和执行计划。以下是一些实用的优化策略。 1. 确保…

    2026年9月23日
    300
  • WooCommerce 购物车联动:实现赠品自动添加与移除的专业指南

    本文提供了一份关于在 woocommerce 中实现自动赠品系统的全面指南。它解决了在程序化添加产品时常见的 `woocommerce_add_to_cart` 递归问题,并提供了一个使用自定义购物车项元数据来管理关联赠品的健壮解决方案,确保赠品能与特定主产品同步添加和移除。 引言 在电子商务中,为…

    2026年9月23日
    500
  • MySQL安装需要哪些硬件配置要求?

    MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?MySQL安装需要哪些硬件配置要求?

    mysql的硬件配置需根据应用场景和负载决定,生产环境应重点考虑磁盘i/o、内存、cpu和网络。1. cpu:oltp场景多核心更重要,olap则更依赖主频和缓存;2. 内存:buffer pool越大越好,但需避免过度分配导致swap使用;3. 磁盘i/o:ssd是标配,nvme ssd和raid…

    2026年9月23日 用户投稿
    200
  • 如何在Procreate中使用AI导出图片?保存高质量图像的正确方法

    Procreate无内置AI导出功能,但可通过导出高质量图像(如PSD、TIFF、PNG)供外部AI工具优化;选择格式需根据用途,PSD适合协作,TIFF用于印刷,PNG支持透明背景,JPEG慎用以避免压缩损失;画布应高DPI创建,色彩配置优先sRGB,印刷时后期转CMYK更精准。 ☞☞☞AI 智能…

    2026年9月23日
    100
  • linux如何优雅的关机

    优雅关机的三大法宝:拔电源、shutdown、poweroff 及其对硬件和数据的影响 在讨论关机方法之前,先了解一下机械硬盘的内部结构。 那固态硬盘SSD呢? FTL工作示意图。FTL表对SSD至关重要,如果在FTL写回Flash之前突然断电,内存数据丢失,FTL表也将丢失。因此,高端SSD和服务…

    2026年9月23日
    100
  • PHP自定义函数:创建与使用 prev_id() 函数的实践指南

    本文旨在指导读者如何定义和实现自定义PHP函数,以解决“Call to undefined function”错误。通过 prev_id() 函数的创建示例,详细阐述了函数的基本语法、参数传递、返回值以及在实际应用(如数据库查询)中的集成方法,并提供了关键注意事项,帮助开发者编写模块化、可维护的代码…

    2026年9月23日
    100
  • 四种获取fasta序列长度的方法

    在处理fasta序列时,我们常常需要知道每条序列的长度。今天小编将与大家分享四种获取fasta序列长度的方法。 一、使用awk 以下是使用awk获取fasta序列长度的代码: awk ‘/^>/{if (l!=””) print l; print; l=0; next}{l+=length($…

    2026年9月23日
    200
  • VSCode如何实现代码版本对比 VSCode Git差异对比的高效使用方法

    vscode通过scm视图直接对比工作区与head的差异;2. 点击已暂存文件可查看暂存区与head的差异;3. 通过命令面板、scm历史记录或右键菜单可对比任意版本或文件;4. 差异视图支持并排和内联模式,并提供跳转导航;5. 时间线视图可追溯文件级提交历史并对比各版本;6. gitlens扩展增…

    2026年9月23日
    600
  • mysql索引怎么用 mysql创建索引提高查询性能方法

    mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法

    索引是mysql中提高查询性能的关键工具,它类似于书籍目录,可快速定位数据。创建索引主要使用create index或alter table语句,例如:create index idx_email on users (email); 或 alter table users add index idx…

    2026年9月23日 用户投稿
    100
  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    200
  • 快手极速版官方网页版地址_快手极速版App下载官网首页

    快手极速版官方网页版地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来快手极速版官方网页版地址及App下载相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://www.kuaishou.com/ 1、小步骤内容。进入官网后可直接浏览平台首页推荐内容,涵盖生活记录、才艺展示等多个领域…

    2026年9月23日
    300
  • Flink项目实践 | Flink 单机安装部署

    Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署

    apache flink 是一个用于对无界和有界数据流进行状态计算的框架和分布式处理引擎。flink 设计旨在所有常见集群环境中运行,并以内存速度和任意规模进行计算。 为了深入了解 Flink,首先需要搭建其运行环境。 Flink 可以在所有类似 UNIX 的环境中运行,包括 Linux,Mac O…

    2026年9月23日 用户投稿
    200
  • 如何在AdobeFresco导出AI生成的画作?快速保存图像的教程

    答案:Adobe Fresco支持PNG、JPG、PSD、PDF和MP4等导出格式。PNG适合透明背景和高质量网络展示;JPG适用于小文件、快速分享的有损压缩图像;PSD保留图层与矢量信息,便于在Photoshop中继续编辑;PDF适合打印和跨平台文档共享;MP4用于导出创作延时视频。选择格式时需根…

    2026年9月23日
    100
  • VSCode配置MacOS C环境 详细图解VSCode搭建C++开发

    在mac++os上用vscode配置c/c++环境的关键是安装xcode command line tools以获取clang编译器和lldb调试器,然后安装vscode的c/c++扩展,接着创建项目文件夹和源文件,通过配置tasks.json定义编译任务,确保使用clang编译当前文件并生成可执行…

    2026年9月23日
    100
  • Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit虽无一键AI裁剪,但通过魔棒、智能移动等智能工具辅助选区,结合裁剪功能可高效精准裁剪;关键在于利用颜色识别与对象分离技术提升效率,避免纯手动操作,再通过调整比例、放大细节、善用撤销等功能优化结果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日 用户投稿
    100

发表回复

登录后才能评论
关注微信