SpringAI


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 的运行会受到所使用模型大小的影响:

  1. 例如,运行一个 7 B( 70 亿参数)的模型至少需要 8 GB 的可用内存(RAM),而运行一个 13 B(130 亿参数)的模型需要 16 GB 的内存,33 B(330 亿参数)的模型需要 32 GB 的内存。
  2. 需要考虑有足够的磁盘空间,大模型的文件大小可能比较大,建议至少为 Ollama 和其模型预留 50 GB 的磁空间。
  3. 性能较高的 CPU 可以提供更好的运算速度和效率,多核处理器能够更好地处理并行任务,选择具有足够核心数的 CPU。
  4. 显卡(GPU):Ollama 支持纯 CPU 运行,但如果电脑配备了 NVIDIA GPU,可以利用 GPU 进行加速,提高模型的运行速度和性能。

可以部署 Open WebUI 对 Ollama 的命令行进行改善,推荐使用 Dokcer 部署。

还有 LobeChat 也可以部署使用。


文章作者: 热心市民灰灰
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 热心市民灰灰 !
  目录