AI框架之Spring AI与Spring Cloud Alibaba AI使用讲解

文章目录

  • 1 AI框架
    • 1.1 Spring AI 简介
    • 1.2 Spring AI 使用
      • 1.2.1 pom.xml
      • 1.2.2 可实现的功能
    • 1.3 Spring Cloud Alibaba AI
    • 1.4 Spring Cloud Alibaba AI 实践操作
      • 1.4.1 pom.xml
      • 1.4.2 配置文件
      • 1.4.3 对接文本模型
      • 1.4.4 文生图模型
      • 1.4.5 语音合成模型

1 AI框架

1.1 Spring AI 简介

在软件开发的世界中,Java一直是企业级应用的主力军。而Spring框架,尤其是Spring Boot,以其生态系统的丰富性,为开发者提供了无与伦比的便利。现在,Spring Boot正迈向一个新的纪元——人工智-能的时代。
Spring AI项目的推出,不仅标志着Spring生态的进一步扩展,也为广大Java开发者开启了一个全新的编程领域。

Spring AI 是从著名的 Python 项目LangChain和LlamaIndex中汲取灵感,它不是这些项目的直接移植,它的成立信念是,下一波生成式人工智能应用程序将不仅适用于 Python 开发人员,而且将在许多编程语言中无处不在。

Spring AI功能,可以看Spring推出的官方文档:https://spring.io/projects/spring-ai
我们可以从Spring AI的官网描述中,总结出Spring AI的几个核心的关键词:

  • 提供抽象能力
  • 简化AI应用的开发
  • 模型与向量支持
  • AI集成与自动配置

Spring AI 简化了我们构建大型复杂的AI应用的过程,当然如果你的项目仅仅是需要调用一个AI接口,那其实直接调用官方SDK反而更方便。

Spring AI提供的功能如下:

  • SQL类过滤器API: 提供类似SQL的元数据过滤器API,实现跨供应商的一致性。
  • Spring Boot集成: 专为Spring Boot设计的自动配置和启动器,让AI集成变得轻而易举。
  • API可移植性,支持所有主要的模型提供商,如OpenAI,Microsoft,Amazon,Google和Huggingface。支持的模型类型包括聊天和文本到图像。
  • 跨 AI 提供商的可移植 API,用于聊天和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能。
  • 将 AI 模型输出映射到 POJO。
  • 支持所有主要的向量数据库,例如 Azure Vector Search、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。
  • 跨 Vector Store 提供程序的可移植 API,包括新颖的类似 SQL 的元数据过滤器 API,该 API 也是可移植的。
  • AI 模型和矢量存储的 Spring Boot stater。
  • 用于数据工程的 ETL 框架

1.2 Spring AI 使用

1.2.1 pom.xml

添加Maven存储库: 在项目的pom.xml中添加Spring MilestoneSnapshot存储库。

<repositories><!-- Spring Milestone Repository for milestones --><repository><id>spring-milestones</id><url>https://repo.spring.io/milestone</url></repository><!-- Spring Snapshot Repository for snapshots --><repository><id>spring-snapshots</id><url>https://repo.spring.io/snapshot</url></repository>
</repositories>

注意:在集成 Spring AI 或其他较新的 Spring 生态系统组件时,添加 Spring MilestoneSnapshot 存储库是为了确保能够访问到最新的开发版本、里程碑版本和快照版本。这些版本可能尚未发布到 Maven Central 这样的稳定仓库,但包含了最新的特性、修复和改进

导入Spring AI BOM: 使用Spring AI BOM定义,可以确保你使用的是测试过的、兼容的库版本。

<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>0.8.1-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

添加AI功能: 根据你的需求,添加相关的AI模块依赖项到pom.xml。

<dependencies><!-- 示例:添加OpenAI的支持 --><dependency><groupId>org.springframework.experimental.ai</groupId><artifactId>spring-ai-openai</artifactId></dependency>
</dependencies>

1.2.2 可实现的功能

