Spring AI 入门学习指南

 更新时间:2024年11月14日 10:13:44   作者:抱糖果彡  
本文介绍了如何使用SpringAI和Ollama进行AI开发,包括如何配置和使用聊天、图像、语音转文字和文字转语音模型,以及如何在Java项目中集成Ollama模型,感兴趣的朋友一起看看吧

Spring AI 初学

Spring AI 官方地址

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

项目可以查看gitee

Open AI

前期准备

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

apikey 形如 sk-xxxxxxxxxxxxxxxxx

项目创建

Idea 创建 SpringBoot Maven 项目(Spring AI基于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());
    }
    /**
    * 流式返回数据,类似打字效果,一个词一个json数据,整句话多个json数据
    */
    @Test
    public void chat3(){
        String msg = "你好";
        Prompt prompt = new Prompt(msg);
        Flux<ChatResponse> flux = chatModel.stream(prompt);
        flux.toStream().forEach(res -> {
            System.out.println(res.getResult().getOutput().getContent());
        });
    }
}

配置属性

    @Test
    public void test3(){
        String msg = "你是谁";
        //采用 gpt-4-turbo 模型,配置属性创建可以参考 OpenAiChatModel 构造函数
        OpenAiChatOptions options = OpenAiChatOptions.builder()
                .withModel("gpt-4-turbo")
                .build();
        ChatResponse res = chatModel.call(new Prompt(msg, options));
        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 绘画,配置属性模型创建可以参考 OpenAiImageModel 构造函数
        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 语音模型,配置属性创建可以参考 OpenAiAudioTranscriptionModel 构造函数
        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 模型,配置属性创建可以参考 OpenAiAudioSpeechModel 构造函数
        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

安装 ollama

ollama 官网提供了下载地址,可以自己选择版本安装。ollama 主要提供了一些语言模型可以让用户在本地运行模型。

安装运行模型

在 ollama 官网右上角提供下载模型。在模型中选择想本地安装使用的模型,如 谷歌语言模型 gemma,搜索查询。选择要下载的数据集,右边选择复制。

window 端打开 cmd 命令窗口,粘贴刚才复制的命令,回车下载安装。

安装完之后,使用刚才复制的命令,运行 gemma 模型,可以向模型提问。

java 集成 ollama

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

修改项目仓库地址,中央仓库暂时还没 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>

简单用法

SpringBoot 测试类

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class SimpleTest {
    @Resource
    private OllamaChatModel chatModel;
    @Test
    public void test(){
        //使用下载的 gemma:7b 配置模型属性,模型属性创建可以参考 OllamaChatModel 构造函数
        OllamaOptions options = OllamaOptions.create().withModel("gemma:7b");
        Prompt prompt = new Prompt("你好", options);
        //调用聊天模型,获取返回值对象
        ChatResponse res = chatModel.call(prompt);
        //获取 AI 回答字符串
        System.out.println(res.getResult().getOutput().getContent());
    }
    /**
     * 流式返回数据,类似打字效果,一个词一个json数据,整句话多个json数据
     */
    @Test
    public void test2(){
        //使用下载的 gemma:7b 配置模型属性,模型属性配置可以参考 OllamaChatModel 构造函数
        OllamaOptions options = OllamaOptions.create().withModel("gemma:7b");
        Prompt prompt = new Prompt("你好", options);
        Flux<ChatResponse> flux = chatModel.stream(prompt);
        flux.toStream().forEach(res -> {
            System.out.println(res.getResult().getOutput().getContent());
        });
    }
}

模型属性可以查看 org.springframework.ai.autoconfigure.ollama.OllamaChatProperties,也可以在官网查看具体的属性。属性配置也可以在 yml 文件上定义,如 OllamaChatProperties 上的注解,需要以 spring.ai.ollama.chat 开头,如配置 gemma:7b、访问其他服务器的 ollama(安装ollama的服务器环境变量配置增加 OLLAMA_HOST=0.0.0.0:11434):

spring:
  ai:
    ollama:
      base-url: http://192.168.8.16:11434
      chat:
        model: gemma:7b

调用 ollama API

ollama 具体 API 方法可以查看官网

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
public class OllamaApiTest {
    @Test
    public void test() throws Exception{
        CloseableHttpClient client = HttpClients.createDefault();
        //ollama 默认端口是 11434
        HttpPost post = new HttpPost("http://127.0.0.1:11434/api/generate");
        post.addHeader("Content-type","application/json; charset=utf-8");
        //参数
        Map<String, Object> map = new HashMap<>();
        map.put("model","gemma:7b");
        map.put("prompt","你好");
        //不以流式返回
        map.put("stream",false);
        StringEntity stringEntity = new StringEntity(JSONObject.valueToString(map),Charset.forName("UTF-8"));
        post.setEntity(stringEntity);
        CloseableHttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();
        System.out.println(EntityUtils.toString(entity));
    }
}

到此这篇关于Spring AI 入门学习指南的文章就介绍到这了,更多相关Spring AI 初学内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用httpclient无需证书调用https的示例(java调用https)

    使用httpclient无需证书调用https的示例(java调用https)

    这篇文章主要介绍了使用httpclient无需证书调用https的示例(java调用https),需要的朋友可以参考下
    2014-04-04
  • 利用Java截取String字符串的几种常用方法

    利用Java截取String字符串的几种常用方法

    在开发应用中经常会使用到java string,这篇文章主要给大家介绍了关于利用Java截取String字符串的几种常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Java中的抽象类和接口你了解吗

    Java中的抽象类和接口你了解吗

    这篇文章主要为大家详细介绍了Java中的抽象类和接口,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 解决@PathVariable对于特殊字符截断的问题

    解决@PathVariable对于特殊字符截断的问题

    这篇文章主要介绍了解决@PathVariable对于特殊字符截断的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • JAVA回顾:封装,继承,多态

    JAVA回顾:封装,继承,多态

    这篇文章主要介绍了java封装继承多态,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java BeanDefination接口详细讲解

    Java BeanDefination接口详细讲解

    BeanDefinition是spring里面bean的一个建模对象,就相当于class对象是普通java对象的建模对象一样。可能在spring作用的各种业务场景中,class对象并不能完成spring对bean的抽象,所以弄了一个BeanDefinition作为bean的抽象建模对象
    2022-11-11
  • Spring Security 中多个身份验证的示例代码

    Spring Security 中多个身份验证的示例代码

    这篇文章主要介绍了Spring Security 中多个身份验证的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Jmeter连接Mysql数据库实现过程详解

    Jmeter连接Mysql数据库实现过程详解

    这篇文章主要介绍了Jmeter连接Mysql数据库实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • IntelliJ IDEA中折叠所有Java代码,再也不怕大段的代码了

    IntelliJ IDEA中折叠所有Java代码,再也不怕大段的代码了

    今天小编就为大家分享一篇关于IntelliJ IDEA中折叠所有Java代码,再也不怕大段的代码了,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • java项目中classpath指向哪里

    java项目中classpath指向哪里

    这篇文章介绍了java项目中classpath指向哪里及工作原理,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论