Spring Boot 整合 Spring AI 实现项目接入ChatGPT(OpenAl的调用)
当前各种AI项目层出不穷,但绝大多数都是用python写的,现在Spring开源了Spring AI项目,让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1,支持接入openAI、Ollama、Azure openAI、Huggingface等,可实现聊天、embedding、图片生成、语音转文字、向量数据库、function calling、prompt模板、outputparser、RAG等功能,就像Java版本的langchain,本文通过一些示例简要介绍部分功能。
一、OpenAI简介
OpenAI是一家致力于推动人工智能发展的研究公司,其目标是确保人工智能的益处广泛而均匀地分布。为了实现这一目标,OpenAI开发了一系列强大的API,供开发者在自己的应用中集成AI功能。
OpenAI的API涵盖了自然语言处理、图像识别、机器翻译等多个领域,其中最为著名的可能是GPT系列模型,它们在文本生成、文本理解等方面表现出色。
二、Spring Boot与OpenAI的无缝对接
Spring Boot是一个流行的Java框架,用于快速开发企业级应用。其简洁的配置和丰富的生态使得Spring Boot成为许多开发者的首选。将Spring Boot与OpenAI对接,可以让你的Java应用轻松拥有AI能力。
Spring AI API 涵盖了广泛的功能。每个主要功能都在其专门的部分中进行了详细介绍。为了提供概述,可以使用以下关键功能:
-
跨 AI 提供商的可移植 API,用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉访问模型特定功能。我们支持 OpenAI、Microsoft、Amazon、Google、Huggingface 等公司的 AI 模型。
-
跨 Vector Store 提供商的可移植 API,包括同样可移植的新颖的类似 SQL 的元数据过滤器 API。支持 8 个矢量数据库。
-
函数调用。Spring AI 使 AI 模型可以轻松调用 POJO java.util.Function 对象。
-
AI 模型和向量存储的 Spring Boot 自动配置和启动器。
-
数据工程的 ETL 框架。这为将数据加载到矢量数据库提供了基础,有助于实现检索增强生成模式,使您能够将数据引入 AI 模型以纳入其响应中。
第一步:建项目:创建一个Spring Boot项目(JDK17起步);

