首页 > 其他分享 >Spring AI 调用 openAI大模型案例

Spring AI 调用 openAI大模型案例

时间:2024-10-17 13:51:26浏览次数:11  
标签:return String AI Spring ai openAI spring msg public

Spring AI

学习目标:通过SpringAI对接各种主流大模型,包括聊天问答,语音,图像等操作

开发环境和版本要求:

  1. jdk版本:17.x及以上。
  2. SpringBoot版本要求3.x。
  3. 学习前提条件:有java基础,并且能熟练使用SpringBoot。
  4. 熟悉OpenAI,有OpenAI的API key(淘宝自己买), 也可以使用国内中转(直连)的账号(有的中转地址处理参数有问题),最好支持gpt4.0
  5. 如果使用官方的OpenAI,需要自己会使用魔法(不懂的私聊)

SpringAI理解(理解)

  • 官网地址 https://spring.io/projects/spring-ai#overview

  • SpringAI介绍:下图是SpringAI官网对SpringAI的描述
    上图是官网对SpringAI的描述,翻译中文

    Spring AI是一个人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于人工智能领域,并推广使用POJO作为人工智能领域应用程序的构建块。

    人话理解:通过SpringAI模块,可以使用面向对象的思想帮助我们快速对接主流大模型,也就是调用各种主流大模型api去满足自己的业务需求。

  • SpringAI版本
    ​ 解释:PRE: 即将发布的版本,M2: 里程碑版本,一般在即将发布版本之前,都会有几个里程碑版本。

SpringAI案例(掌握)

环境搭建

  1. 创建springboot项目,如下图:
    在这里插入图片描述

  2. 下一步,选择对应的依赖,如下图:
    在这里插入图片描述

  3. 点击create创建项目