可实现的功能:

  • 生成式AI:利用Spring AI,你可以通过简单的API调用,实现文本的生成、翻译、摘要等功能。
  • 矢量数据库:当你需要对文本数据进行语义搜索时,Spring AI提供的矢量数据库支持使得相关操作变得简单高-效。
  • AI绘画:对于需要将文本转换为图像的应用场景,Spring AI的绘画功能可以无缝集成到你的应用中。

1.3 Spring Cloud Alibaba AI

原始的Spring AI并没有国内相关大模型的接入,对国内开发者不太友好。
总的来说,Spring Cloud Alibaba AI 目前基于 Spring AI 0.8.1 版本 API 完成通义系列大模型的接入。

在当前最新版本中,Spring Cloud Alibaba AI 主要完成了几种常见生成式模型的适配,包括对话、文生图、文生语音等,开发者可以使用 Spring Cloud Alibaba AI 开发基于通义的聊天、图片或语音生成 AI 应用,框架还提供 OutParser、Prompt Template、Stuff 等实用能力。
Spring Cloud Alibaba AI 官方还提供了包括聊天对话、文生图、文生语音等多种应用的开发示例,具体可以前往官网查看:https://sca.aliyun.com

1.4 Spring Cloud Alibaba AI 实践操作

首先新建一个Maven项目,JDK选的是17版本。

1.4.1 pom.xml

Maven文件需要引入spring-cloud-alibaba-dependenciesspring-cloud-starter-alibaba-ai两个依赖。

<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2023.0.1.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-ai</artifactId></dependency>
</dependencies>

1.4.2 配置文件

配置阿里云通义千问的Api-Key,没有的读者可以从官网上申请。

server:port: 8080
spring:application:name: alibaba-spring-ai-democloud:ai:tongyi:api-key: 你的api-key

1.4.3 对接文本模型

我们首先测试如何对接文本大模型。
新建一个控制器类:新建/simple接口,用来测试基本QA。

@RestController
@RequestMapping("/ai")
@CrossOrigin
public class TongYiController {@Autowired@Qualifier("tongYiSimpleServiceImpl")private TongYiService tongYiSimpleService;@GetMapping("/simple")public String completion(@RequestParam(value = "message", defaultValue = "AI时代下Java开发者该何去何从?")String message) {return tongYiSimpleService.completion(message);}
}

新建一个TongyiService服务类:

public interface TongYiService {/*** 基本问答*/String completion(String message);/*** 文生图*/ImageResponse genImg(String imgPrompt);/*** 语音合成*/String genAudio(String text);}

具体的实现类如下:由 Spring AI 自动注入 ChatClient、StreamingChatClient,ChatClient 屏蔽底层通义大模型交互细节,后者用于流式调用。

对于QA而言,仅仅通过client.call(prompt)一行代码就可以完成对模型的调用。

@Service
@Slf4j
public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {/*** 自动注入ChatClient、StreamingChatClient,屏蔽模型调用细节*/private final ChatClient chatClient;private final StreamingChatClient streamingChatClient;@Autowiredpublic TongYiSimpleServiceImpl(ChatClient chatClient, StreamingChatClient streamingChatClient) {this.chatClient = chatClient;this.streamingChatClient = streamingChatClient;}/*** 具体实现:*/@Overridepublic String completion(String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatClient.call(prompt).getResult().getOutput().getContent();}
}

我们发送一个请求,prompt是AI时代下Java开发者该何去何从?测试结果如下:
在这里插入图片描述

1.4.4 文生图模型

这里只给出service的代码,其它代码同上面的文本问答。

可以看到,只需要实例化一个imagePrompt,再调用模型即可。

@Slf4j
@Service
public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl {private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);private final ImageClient imageClient;@Autowiredpublic TongYiImagesServiceImpl(ImageClient client) {this.imageClient = client;}@Overridepublic ImageResponse genImg(String imgPrompt) {var prompt = new ImagePrompt(imgPrompt);return imageClient.call(prompt);}
}

