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")publicclassChatGPTController{@ResourceprivateOpenAiChatClient openAiChatClient;@GetMapping("/chat1")publicStringchat1(@RequestParam(value ="msg")String msg){String call = openAiChatClient.call(msg);return call;}@GetMapping("/chat2")publicStringchat2(@RequestParam(value ="msg")String msg){ChatResponse call = openAiChatClient.call(newPrompt(msg,OpenAiChatOptions.builder().withModel("gpt-3.5-turbo")// 指定模型 版本.withTemperature(0.5F)// 值越大 准确率约低.build()));return call.getResult().getOutput().getContent();}@GetMapping("/chat3")publicObjectchat3(@RequestParam(value ="msg")String msg){Flux<ChatResponse> stream = openAiChatClient.stream(newPrompt(msg,OpenAiChatOptions.builder().withModel("gpt-3.5-turbo")// 指定模型 版本.withTemperature(0.5F)// 值越大 准确率约低.build()));return stream.collectList();// 数据的序列, 一序列的数据,一个一个的数据返回}}
图片生成
@RestController@RequestMapping("/images")publicclassOpenAIImageController{@ResourceprivateOpenAiImageClient openAiImageClient;@RequestMapping("/image1")privateStringgenerateImage1(@RequestParam(value ="msg")String msg){// 可以通过配置文件来设置参数属性ImageResponse imageResponse = openAiImageClient.call(newImagePrompt(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-01openai:api-key: xx
base-url: xx
image:options:width: xx
height: xx
n: xx
model: xx
音频转文本
@RestController@RequestMapping("/transcription")publicclassTranscriptionController{@ResourceprivateOpenAiAudioTranscriptionClient openAiAudioTranscriptionClient;@GetMapping("/transcribe1")publicObjecttranscribe1(){// 将音频转文字// 这里将资源放在classpath目录下的org.springframework.core.io.Resource audio =newClassPathResource("xxx.flac");String call = openAiAudioTranscriptionClient.call(audio);return call;}}
文本转音频
@RestController@RequestMapping("/tts")publicclassTTSController{@ResourceprivateOpenAiAudioSpeechClient openAiAudioSpeechClient;@GetMapping("/speak")publicStringspeak(){String text ="语音内容";byte[] call = openAiAudioSpeechClient.call(text);writeBytesToFile(call,"output.mp3");return"success";}publicstaticvoidwriteBytesToFile(byte[] byteArray,String filePath){try(BufferedOutputStream bos =newBufferedOutputStream(newFileOutputStream(filePath))){
bos.write(byteArray);System.out.println("字节数组已成功写入文件。");}catch(IOException e){System.out.println("写入文件时出错:"+ e.getMessage());
e.printStackTrace();}}}
识别图片
@RestController@RequestMapping("/multi")publicclassMultiModelController{@ResourceprivateChatClient chatClient;@GetMappingpublicObjectmultiModel(String msg,String imageUrl){// 这里要指定图片类型UserMessage userMessage =newUserMessage(msg,List.of(newMedia(MimeTypeUtils.IMAGE_PNG, imageUrl)));// 这里要指定模型ChatResponse call = chatClient.call(newPrompt(userMessage,OpenAiChatOptions.builder().withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue()).build()));return call.getResult().getOutput().getContent();}}
ollama
@RestController@RequestMapping("/ollama")publicclassOllamaController{@ResourceprivateOllamaChatClient ollamaChatClient;@GetMapping("/chat")publicObjectollama(@RequestParam(value ="msg")String msg){String call = ollamaChatClient.call(msg);System.out.println(call);return call;}@GetMapping("/chat1")publicObjectollama1(@RequestParam(value ="msg")String msg){ChatResponse response = ollamaChatClient.call(newPrompt(
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-01ai:openai:api-key: xxx # 填写自己的 api-keybase-url: https://api.openai.com
本地大模型:
spring:application:name: spring-ai-demo-01ai:ollama:base-url: http://localhost:11434chat:options:model: qwen
本地模型部署
在 ollama 官网进行下载 Ollama ,下载window版即可
下载完成后 就可以选择模型进行部署在本地上 ollama 的官方提供了各类模型部署的命令
如何所示就是正常下载并运行。我这个原来下载过了,如果是第一次执行这条命令,他会自动去下载模型。
默认模型运行端口
localhost:11434
,在配置文件中就可以应用自己本地的模型
配置文件中用本地模型的时候,要注意模型的名称要写完整,不然会报错 500 找不到模型
版权归原作者 @柠 所有, 如有侵权,请联系我们删除。