SpringAI学习笔记
SpringAi
因本人研究生专业为人工智能,所以对Ai相关的知识有所了解,有了进一步学习通过Java调用大模型的兴趣。
课程:SpringAI
大模型
简介
大模型,是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能,以应对更加复杂的任务和数据;
大模型,简单来说,就是一个特别聪明、特别能干的“大脑”,这个“大脑”由很多个小小的“神经元”组成,每个“神经元”都能处理一部分信息,当这些“神经元”一起工作时,大模型就能理解并回答各种问题,或者完成各种复杂的任务。就像你有一个超级聪明的助手,它能帮你写邮件、写PPT、回答你的各种问题等等,它就像是一个上知天文,下知地理,无所不知的人;
训练
要训练一个大模型不容易,需要给它提供很多学习材料,就像我们小时候读书学习一样。而且为了让这个“大脑”更聪明,还需要很多高级的计算机设备来帮助它学习;
训练大模型:
- 高性能的CPU和GPU,多核心和高主频的CPU以及支持CUDA的GPU加速训练过程;
- 大容量存储设备,训练大模型需要存储大量的数据集、模型参数和中间结果;
- 高速网络连接,通过网络连接将训练任务分配到多个计算节点上;
- 深度学习框架,如TensorFlow、PyTorch等,这些框架提供了构建和训练模型的工具和库;
- 分布式训练框架,为了加速大模型的训练,可以使用分布式训练框架,如Horovod、Ray等;
- 编程语言和工具,Python是深度学习领域最常用的编程语言,还有(如Git)来管理代码和版本迭代;
- 训练大模型非常耗电,高性能计算机和GPU进行长时间的工作,需要消耗大量的电力;
SpringAi
简介
官网:https://spring.io/
官网定义:Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.
Spring AI是一个AI工程领域的应用程序框架;它的目标是将Spring生态系统的设计原则应用于人工智能领域,比如Spring生态系统的可移植性和模块化设计,并推广使用POJO来构建人工智能领域应用程序;
简易理解:Spring AI并不是要构建一个自己的AI大模型,而是让你对接各种AI大模型;
特点:
Spring AI提供的API支持跨人工智能提供商的 聊天,文本到图像,和嵌入模型等,同时支持同步和流API选项;
1、Chat Models 聊天模型:
- OpenAI
- Azure Open AI
- Amazon Bedrock
- Cohere's Command
- AI21 Labs' Jurassic-2
- Meta's LLama 2
- Amazon's Titan
- Google Vertex AI Palm
- Google Gemini
- HuggingFace - access thousands of models, including those from Meta such as Llama2
- Ollama - run AI models on your local machine
- MistralAI
2、Text-to-image Models 文本到图像模型:
- OpenAI with DALL-E
- StabilityAI
3、Transcription (audio to text) Models 转录(音频到文本)模型
- OpenAI
4、Embedding Models 嵌入模型
- OpenAI
- Azure OpenAI
- Ollama
- ONNX
- PostgresML
- Bedrock Cohere
- Bedrock Titan
- Google VertexAI
- Mistal AI
5、Vector Store API提供了跨不同提供商的可移植性,其特点是提供了一种新颖的类似SQL的元数据过滤API,以保持可移植性;
矢量数据库:
- Azure Vector Search
- Chroma
- Milvus
- Neo4j
- PostgreSQL/PGVector
- PineCone
- Redis
- Weaviate
- Qdrant
6、用于AI模型和矢量存储的Spring Boot自动配置和启动器;(xxxx-spring-ai-starter)
7、函数调用,您可以声明java.util.Function的OpenAI模型的函数实现,用于其提示响应。如果在应用程序上下文中注册为@Bean,则可以直接将这些函数作为对象提供,或者引用它们的名称。这一功能最大限度地减少了不必要的代码,并使人工智能模型能够要求更多信息来完成其响应;支持的模型有:
OpenAI
Azure OpenAI
VertexAI
Mistral AI
8、用于数据工程的ETL框架
ETL框架的核心功能是使用Vector Store促进文档向模型提供者的传输。ETL框架基于Java函数式编程概念,可帮助您将多个步骤链接在一起;支持阅读各种格式的文档,包括PDF、JSON等;该框架允许数据操作以满足您的需求。这通常包括拆分文档以遵守上下文窗口限制,并使用关键字增强它们以提高文档检索效率;最后,处理后的文档存储在矢量数据库中,以便将来检索;
9、广泛的参考文档、示例应用程序和研讨会/课程材料;
未来的版本将在此基础上提供对其他人工智能模型的访问,例如,谷歌刚刚发布的Gemini多模式模态,一个评估人工智能应用程序有效性的框架,更方便的API,以及帮助解决“查询/汇总我的文档”用例的功能。有关即将发布的版本的详细信息,请查看GitHub;
开发学习
前期准备
1、本机电脑要可以访问OpenAI网站 https://openai.com/;(科学上网)
2、要有OpenAI的API Key;(注册账号或者购买)我使用的平台ChatMoss
创建项目
1、创建maven项目
2、pom依赖
<?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.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>SpringAi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SpringAi</name>
<description>SpringAi</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
<spring-ai.version>1.0.0-M5</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</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>
<!--快照版本的仓库-->
<repository>
<id>spring-snapshot</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
</project>
3、yml配置
spring:
application:
name: SpringAi
ai:
openai:
api-key: --自己的apikey
base-url: --自己的代理平台地址
image:
options:
model: gpt-3.5-turbo --默认模型
4、controller
文本模型:
@RestController
public class ChatController {
/**
* spring-ai 自动装配的,可以直接注入使用
*/
@Resource
private OpenAiChatClient openAiChatClient;
/**
* 调用OpenAI的接口
*
* @param msg 我们提的问题
* @return
*/
@RequestMapping(value = "/ai/chat")
public String chat(@RequestParam(value = "msg") String msg) {
String called = openAiChatClient.call(msg);
return called;
}
/**
* 调用OpenAI的接口
*
* @param msg 我们提的问题
* @return
*/
@RequestMapping(value = "/ai/chat2")
public Object chat2(@RequestParam(value = "msg") String msg) {
ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg));
return chatResponse.getResult().getOutput().getContent();
}
/**
* 调用OpenAI的接口
*
* @param msg 我们提的问题
* @return
*/
@RequestMapping(value = "/ai/chat3")
public Object chat3(@RequestParam(value = "msg") String msg) {
//可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
ChatResponse chatResponse = openAiChatClient.call(new Prompt(msg, OpenAiChatOptions.builder()
//.withModel("gpt-4-32k") //gpt的版本,32k是参数量
.withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
.build()));
return chatResponse.getResult().getOutput().getContent();
}
/**
* 调用OpenAI的接口
*
* @param msg 我们提的问题
* @return
*/
@RequestMapping(value = "/ai/chat4")
public Object chat4(@RequestParam(value = "msg") String msg) {
//可选参数在配置文件中配置了,在代码中也配置了,那么以代码的配置为准,也就是代码的配置会覆盖掉配置文件中的配置
Flux<ChatResponse> flux = openAiChatClient.stream(new Prompt(msg, OpenAiChatOptions.builder()
//.withModel("gpt-4-32k") //gpt的版本,32k是参数量
.withTemperature(0.4F) //温度越高,回答得比较有创新性,但是准确率会下降,温度越低,回答的准确率会更好
.build()));
flux.toStream().forEach(chatResponse -> {
System.out.println(chatResponse.getResult().getOutput().getContent());
});
return flux.collectList(); //数据的序列,一序列的数据,一个一个的数据返回
}
}
图像模型:
注:需要调用的模型支持图像类型
spring:
application:
name: spring-ai-image
ai:
openai:
api-key: ---
base-url: ---
image:
options:
model: gpt-4-dalle
quality: hd
n: 1
height: 1024
width: 1024
@RestController
public class ImageController {
@Resource
private OpenAiImageClient openAiImageClient;
@RequestMapping("/ai/image")
private Object image(@RequestParam(value = "msg") String msg) {
ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(msg));
System.out.println(imageResponse);
String imageUrl = imageResponse.getResult().getOutput().getUrl();
//把图片进行业务处理
return imageResponse.getResult().getOutput();
}
@RequestMapping("/ai/image2")
private Object image2(@RequestParam(value = "msg") String msg) {
ImageResponse imageResponse = openAiImageClient.call(new ImagePrompt(msg, OpenAiImageOptions.builder()
.withQuality("hd") //高清图像
.withN(1) //生成1张图片
.withHeight(1024) //生成的图片高度
.withWidth(1024) //生成的图片宽度
.build()));
System.out.println(imageResponse);
String imageUrl = imageResponse.getResult().getOutput().getUrl();
//把图片进行业务处理
return imageResponse.getResult().getOutput();
}
}
Ollama
简介
官网:https://ollama.com/
Ollama是一个用于部署和运行各种开源大模型的工具;它能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型,如Llama 2等;综上,Ollama是一个大模型部署运行工具,在该工具里面可以部署运行各种大模型,方便开发者在本地搭建一套大模型运行环境;
下载
下载:https://ollama.com/download
说明:Ollama的运行会受到所使用模型大小的影响;
1、例如,运行一个7B(70亿参数)的模型至少需要8GB的可用内存(RAM),而运行一个13B(130亿参数)的模型需要16GB的内存,33B(330亿参数)的模型需要32GB的内存;
2、需要考虑有足够的磁盘空间,大模型的文件大小可能比较大,建议至少为Ollama和其模型预留50GB的磁盘空间;
3、性能较高的CPU可以提供更好的运算速度和效率,多核处理器能够更好地处理并行任务,选择具有足够核心数的CPU;
4、显卡(GPU):Ollama支持纯CPU运行,但如果电脑配备了NVIDIA GPU,可以利用GPU进行加速,提高模型的运行速度和性能;
傻瓜式安装
启动Ollama
运行命令:cmd控制台
(大模型的名字去ollama官网找:https://ollama.com/library)
ollama run qwen:0.5b-chat
代码
Spring AI代码测试
默认Ollama api会监听11434端口,可以使用命令进行查看:
netstat -ano | findstr 11434
pom依赖
<?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.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>ollama</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ollama</name>
<description>ollama</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
<spring-ai.version>1.0.0-M5</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
</project>
代码调用
@RestController
public class OllamaController {
@Autowired
OllamaChatModel ollamaChatModel;
@RequestMapping("/ai/chat")
public String chart(@RequestParam("msg") String msg){
OllamaOptions ollamaOptions = OllamaOptions.builder().model("deepseek-r1:1.5b").build();
ChatResponse chatResponse = ollamaChatModel.call(new Prompt(msg, ollamaOptions));
return chatResponse.getResult().getOutput().getContent();
}
}
开源Web端
Web & Desktop
Ollama的Web & Desktop非常多,比较流行的是 Open WebUI;
Open WebUI Github:https://github.com/open-webui/open-webui
Open WebUI 官网:https://www.openwebui.com/
Open WebUI是一个可扩展、功能丰富、用户友好的自托管WebUI,它支持完全离线操作,支持各种LLM(Large
Language Model)运行程序,包括Ollama和OpenAI兼容的API;
搭建部署
Open WebUI
搭建部署Open WebUI有两种方式:
1、Docker方式;(官方推荐的方式)
2、源码部署安装方式;(文档:https://docs.openwebui.com/getting-started/ )
在docker中运行Open WebUI
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v D:\dev\open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
这是一个 docker run 命令,用于启动一个新的 Docker 容器,下面是这个命令各个部分的解释:
docker run:这是 Docker 的命令,用于从指定的镜像启动一个新的容器;
-d:表示在“分离”模式下运行容器,即后台运行;
-p 3000:8080:端口映射,表示将宿主机的3000端口映射到容器的8080端口,当你访问宿主机的3000端口时,实际上会访问容器内的8080端口;
--add-host=host.docker.internal:host-gateway:这个选项向容器的 /etc/hosts 文件中添加一条记录,这通常用于让容器能够解析到宿主机的名称,并且将其 IP 地址设置为宿主机的网关地址,这在某些网络配置中很有用,尤其是当容器需要知道宿主机的地址时;
-v D:\dev\open-webui:/app/backend/data:卷挂载,这表示将宿主机的 D:\dev\open-webui 目录挂载到容器内的/app/backend/data 目录,这样,容器和宿主机之间可以共享这个目录中的数据;
--name open-webui:为容器指定一个名称,这里是 open-webui;
--restart always:这个选项告诉 Docker 在容器退出时总是自动重启它,无论容器是因为何种原因退出,它都会自动重启;
ghcr.io/open-webui/open-webui:main:这是你要运行的 Docker 镜像的完整名称,ghcr.io 是 GitHub Container Registry 的地址,open-webui/open-webui 是镜像的仓库和名称,main是标签,通常表示该镜像的最新或主分支版本;
Lobe Chat
官网:https://lobehub.com/
Github:https://github.com/lobehub/lobe-chat
Built for you the Super Individual (专为你打造的超级个人)现代化设计的开源 ChatGPT/LLMs 聊天应用与开发的UI框架;支持语音合成、多模态、可扩展的(function call)插件系统;一键免费拥有你自己的ChatGPT/Gemini/Claude/Ollama 应用;
使用 Docker 部署;
docker run -d -p 3210:3210 -e OPENAI_API_KEY=sk-xxxx -e ACCESS_CODE=lobe66 --name lobe-chat lobehub/lobe-chat
进一步了解参考完整的部署文档:https://lobehub.com/zh/docs/self-hosting/start