使用Springboot+Openai实现一个能够与Ai交互的系统
使用Springboot+Openai实现一个能够与Ai交互的系统
如今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交互功能就实现了,本文章只用作学习交流,不足之处希望不吝指出。
更多推荐
所有评论(0)