编辑
2024-03-06
后端
00
请注意,本文编写于 643 天前,最后修改于 628 天前,其中某些信息可能已经过时。

目录

Sping AI 初体验
Sping AI
Ollama
支持的功能模型
SpringBoot+Ollama实战
启动Ollama模型
测试
流式访问

简介

最近几年 AI 一直很火,但是在 AI 领域,最火的语言一直是 Python, 但是 Spring 官方的一则爆炸性消息引爆了整个 Java 生态圈。SpringAI 来了,大模型方面不在是 Python 的单一天下了😂。Spring 对于 LLM 大模型姗姗来迟,虽迟但到,好在它来了,以至于不少人已经开始上手体验了。

Sping AI 初体验

image.png

这个 Dan Vega 很多人可能不清楚他,因为我们可能从未注意过 Spring 的作者贡献榜中的名单。这个 Dan Vega 就是 Spring 开发者倡导者中的一员,在 github 上有 2.3K 的关注量,但是国内熟悉他的人真不多。

Sping AI

Spring 官方已经把 Spring AI 已经上架到 Spring Initializr 上,它提供了一种更简洁的方式和 AI 交互,减轻 Java 程序员接入 LLM 模型应用的学习成本,目前在 https://start.spring.io/ 上可以使用并构建。

image.png Spring AI Initializr 是一个工具,它允许开发者快速创建和配置 Spring Boot 项目,以便与人工智能(AI)模型进行交互。这个工具的目的是简化 Java 开发者在业务中接入大型语言模型(LLM)的过程,降低学习成本。

Spring AI 提供了跨 AI 提供商的便携式 API,支持聊天、文本到图像和嵌入模型等功能。它还支持同步和流 API 选项,并允许配置参数以访问特定的模型。

一些支持的聊天模型包括 OpenAI、Azure OpenAI、Amazon Bedrock 等,而文本到图像模型则包括 OpenAI with DALL-E 和 StabilityAI 等。此外,Spring AI 还支持在本地无 GPU 情况下运行 AI 模型,例如通过 Ollama 支持的模型。

开发者可以通过 Spring AI Initializr 创建项目,选择所需的 AI 模型依赖,并在项目中引入相应的依赖。然后,他们可以配置项目以启动和测试 AI 模型,例如通过修改 application.yml 配置文件来设置 Ollama 模型的参数。

Spring AI 的目标是将 Spring 生态系统的设计原则应用于 AI 领域,并推广使用 POJO(Plain Old Java Object)作为 AI 领域应用程序的构建块。这使得开发者可以更容易地将 AI 集成到他们的 Java 应用程序中。

Ollama

在 Spring Initializr 网站上,搜索 AI,就会出现很多与 AI 相关的集成方案。包括热门的 OpenAI 等。

稍微往下翻一翻,就会看到 Ollama 这个项目。

❝ Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them.

我稍微翻译一下,大致意思就是说,SpringAI 支持 Ollama,它允许我们在本地运行各种大型语言模型(LLM),并从中生成文本。

这个 Ollama 就是一个开源的软件框架,它被设计用于在 Docker 容器中部署和管理大型语言模型(LLM)。Ollama 的主要功能是简化在本地运行大型语言模型的过程,使得这一过程变得非常简单。Ollama 通过将模型权重、配置和数据捆绑到一个单一的包中,由 Modelfile 定义,优化了设置和配置细节,包括 GPU 使用。

Ollama 支持 GPU/CPU 混合模式运行,允许用户根据自己的硬件条件(如 GPU、显存、CPU 和内存)选择不同量化版本的大模型。它提供了一种方式,使得即使在没有高性能 GPU 的笔记本电脑上,也能够运行大型模型。

注意上面标记深色的这句话,Ollama 能够让我们在本地运行大语言模型 LLM,而无需高性能 GPU 支持(支持本地无 GPU 情况下运行 AI 模型)。春哥还是一如既往的🐮🍺,Spring AI 让 LLM 成为大家都能够体验大模型的能力的工具。

支持的功能模型

根据官方文档 https://docs.spring.io/spring-ai/reference/getting-started.html 得知,Spring AI 支持众多 Embeddings Models。

image.png

其他的还有语言模型,图像生成模型,向量数据库等等。

image.png

SpringBoot+Ollama实战

首先给出本机环境:

Apple M1 Pro 16G 系统 Ventura 13.6.2

Java 版本 image.png

