Spring AI 是一个用于 AI 工程的应用程序框架。 其目标是将 Spring 生态系统设计原则应用于 AI 领域。
Spring AI 提供以下功能:
- 支持所有主要的 AI 模型提供商,例如 Anthropic、OpenAI、Microsoft、Amazon、Google 和 Ollama等。
- 支持跨 AI 提供商对同步和流式处理 API 选项的可移植 API 支持。
- 支持结构化输出 - AI 模型输出到 POJO 的映射。
- 支持所有主要的向量数据库提供商,例如 Apache Cassandra、Azure Vector Search、Chroma、Milvus、MongoDB Atlas、Neo4j、Oracle、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。
- 支持跨向量存储提供商的可移植 API,包括一种新颖的类似 SQL 的元数据过滤器 API。
- 工具/函数调用 - 允许模型请求执行客户端工具和函数,从而根据需要访问必要的实时信息。
- 可观察性。
- 用于数据工程的文档注入 ETL 框架。
- AI 模型评估 - 帮助评估生成的内容并防止幻觉响应的实用程序。
- ChatClient API - 用于与 AI 聊天模型通信的 Fluent AP。
- Advisors API - 封装重复的生成式 AI 模式,转换发送到和传出语言模型 (LLM) 的数据,并提供跨各种模型和用例的可移植性。
- 支持 Chat Conversation Memory(聊天记忆) and Retrieval Augmented Generation (RAG)。
- 针对所有 AI 模型和向量存储提供Spring Boot的自动配置和启动器。
下面,我们通过具体的案例来学习下Spring AI的使用。
导入jar
新建spring boot项目,使用spring ai时,spring boot使用3.0以上版本,jdk使用17及以上版本。
XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
本例调用智谱大模型,还需要导入如下jar:
XML
<!-- m7以后使用该pom -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
注意:本例使用spring ai的1.0.0-SNAPSHOT版本,如果使用1.0.0-M6及之前的版本,导入的智谱的artifactId为spring-ai-zhipuai-spring-boot-starter。
yml配置
javascript
spring:
ai:
zhipuai:
api-key: XXXXXXXXXXXXXX # 智谱的apikey
chat:
options:
model: glm-4-flash
temperature: 0.7
本例测试智谱大模型的调用,api-key使用读者自己申请的key。
配置类
java
package com.renr.springainew.common;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringAiConfig {
// 创建ChatClient对象
@Bean
public ChatClient chatClient(ZhiPuAiChatModel chatModel) {
return ChatClient.builder(chatModel).build();
}
}
调用模型的代码
java
package com.renr.springainew.controller;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
public class ChatController {
@Resource
private ZhiPuAiChatModel chatModel;
@Resource
private ChatClient client;
@GetMapping("/chat")
public String chat(String message) {
String answer = this.chatModel.call(message);
System.out.println(answer);
return "success";
}
@GetMapping("/chat2")
public String chat2(String message) {
String answer = this.client.prompt("你好").call().content();
System.out.println(answer);
return "success";
}
}
本例使用两种方式调用智谱的大模型:
- 通过ZhipuAiChatModel对象
- 通过ChatClient对象,ChatClient支持函数调用、聊天记忆、RAG等高级功能
打印请求和响应的日志
修改配置类
java
package com.renr.springainew.common;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.zhipuai.ZhiPuAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringAiConfig {
@Bean
public SimpleLoggerAdvisor simpleLoggerAdvisor() {
// 创建SimpleLoggerAdvisor实例,可以传递日志级别等配置参数(此处为默认配置)
return new SimpleLoggerAdvisor();
}
@Bean
public ChatClient chatClient(ZhiPuAiChatModel chatModel) {
return ChatClient
.builder(chatModel)
// 设置系统消息
.defaultSystem("你是一个java架构师")
//配置日志相关的Advisor,需要开启日志级别以及配置 默认debug级别
.defaultAdvisors(simpleLoggerAdvisor())
.build();
}
// @Bean
// public ChatClient chatClient(ZhiPuAiChatModel chatModel) {
// return ChatClient.builder(chatModel).build();
// }
}
Spring AI的Advisors API 提供了一种灵活而强大的方法来拦截、修改和增强 Spring AI的应用。 通过利用 Advisors API,开发人员可以创建更复杂、可重用和可维护的 AI 组件。本例使用SimpleLoggerAdvisor提供日志打印功能。
另外,在创建ChatClient对象时,我们还设置了系统消息。聊天大模型一般包含三种消息类型:系统消息、用户消息和Ai返回的消息。
yml中增加日志配置
java
logging:
level:
org.springframework.ai.chat.client.advisor: DEBUG
调用http://localhost:8080/chat2测试
请求数据日志如下:
javascript
request: ChatClientRequest[prompt=Prompt{messages=[SystemMessage{textContent='你是一个java架构师', messageType=SYSTEM, metadata={messageType=SYSTEM}}, UserMessage{content='你好', properties={messageType=USER}, messageType=USER}], modelOptions=org.springframework.ai.zhipuai.ZhiPuAiChatOptions@bd71d690}, context={}]
响应日志如下:
javascript
response: {
"result" : {
"metadata" : {
"finishReason" : "STOP",
"contentFilters" : [ ],
"empty" : true
},
"output" : {
"messageType" : "ASSISTANT",
"metadata" : {
"finishReason" : "STOP",
"role" : "ASSISTANT",
"id" : "202505072240346deb3a95109d44d9",
"messageType" : "ASSISTANT"
},
"toolCalls" : [ ],
"media" : [ ],
"text" : "作为一位虚拟的Java架构师,我很高兴能为您提供帮助。请问有什么具体的技术问题或者架构设计上的挑战需要我协助您解决吗?"
}
},
"metadata" : {
"id" : "202505072240346deb3a95109d44d9",
"model" : "glm-4-flash",
"rateLimit" : {
"requestsLimit" : 0,
"tokensLimit" : 0,
"requestsReset" : 0.0,
"tokensReset" : 0.0,
"tokensRemaining" : 0,
"requestsRemaining" : 0
},
"usage" : {
"promptTokens" : 13,
"completionTokens" : 33,
"totalTokens" : 46,
"nativeUsage" : {
"completion_tokens" : 33,
"prompt_tokens" : 13,
"total_tokens" : 46
}
},
"promptMetadata" : [ ],
"empty" : false
},
"results" : [ {
"metadata" : {
"finishReason" : "STOP",
"contentFilters" : [ ],
"empty" : true
},
"output" : {
"messageType" : "ASSISTANT",
"metadata" : {
"finishReason" : "STOP",
"role" : "ASSISTANT",
"id" : "202505072240346deb3a95109d44d9",
"messageType" : "ASSISTANT"
},
"toolCalls" : [ ],
"media" : [ ],
"text" : "作为一位虚拟的Java架构师,我很高兴能为您提供帮助。请问有什么具体的技术问题或者架构设计上的挑战需要我协助您解决吗?"
}
} ]
}