目录
一、前言
随着Spring AI 加入对大模型的支持,对于Java生态来说,对大模型项目的应用开发也变得简单,借助于spring框架自身的优势,开发者无需太多关注技术框架层面的细节,只需简单了解和学习其技术组件,掌握基本的用法即可,与此同时,Spring AI更多像是扮演了一个通用的接入规则制定者,基于这套规则即可以快速联通各个AI大模型,本篇将详细介绍下基于Spring AI框架,如何快速对接目前主流的大模型平台。
二、Spring AI 对接硅基流动
2.1 硅基流动平台介绍
硅基流动(SiliconCloud)是一家致力于打造大模型时代的AI基础设施的公司,主要提供高效、低成本且全面的生成式人工智能(GenAI)模型服务。硅基流动的核心目标是通过优化大模型使用体验,帮助用户实现“Token 自由”,即以更低成本和更高效率使用先进的大语言模型(LLMs)及其他生成式人工智能(AI)模型。
快速入口:硅基流动用户系统,统一登录 SSO ,注册登录进去之后默认进到模型广场
2.1.1 平台是做什么的
硅基流动是一家专注于大规模AI计算的技术公司,由清华大学高性能计算研究所孙广宇教授团队创立。公司核心团队来自清华大学、MIT等顶尖高校,在高性能计算和AI系统方面有深厚的技术积累。主要产品和服务包括:
-
SiliconLLM: 高性能LLM推理引擎,支持各种主流大语言模型的高效部署。
-
SiliconCloud: 一站式AI云计算平台,提供LLM训练推理等服务。
-
OneDiff: 开源的AI编译框架,可自动优化AI模型性能。
产品核心优势在于深厚的系统优化技术,能大幅提升AI模型的计算效率,帮助企业降低AI部署成本。目标市场主要面向有大规模AI计算需求的企业客户。
2.1.2 适用场景
硅基流动适用于各种需要高效、低成本AI服务的场景,包括但不限于文本生成、图像生成、语音生成、视频生成等。其便捷的使用体验和高性价比的优势使得硅基流动成为开发者和企业在AI应用开发中的理想选择。
-
企业级 AI 应用开发:
-
通过低成本的 API 服务,迅速将大模型集成到企业产品中。
-
-
个人开发者与 AI 爱好者:
-
无需依赖昂贵的硬件支持,便可使用顶尖大模型进行实验和创新。
-
-
多模态内容生成:
-
支持文本、语音、图像和视频的生成,适用于内容创作者和设计师。
-
-
模型微调与定制:
-
企业可上传自有数据,对模型进行微调,从而满足特定业务需求。
-
硅基流动(SiliconCloud)致力于为开发者提供一个集成多种开源大模型并配备优化 API 服务的高效、灵活且经济高效的 AI 开发平台。它不仅支持个人开发者快速将创意转化为实际项目,也为企业用户提供了简化的途径来实现生成式 AI 应用的迅速落地。通过整合这些资源和服务,该平台有效地降低了技术实施的门槛与成本,使得更广泛的用户群体能够轻松接触和应用先进的大语言模型与生成式 AI 技术。
2.2 获取apikey
在接下来使用Spring AI对接硅基流动时,需要使用该平台的apikey作为唯一的访问凭证,所以需要首先在平台创建并获取到apikey,硅基流动入口:硅基流动用户系统,统一登录 SSO
通过左侧的菜单获取apikey,初次注册可以自己新建一个,apikey在工程中会用到
2.3 Spring AI对接硅基流动完整过程
前置准备
-
本地创建一个springboot工程
2.3.1 导入核心依赖
在工程pom文件中导入如下spring ai 核心依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/>
</parent>
<properties>
<docker.image.prefix>dcloud</docker.image.prefix>
<junit.version>5.11.4</junit.version>
</properties>
<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-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<!--快照版本的仓库-->
<repository>
<id>spring-snapshot</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.2.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-moonshot-spring-boot-starter</artifactId>
</dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>boot-docker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2.3.2 添加配置文件
在工程的配置文件中添加如下配置信息
server:
port: 8081
spring:
ai:
openai:
api-key: 你的硅基流动的apikey
base-url: https://api.siliconflow.cn
chat:
options:
model: deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
2.4 基本组件能力使用
接下来,通过代码演示spring ai基于硅基流动整合大模型几个基础组件能力的使用。
2.4.1 对话能力使用
在工程中添加一个测试接口,参考下面的代码:
-
在当前接口中注入了一个ChatClient 对象,同时为这个对象设置了一个系统的默认身份,可以在回答问题的时候基于这个身份进行回答(身份设置非必须);
package com.congge.web;
import groovy.util.logging.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/deepseek")
@Slf4j
public class DeepSeekChatController {
private ChatClient chatClient;
public DeepSeekChatController(ChatClient.Builder builder) {
this.chatClient = builder.defaultSystem("假如你是特朗普,请以特朗普的身份回答问题").build();
}
//localhost:8081/deepseek/ai/chat?message=你是如何看待拜登这个人的
@GetMapping(value = "/ai/chat")
public String chatApi(@RequestParam("message") String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
启动工程之后,调用一下接口,可以看到下面的效果,同时还输出了推理过程
2.4.2 流式对话
在某些场景下,如果你需要得到像在线使用AI大模型那样回答的问题展示出流式效果,可以考虑使用这种方式,参考下面的代码,这两种写法都可以
/**
* ChatClient 流式调用
* localhost:8081/openai/chat/stream/chat?message=生成一首歌咏春天的现代诗
*/
@GetMapping("/stream/chat")
public Flux<String> streamChat(@RequestParam String message,
HttpServletResponse response) {
response.setCharacterEncoding("UTF-8");
return openAiChatClient.prompt(message).stream().content();
}
/**
* ChatClient 流式响应
*/
@GetMapping(value = "/stream/response", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> streamChat(@RequestParam String message) {
return openAiChatClient.prompt()
.user(message)
.stream()
.content()
.map(content -> ServerSentEvent.<String>builder()
.data(content)
.build());
}
通过接口执行效果可以看到,返回的内容就呈现出流式输出的效果
2.4.3 Function Calling
Function Calling ,即工具调用(也称为函数调用)是 AI 应用程序中的一种常见模式,允许模型与一组 API 或者工具进行交互,从而增强其功能。在Spring AI与大模型对接时,如果要使用该能力,需要提前了解该模型是否支持Function Calling。在模型列表页面,点击详情可以看到是否支持。
在代码中集成也比较简单,首先定义一个tool工具类,如下,我们定义一个可以获取当前所在时区的系统时间的工具方法
package com.congge.tool;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
public class DateTimeTools {
@Tool(description = "Get the current date and time in the user's timezone")
String getCurrentDateTime() {
return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
}
@Tool(description = "Set a user alarm for the given time, provided in ISO-8601 format")
void setAlarm(String time) {
LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
System.out.println("Alarm set for " + alarmTime);
}
}
添加一个接口用于测试,参考下面的完整代码
package com.congge.web;
import com.congge.tool.DateTimeTools;
import groovy.util.logging.Slf4j;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
@RestController
@CrossOrigin(origins = "*")
@RequestMapping("/deepseek")
@Slf4j
public class DeepSeekChatController {
private ChatClient chatClient;
public DeepSeekChatController(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("你是一个聊天助手,请根据用户提问回答")
.defaultTools(DateTimeTools.class)
.build();
}
/**
* localhost:8081/deepseek/tool?prompt=今天是几号
* @param prompt
* @return
*/
@GetMapping("/tool")
public String get(@RequestParam(value = "prompt", required = false) String prompt) {
return chatClient
.prompt(prompt)
.tools(new DateTimeTools())
.call()
.content();
}
}
启动工程后,调用一下上面的接口,可以看到下面的效果
三、Spring AI 对接阿里云百炼平台
3.1 阿里云百炼平台介绍
阿里云的“百炼平台”是一个专注于大规模模型训练和优化的平台,旨在帮助企业及开发者更高效地进行人工智能模型的研发和部署。地址:百炼控制台
百炼平台 是阿里云推出的一个面向AI开发者的全栈式AI模型训练与优化平台。它集成了阿里云在云计算、大数据和人工智能领域的技术优势,提供了从数据准备、模型训练到模型部署的一站式解决方案。该平台特别适合需要处理大规模数据集和复杂模型训练任务的企业和研究机构。
3.1.1 平台主要功能
阿里云百炼平台提供了丰富的功能,如下:
-
一站式AI开发环境
-
提供了完整的AI开发流程支持,包括数据标注、预处理、模型训练、评估和部署。
-
支持多种深度学习框架,如TensorFlow、PyTorch等,方便用户根据需求选择合适的工具。
-
-
高效的分布式训练
-
支持大规模分布式训练,能够有效利用多台服务器上的GPU资源,加速模型训练过程。
-
提供自动化的分布式训练配置,简化了分布式训练的复杂性。
-
-
自动化机器学习(AutoML)
-
内置AutoML功能,可以自动选择最优的超参数组合,提高模型性能并减少人工调参的工作量。
-
支持自动特征工程和模型选择,帮助用户快速找到最佳模型。
-
-
丰富的算法库和预训练模型
-
提供了丰富的算法库和预训练模型,覆盖了图像识别、自然语言处理、推荐系统等多个领域。
-
用户可以直接使用这些预训练模型进行微调,节省时间和计算资源。
-
-
灵活的资源调度和管理
-
支持按需分配计算资源,用户可以根据实际需求动态调整使用的CPU、GPU等资源。
-
提供详细的资源使用监控和日志记录,方便用户管理和优化资源使用。
-
-
安全可靠的数据管理
-
提供安全的数据存储和管理服务,确保数据的完整性和隐私保护。
-
支持多种数据源接入,包括本地文件系统、OSS(对象存储服务)、数据库等。
-
-
便捷的模型部署和服务化
-
支持将训练好的模型一键部署为在线服务,方便用户快速上线AI应用。
-
提供RESTful API接口,便于与其他系统集成。
-
3.1.2 应用场景
下面列举了阿里云百炼平台的几种使用场景:
-
企业级AI项目:适用于需要处理大规模数据和复杂模型的企业级AI项目,如金融风控、医疗影像分析等。
-
科研机构:为科研人员提供强大的计算资源和工具,支持前沿研究和实验。
-
个人开发者:为个人开发者提供了一个低成本、高效率的AI开发环境,帮助他们快速实现创意。
3.2 获取apikey
与上述对接硅基流动平台一样,需要先登录到百炼平台获取一个apikey,阿里云百炼平台入口:百炼控制台
在左下方的API-key管理的位置,如果是初次进入,可以点击右边的按钮,新创建一个apikey,注意妥善保管
3.3 整合SpringBoot 完整过程
前置准备与说明:
-
提前在本地搭建一个springboot工程
-
Spring ai与百炼平台整合使用,借助了spring ai alibaba这个组件的能力,使用该组件,对于开发者来说,组件的封装程度更高,对于各个大模型的调用也更简单
3.3.1 导入核心依赖
在pom文件中导入如下核心依赖
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-ai.version>1.0.0-M6</spring-ai.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.4</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.35</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<finalName>boot-docker</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3.3.2 添加配置文件
在配置文件中添加如下信息
-
注意,这里的模型可以不填,不填会使用默认的,如果你需要在后面使用Function Calling能力,则需要选择特定的大模型,因为不是所有的模型都支持;
spring:
ai:
dashscope:
api-key: 你的apikey
chat:
options:
model: qwen-plus
3.4 基本对话能力使用
3.4.1 提供测试接口
在工程中添加一个测试使用的接口,参考下面的代码
package com.congge.web;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatV1Controller {
private final ChatClient chatClient;
public ChatV1Controller(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
//localhost:8081/chat?input=你是谁
@GetMapping("/chat")
public String chat(String input) {
return this.chatClient
.prompt()
.user(input)
.call()
.content();
}
//localhost:8081/chat/v2?input=AI时代程序员该如何提升自己
@GetMapping("/chat/v2")
public String chatV2(String input) {
Prompt prompt = new Prompt(new UserMessage(input));
String content = chatClient.prompt(prompt).call().content();
return content;
}
}
调用一下这个接口,可以看到大模型给出了响应
3.5 Function Calling 能力使用
3.5.1 Function Calling 是什么
功能调用(Function Calling)允许大型语言模型(LLM)在必要时调用一个或多个可用的工具,这些工具通常由开发者定义。工具可以是任何东西:网页搜索、对外部 API 的调用,或特定代码的执行等。
功能调用是AI应用与模型交互中一个非常典型的范式,它可以辅助模型更好的回答用户问题。我们在给模型输入的过程中,附带上可用的函数列表(包含函数名、函数描述等),模型在收到问题和函数列表后,根据对问题的推理在必要的时候发起对函数的调用。
参考文档:工具(Function Calling)-阿里云Spring AI Alibaba官网官网
3.5.2 创建自定义的FunctionTools
自定义函数需要提供一个 name、description 和 function call signature,以便模型知道函数能做什么、期望的输入参数。
-
Spring AI 使这一过程变得简单,只需定义一个返回 java.util.Function 的 @Bean 定义,并在调用 ChatModel 时将 bean 名称作为选项进行注册。
-
在底层,Spring 会用适当的适配器代码包装你的 POJO(即函数),以便与 AI 模型进行交互,免去了编写繁琐的样板代码。
-
FunctionCallback.java 接口和配套的 FunctionCallbackWrapper.java 工具类包含了底层实现代码,它们是简化 Java 回调函数的实现和注册的关键。
下面自定义了模拟算术运算的函数,可执行加法和乘法运算。在实际业务中,你可以在自定义函数中执行数据库操作、调用HTTP服务、执行业务逻辑等。
package com.congge.tool;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
@Configuration
public class FunctionTools {
private static final Logger logger = LoggerFactory.getLogger(FunctionTools.class);
public record AddOperationRequest(int d1, int d2) {
}
public record MulOperationRequest(int d1, int d2) {
}
@Bean
@Description("加法运算")
public Function<AddOperationRequest, Integer> addOperation() {
return request -> {
logger.info("加法运算函数被调用了:" + request.d1 + "," + request.d2);
return request.d1 + request.d2;
};
}
@Bean
@Description("乘法运算")
public Function<MulOperationRequest, Integer> mulOperation() {
return request -> {
logger.info("乘法运算函数被调用了:" + request.d1 + "," + request.d2);
return request.d1 * request.d2;
};
}
}
如何定义&注册函数:
-
您可以在应用程序上下文中定义 @Beans,就像定义任何其他 Spring 管理对象一样。
-
在内部,Spring AI ChatModel 将创建一个 FunctionCallbackWrapper 包装器的实例,该包装器添加通过 AI 模型调用它的逻辑。@Bean 的名称作为 ChatOption 传递。
-
@Description 注释是可选的,它提供了函数描述,可帮助模型了解何时调用该函数。这是一个重要的属性,可帮助 AI 模型确定要调用哪个客户端函数。
3.5.3 添加测试接口
下面增加一个测试接口用于测试效果
package com.congge.web;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ai/function")
public class FunctionCallController {
@Autowired
private ChatModel chatModel;
//localhost:8081/ai/function/chat?userMessage=你是谁
//localhost:8081/ai/function/chat?userMessage=3加7等于几
@GetMapping(value = "/chat", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public String ragJsonText(@RequestParam(value = "userMessage") String userMessage){
return ChatClient.builder(chatModel)
.build()
.prompt()
.system("""
您是算术计算器的代理。
您能够支持加法运算、乘法运算等操作,其余功能将在后续版本中添加,如果用户问的问题不支持请告知详情。
在提供加法运算、乘法运算等操作之前,您必须从用户处获取如下信息:两个数字,运算类型。
请调用自定义函数执行加法运算、乘法运算。
请讲中文。
""")
.user(userMessage)
.functions("addOperation", "mulOperation")
.call()
.content();
}
}
3.5.4 效果测试
首先测试第一个问题,问一个与工具能力无关的问题
通过接口的返回结果不难发现,ChatClient中设置的system提示词生效了,工具在执行的时候会按照默认角色输出了打招呼内容,由于本次的问题与提示词设置的无关,所以给出了接口中的返回内容。此时再换一个问题再调用一次,此时就得到了目标的预期结果。
四、写在文末
本文通过较大的篇幅详细介绍了spring ai快速接入硅基流动和阿里云百炼平台使用大模型的能力的操作过程,spring ai整合大模型之后还有很多组件能力可以直接调用,比如文生图,文生视频等,有兴趣的同学可以在此基础上继续深入研究,本篇到此结束,感谢观看。