0


超级详细Spring AI+ChatGPT(java接入OpenAI大模型)

Spring AI

对接各种AI大模型(AI工程领域的应用程序框架)

前期准备

**API-Key:**sk-3sfER03LDLG3SDFsdlwe283JSdw023lkrmrHDND32fmREKFD

(格式长这样,这个不可用)

免费使用

  • 🚀申请领取内测免费API Key****
  • 免费版支持gpt-3.5-turbo, embedding, gpt-4。其中gpt-4由于价格过高,每24小时限制10次调用,且不支持流式传输。需要更稳定快速的gpt-4请使用付费版。
  • 转发Host1: https://api.chatanywhere.tech (国内中转,延时更低,host1和host2二选一)
  • 转发Host2: https://api.chatanywhere.com.cn (国内中转,延时更低,host1和host2二选一)
  • 转发Host3: https://api.chatanywhere.cn (国外使用,国内需要全局代理)

创建项目

pom文件配置

<?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.2.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zzq</groupId>
    <artifactId>spring-ai-chat01</artifactId>
    <!--        快照版本-->
    <version>1.0.1-SNAPSHOT</version>
    <name>spring-ai-chat01</name>
    <description>spring-ai-chat01</description>
    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0-SNAPSHOT</spring-ai.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        spring ai-starter依赖 启动依赖-->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
<!--    继承一个父项目spring-ai-bom-->
    <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>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
<!--    配置本项目的maven仓库  因为maven中心仓库还没有更新spring ai的jar包-->
<!--里程碑版本仓库-->
    <!--    <repositories>-->
<!--        <repository>-->
<!--            <id>spring-milestones</id>-->
<!--            <name>Spring Milestones</name>-->
<!--            <url>https://repo.spring.io/milestone</url>-->
<!--            <snapshots>-->
<!--                <enabled>false</enabled>-->
<!--            </snapshots>-->
<!--        </repository>-->
<!--    </repositories>-->

<!--    快照版本-->
    <repositories>
        <repository>
            <id>spring-snapshot</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
</project>

配置application文件

文件内容:

spring:
  application:
     name:spring-ai-01-chat
  ai:
    openai:
     api-key: ${OPENAI_API_KEY}
     base-url: ${OPENAI_API_URL}
     chat:
       option:
         #model:gpt-4-32k
         model:gpt-3.5-turbo
         temperature:0.3F

http://t.csdnimg.cn/32fqr小白如何设置openai api key的环境变量

controller文件内容:

生成文字

package com.zzq.controller;
 
import jakarta.annotation.Resource;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
 
@RestController
public class ChatController {
    /**
     * OpenAi自动装配,可以直接注入使用
     */
    @Resource
    private OpenAiChatClient openAiChatClient;
 
    /**
     * 调用OpenAi的接口,call方法为同步的api
     * @param msg 你要问的问题
     * @return
     */
    @RequestMapping("/ai/chat")
    public String chat(@RequestParam("msg") String msg) {
        String called = openAiChatClient.call(msg);
        return called;
    }
 
    /**
     * 调用OpenAi的接口
     * @param msg 你要问的问题
     * @return  Object--json对象
     */
    @RequestMapping ("/ai/chat1")
    public Object chat1(@RequestParam("msg") String msg) {
        ChatResponse response = openAiChatClient.call(new Prompt(msg));
        return response;
//        return response.getResult().getOutput().getContent();//只拿到内容
    }
 
    /**
     * 调用OpenAi的接口
     * @param msg 你要问的问题
     * @return
     */
    @RequestMapping ("/ai/chat3")
    public String chat3(@RequestParam("msg") String msg) {
        //可选参数在yml配置,同时在代码中也配置,那么会以代码为准
        ChatResponse response = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
//                .withModel("gpt-4-32k")//使用的模型,32k是参数量//参数量越高,准确率越高
                .withTemperature(0.3F)//温度越高回答越慢,温度越低回答越快
                .build()));
        return response.getResult().getOutput().getContent();
    }
 
    /**
     * 调用OpenAi的接口 stream是流式的api
     * @param msg 你要问的问题
     * @return
     */
    @RequestMapping ("/ai/chat4")
    public Object chat4(@RequestParam("msg") String msg) {
        //可选参数在yml配置,同时在代码中也配置,那么会以代码为准
        Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
//                .withModel("gpt-3.5")//使用的模型
                .withTemperature(0.3F)//温度越高回答越慢,温度越低回答越快
                .build()));
        flux.toStream().forEach(chatResponse ->{
            System.out.println(chatResponse.getResult().getOutput().getContent());
        });
        return flux.collectList();//数据的序列,一序列的数据,一个一个的数据返回
    }
}
 

spring-ai-02-image

application文件内容(代码配置的会覆盖yml文件中的)

更改可以生成image的api-key

画图模型版本

n:1(生成图片两张)

height:1024(高度)

width:1024(宽度)

quality:hd(高清)

spring:
  application:
     name:spring-ai-02-image
  ai:
    openai:
     api-key: ${OPENAI_API_KEY}
     base-url: ${OPENAI_API_URL}
     image:
        options:
           model:gpt-4-dalle
    

