一、前言
随着各大厂商都在大模型领域布局,各种编程语言也在积极降低对接大模型的成本,可以肯定的是,在大模型能力和生态渐臻完善的情况下,接下来就是在应用层的接入、商用和市场化进程,基于此,以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: 8085
spring:
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的使用,以及如何基于阿里云百炼大模型平台的模型能力使用,希望对看到的同学有用,本篇到此结束,感谢观看。
版权归原作者 小码农叔叔 所有, 如有侵权,请联系我们删除。