当前位置:   article > 正文

SpringAI初入_spring-ai-ollama-spring-boot-starter

spring-ai-ollama-spring-boot-starter

SpringAI 集成AI及本地部署AI

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

项目依赖

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

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4

或者

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4

正对不同模型,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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用上述的依赖的时候,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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

代码内容

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(); // 数据的序列, 一序列的数据,一个一个的数据返回
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
图片生成
@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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
spring:
  application:
    name: spring-ai-demo-01
    openai:
      api-key: xx
      base-url: xx
      image:
        options:
          width: xx
          height: xx
          n: xx
          model: xx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
音频转文本
@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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
文本转音频
@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();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
识别图片
@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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

第一种方式会去使用配置文件中指定的模型,第二种文件使用,代码指定的模型。如果在代码中指定了模型,以代码指定的模型进行调用 .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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

本地大模型:

spring:
  application:
    name: spring-ai-demo-01
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: qwen
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

本地模型部署

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/768506
推荐阅读
相关标签
  

闽ICP备14008679号