controller内容:

生成图片

图片无法使用流式api

package com.zzq.controller;
import jakarta.annotation.Resource;
import org.springframework.ai.image.ImageOptionsBuilder;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.openai.OpenAiImageClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ImageController {
    @Resource
    private OpenAiImageClient openAiImageClient;

    @RequestMapping("/ai/image")
    private Object image(@RequestParam(value="msg")String msg){
        ImageResponse imageResponse=openAiImageClient.call(new ImagePrompt(msg));
        System.out.println(imageResonse);
//把图片进行业务处理
        String imageUrl=return response.getResult().getOutput().getUrl();

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

  /*  @GetMapping("/ai/draw")
    public String drawImage(@RequestParam(value = "msg") String msg){
        ImageResponse response = openAiImageClient.call(new ImagePrompt(msg,
                ImageOptionsBuilder
                        .builder()
                        .withQuality("hd")//高清图像
                        .withModel("dall-e-3") //绘画模型
                        .withN(1) //生成图像的个数
                        .withWidth(1024) //图像宽度 默认值
                        .withHeight(1024) //图像高度 默认值
                        .build()
                )
        );
        //返回结果图片的地址
        return response.getResult().getOutput().getUrl();
*/
    }
}

生成语音

Ai音频转文本

spring-ai-03-transcription

更改可以生成声音的api-key

声音模型版本

application文件内容

spring:
  application:
     name:spring-ai-03-trascription
  ai:
    openai:
     api-key: ${OPENAI_API_KEY}
     base-url: ${OPENAI_API_URL}
    
import jakarta.annotation.Resource;
import org.springframework.ai.openai.OpenAiAudioSpeechClient;
import org.springframework.ai.openai.OpenAiAudioTranscriptionClient;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static com.ysl.utisl.save2File.save2File;

@RestController
public class TranscriptionController {
    @Resource
    private OpenAiudioTranscriptionClient openAiAudioTranscriptionClient;
    @RequestMapping(value="/ai/transcription")
    public Object transcription(){
          org,springframework.core.io.Resourse audioFile = new ClassPathResourse("文件名jfk.mp3")
    String called = openAiAudioTranscriptiomClient.call(audioFile)
    System.out.println(called);
    return called;
}

/*
@RestController
public class TranscriptionController {
    //将音频转文字时使用
    @Resource
    private OpenAiAudioTranscriptionClient transcriptionClient;
    //将文字转语音时使用
    @Resource
    private OpenAiAudioSpeechClient speechClient;

    /**
     * 将音频转文字
     * @return
     */
   /* @RequestMapping("/ai/transcription")
    public Object transcription() {
    //读取的是磁盘的路径
    //FileSystemResource audioFile = new FileSystemResource("C:\\Users\\DELL\\Desktop\\luyin.m4a");
        //读取的是classpath静态资源下的文件
        ClassPathResource audioFile = new ClassPathResource("luyin.m4a");
        String call = transcriptionClient.call(audioFile);
        System.out.println(call);
        return call;
    }

    /**
     * 将文字转音频
     * @return
     */
   /* @RequestMapping("/ai/tts")
    public Object tts() {
        String text = "Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI,并推广使用 POJO 作为 AI 领域应用程序的构建块。 跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能";
        byte[] bytes = speechClient.call(text);
        save2File("C:\\Users\\DELL\\Desktop\\test.mp3",bytes);
        return "OK";
    }
*/
/*

@RequestMapping("/ai/tts")
    public Object tts() {
        String text = "Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI,并推广使用 POJO 作为 AI 领域应用程序的构建块。 跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能";
        byte[] bytes = openAiAudioSpeechClient..call(text);
        FileUtilssave2File("C:\\Users\\DELL\\Desktop\\test.mp3",bytes);
        return "OK";
}
*/

}

Spring Ai---多模态

多模态API

多模态是指模型同时理解和处理来自各种来源信息的能力,包括文本、图像、音频和其他数据格式

多模型大语言(LLM)特征使模型能够结合其他模态(如图像、音频或视频)来处理和生成文本

spring-ai-05-multimodel

package com.zzq.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.ai.chat.messages.Media;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class MultiModelController {
@Resource
    private ChatClient chatClient;
@RequestMapping(value = "/ai/multi")
    public  Object multi(String msg,String imageUrl){
    UserMessage userMessage=new UserMessage(msg,
            List.of(new Media(MimeTypeUtils.IMAGE_PNG,imageUrl))
            );
    ChatResponse response=chatClient.call(new Prompt(List.of(userMessage),
            OpenAiChatOptions.builder()
                    .withModel(OpenAiApi.ChatModel.GPT_4_VISION_PREVIEW.getValue())
                    .build()
            ));
    return response.getResult().getOutput().getContent();
}
}

本文转载自: https://blog.csdn.net/qq_73735007/article/details/139039494
版权归原作者 爱吃java的羊儿 所有, 如有侵权,请联系我们删除。

“超级详细Spring AI+ChatGPT(java接入OpenAI大模型)”的评论:

还没有评论