0


【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解

一、前言

随着各大厂商都在大模型领域布局,各种编程语言也在积极降低对接大模型的成本,可以肯定的是,在大模型能力和生态渐臻完善的情况下,接下来就是在应用层的接入、商用和市场化进程,基于此,以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的使用,以及如何基于阿里云百炼大模型平台的模型能力使用,希望对看到的同学有用,本篇到此结束,感谢观看。


本文转载自: https://blog.csdn.net/zhangcongyi420/article/details/143452747
版权归原作者 小码农叔叔 所有, 如有侵权,请联系我们删除。

“【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解”的评论:

还没有评论