代码实现

  1. pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.3.3</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.cjc</groupId>
        <artifactId>spring-ai-study</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>spring-ai-study</name>
        <description>spring-ai-study</description>
        <url/>
        <properties>
            <java.version>17</java.version>
            <spring-ai.version>1.0.0-M2</spring-ai.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.ai</groupId>
                    <artifactId>spring-ai-bom</artifactId>
                    <version>${spring-ai.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://repo.spring.io/milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    </project>
    
  2. application.yml文件

    spring:
      ai:
        openai:
          api-key: 自己的API key
          base-url: url地址
          chat:
            options:
              temperature: 0.4f
              model: gpt-4-turbo #可配置自己支持的model,默认是4.0
    
  3. controller层实现

    @RestController
    @RequestMapping("/ai")
    public class HelloController {
    
        /**
         * 
         */
        private final ChatClient chatClient;
    
        /**
         * 通过构造方法对chatClient赋值
         * @param chatClientBuilder
         */
        public HelloController(ChatClient.Builder chatClientBuilder) {
            this.chatClient = chatClientBuilder.build();
        }
    
        /**
         * @param userInput :请求参数
         * @return
         */
        @GetMapping("/chat")
        public String hello1(String msg) {
            return this.chatClient.prompt()
                    .user(userInput)
                    .call()
                    .content();
        }
    }
    
  4. 展示结果 浏览器发送请求:http://localhost:8080/ai?userInput=二哈咬人不?

    image-20240913162842471

流式输出

  1. 代码如下:
/**
 * 流式输出,会乱码  produces = "text/html;charset=utf-8"
 * @param msg
 * @return
 */
@GetMapping(value = "/stream",produces = "text/html;charset=utf-8")
public Flux<String> hello2(@RequestParam(value = "msg") String msg) {

    Flux<String> content = this.chatClient.prompt()
            .user(msg)
            .stream()
            .content();
    return content;
}

设定角色

  1. 代码: 方式一:

    // 可以在构造方法中设置
    public HelloController(ChatClient.Builder chatClientBuilder) {
        chatClientBuilder.defaultSystem("现在你的角色是一个科学家,狗是一种海底动物,吃鱼虾长大,不需要呼吸");
        this.chatClient = chatClientBuilder.build();
    }
    
    // 也可以单独写一个bean,然后设置
    

    代码: 方式二:

    @Configuration
    class OpenAiConfig {
    	 /**
         * 通过@Bean管理ChatClient
         * @param builder
         * @return
         */
        @Bean
        public ChatClient chatClient(ChatClient.Builder builder) {
            return builder.defaultSystem("现在你的角色是一个科学家,狗是一种海底动物,吃鱼虾长大,不需要呼吸")
                    .build();
        }
    
    }
    
    /**
    * 通过注解直接注入
    */
    @Autowired
    private ChatClient chatClient;
    
    // 不需要构造方法赋值了。
    /*public HelloController(ChatClient.Builder chatClientBuilder) {
        chatClientBuilder.defaultSystem("现在你的角色是一个科学家,狗是一种海底动物,吃鱼虾长大,不需要呼吸");
        this.chatClient = chatClientBuilder.build();
    }*/
    

ChatModel使用

  1. ChatClient和ChatModel的区别:ChatClient代表的通用的模型客户端,ChatModel代表的是具体的某个类型的模型客户端
  2. 代码:
@Autowired
private ChatModel chatModel;
/**
 * 简单使用
 * @param msg
 * @return
 */
@GetMapping("/h4")
public String hello4(@RequestParam(value = "msg") String msg) {
    return chatModel.call(msg);
}

/**
 * 流式输出
 * @param msg
 * @return
 */
@GetMapping(value = "/h5",produces = "text/html;charset=utf-8")
public Flux<String> hello5(@RequestParam(value = "msg") String msg) {
    Prompt prompt = new Prompt(new UserMessage(msg));
    Flux<ChatResponse> stream = chatModel.stream(prompt);
    Flux<String> flux = stream.mapNotNull(chatResponse -> chatResponse.getResult().getOutput().getContent());
    return flux;
}

/**
 * 通过chatModel对话,设置多个参数
 * 一般在yml中设置一次就可以了。
 */
@GetMapping("/chatModel")
public String hello3(@RequestParam(value = "msg") String msg){
    ChatResponse response = chatModel.call(
            new Prompt(
                    msg,
                    OpenAiChatOptions.builder()
                           // .withModel("gpt-4-turbo") // 自己指定模型
                           // .withTemperature(0.4f)  // 温度  0-1,值越大,回答的越发散,
                            .build()
            ));
    return response.getResult().getOutput().getContent();
}

文生图

@Autowired
private OpenAiImageModel openaiImageModel;
/**
 * 文生图:
 * 注意: 一定要跟商家确认,买的key是否支持文生图。
 */
@GetMapping("/tti")
public String textToImage(@RequestParam(value = "msg",defaultValue = "狗") String msg){
    ImageResponse response = openaiImageModel.call(
            new ImagePrompt(msg,
                    OpenAiImageOptions.builder()
                            .withQuality("hd") // 清晰懂
                            .withN(1) // 生成图片数量
                            .withHeight(1024)
                           .withWidth(1024).build()
            )

    );

    return response.getResult().getOutput().getUrl();
}

音频转文本

@Autowired
private OpenAiAudioTranscriptionModel openAiAudioTranscriptionModel;
/**
 * 语音转文本
 */
@GetMapping("/transTest")
public String transTest(){

    var transcriptionOptions = OpenAiAudioTranscriptionOptions.builder()
            .withResponseFormat(OpenAiAudioApi.TranscriptResponseFormat.TEXT)
            .withTemperature(0f)  // 温度,直接语音转文本,不瞎吹
            .build();

    var audioFile = new ClassPathResource("长歌行.mp3");  // 类路径下的文件

    AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile, transcriptionOptions);
    AudioTranscriptionResponse response = openAiAudioTranscriptionModel.call(transcriptionRequest);

    String str = response.getResult().getOutput();
    return str;
}

文本转语音

@Autowired
private OpenAiAudioSpeechModel openAiAudioSpeechModel;
/**
 * 文本转语音
 */
@GetMapping("/textToAudio")
public String textToAudio(@RequestParam(value = "msg")String msg){

    var speechOptions = OpenAiAudioSpeechOptions.builder()
            .withResponseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3)  // 输出格式
            .withSpeed(1.0f) // 声音合成语速
            .withVoice(OpenAiAudioApi.SpeechRequest.Voice.ECHO)  // 声音的种类,比如老人,年轻人等
            .withModel(OpenAiAudioApi.TtsModel.TTS_1.value) // 模型
            .build();

    var speechPrompt = new SpeechPrompt(msg, speechOptions);
    SpeechResponse response = openAiAudioSpeechModel.call(speechPrompt);

    OpenAiAudioSpeechResponseMetadata metadata = response.getMetadata();

    byte[] responseAsBytes = response.getResult().getOutput();

    fileToBytes(responseAsBytes,"D:\\WorkSpace\\spring-ai-study\\","xx.mp3");

    return "success";
}

