SpringAI
Spring AI 是 AI 工程的应用框架。其目标是将 Spring 生态系统的设计原则(如可移植性和模块化设计)应用于 AI 领域,并促进使用 POJO 作为应用程序的构建块到 AI 领域。Spring AI 并不需要我们自己构建 AI 大模型,而是让我们能够对接各种 AI 大模型。
引言
什么是大模型?
大模型,是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能,以应对更加复杂的任务和数据。
简单来说,大模型就是一个特别聪明、特别能干的 “大脑”,这个 “大脑” 由很多个小小的 “神经元” 组成,每个 “神经元” 都能处理一部分信息,当这些 “神经元” 一起工作时,大模型就能理解并回答各种问题,或者完成各种复杂的任务。就像你有一个超级聪明的助手,它能帮你写邮件、写 PPT、回答你的各种问题等等,它就像是一个上知天文,下知地理,无所不知的人。
如何训练大模型?
要训练一个大模型不容易,需要给它提供很多学习材料,就像我们小时候读书学习一样。而且为了让这个 “大脑” 更聪明,还需要很多高级的计算机设备来帮助它学习:
- 高性能的 CPU 和 GPU:多核心和高主频的 CPU 以及支持 CUDA 的 GPU 加速训练过程。
- 大容量存储设备:训练大模型需要存储大量的数据集、模型参数和中间结果。
- 高速网络连接:通过网络连接将训练任务分配到多个计算节点上。
- 深度学习框架:如 TensorFlow、PyTorch 等,这些框架提供了构建和训练模型的工具和库。
- 分布式训练框架:为了加速大模型的训练,可以使用分布式训练框架,如 Horovod、Ray 等。
- 编程语言和工具:Python 是深度学习领域最常用的编程语言。
- 训练大模型非常耗电:高性能计算机和 GPU 进行长时间工作,需要消耗大量电力。
前期准备
调用 gpt 的接口需要购买 api key。在注册了 openai 账号后,先访问 api keys 的页面,然后去创建对应的 key。可以使用 SMS 接码平台来接收短信。(详情查看这篇博客)
接下来,创建带有 Open AI 依赖的 SpringBoot 项目,之后进行配置:
spring:
ai:
openai:
api-key: sk-xxx
base-url: https://xxx
chat:
options:
model: gpt-3.5-turbo
temperature: 0.7
单模态 API
单模态模型专门处理一种类型的数据或输入,例如仅处理文本、图像或语音。单模态模型常用于特定领域的任务,例如文本生成、图像分类或语音识别等。
聊天模型
通过注入 OpenAiChatModel
并调用其 call
方法可以实现用户与 ai 模型的交互功能:
@RestController
@RequestMapping("/openai")
public class ChatController {
@Resource
private OpenAiChatModel openAiChatModel;
/**
* 聊天程序
* @param msg 用户输入的提示词
* @return gpt模型的回复
*/
@GetMapping("/chat")
public String chat(@RequestParam("msg") String msg) {
return openAiChatModel.call(msg);
}
}
当然,通过 Prompt
也可以实现上述效果:
@GetMapping("/chat/prompt")
@Operation(summary = "聊天程序")
public Object chatWithPrompt(@RequestParam("msg") String msg) {
ChatResponse response = openAiChatModel.call(new Prompt(msg));
// 这里的response包含了响应的所有详细数据,我们只需要取出content部分
return response.getResult().getOutput().getContent();
}
在使用 Prompt
时,可以通过 OpenAiChatOptions
来指定参数:
ChatResponse response = chatModel.call(
new Prompt(
msg,
OpenAiChatOptions.builder()
.withModel("gpt-4-32k") // gpt版本,32k是参数量,参数量越大,回复的质量越高
.withTemperature(0.4) // 温度越高,回答的准确率会下降,但创新性会提升
.build()
));
使用流式 API 可以让数据一个一个返回:
@GetMapping("/chat/stream")
@Operation(summary = "聊天程序")
public void chatWithStream(@RequestParam("msg") String msg) {
Flux<ChatResponse> flux = openAiChatModel.stream(new Prompt(msg));
// 遍历打印数据,一个一个数据返回
flux.toStream().forEach(chatResponse ->
System.out.print(chatResponse.getResult().getOutput().getContent())
);
// return flux.collectList();
}
图像模型
通过注入 OpenAiImageModel
并调用其 call
方法可以实现用户与 ai 模型的交互功能:
@RestController
@RequestMapping("/openai/image")
public class ImageController {
@Resource
private OpenAiImageModel openAiImageModel;
/**
* 生成图片
* @param msg 提示词
* @return 图片url地址
*/
@GetMapping
public Object image(@RequestParam("msg") String msg) {
ImageResponse response = openAiImageModel.call(new ImagePrompt(msg));
// 图像url
String url = response.getResult().getOutput().getUrl();
System.out.println(url);
return response.getResult().getOutput();
}
}
同样也可以利用 Options 对象来进行参数配置:
ImageResponse response = openaiImageModel.call(
new ImagePrompt(msg,
OpenAiImageOptions.builder()
.withQuality("hd") // 高清图像
.withN(4) // 生成4张图片
.withHeight(1024) // 图片高度
.withWidth(1024) // 图片宽度
.build())
);
音频模型
通过注入 OpenAiAudioTranscriptionModel
并调用其 call
方法可以实现 ai 模型的音频转文字功能:
@RestController
@RequestMapping("/openai/tran")
public class TranscriptionController {
@Resource
private OpenAiAudioTranscriptionModel openAiAudioTranscriptionModel;
/**
* 音频转文本
* @return 转换后的文本
*/
@GetMapping
public Object transcription() {
// 音频文件
FileSystemResource audioFile = new FileSystemResource("xxx.mp3");
String called = openAiAudioTranscriptionModel.call(audioFile);
System.out.println(called); // called为返回的文本
return called;
}
}
通过注入 OpenAiAudioSpeechModel
并调用其 call
方法可以实现 ai 模型的文字转音频功能:
@RestController
@RequestMapping("/openai/tts")
public class TTSController {
@Resource
private OpenAiAudioSpeechModel openAiAudioSpeechModel;
/**
* 文本转语音
* @param text 输入的文本
* @return OK
*/
@GetMapping
public Object tts(@RequestParam("text") String text) {
// 返回语音字节数组
byte[] bytes = openAiAudioSpeechModel.call(text);
// ...将语音字节数组转换为文件保存即可
return "OK";
}
}
当然,文字转语音也支持流式 API:
// Options参数配置
OpenAiAudioSpeechOptions speechOptions = OpenAiAudioSpeechOptions.builder()
.withVoice(OpenAiAudioApi.SpeechRequest.Voice.ALLOY)
.withSpeed(1.0f)
.withResponseFormat(OpenAiAudioApi.SpeechRequest.AudioResponseFormat.MP3)
.withModel(OpenAiAudioApi.TtsModel.TTS_1.value)
.build();
SpeechPrompt speechPrompt = new SpeechPrompt("测试文本", speechOptions);
Flux<SpeechResponse> responseStream = openAiAudioSpeechModel.stream(speechPrompt);
多模态 API
多模态模型可以同时处理和理解多种类型的数据输入,如文本、图像、音频、视频等。这些模型能够将不同类型的数据进行关联和综合处理。
多模态模型可以用于更复杂的任务,如视觉问答,即根据一张图像回答问题;图像生成(如 DALL-E),根据文本描述生成图像;甚至视频生成、情感分析(结合文本和音频)等。
@RestController
@RequestMapping("/openai/multi")
public class MultiModelController {
@Resource
private OpenAiChatModel openAiChatModel;
/**
* 图像识别
* @param msg 提示词
* @param imageUrl 图像url
* @return
*/
@GetMapping
public Object multi(String msg, String imageUrl) throws MalformedURLException, URISyntaxException {
// 创建多模态信息
UserMessage userMessage = new UserMessage(
msg,
List.of(new Media(MimeTypeUtils.IMAGE_PNG, URL.of(new URI(imageUrl), null)))
);
ChatResponse response = openAiChatModel.call(
new Prompt(
List.of(userMessage),
OpenAiChatOptions.builder().withModel(OpenAiApi.ChatModel.GPT_4_O.getValue()).build()
)
);
return response.getResult().getOutput().getContent();
}
}
大模型工具 Ollama
Ollama 是一个用于部署和运行各种开源大模型的工具,它能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型,如 Llama 2 等,默认 Ollama 会监听 11434 端口。
官网戳我。
说明:Ollama 的运行会受到所使用模型大小的影响:
- 例如,运行一个 7 B( 70 亿参数)的模型至少需要 8 GB 的可用内存(RAM),而运行一个 13 B(130 亿参数)的模型需要 16 GB 的内存,33 B(330 亿参数)的模型需要 32 GB 的内存。
- 需要考虑有足够的磁盘空间,大模型的文件大小可能比较大,建议至少为 Ollama 和其模型预留 50 GB 的磁空间。
- 性能较高的 CPU 可以提供更好的运算速度和效率,多核处理器能够更好地处理并行任务,选择具有足够核心数的 CPU。
- 显卡(GPU):Ollama 支持纯 CPU 运行,但如果电脑配备了 NVIDIA GPU,可以利用 GPU 进行加速,提高模型的运行速度和性能。
可以部署 Open WebUI 对 Ollama 的命令行进行改善,推荐使用 Dokcer 部署。
还有 LobeChat 也可以部署使用。