目录
一、前言
二、Spring AI概述
2.1 spring ai是什么
2.2 Spring AI 核心能力
2.3 Spring AI 应用场景
三、Spring AI Alibaba 介绍
3.1 Spring AI Alibaba 是什么
3.2 Spring AI Alibaba 核心特点
3.3 Spring AI Alibaba 应用场景
四、SpringBoot 对接Spring AI Alibaba 过程
4.1 前置准备
4.1.1 获取apikey
4.1.2 引入必要的依赖
4.1.3 配置文件添加apikey
4.2 通义对话大模型对接
4.2.1 添加测试对话接口
4.2.2 效果测试
4.3 文生图模型能力
4.3.1 Java HTTP 方式对接
4.3.2 SDK方式对接
五、阿里云百炼大模型平台使用
5.1 前置准备
5.1.1 登录平台
5.1.2 获取apikey
5.1.3 开通大模型服务
5.2 在线体验大模型能力
5.2.1 在线使用大模型对话能力
5.2.2 http方式调用大模型对话能力
5.3 Java http方式调用大模型能力
5.3.1 文本输入对话能力
5.3.2 图像输入与理解能力
5.3.3 文档理解能力
六、写在文末
一、前言
随着各大厂商都在大模型领域布局,各种编程语言也在积极降低对接大模型的成本,可以肯定的是,在大模型能力和生态渐臻完善的情况下,接下来就是在应用层的接入、商用和市场化进程,基于此,以Java生态spring框架为例,也在去年推出spring ai,基于spring ai 可以快速对接chatgpt模型,也可以对接主流厂商的大模型,本文以spring ai alibaba为例进行详细的说明。
二、Spring AI概述
2.1 spring ai是什么
Spring AI是一个人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于人工智能领域,并推广使用POJO作为人工智能领域应用程序的构建块。
官网地址:Spring AI
2.2 Spring AI 核心能力
从Spring AI官网左侧的菜单不难看出,Spring AI提供的主要功能如下:
-
Spring Boot框架集成:专为Spring Boot设计的自动配置和启动器,让AI集成变得简单;
-
SQL类过滤器API: 提供类似SQL的元数据过滤器API,实现跨供应商的一致性;
-
将 AI 模型输出映射到 POJO,更方便编码;
-
跨 Vector Store 提供程序的可移植 API,包括新颖的类似 SQL 的元数据过滤器 API,该 API 也是可移植的;
-
跨 AI 提供商可移植 API
-
用于聊天和嵌入模型,支持同步和流 API 选项,还支持下拉以访问特定于模型的功能;
-
-
API可移植性
-
支持所有主流模型提供商,如OpenAI,Microsoft,Amazon,Google和Huggingface。支持的模型类型包括聊天和文本到图像;
-
-
AI 模型和矢量存储的 Spring Boot stater,便于程序集成时开箱即用;
-
数据处理能力
-
Spring AI 提供了丰富的数据处理工具,帮助开发者高效地处理和准备数据。
-
数据预处理:提供常用的数据预处理工具,如数据清洗、特征提取、归一化等。
-
数据管道:支持构建高效的数据管道,确保数据流的顺畅,支持批处理和流处理。
-
-
-
模型管理能力
-
Spring AI 提供了强大的模型管理功能,帮助开发者更好地管理和维护模型。
-
模型加载和保存:提供简单的方法来加载和保存模型,支持多种格式和存储方式。
-
模型版本控制:支持模型的版本控制,确保不同版本的模型可以独立管理和部署。
-
模型注册表:提供模型注册表,方便管理和共享模型,支持模型的元数据管理。
-
-
-
模型训练能力
-
Spring AI 提供了强大的模型训练功能,帮助开发者高效地训练模型。
-
分布式训练:支持分布式训练,提高训练效率,支持多节点和多 GPU 训练。
-
超参数调优:提供超参数调优工具,帮助找到最优模型参数,支持网格搜索、随机搜索等方法。
-
训练监控:提供训练过程的监控工具,实时查看训练进度和性能,支持可视化监控。
-
-
-
模型推理能力
-
Spring AI 提供了高效的模型推理功能,支持实时和批量推理。
-
实时推理:支持实时推理,适用于在线服务场景,提供低延迟和高吞吐量的推理服务。
-
批量推理:支持批量推理,适用于离线批处理场景,提供高性能的批量处理能力。
-
模型优化:提供模型优化工具,提高推理速度和效率,支持模型剪枝、量化等技术。
-
-
2.3 Spring AI 应用场景
Spring AI 可以应用于多种场景,特别是在微服务架构中,它可以帮助开发者更轻松地集成和管理人工智能功能。以下是一些常见的应用场景及其具体示例:
-
智能客服
-
Spring AI可以用于构建智能客服系统,例如AI掌门人为门店营销提供智能总结和问答服务,慧言AI智能客服基于AI Agent提供企业智能客服功能。
-
-
自然语言处理(NLP)
-
Spring AI可以应用于自然语言处理任务,例如基于公司文档的问答系统,通过将公司文档转换为向量格式并存储在向量数据库中,然后通过AI模型进行检索和处理,从而提高员工的工作效率。
-
场景描述
-
数据预处理:对用户输入的文本进行预处理,如分词、去停用词等。
-
模型训练:使用 Spring AI 的模型训练功能,基于预处理的数据训练 NLP 模型。
-
实时推理:在用户输入时,通过调用 Spring AI 的推理接口,实时生成分析结果。
-
-
场景示例
-
聊天机器人:理解用户意图并生成回复。
-
文本分类系统:将用户评论分类为正面、负面或中立。
-
情感分析工具:分析社交媒体上的用户情绪
-
-
-
数据分析
-
Spring AI支持数据分析功能,例如使用SwiftAgent数据分析智能体进行商业分析,以及使用数据可视化工具如Sugar BI进行数据可视化。
-
-
实时推荐系统
-
数据收集:从用户行为日志中收集数据,包括浏览历史、购买记录等。
-
模型训练:使用 Spring AI 的模型训练功能,基于收集的数据训练推荐模型。
-
实时推理:在用户访问时,通过调用 Spring AI 的推理接口,实时生成推荐结果。
-
电商平台:根据用户的浏览和购买历史推荐相关商品。
-
新闻网站:根据用户的阅读偏好推荐相关新闻文章。
-
-
-
图像识别
-
场景描述:
-
数据收集:收集图像数据,包括商品图片、人脸照片、医学影像等。
-
模型训练:使用 Spring AI 的模型训练功能,基于收集的数据训练图像识别模型。
-
实时推理:在用户上传图像时,通过调用 Spring AI 的推理接口,实时生成识别结果。
-
-
场景示例
-
电商平台:商品图像识别,自动分类商品类别。
-
医疗影像分析系统:辅助医生诊断疾病。
-
安防系统:人脸识别,实现门禁控制。
-
-
-
语音识别和合成
-
场景描述:
-
数据收集:收集语音数据,包括用户录音、合成语音等。
-
模型训练:使用 Spring AI 的模型训练功能,基于收集的数据训练语音识别和合成模型。
-
实时推理:在用户输入语音时,通过调用 Spring AI 的推理接口,实时生成文字或合成语音。
-
-
示例:
-
智能客服系统:将用户语音转换为文本并生成回复。
-
智能家居系统:通过语音指令控制家电。
-
语音助手:将文本转换为语音播放给用户。
-
-
Spring AI 通过提供强大的 AI 功能和工具,帮助开发者在微服务架构中轻松集成和管理人工智能应用。无论是在推荐系统、自然语言处理、图像识别、异常检测、语音识别和合成、时间序列预测、模型管理和版本控制等方面,Spring AI 都能提供全面的支持,助力企业实现智能化转型。
三、Spring AI Alibaba 介绍
3.1 Spring AI Alibaba 是什么
Spring AI Alibaba入口:Spring Cloud Alibaba官网_基于Springboot的微服务教程-阿里云-阿里云Spring Cloud Alibaba官网
原始的Spring AI并没有国内相关大模型的接入,对国内开发者不太友好。Spring AI Alibaba 是阿里巴巴推出的一个基于 Spring AI 的扩展框架,旨在简化 Java 开发者在微服务架构中集成和管理人工智能功能的过程。Spring AI Alibaba 不仅继承了 Spring AI 的核心能力,还结合了阿里巴巴的多项技术和最佳实践,提供了更丰富和强大的功能。
git地址:spring-ai-alibaba/README-zh.md at main · alibaba/spring-ai-alibaba · GitHub
3.2 Spring AI Alibaba 核心特点
Spring AI Alibaba为开发者提供了快速接入阿里AI相关的大模型能力,比如通义系列的大模型产品,具体来说,其具备如下特点:
-
与 Spring 生态系统的无缝集成:
-
Spring AI Alibaba 可以无缝集成到现有的 Spring Boot 和 Spring Cloud 项目中,使得开发者可以使用熟悉的 Spring 注解和配置来管理 AI 功能。
-
-
深度适配阿里巴巴的大模型:
-
Spring AI Alibaba 深度集成了阿里巴巴的通义系列大模型,包括通义千问、通义万相等,提供了丰富的 AI 服务,如自然语言处理、图像识别、语音识别等。
-
-
简化模型管理和部署:
-
提供了模型管理和版本控制功能,支持模型的加载、保存、版本管理和注册表功能,确保模型的可追溯性和可重复性。
-
-
丰富的 API 和工具:
-
提供了丰富的 API 和工具,帮助开发者轻松实现数据预处理、模型训练、推理和监控等功能。
-
-
高性能和高可用性:
-
优化了模型推理的性能,支持分布式训练和推理,确保在高并发场景下的稳定性和性能。
-
-
易用性和可扩展性:
-
提供了详细的文档和示例,帮助开发者快速上手。同时,支持自定义扩展,满足不同业务场景的需求。
-
3.3 Spring AI Alibaba 应用场景
Spring AI Alibaba在下面的场景下可以考虑使用:
-
自然语言处理(NLP):
-
文本分类:将文本分类为不同的类别,如情感分析、主题分类等。
-
文本生成:生成自然语言文本,如文章、摘要等。
-
对话模型:实现智能对话系统,如聊天机器人、客服系统等。
-
-
语音识别和合成:
-
语音识别:将语音转换为文本。
-
语音合成:将文本转换为语音
-
-
推荐系统
-
用户行为分析:分析用户的行为数据,生成推荐模型。
-
实时推荐:在用户访问时,实时生成推荐结果
-
-
图像识别
-
物体检测:检测图像中的物体并标注位置。
-
图像分类:将图像分类为不同的类别,如动物、植物等。
-
图像生成:生成新的图像,如风格迁移、图像修复等。
-
四、SpringBoot 对接Spring AI Alibaba 过程
4.1 前置准备
4.1.1 获取apikey
apikey是调用大模型的必要参数,目前可以通过阿里云百炼平台获取,参考下面的说明注册账户并获取apikey
如何获取API Key_大模型服务平台百炼(Model Studio)-阿里云帮助中心
以通义系列大模型产品为例,申请使用通过后,平台就会颁发给你一个apikey,可以在控制台查看
4.1.2 引入必要的依赖
在工程中引入如下核心依赖
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></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>
4.1.3 配置文件添加apikey
在工程的配置文件中添加你在百炼控制台中申请的那个apikey
server:port: 8085spring:ai:dashscope:api-key: 你的apikey
4.2 通义对话大模型对接
4.2.1 添加测试对话接口
有了Spring AI Alibaba的相关依赖之后,调用通义大模型的对话能力就变得很简单了,下面提供两个测试接口
package com.congge.web;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ChatController {private final ChatClient chatClient;public ChatController(ChatClient.Builder builder) {this.chatClient = builder.build();}//localhost:8085/chat?input=你是谁@GetMapping("/chat")public String chat(String input) {return this.chatClient.prompt().user(input).call().content();}
}
另一种方式
//localhost:8085/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;
}
4.2.2 效果测试
运行上面的代码,调用一下接口进行测试
再用另一个接口测试一下
4.3 文生图模型能力
在大模型列表页面找到文生图,可以看到,平台上集成了多种文生图模型,可以根据自己的需要选择一种,本次以第一个模型为例进行说明。
点击API调用示例,进入到API调用文档页面,里面详细介绍了使用该模型的方法、参数等,可以点击进去进行深入研究
按照平台API文档提供的对接流程,主要提供了两种方式进行对接,HTTP方式,以及SDK的方式,接下来使用Java代码调用一下API的能力
4.3.1 Java HTTP 方式对接
http对接需要两步:
-
获取taskid;
-
根据taskid获取文生图结果;
可以将自己的apikey代入到示例中,然后通过burl命令进行两个步骤的调用,即可得到结果,参考下面的代码
获取taskid信息
private static final String DASHSCOPE_API_KEY = "你的apikey"; // 替换为你的 API 密钥private static final String URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis";private static final String TASK_URL = "https://dashscope.aliyuncs.com/api/v1/tasks/";//localhost:8085/generate/task
@GetMapping("/generate/task")
public Object generatePic() {String body = null;try {// 创建 HttpClient 实例HttpClient client = HttpClient.newHttpClient();// 构建请求体String requestBody = "{\n" +" \"model\": \"wanx-v1\",\n" +" \"input\": {\n" +" \"prompt\": \"少女,高分辨率,增加细节,细节强化,侧面视角,森林,奶油风,暖色调,精致的脸部比例,精细的裙子,五官立体,长卷发,极高分辨率,清晰度强化,全身像,微笑,五颜六色的花瓣飞舞,自然光\"\n" +" },\n" +" \"parameters\": {\n" +" \"style\": \"<auto>\", \n" +" \"size\": \"1024*1024\",\n" +" \"n\": 1\n" +" }\n" +"}";// 创建 HttpRequest 实例HttpRequest request = HttpRequest.newBuilder().uri(URI.create(URL)).header("X-DashScope-Async", "enable").header("Authorization", "Bearer " + DASHSCOPE_API_KEY).header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8)).build();// 发送请求并获取响应HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());// 打印响应System.out.println("Response status code: " + response.statusCode());body = response.body();System.out.println("Response body: " + body);} catch (Exception e) {e.printStackTrace();}return body;
}
调用一下接口,返回了taskid信息
根据taskid获取生成的图片
//localhost:8085/get/result?taskId=aff4ab60-7f7f-4c1a-9962-a29f6e535cd3
@GetMapping("/get/result")
public Object getTaskResult(String taskId){String result = null;try {// 创建 HttpClient 实例HttpClient client = HttpClient.newHttpClient();// 创建 HttpRequest 实例HttpRequest request = HttpRequest.newBuilder().uri(URI.create(TASK_URL + taskId)).header("Authorization", "Bearer " + DASHSCOPE_API_KEY).GET().build();// 发送请求并获取响应HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());// 打印响应System.out.println("Response status code: " + response.statusCode());result = response.body();System.out.println("Response body: " + result);} catch (Exception e) {e.printStackTrace();}return result;
}
调用一下接口,可以看到成功返回了执行结果
拷贝里面的url,将会下载一张图片,即本次生成的图片
4.3.2 SDK方式对接
API文档中也提供了SDK的方式进行对接,引入SDK,参考提供的示例代码
参考下面的完整代码
public static void basicCall() throws ApiException, NoApiKeyException {ImageSynthesis is = new ImageSynthesis();ImageSynthesisParam param =ImageSynthesisParam.builder().model(ImageSynthesis.Models.WANX_V1).n(4).size("1024*1024").prompt("雄鹰自由自在的在蓝天白云下飞翔").apiKey(DASHSCOPE_API_KEY).build();ImageSynthesisResult result = is.call(param);System.out.println(result);
}public static void listTask() throws ApiException, NoApiKeyException {ImageSynthesis is = new ImageSynthesis();AsyncTaskListParam param = AsyncTaskListParam.builder().apiKey(DASHSCOPE_API_KEY).build();ImageSynthesisListResult result = is.list(param);System.out.println(result);
}public void fetchTask() throws ApiException, NoApiKeyException {String taskId = "25278e6a-377b-47d6-91c1-e11d0eec233e";ImageSynthesis is = new ImageSynthesis();// If set DASHSCOPE_API_KEY environment variable, apiKey can null.ImageSynthesisResult result = is.fetch(taskId, "你的apikey");System.out.println(result.getOutput());System.out.println(result.getUsage());
}public static void main(String[] args){try{basicCall();listTask();}catch(ApiException|NoApiKeyException e){System.out.println(e.getMessage());}
}
五、阿里云百炼大模型平台使用
当下大模型厂商如火如荼的推出各自的大模型抢占市场,对于开发者来说,也是不错的学习和尝鲜的机会,可以借此体验到各个厂商大模型的最新功能,以阿里云百炼为例,在其平台上不仅集成了阿里自身的各类大模型能力,也提供了不少其他厂商的大模型能力使用的窗口,下面介绍如何快速使用百炼大模型平台的相关能力。
5.1 前置准备
5.1.1 登录平台
在上文中为了使用 Apring AI Alibaba的能力,也介绍了如何通过百炼大模型平台获取apkey的操作步骤,使用支付宝/钉钉/淘宝等账号登录百炼控制台,阿里云百炼主页:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
切换到左侧的模型广场,这里不仅列出了与通义千问大模型相关的最新能力,也提供了其他厂商大模型的使用入口
5.1.2 获取apikey
通过右上角的API-KEY入口点击进去
首次进入这里的列表是空的,点击创建一个即可展现在列表上,妥善保管这个APIKEY,后续在其他位置进行调用的时候会用到
5.1.3 开通大模型服务
如下,当你点击大模型列表中某一个进行体验时,会弹出一个让你开通服务的弹框,然后勾选这些大模型能力即可
-
平台会给登录的账户一定额度的调用次数,超过免费的额度之后,需要从账户扣费,所以需要确保账户上有金额即可;
同时,也可以进入到各个大模型查看其调用时的计费规则。新用户会免费赠送一定的使用额度,对于测试使用来说完全够用了
5.2 在线体验大模型能力
5.2.1 在线使用大模型对话能力
如下以通义千问-Max这个大模型为例,点击立即体验,跳转到下面的对话框,这个就与大家在使用通义千问网页版的时候能力类似;
5.2.2 http方式调用大模型对话能力
点击API调用示例
在这个页面,提供了关于调用通义千问-Max模型能力的API层面的详细说明,比如请求/响应参数、各个参数的含义,以及调用的代码参考示例
这里我们尝试使用HTTP的方式在线调用测试一下
如下,找个linux环境的shell窗口调用一下,可以看到能够正常的返回响应内容,后续只需要解析内容中的关键参数即可集成到项目中使用。
其他的大模型能力也是类似的使用方式,先申请开通服务,然后使用自己的apikey进行调用
5.3 Java http方式调用大模型能力
百炼平台中的很多大模型能力也提供了SDK或http的方式,方便应用程序接入,以Java代码为例进行说明。
5.3.1 文本输入对话能力
即类似于chatgpt那种你问我答的对话功能,上述演示了在线调用通义千问-Max模型能力,基于上述HTTP的调用方式,虽然控制台没有直接提供Java的调用API,我们可以直接通过http的方式进行集成调用,参考如下的代码:
package com.congge.tongyi;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import javax.tools.JavaCompiler;public class QianWenTest2 {public static void main(String[] args) {String requestUrl = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";String dashScopeApiKey = "你的apikey";try {URL url = new URL(requestUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("POST");// 请求头connection.setRequestProperty("Authorization", "Bearer " + dashScopeApiKey);connection.setRequestProperty("Content-Type", "application/json");// 设置允许输出connection.setDoOutput(true);// 构造请求参数String requestBody = "{\n" +" \"model\": \"qwen-plus\",\n" +" \"messages\": [\n" +" {\n" +" \"role\": \"system\",\n" +" \"content\": \"You are a helpful assistant.\"\n" +" },\n" +" {\n" +" \"role\": \"user\",\n" +" \"content\": \"写一段Java的Hello World的代码\"\n" +" }\n" +" ]\n" +"}";// 写入请求数据try (OutputStream os = connection.getOutputStream()) {byte[] input = requestBody.getBytes(StandardCharsets.UTF_8);os.write(input, 0, input.length);}// 获取响应码int responseCode = connection.getResponseCode();System.out.println("Response Code : " + responseCode);// 读取响应数据try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {StringBuilder response = new StringBuilder();String responseLine;while ((responseLine = br.readLine()) != null) {response.append(responseLine.trim());}System.out.println("Response Body: " + response.toString());}} catch (Exception e) {e.printStackTrace();}}}
运行上面的代码,通过控制台输出可以看到已经成功得到响应结果,后续只需要进一步封装该代码集成到项目即可使用。
5.3.2 图像输入与理解能力
即大模型对输入的图像进行解读
用官方的这个示例做一下测试,从响应结果来看,基本上理解是没问题的
5.3.3 文档理解能力
有时候我们需要大模型帮助理解一篇文档,从而写出概要或总结,此时就可以考虑使用大模型的文档理解能力。
如下,我们给出一本书,让大模型给出对这本书的纲要理解
六、写在文末
本文通过案例操作详细介绍了Spring AI Alibaba的使用,以及如何基于阿里云百炼大模型平台的模型能力使用,希望对看到的同学有用,本篇到此结束,感谢观看。