我们选择https://start.spring.io/进行快速开始。

依赖项我们选择 Ollama,我们选择 Maven 来构建项目。默认选择 Java 17。

Ollama 支持众多模型,比如:gemma、llama2、mistral、mixtral 等等。

image.png

项目配置完成后,参考结构如下。

image.png

pom.xml 配置文件的主要内容如下所示。

xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.example</groupId> <artifactId>SpringAi</artifactId> <version>0.0.1-SNAPSHOT</version> <name>SpringAi</name> <description>SpringAi</description> <properties> <java.version>17</java.version> <spring-ai.version>0.8.0</spring-ai.version> </properties> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.2.0</version> </dependency> </dependencies> <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> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>

启动Ollama模型

Spring AI 不仅提供了与 OpenAI 进行API交互,同样支持与 Ollama 进行API交互。Ollama 是一个发布在GitHub上的项目,专为运行、创建和分享大型语言模型而设计,可以轻松地在本地启动和运行大型语言模型。

这里我们选择使用Docker环境安装Ollama docker 版本如下:

➜ SpringAi git:(master) ✗ docker version Client: Cloud integration: v1.0.35+desktop.10 Version: 25.0.3 API version: 1.44 Go version: go1.21.6 Git commit: 4debf41 Built: Tue Feb 6 21:13:26 2024 OS/Arch: darwin/arm64 Context: desktop-linux Server: Docker Desktop 4.27.2 (137060) Engine: Version: 25.0.3 API version: 1.44 (minimum version 1.24) Go version: go1.21.6 Git commit: f417435 Built: Tue Feb 6 21:14:22 2024 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.6.28 GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
  1. 获取Docker镜像。

docker pull ollama/ollama

  1. 在 Docker 容器内运行 Ollama。

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

  1. 现在您可以在容器内运行像 gemma:2b 这样的模型。

docker exec -it ollama ollama run gemma:2b

image.png

哇,是不是看起来非常炫酷。

需要注意的是,首次运行会先下载模型文件(大概 3G 左右,由于众所周知的原因,下载会比较耗时,具体时长取决于大家的网络情况)。

下载完模型资源后会自动启动模型,如上,可以在控制台测试和模型交互。

建议大家睡觉前下载,运气好的话,第二天早上就可以使用了。

更多模型可以在Ollama 库中找到。

接下来我们可以在 application.yml 中配置 Ollama 地址和使用的模型。

yml
spring: ai: ollama: ## 默认地址无需配置 base-url: http://localhost:11434 chat: # model: llama2 model: gemma:2b

测试

这里可以先写一个 Controller

java
package org.example.springai.controller; import jakarta.annotation.Resource; import org.example.springai.model.Question; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.ollama.OllamaChatClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; /** * @author codejump */ @RestController public class AiController { @Resource OllamaChatClient chatClient; @PostMapping("/question") public String requestQuestion(@RequestBody Question question) { PromptTemplate promptTemplate = new PromptTemplate(question.getMessage()); promptTemplate.add("question", question.getMessage()); return chatClient.call(promptTemplate.render()); } }

启动项目

image.png

image.png

流式访问

需要构建异步函数来实现流式访问

package org.example.springai.controller; import static org.junit.jupiter.api.Assertions.*; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.Test; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.ai.ollama.OllamaChatClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class SpringAiApplicationTests { @Autowired private OllamaChatClient chatClient; @Test public void streamClient() throws ExecutionException, InterruptedException { // 构建一个异步函数,实现手动关闭测试函数 CompletableFuture<Object> future = new CompletableFuture<>(); String message = "年终总结"; PromptTemplate promptTemplate = new PromptTemplate("你是一个Java开发工程师,你擅长八股文,根据:{message} 背诵相关八股文,不少于 100 字"); Prompt prompt = promptTemplate.create(Map.of("message", message)); chatClient.stream(prompt).subscribe(chatResponse -> { System.out.println("response: " + chatResponse.getResult().getOutput().getContent()); }, throwable -> { System.out.println("err: " + throwable.getMessage()); }, () -> { System.out.println("完成!"); // 关闭函数 future.complete(null); }); future.get(); } }

执行结果:

image.png

very nice 👍。

以上就是使用 SpringAI 框架和 Ollama框架来实现的 Spring 和常用大模型的结合,大家可以感觉学起来,可以整个自己的 AI 机器人了哈哈哈

本文作者:CodeJump

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!