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

爱吃java的羊儿 2024-07-05 11:01:03 阅读 62

Spring AI

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

前期准备

API-Key:sk-3sfER03LDLG3SDFsdlwe283JSdw023lkrmrHDND32fmREKFD

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

免费使用

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

创建项目

pom文件配置

<code><?xml version="1.0" encoding="UTF-8"?>code>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"code>

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">code>

<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文件

文件内容: 

<code>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){code>

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")code>

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();

}

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。