在这个人工智能的春天,我们迎来了Spring AI。在这篇文章中,将介绍Spring AI以及如何将其与Ollama本地模型集成。
一、Spring AI简介
图片
官方正式宣布,Spring AI已经列入Spring Initializr。它提供了一种更简洁的方式来与AI交互,降低了将LLM模型集成到Java操作中的学习曲线。它现在可以在start.spring.io上使用和构建。
Spring AI是一个人工智能工程应用框架。它的目标是将Spring生态系统的设计原则,如可移植性和模块化设计,应用到AI领域,并推广使用POJO作为AI应用程序的构建模块。
二、特性
可移植的API支持跨AI提供商的交互,包括聊天、文本到图像和嵌入模型。它支持同步和流API选项。它还支持配置参数以访问特定模型。
支持的聊天模型:
- OpenAI。
- Azure Open AI。
- Amazon Bedrock。
- Anthropic的Claude。
- Cohere的Command。
- AI21 Labs的Jurassic-2。
- Meta的LLama 2。
- Amazon的Titan。
- Google Vertex AI。
- HuggingFace——HuggingFace上的众多模型,如Llama2。
- Ollama——支持在没有GPU的情况下在本地运行AI模型。
支持的文本到图像模型:
- OpenAI与DALL-E。
- StabilityAI。
支持的向量模型:
- OpenAI。
- Azure OpenAI。
- Ollama。
- ONNX。
- PostgresML。
- Bedrock Cohere。
- Bedrock Titan。
- Google VertexAI。
官方文档:spring.io/projects/spring-ai
三、快速入门
使用IDEA快速启动一个新项目,选择需要的AI模型依赖项。
在这里,以Ollama模型为例:
图片
3.1 Ollama
Ollama使我们能够在不需要GPU资源的情况下在本地计算机上轻松构建大型模型,并提供控制台和RestfulAPI,以便在Ollama上快速测试和集成大型模型。
Ollama支持哪些模型?
图片
Ollama网站:ollama.com/library
提示:
- Gemma是Google Meta最近发布的一个模型。
- llama2模型对中文支持不太友好,而gemma模型对中文更加友好。
3.2 引入依赖项
提示:Spring AI相关的依赖项不在Maven中央资源库中,因此需要配置Spring的资源库。
<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>
</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>
3.3 启动Ollama模型
在本地计算机控制台中运行ollama run gemma:2b(这里使用gemma模型)。
图片
第一次运行会下载模型文件(约3GB,可能需要一些时间)。
下载模型资源后,模型将自动启动,如上所示,你可以在控制台中测试和与模型交互。
3.4 配置Ollama模型
修改该项目的application.yml配置文件,添加以下内容:
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: gemma:2b
3.5 测试
@Test
void contextLoads() {
String message = """
Who is Donald Trump?
""";
System.out.println(chatClient.call(message));
}
图片
3.6 流式访问
@Test
void streamChat() throws ExecutionException, InterruptedException {
// 构建一个异步函数来手动关闭测试函数
CompletableFuture<Void> future = new CompletableFuture<>();
String message = """
year-end work summary report
""";
PromptTemplate promptTemplate = new PromptTemplate("""
You are a Java development engineer, and you are good at writing the company’s year-end work summary report.
Write a 100-word summary report based on: {message} scenario
""");
Prompt prompt = promptTemplate.create(Map.of("message", message));
chatClient.stream(prompt).subscribe(
chatResponse -> {
System.out.println("response: " + chatResponse.getResult().getOutput().getContent());
},
throwable -> {
System.err.println("err: " + throwable.getMessage());
},
() -> {
System.out.println("complete~!");
// 关闭函数
future.complete(null);
}
);
future.get();
}