Spring AI 初学

Spring AI 官方地址

”spring 不生产 AI,只是 AI 工具的搬运工“

项目可以查看gitee

Open AI

前期准备

Open AI官方地址,需要使用魔法才能打开,同时购买很麻烦,建议淘宝进行购买,只需要购买 open ai 的 apikey 即可。

apikey 形如 sk-xxxxxxxxxxxxxxxxx

项目创建

Idea 创建 SpringBoot Maven 项目(基于1.0-SNAPSHOT版本,SpringBoot 3.2.6),依赖选择Spring Web、 OpenAI。其他可以自行选择

修改项目仓库地址,中央仓库暂时还没 Spring AI 相关 jar 包。仓库地址改成快照仓库地址,官方说明

    <repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>

项目中找到 pom.xml 文件,将 <spring-ai.version>0.8.1</spring-ai.version> 改为 <spring-ai.version>1.0.0-SNAPSHOT</spring-ai.version>

yaml 配置文件中添加,openai 更多配置可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration。

spring:
ai:
openai:
# 购买的 api-key
api-key: sk-xxxx
# 如果是官方地址,则可以不填,默认为 https://api.openai.com
base-url:

聊天

基础使用

主要类 org.springframework.ai.openai.OpenAiChatModel,快照版本不同,可能名字不一样,可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration 中的聊天类是哪个。

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest
public class ChatTest { @Resource
private OpenAiChatModel chatModel; @Test
public void chat1(){
String msg = "你是谁?";
//返回string数据
String res = chatModel.call(msg);
System.out.println(res);
} @Test
public void chat2(){
String msg = "你是谁?";
//返回对象
ChatResponse res = chatModel.call(new Prompt(msg));
System.out.println(res);
//获取对话返回结果
System.out.println(res.getResult().getOutput().getContent());
} }

配置属性

    @Test
public void test3(){
String msg = "你是谁";
//采用 gpt-4-turbo 模型
ChatResponse res = chatModel.call(new Prompt(msg, OpenAiChatOptions.builder()
.withModel("gpt-4-turbo")
.build()));
System.out.println(res);
//获取对话返回结果
System.out.println(res.getResult().getOutput().getContent());
}

聊天模型配置属性可以查看 org.springframework.ai.autoconfigure.openai.OpenAiChatProperties,也可以在官网查看更详细的信息。配置属性也可以放在 yml 配置文件中,如 OpenAiChatProperties 的注解,需要以 spring.ai.openai.chat 开头,例如将 gpt-4-turbo 配置在配置文件中,就是 OpenAiChatProperties 中 options 中的属性。

spring:
ai:
openai:
chat:
options:
model: gpt-4-turbo

多模型

可以配合图片等让聊天模型进行回答。

    //给图片来进行聊天
@Test
public void test4() {
//获取图片资源
ClassPathResource resource = new ClassPathResource("2024052701.png");
UserMessage userMessage = new UserMessage("说说你看到了什么",
List.of(new Media(MimeTypeUtils.IMAGE_PNG, resource)));
ChatResponse res = chatModel.call(new Prompt(userMessage, OpenAiChatOptions.builder()
.withModel("gpt-4-turbo")
.build()));
System.out.println(res);
//获取回答
System.out.println(res.getResult().getOutput().getContent());
}

图像

基础使用

主要类 org.springframework.ai.openai.OpenAiImageModel,快照版本不同,可能类不一样。可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration 中具体的图像类是哪个。

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageModel;
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest
public class ImageTest { @Resource
private OpenAiImageModel imageModel; @Test
public void test(){
//调用 image 模型的 call 方法获取图片
ImageResponse res = imageModel.call(new ImagePrompt("山水画"));
//AI 绘制的图片路径
String url = res.getResult().getOutput().getUrl();
System.out.println(url);
} }

配置属性

    @Test
public void test2(){
//使用 dall-e-2 绘画
OpenAiImageOptions options = OpenAiImageOptions.builder()
.withModel(OpenAiImageApi.ImageModel.DALL_E_2.getValue())
.build();
ImageResponse res = imageModel.call(new ImagePrompt("山水画", options));
//获取 AI 绘画路径
String url = res.getResult().getOutput().getUrl();
System.out.println(url);
}

图像模型属性配置可以查看 org.springframework.ai.autoconfigure.openai.OpenAiImageProperties,也可以查看官网获取更详细的信息。当然配置属性也可以在 yml 中定义,如 OpenAiImageProperties 上的注解,需要以 spring.ai.openai.image 开头,例如使用 dall-e-2 模型进行绘画

 spring:
ai:
openai:
image:
options:
model: dall-e-2

语音

语音转文字

基础使用

主要类 org.springframework.ai.openai.OpenAiAudioTranscriptionModel,快照版本不同,可能名字不一样,可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration 中的语音转文字翻译类是哪个。

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.ai.openai.OpenAiAudioTranscriptionModel;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.ClassPathResource; @SpringBootTest
public class AudioTest { //语音转文字
@Resource
private OpenAiAudioTranscriptionModel transcriptionModel; @Test
public void testTranscription1(){
String res = transcriptionModel.call(new ClassPathResource("2024052702.mp3"));
System.out.println(res);
} }
配置属性
    @Test