/**
 * 百度搜的工具类,只要byte[]可以转文件就行
 * 将Byte数组转换成文件
 * @param bytes byte数组
 * @param filePath 文件路径  如 D://test/ 最后“/”结尾
 * @param fileName  文件名
 */
public static void fileToBytes(byte[] bytes, String filePath, String fileName) {
    BufferedOutputStream bos = null;
    FileOutputStream fos = null;
    File file = null;
    try {

        file = new File(filePath + fileName);
        if (!file.getParentFile().exists()){
            //文件夹不存在 生成
            file.getParentFile().mkdirs();
        }
        fos = new FileOutputStream(file);
        bos = new BufferedOutputStream(fos);
        bos.write(bytes);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (bos != null) {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

标签:return,String,AI,Spring,ai,openAI,spring,msg,public
From: https://blog.csdn.net/QQ903275718/article/details/142874197

相关文章

  • vue入门案例-基本使用----非常适合初学者。言简意赅,没有废话。附带springboot+vue前后
    Listitemvue1.vue介绍渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的Web前端框架地址:https://cn.vuejs.org/什么是vue?Vue(发音为/vjuː/,类似view)是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明......
  • 【closerAI ComfyUI】电商模特一键换装解决方案来了!细节到位无瑕疵!再加上flux模型加持
    不得了了兄弟们。这应该是电商界的福音,电商模特一键换装解决方案来了!细节到位无瑕疵!再加上flux模型加持,这个工作流不服不行!这期我们主要讨论如何使用stablediffusioncomfyUI制作完美无瑕疵的换装工作流。**这一次我们用到的节点是catVTON节点。CatVTON介绍[CatVTON是......
  • java毕业设计-基于Springboot的小型企业客户关系管理系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:Springboot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能产品管理:集中维护产品信息,包括添加、......
  • 免费插件集-illustrator插件-Ai插件-剪切路径
    文章目录1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结1.介绍本文介绍一款免费插件,加强illustrator使用人员工作效率,实现多路径集合路径剪切功能。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87890501,或者http://www.zhi......
  • 构建高效在线考试平台:Spring Boot与JavaWeb的融合
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现的相关信息成为必然。开发合适的基于JavaWeb技术......
  • Spring Boot驱动的在线考试系统:JavaWeb技术实战
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现的相关信息成为必然。开发合适的基于JavaWeb技术......
  • Spring Boot与图书管理:进销存系统的新发展
    4系统概要设计4.1概述本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示:图4-1系统工作原理图4.2系统结构本系统......
  • Springboot缓存+定时提交优化频繁数据库表修改
    缘起最近在弄一个答题小程序,当用户选择的时候需要把用户选择的选项提交到服务器上,然后整个字段是个json格式的,更新的方法也就是解析json后添加选项进入json中。于是其中就涉及到频繁的数据库修改,因为用户答题速度根据题目不同嘛,所以我就寻思这样频繁的修改,数据量上来速度就会受......
  • 【图书介绍】《Spring+Spring MVC+MyBatis从零开始学(视频教学版)(第3版)》
    本书重点基于版本Spring 6.1.10、Spring MVC 6.1.10、MyBatis 3.5.16。详解SSM框架各组件用法及其整合方法,实战新闻发布管理系统、图书管理系统开发。配套示例源码、PPT课件、教学大纲、习题答案、教学视频。内容简介本书全面讲解使用流行轻量级框架SSM(Spring+Spring......
  • Tailwind CSS:最受欢迎的实用类CSS框架!Github Star达到了惊人的82.5K!
    在前端开发的世界中,随着项目的复杂性增加,如何高效管理样式,快速开发出响应式、美观的界面成为每个开发者关心的问题。TailwindCSS作为一个革命性的实用类(utility-first)CSS框架,以其灵活的样式管理方式赢得了广大开发者的青睐,目前是GitHub上Star数最多的CSS类框架,充分说明了......