如今AI大时代涉及到人们的生活,以下是我最近新学到的技术,范围是在java开发过程中通过引入OpenAi通过SpringBoot整合而生成的模型,其中包括关键代码以及设计思路和技术栈,希望能为开发界做出微薄的贡献,那么进入正题吧。

首先,做一个设计理念图方便理解,看图很容易理解首先使用大模型对Ai程序提出需求,由Ai程序调用api使Ai能够组织语言实现智能化并能够回馈给大模型用户端,由fucation-calling接口功能实现Ai实时回复,再次由Ai程序调用api使Ai能够组织语言然后返回给用户端

一、构建web工程使用的技术栈:SpringBoot,OpenAi ,lombok前面这两个是基本Maven骨架。

其中注意的是如果拉起的api不是国内的就要设置一下代理

设置Key:

关键代码示例:

首先我们要用基础大模型来调用SpringAi实现response:

接下来SpringAi要调用APIS对Gpt大模型要回馈prompt:

41.withHeight(256)

42.withWidth(256).build()));

String url = response.getResult().getOutput().getUrl();

System.out.println(url);

return "<img src='"+url+"'/>";

}

@GetMapping(value="/ai/audit2text")

public String audit2text() {

var transcriptionOptions = OpenAiAudioTranscriptionOptions.builder()

.withResponseFormat(OpenAiAudioApi.TranscriptResponseFormat.TEXT)

.withTemperature(0f)

.build();

// flac、mp3、mp4、mpeg、mpga、m4a、ogg、wav 或 webm。

var audioFile = new ClassPathResource("/hello.mp3");

AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptio

nPrompt(audioFile, transcriptionOptions);

AudioTranscriptionResponse response = audioClient.call(transcriptionR

equest);

//openAiAudioApi.createTranscription()

return response.getResult().getOutput();

}

@GetMapping(value="/ai/text2audit")

public String text2audit() {

ResponseEntity<byte[]> speech = openAiAudioApi.createSpeech(

OpenAiAudioApi.SpeechRequest.builder().

withVoice(OpenAiAudioApi.SpeechRequest.Voice.ONYX).

withInput("你好,明天").build());

byte[] body = speech.getBody();

// 将byte[]存为 mp3⽂件

try {

writeByteArrayToMp3(body, System.getProperty("user.dir"));

} catch (IOException e) {

throw new RuntimeException(e);

}

return "ok";

}

public static void writeByteArrayToMp3(byte[] audioBytes, String outputFi

lePath) throws IOException {

// 创建FileOutputStream实例

FileOutputStream fos = new FileOutputStream(outputFilePath+"/xushu.mp

3");

// 将字节数组写⼊⽂件

fos.write(audioBytes);

// 关闭⽂件输出流

fos.close();

}

@GetMapping(value="/ai/mutil")

public String mutilModel(String message,String imgUrl) throws IOExceptio

n {

byte[] imageData = new ClassPathResource("/test.png").getContentAsByt

eArray();

var userMessage = new UserMessage(

"这个图⽚你看出什么?", // content

List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData))); // med

ia

ChatResponse response = chatClient.call(new Prompt(userMessage,

OpenAiChatOptions.builder()

.withModel(OpenAiApi.ChatModel.GPT_4_TURBO_PREVIEW.getVal

ue())

.build()));

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

}

二、到了这一步,一个比较基本的大模型和SpringAi已经做到需求传递,但是一个没有时间概念的Ai无法做到实时回馈给用户,为了解决这个问题可以按照接口传输来设计

1、在发送⽂本时, 同时设置Funcation ; 关键代码:.withFunction("getWaitTime")

2. 当代码执⾏完call时(AI响应之后), 会再调⽤getWaitTime对应的bean的apply⽅法。

3. 并且会把 getWaitTime该bean的Request作为funcation-call的返回参数, 即可在apply⽅法中获取Request

对应的参数

随后Response会再次丢给AI组织语⾔, 进⾏响应达到Ai实时智能的效果

这样一个简单的人与Ai交互功能就实现了,本文章只用作学习交流,不足之处希望不吝指出。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