第二步:加依赖
2.1 加入spring-ai-openai-spring-boot-starter依赖;
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
2.2 继承父项目:<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
2.3 配置项目依赖下载的仓库:(因为spring ai在中心仓库还没有依赖,所以需要去网站下载)
<repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository>
</repositories>
第三步:配文件(这个的api -key就是你自己的)
-
注册OpenAI账号并获取API密钥
要使用OpenAI的API,首先需要注册一个OpenAI账号,并在Dashboard中获取你的API密钥。这个密钥将用于后续的API调用中,以验证你的身份。
13k star! 获取免费ChatGPT API Key的开源项目,亲测可用!
spring:ai:openai:api-key: (换成你的api-key)base-url: https://api.openai.com(分为代理地址和直连地址)
第四步: 聊天功能写具体的代码实现
4.1 因为所有的接口的父接口都继承与Model,可以看到聊天方式的实现就是注入OpenAiChatModel 因为这个springboot自动装配的功能,只需要注入即可
第一种: 聊天的第一种实现方式(调用call方法,直接传入msg,这个叫做同步API)
public class ChatController {@Resourceprivate OpenAiChatModel openAiChatModel;/*** 聊天的方法。底层调用的openAi的方法* RequestParam 接受参数* msg 就是我们提的问题* @return*/@RequestMapping("/ai/chat")public String chat(@RequestParam("msg") String msg){String called = openAiChatModel.call(msg);return called;}
5.1 运行程序结果

2. 聊天与prompt template
如果使用openai,就注入openAiChatClient,如果使用ollama,就注入ollamaChatClient,然后调用call方法就可以了。
@Autowired
private ChatClient openAiChatClient;
@Autowired
private ChatClient ollamaChatClient;@GetMapping("/ai/simple")
public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {return Map.of("generation", openAiChatClient.call(message));
}
第二种 聊天的程序的第二种实现方式(调用call方法,new一个Prompt对象再传入msg)
/*** 聊天的方法。底层调用的openAi的方法* RequestParam 接受参数* msg 就是我们提的问题* ChatResponse 返回的是一个josn串* chatResponse.getResult().getOutput().getContent();只获取文本* @return*/@RequestMapping("/ai/chat2")public Object chat2(@RequestParam("msg") String msg){ChatResponse chatResponse = openAiChatModel.call(new Prompt(msg));return chatResponse.getResult().getOutput().getContent();}
6.1 运行程序结果

第三种:聊天的程序的第三种实现方式(比上一个方法多了一个关于gpt参数的设置)
/***OpenAiChatOptions.builder() 传入的一个参数,可以控制大模型的设置* @param msg* @return*/@RequestMapping("/ai/chat3")public Object chat3(@RequestParam("msg") String msg){ChatResponse chatResponse = openAiChatModel.call(new Prompt(msg, OpenAiChatOptions.builder()//.withModel("gpt-4-32k") //gpt的版本 ,32K是参数,参数越高,回答问题越准确.withTemperature(0.4F) //温度值,温度越高,回答的准确率越低,温度越低,回答的准确率越高.build()));return chatResponse.getResult().getOutput().getContent();}
7.1 运行程序结果

当然上述的可选参数不仅可以在代码中配置,也可以在配置文件中配置
注意:如果代码中写了关于gpt的参数,配置文件中也配置了参数,那么以代码中为主

第四种:聊天的程序的第三种实现方式(调用stream方法,用法和call一样,只不过返回值不一样,Stream返回的是Fiux,叫做数据的序列一序列的数据,一个一个的数据返回,调用Stream叫做流式API)
/***OpenAiChatOptions.builder() gpt的可选参数* @param msg* @return*/@RequestMapping("/ai/chat4")public Object chat4(@RequestParam("msg") String msg){Flux<ChatResponse> flux = openAiChatModel.stream(new Prompt(msg, OpenAiChatOptions.builder()//.withModel("gpt-4-32k") //gpt的版本 ,32K是参数,参数越高,回答问题越准确.withTemperature(0.4F) //温度值,温度越高,回答的准确率越低,温度越低,回答的准确率越高.build()));return flux.collectList();}
上述就是关于Spring Boot 整合 Spring AI 实现项目接入ChatGPT,本文仅介绍了关于聊天方面的实现方式,接下来的文章介绍关于如何生成图片以及语言的转换。
相关文章:
Spring Boot 整合 Spring AI 实现项目接入ChatGPT(OpenAl的调用)
当前各种AI项目层出不穷,但绝大多数都是用python写的,现在Spring开源了Spring AI项目,让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1,支持接入openAI、Ollama、Azure openAI、Huggingfa…...
react中 useContext 和useReducer的使用
在React中,useContext 和 useReducer 是两个非常有用的Hooks,它们分别用于管理跨组件的状态和复杂的状态逻辑。下面将分别介绍这两个Hooks的使用方式及其结合使用的场景。 1. useContext useContext 允许你订阅React的Context变化。Context提供了一种在…...
Android:动态更新app启动图标和应用名
一、需求背景 每逢重要佳节,很多应用启动图标会自动更新为对应佳节的图标,应用无需更新。 二、效果图 更新后的启动图标和应用名称 三、实现流程 Android app只能替换内置的icon,因此需要提前将logo图标放入App资源文件件里 实际项目App更新…...
深入探讨 ElementUI 动态渲染 el-table
在前端开发中,表格是不可或缺的一部分。无论是数据展示、数据录入,还是数据分析,表格都扮演着重要的角色。而在 Vue.js 生态系统中,ElementUI 提供了一个强大且灵活的表格组件——el-table。本文将带你深入了解如何使用 ElementUI…...
数据炼金术:用Python爬虫精炼信息
标题:数据炼金术:用Python爬虫精炼信息 在数据泛滥的互联网时代,Python爬虫不仅是搜集信息的利器,更是清洗和格式化数据的炼金术。本文将带你走进数据清洗和格式化的世界,展示如何使用Python爬虫从海量网络信息中提取…...
C++第三十八弹---一万六千字使用红黑树封装set和map
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、set/map基本结构 2、红黑树基本结构改造 3、红黑树的迭代器 4、set的模拟实现 5、map的模拟实现 6、完整代码 1、set/map基本结构 在封装…...
★ C++基础篇 ★ vector 类
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…...
原生js用Export2Excel导出excel单级表头和多级表头数据方式实现
原生js用Export2Excel导出excel单级表头和多级表头数据方式实现 原生js用Export2Excel导出excel单级表头和多级表头数据方式实现HTML文件导入需要的文件HTML文件中实现导出函数HTML总代码实现汇总(直接复制代码,注意js引入路径) 原生js用Expo…...
急需翻译PDF文件怎么办?pdf翻译在线快速帮你解决
面对满屏幕密密麻麻的pdf文件,我常常感到头疼! 语言障碍让我在获取信息的道路上踌躇不前,但自从我发现了pdf在线翻译成中文的神奇工具,一切问题似乎都迎刃而解。 这些软件不仅让我能够快速跨过语言壁垒,还让我在学术…...
线程安全的集合类和并发数据结构
在Java中,线程安全的集合类和并发数据结构对于处理多线程环境下的数据共享和同步至关重要。这些集合和数据结构通过不同的机制来确保在多线程环境下数据的一致性和完整性。以下是一些常见的线程安全的集合类和并发数据结构: 线程安全的集合类 Vector 描…...
Linux环境下运行介绍
1. 文件编程函数介绍 如果在Linux系统下学习C语言,就会了解到两套文件编程接口函数: C语言标准的文件编程函数: fopen、fread、fwrite、fclose Linux下提供的文件编程函数: open、read、write、close 传参的区别: 基于文件指针: fopen fclose fread…...
Adobe Media Encoder ME 2023-23.6.6.2 解锁版下载安装教程 (专业的视频和音频编码渲染工具)
前言 Adobe Media Encoder(简称Me)是一款专业的音视频格式转码软件,文件格式转换软件。主要用来对音频和视频文件进行编码转换,支持格式非常多,使用系统预设设置,能更好的导出与相关设备兼容的文件。 一、…...
在go语言里io.EOF怎么理解呢?
Go语言在处理文件和其他I/O流时,会使用io.EOF常量来表示文件结束(End Of File)的情况。 io.EOF是Go标准库中io包定义的一个错误值,用于在读取操作达到文件末尾时返回。它是处理文件读取和I/O操作时常见的错误类型之一。当读取操作…...
日常编码工作与提升式学习两不误
在快速迭代的编程世界中,程序员们不仅需要高效完成日常编码任务,还需不断学习新技术、深化专业知识,以应对日益复杂的项目挑战。然而,如何在繁忙琐碎的编码工作与个人成长之间找到平衡,是不少程序员都面临的一个难题。…...
推荐被Stars5.8k的Java框架RuoYi
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,…...
聊聊适配器模式
目录 适配器模式概念 主要实现方式 主要组成 UML用例图 代码示例 生活场景 应用场景 适配器模式概念 适配器模式属于结构型设计模式,它的主要目的是将一个类的接口转换成客户端所期望的另一种接口形式,使得原本接口不兼容的类可以一起工作。 主…...
韩国服务器的性能如何提升
韩国服务器的性能可以通过硬件升级、网络优化、缓存优化和软件优化来提升。具体方法如下,rak小编为您整理发布韩国服务器的性能如何提升。 1. 硬件升级 CPU升级:选择高性能的多核处理器,可以显著提升计算速度和响应能力。 内存升级࿱…...
体育器材管理系统的设计与实现---附源码 76709
摘 要 本文介绍了一种基于Spring Boot框架的体育器材管理系统,该系统旨在优化学校或教育机构对体育器材的管理流程。通过集成Spring Boot、MySQL、MyBatis以及前端HTML、CSS、JavaScript等技术,实现了器材信息的录入、查询、修改,器材的借用…...
ArcEngine提取面要素公共边的实现方法
1、前言 很久没写ArcEngine的内容了,正好这次有同志提了一个问题:如何用ArcEngine实现批量提取面要素之间的公共边?捣鼓了半天总算是解决了,下面就来说一说解决思路。 2、ArcMap的实现方法 首先准备一份测试数据,如…...
高可用集群keepalived 原理+实战
keepalived 1.高可用集群1.1简介1.2原理1.3 集群类型1.4实现高可用1.5VRRP:Virtual Router Redundancy Protocol1.5.1 VRRP 相关术语1.5.2VRRP 相关技术 2.实验2.1keepalived环境部署2.2抢占模式和非抢占模式2.2.1非抢占模式2.2.2抢占延迟模式 preempt_delay 2.3VIP…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