测试的prompt是:Painting a boy coding in front of the desk, with his dog.,测试结果如下,效果还是很不错的:
在这里插入图片描述
在这里插入图片描述

1.4.5 语音合成模型

@Slf4j
@Service
public class TongYiAudioSimpleServiceImpl extends AbstractTongYiServiceImpl {private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);private final SpeechClient speechClient;@Autowiredpublic TongYiAudioSimpleServiceImpl(SpeechClient client) {this.speechClient = client;}@Overridepublic String genAudio(String text) {logger.info("gen audio prompt is: {}", text);var resWAV = speechClient.call(text);// save的代码省略,就是将音频保存到本地而已return save(resWAV, SpeechSynthesisAudioFormat.WAV.getValue());}
}

测试结果也是成功的:
在这里插入图片描述

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

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

相关文章

NSSCTF-Web题目5

目录 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 3、思路 [LitCTF 2023]作业管理系统 1、题目 2、知识点 3、思路 [HUBUCTF 2022 新生赛]checkin 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 数据库注入、报错注入 3、思路 首先…

浅谈InoDB中的行级锁

行级锁的类型&#xff1a; Record Lock&#xff0c;记录锁&#xff0c;仅仅把⼀条记录锁上&#xff0c;记录锁分为排他锁和共享锁。Gap Lock&#xff0c;间隙锁&#xff0c;锁定⼀个范围&#xff0c;但是不包含记录本身&#xff0c;只存在于可重复读隔离级别&#xff0c;⽬的是…

Oracle 重置system用户的密码

荆轲刺秦王 如果您忘记了Oracle数据库的密码&#xff0c;可以通过以下步骤来重置密码&#xff1a; Oracle 版本&#xff1a;linux 11g Release 11.2.0.4.0-64bit Froduction 1. 以SYSDBA权限登录到数据库。 conn / as sysdba 2. 停止数据库实例。 shutdown immediate; 3…

vue 文件预览mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml

vue 文件预览 图片、mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml 最近公司要做一个类似电脑文件夹的功能&#xff0c;支持文件夹操作&#xff0c;文件操作,这里就不说文件夹操作了&#xff0c;说说文件预览操作&#xff0c;本人是后端java开发&#xff0c;前端vue&#…

Nginx通过转发代理解决跨域问题

前后端分离开发WEB端&#xff08;浏览器&#xff09;&#xff0c;不可避免的就是要解决跨域问题&#xff0c;因为这是浏览器的一种安全机制&#xff0c;当请求的&#xff08;1&#xff09;域名、&#xff08;2&#xff09;端口、&#xff08;3&#xff09;协议 。其中的一项与源…

MySQL如何多表关联更新

在 MySQL 中,多表关联更新可以使用 UPDATE 语句与 JOIN 子句结合来实现。以下是一个多表关联更新的基本示例: 基本语法 UPDATE table1 JOIN table2 ON table1.column = table2.column SET table1.column = new_value, table2.column = new_value WHERE condition;

Linux系统安装APITable详细流程与远程访问本地平台数据分析

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言 v…

AMD显卡和英伟达显卡哪个好?

显卡是计算机中负责处理图形和视频输出的硬件设备&#xff0c;主要分为两种类型&#xff1a;AMD的A卡和NVIDIA的N卡。那么AMD显卡和英伟达显卡哪个好&#xff1f;怎么选&#xff1f; 答&#xff1a;不能一概而论地说哪个好&#xff0c;因为它们各有优势&#xff0c;选择应基于…

listbox有scrollviewer,点击后不会触发selectionchanged事件

这个问题是因为在ListBox中的ScrollViewer处于焦点状态时&#xff0c;SelectionChanged事件没有触发。这通常是因为ScrollViewer在处理鼠标事件时会优先于ListBox。 为了解决这个问题&#xff0c;可以通过以下方法来确保SelectionChanged事件在ListBox中被触发&#xff1a; 在…

RE_RC4加密