public void testTranscription2(){
//创建模型属性,采用 whisper-1 语音模型
OpenAiAudioTranscriptionOptions options = new OpenAiAudioTranscriptionOptions().builder()
.withModel(OpenAiAudioApi.WhisperModel.WHISPER_1.getValue())
.build();
AudioTranscriptionResponse res = transcriptionModel.call(
new AudioTranscriptionPrompt(new ClassPathResource("2024052702.mp3"), options));
//获取翻译内容
String output = res.getResult().getOutput();
System.out.println(output);
}

语音转文字模型属性可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAudioTranscriptionProperties,也可以在官网查看更详细信息。当然可以在 yml 配置中配置属性,如 OpenAiAudioTranscriptionProperties 上的注解,以 spring.ai.openai.audio.transcription 开头,例如采用 whisper-1 模型

spring:
ai:
openai:
audio:
transcription:
options:
model: whisper-1

文字转语音

基础使用

主要类 org.springframework.ai.openai.OpenAiAudioSpeechModel,快照版本不同,可能名字不一样,可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAutoConfiguration 中的文字转语音类是哪个。

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.ai.openai.OpenAiAudioSpeechModel;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.FileOutputStream;
import java.io.IOException; @SpringBootTest
public class AudioTest2 { @Resource
private OpenAiAudioSpeechModel speechModel; //byte数组转文件
private void byteArrayToFile(byte[] byteArray, String filePath) throws IOException {
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(byteArray);
fos.close();
} @Test
public void testSpeech() throws IOException {
byte[] res = speechModel.call("我爱北京");
byteArrayToFile(res,"D:\\project\\AI\\openai\\speech\\1.mp3");
} }
属性配置
    @Test
public void testSpeech2() throws IOException {
//采用 tts-1-hd 模型
OpenAiAudioSpeechOptions options = new OpenAiAudioSpeechOptions().builder()
.withModel(OpenAiAudioApi.TtsModel.TTS_1_HD.getValue())
.build();
SpeechPrompt prompt = new SpeechPrompt("我爱北京", options);
SpeechResponse res = speechModel.call(prompt);
byte[] bytes = res.getResult().getOutput();
byteArrayToFile(bytes,"D:\\project\\AI\\openai\\speech\\1-hd.mp3");
}

文字转语音模型属性可以查看 org.springframework.ai.autoconfigure.openai.OpenAiAudioSpeechProperties,也可以在官网查看更详细信息。当然可以在 yml 配置中配置属性,如 OpenAiAudioSpeechProperties 上的注解,以 spring.ai.openai.audio.speech 开头,例如采用 tts-1-hd 模型

spring:
ai:
openai:
audio:
speech:
options:
model: tts-1-hd

Ollama

随机推荐

  1. ArcMap分别求取矢量要素各区域的面积

      本文介绍基于ArcMap软件,自动批量计算矢量图层中各个要素的面积的方法.   一次,遇到一个问题,需要分别计算ArcMap软件中一个图层的所有面要素的面积.如图,这个图层中包括多个省级行政区矢量 ...

  2. MySQL组合索引

    MySQL组引合索优化SQL 我的场景 200w左右的数据,后面会更多 使用定时任务爬取数据插入到自己的数据库.要保证数据的唯一性,所以我用了组合唯一索引. 表结构 最初的组合索引 SQL执行和exp ...

  3. javascript现代编程系列教程之七——字符数据类型-字符集-编码解码-常用字符串处理方法(七)

    一.字符集 Unicode:Unicode 是一个字符集(Charset),包含了世界上所有的字符.每个字符在 Unicode 中都有其唯一对应的数字编号,这就是我们常说的 Unicode 码. UT ...

  4. 力扣125(java)-验证回文串(简单)

     题目: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan ...

  5. 力扣372(java)-超级次方(中等)

    题目: 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入:a = 2, b = [3]输出:8示例 2: 输入:a = 2, ...

  6. 新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析

    简介: 作为新型反射类型,目前仍存绕过防御可能性. 阿里云安全近期发现利用STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)服务发起的DDoS反 ...

  7. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

    ​简介:Jenkins 由于其开源特性以及丰富插件能力,长久以来都是中小企业搭建 CICD 流程的首选.不过 Jenkins 存在维护成本高.配置复杂等缺点,云效 Flow 较好地解决了这些问题. 本 ...

  8. [FAQ] Laravel 验证未通过 Route [login] not defined 处理

    一种方式是在路由中定义一个name为 login 的请求. Route::get('xxx', [XxxController::class, 'x'])->name('login'); 第二种方 ...

  9. [FAQ] 腾讯企业邮箱成员的名字如何多次更改 ?

    可以通过给成员的邮箱增加别名,先点击成员信息最右侧的 "编辑",在编辑页面顶部的 "更多操作" 这个按钮中,比较隐蔽. Refer:腾讯邮箱成员名字更改 Lin ...

  10. VisualStudio 如何快速添加一个 Git Tag 推送

    在 VisualStudio 的团队管理功能,提供了方便的添加 Tag 的方法,可以新建一个 Tag 添加 Tag 信息,同时推送某个特定的 Tag 到服务器.配合推 Tag 打包 NuGet 的方法 ...