java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring AI Alibaba百炼平台大模型

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

作者:小码农叔叔

本文详细介绍了SpringAIAlibaba框架及其在阿里云百炼大模型平台上的应用,通过SpringBoot对接SpringAIAlibaba,可以快速实现与通义系列大模型的对接,包括对话模型、文生图、文本分类、图像识别等能力,文章还提供了具体的代码示例和操作步骤

一、前言

随着各大厂商都在大模型领域布局,各种编程语言也在积极降低对接大模型的成本,可以肯定的是,在大模型能力和生态渐臻完善的情况下,接下来就是在应用层的接入、商用和市场化进程,基于此,以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提供的主要功能如下:

2.3 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相关的大模型能力,比如通义系列的大模型产品,具体来说,其具备如下特点:

3.3 Spring AI Alibaba 应用场景

Spring AI Alibaba在下面的场景下可以考虑使用:

四、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对接需要两步:

可以将自己的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的使用,以及如何基于阿里云百炼大模型平台的模型能力使用,希望对看到的同学有用,本篇到此结束,感谢观看。

到此这篇关于Spring AI Alibaba 对接百炼平台大模型使用详解的文章就介绍到这了,更多相关Spring AI Alibaba百炼平台大模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文