SpringAI初入

@柠 2024-06-28 17:31:03 阅读 78

SpringAI 集成AI及本地部署AI

本篇主要简述一下SpringAI 如何来调用AI接口,以及部署本地AI来调用AI接口。

项目依赖

在内部接入AI,需要导入一下依赖

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-openai-spring-boot-starter</artifactId>

</dependency>

或者

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>

</dependency>

正对不同模型,spring ai 提供了不同的依赖jar包,上述给出的示例就是 chat-gpt 和 ollama 两中接口,根据实际使用,选择不同依赖。

例如:

然后本人的pom文件使用的是一个快照版本 pom配置文件如下:

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-bom</artifactId>

<version>1.0.0-SNAPSHOT</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

使用上述的依赖的时候,maven官方还未将上述使用的依赖录入,所以我们这里需要改变一下仓库地址 pom配置文件内容如下

<!--<repositories>-->

<!--<repository>-->

<!--<id>spring-milestones</id>-->

<!--<name>Spring Milestones</name>-->

<!--<url>https://repo.spring.io/milestone</url>-->

<!--</repository>-->

<!--</repositories>-->

<repositories>

<!--这里使用的是快照版本-->

<repository>

<id>spring-snapshot</id>

<name>Spring Snapshot</name>

<url>https://repo.spring.io/snapshot</url>

<releases>

<enabled>false</enabled>

</releases>

</repository>

</repositories>

然后可以写代码调用接口了。

代码内容

chat-gpt

聊天

@RestController

@RequestMapping("/chatgpt")

public class ChatGPTController {

@Resource

private OpenAiChatClient openAiChatClient;

@GetMapping("/chat1")

public String chat1(@RequestParam(value = "msg") String msg) {

String call = openAiChatClient.call(msg);

return call;

}

@GetMapping("/chat2")

public String chat2(@RequestParam(value = "msg") String msg) {

ChatResponse call = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()

.withModel("gpt-3.5-turbo") // 指定模型 版本

.withTemperature(0.5F) // 值越大 准确率约低

.build()));

return call.getResult().getOutput().getContent();

}

@GetMapping("/chat3")

public Object chat3(@RequestParam(value = "msg") String msg) {

Flux<ChatResponse> stream = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()

.withModel("gpt-3.5-turbo") // 指定模型 版本

.withTemperature(0.5F) // 值越大 准确率约低

.build()));

return stream.collectList(); // 数据的序列, 一序列的数据,一个一个的数据返回

}

}

图片生成

@RestController

@RequestMapping("/images")

public class OpenAIImageController {

@Resource

private OpenAiImageClient openAiImageClient;

@RequestMapping("/image1")

private String generateImage1(@RequestParam(value = "msg") String msg) {

// 可以通过配置文件来设置参数属性

ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(msg, OpenAiImageOptions.builder()

.withQuality("hd") // 高清

.withN(4) // 指定生成图片数量

.withHeight(1024) // 指定分辨率

.withWidth(1024)

.build()));

String url = imageResponse.getResult().getOutput().getUrl();

return url;

}

}

spring:

application:

name: spring-ai-demo-01

openai:

api-key: xx

base-url: xx

image:

options:

width: xx

height: xx

n: xx

model: xx

音频转文本

@RestController

@RequestMapping("/transcription")

public class TranscriptionController {

@Resource

private OpenAiAudioTranscriptionClient openAiAudioTranscriptionClient;

@GetMapping("/transcribe1")

public Object transcribe1() {

// 将音频转文字

// 这里将资源放在classpath目录下的

org.springframework.core.io.Resource audio = new ClassPathResource("xxx.flac");

String call = openAiAudioTranscriptionClient.call(audio);

return call;

}

}

文本转音频

@RestController

@RequestMapping("/tts")

public class TTSController {

@Resource

private OpenAiAudioSpeechClient openAiAudioSpeechClient;

@GetMapping("/speak")

public String speak() {

String text = "语音内容";

byte[] call = openAiAudioSpeechClient.call(text);

writeBytesToFile(call, "output.mp3");

return "success";

}

public static void writeBytesToFile(byte[] byteArray, String filePath) {

try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath))) {

bos.write(byteArray);

System.out.println("字节数组已成功写入文件。");

} catch (IOException e) {

System.out.println("写入文件时出错:" + e.getMessage());

e.printStackTrace();

}

}

}

识别图片

@RestController

@RequestMapping("/multi")

public class MultiModelController {

@Resource

private ChatClient chatClient;

@GetMapping

public Object multiModel(String msg, String imageUrl) {

// 这里要指定图片类型

UserMessage userMessage = new UserMessage(msg, List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageUrl)));

// 这里要指定模型

ChatResponse call = chatClient.call(new Prompt(userMessage, OpenAiChatOptions.builder()

.withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue())

.build()));

return call.getResult().getOutput().getContent();

}

}

ollama

@RestController

@RequestMapping("/ollama")

public class OllamaController {

@Resource

private OllamaChatClient ollamaChatClient;

@GetMapping("/chat")

public Object ollama(@RequestParam(value = "msg") String msg){

String call = ollamaChatClient.call(msg);

System.out.println(call);

return call;

}

@GetMapping("/chat1")

public Object ollama1(@RequestParam(value = "msg") String msg){

ChatResponse response = ollamaChatClient.call(

new Prompt(

msg,

OllamaOptions.create()

.withModel("qwen")

.withTemperature(0.4F)

));

System.out.println(response.getResult().getOutput());

return response.getResult().getOutput();

}

}

第一种方式会去使用配置文件中指定的模型,第二种文件使用,代码指定的模型。如果在代码中指定了模型,以代码指定的模型进行调用 .withModel("qwen") .withTemperature(0.4F) 设置问题回答的准确度,值越大准确率下降。还可以设置其他参数,通过代码或者写配置文件的形式进行设置,可自行查看官方文档。Spring AI API :: Spring AI Reference

在使用不同模型,application.yml配置内容也不同

API-KEY

spring:

application:

name: spring-ai-demo-01

ai:

openai:

api-key: xxx # 填写自己的 api-key

base-url: https://api.openai.com

本地大模型:

spring:

application:

name: spring-ai-demo-01

ai:

ollama:

base-url: http://localhost:11434

chat:

options:

model: qwen

本地模型部署

在 ollama 官网进行下载 Ollama ,下载window版即可

下载完成后 就可以选择模型进行部署在本地上 ollama 的官方提供了各类模型部署的命令

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

如何所示就是正常下载并运行。我这个原来下载过了,如果是第一次执行这条命令,他会自动去下载模型

默认模型运行端口localhost:11434,在配置文件中就可以应用自己本地的模型

配置文件中用本地模型的时候,要注意模型的名称要写完整,不然会报错 500 找不到模型



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。