之前做的几道题目&#xff0c;rc4也是经常遇到&#xff0c;今来系统学学&#xff0c;记录一下 对称加密&#xff0c;即加密和解密的密钥可以相互推导&#xff0c;也有的是相同的。 RC4 是以字节流处理每一个字节&#xff0c;而不是 DES 的分组操作。 包含三个参数&#xff1…

探索通信技术的未来:2024中国通信技术和智能装备产业博览会

探索通信技术的未来&#xff1a;2024通信技术产业专场 随着信息技术的飞速发展&#xff0c;通信技术已成为现代社会不可或缺的基础设施。2024年10月11日至13日&#xff0c;青岛将迎来一场通信技术的盛会——2024中国军民两用智能装备与通信技术产业博览会。本次博览会不仅将展…

面试(03)————多线程

目录 一、线程和进程的区别&#xff1f; 二、并行和并发的区别&#xff1f; 三、线程创建的方式有哪些&#xff1f; 3.1、继承Thread类 3.2、实现Runnable接口 3.3、实现Callable接口 3.4、线程池 四、Runnable和Callable的区别&#xff1f; 五、在启动线程的时候&am…

使用packstack快速部署OpenStack

目录 资源列表 基础环境 安装packstack 安装OpenStack 本文记录了基于CentOS操作系统使用packstack快速部署openstack。 资源列表 操作系统配置磁盘IP数量CentOS7.94C8G50G192.168.207.1551 基础环境 服务器开启虚拟化&#xff0c;我这里使用的是VMware虚拟机&#xff0…

Redis教程(二十二):Redis的过期删除和缓存淘汰策略

传送门:Redis教程汇总篇,让你从入门到精通 一、过期删除策略 Redis 中的过期删除策略是与 Redis 管理键的生命周期相关的一系列操作,用于删除过期的Key以释放内存。Redis 提供了三种主要的过期删除策略: 1、惰性删除(Lazy Expiration) 工作原理:当客户端尝试访问一个…

书生·浦语大模型全链路开源体系-笔记作业4

XTuner 微调 LLM:1.8B、多模态、Agent 引自&#xff1a;Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自&#xff1a;欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner &#xff1f; X…

修改缓存供应商--EhCache

除了我们默认的缓存形式simlpe之外, 我们其实还有许多其他种类的缓存供应 Ehcache就是其中的一种形式 Ehcache在SpringBoot当中的使用: 其实跟我们之前整合第三方的资源是一样的形式 1>导入依赖: <!-- 更换缓存, 将默认使用的 Simple 更换为Ehcache--> <depe…

Redis 数据拷贝

一、从db0到db1 将redis数据从db0拷贝到db1&#xff0c;可以使用下面脚本进行复制 REDIS_CLI/usr/local/redis/bin/redis-cli hostredis_host portredis_port passwordredis_password old_base0 new_base1${REDIS_CLI} -h ${host} -p ${port} -a ${password} -n $old_base ke…

【go】windows环境设置goos

场景 本地环境&#xff1a;windows 生产环境&#xff1a;linux 现想在本地将go脚本编译为可执行二进制文件&#xff0c;转移至生产中进行运行测试。但go build不生效。 方案&#xff08;修改GOOS&#xff09; cmd打开命令行&#xff0c;执行go env查看本地go环境&#xff0c…

PPT视频如何16倍速或者加速播放

有两种方式&#xff0c;一种是修改PPT本身&#xff0c;这种方式非常繁琐&#xff0c;不太推荐&#xff0c;还有一种就是修改视频本身&#xff0c;直接让视频是16倍速的视频即可。 如何让视频16倍速&#xff0c;我建议人生苦短&#xff0c;我用Python&#xff0c;几行代码&…

基本元器件 - 电阻

目录 电阻的选型 贴片封装的参数 电阻的阻值 丝印表示方法 标准电阻取值 电阻的失效 0 欧姆电阻的使用 电阻的使用场景 分压电路 分流电路 限流电路 阻抗匹配电路 RC 充放电电路 上下拉电路 其他电路 电阻的选型 一般来说&#xff0c;要考虑以下四个因素&…