【AI大模型】基于阿里百炼大模型进行调用

news2025/4/19 9:02:49

目录

一、认识阿里云百炼

模型广场

创建自己的模型

二、AI扩图示例

1、开头服务、设置秘钥

2、选择HTTP方式调用流程

3、创建任务请求示例

4、发送http请求提交任务

5、查看任务进度的流程设计

6、后端查看任务进度代码 

三、总结 


        大家好,我是jstart千语。今天来给大家如何给系统接入AI大模型,让我们的系统可以增加AI功能。本篇主要是依赖阿里云百炼来讲解,因为它有丰富的模型和应用,也可以自定义一个应用发布,然后调用API使用自己的模型。本篇以AI扩图为例给大家讲解。

一、认识阿里云百炼

模型广场

官网地址:阿里云百炼https://bailian.console.aliyun.com/#/home

模型广场地址:阿里云百炼https://bailian.console.aliyun.com/?tab=model#/model-market

可以看到有非常多现成的模型可以使用,可以根据自己的业务功能选一个来实现

创建自己的模型

(1)登录后还可以创建自己的应用:

(2)创建好应用后,要选择一个模型:


(3)模型示例,点击右上发布


(4)这里通过官方文档学习调用,这里就不展开讲了



二、AI扩图示例

官方文档:阿里云百炼https://bailian.console.aliyun.com/?tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2796845.html

1、开头服务、设置秘钥

可自行查看官方文档,申请一个秘钥非常简单,但记得秘钥不要暴露。之后还要放在配置文件里,然后读取

秘钥官方文档:阿里云百炼https://bailian.console.aliyun.com/?tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2712195.html


2、选择HTTP方式调用流程

调用大模型可以使用sdk调用和使用http调用,这里我们选择的是发送http请求的方式调用

1. 根据官方文档得知,只需要向官方指定的路径,携带图片的地址、以及个人秘钥和其他相关请求头即可发送http请求,创建一个扩图任务,任务创建成功后,会返回一个任务id


2. 任务完成后,不会主动向我们响应,我们需要携带用户id反复地询问官方文档指定的地址,看任务有没有完成,如果任务完成了,就会返回图片地址


3、创建任务请求示例

请求参数具体表示什么请看官方文档:阿里云百炼

部分请求参数解释:

注意,虽然这个http请求只支持异步,但还是要显示地设置。这样做的好处是便于后期扩展,如果后面又支持同步调用了,那么只需要改一下参数即可。而且,这样也可以让开发者清楚这是一个异步请求,更好理解。


请求实体示例:

@Data
public class CreateOutPaintingTaskRequest implements Serializable {

    /**
     * 模型,例如 "image-out-painting"
     */
    private String model = "image-out-painting";

    /**
     * 输入图像信息
     */
    private Input input;

    /**
     * 图像处理参数
     */
    private Parameters parameters;

    @Data
    public static class Input {
        /**
         * 必选,图像 URL
         */
        @Alias("image_url")
        private String imageUrl;
    }

    @Data
    public static class Parameters implements Serializable {
        /**
         * 可选,逆时针旋转角度,默认值 0,取值范围 [0, 359]
         */
        private Integer angle;

        /**
         * 可选,输出图像的宽高比,默认空字符串,不设置宽高比
         * 可选值:["", "1:1", "3:4", "4:3", "9:16", "16:9"]
         */
        @Alias("output_ratio")
        private String outputRatio;

        /**
         * 可选,图像居中,在水平方向上按比例扩展,默认值 1.0,范围 [1.0, 3.0]
         */
        @Alias("x_scale")
        @JsonProperty("xScale")
        private Float xScale;

        /**
         * 可选,图像居中,在垂直方向上按比例扩展,默认值 1.0,范围 [1.0, 3.0]
         */
        @Alias("y_scale")
        @JsonProperty("yScale")
        private Float yScale;

        /**
         * 可选,在图像上方添加像素,默认值 0
         */
        @Alias("top_offset")
        private Integer topOffset;

        /**
         * 可选,在图像下方添加像素,默认值 0
         */
        @Alias("bottom_offset")
        private Integer bottomOffset;

        /**
         * 可选,在图像左侧添加像素,默认值 0
         */
        @Alias("left_offset")
        private Integer leftOffset;

        /**
         * 可选,在图像右侧添加像素,默认值 0
         */
        @Alias("right_offset")
        private Integer rightOffset;

        /**
         * 可选,开启图像最佳质量模式,默认值 false
         * 若为 true,耗时会成倍增加
         */
        @Alias("best_quality")
        private Boolean bestQuality;

        /**
         * 可选,限制模型生成的图像文件大小,默认值 true
         * - 单边长度 <= 10000:输出图像文件大小限制为 5MB 以下
         * - 单边长度 > 10000:输出图像文件大小限制为 10MB 以下
         */
        @Alias("limit_image_size")
        private Boolean limitImageSize;

        /**
         * 可选,添加 "Generated by AI" 水印,默认值 true
         */
        @Alias("add_watermark")
        private Boolean addWatermark = false;
    }
}

解释:

  1. 添加了@Alias注解的属性表示进行json转换时转换成的名字,但这个注解只对使用hutool工具包时生效,springMVC转换不受影响。
  2. xScale和yScale属性上面加上了类似@JsonProperty("yScale")的注解,是因为这个属性的名字比较特殊:第二个字母是大写开头的属性名。这样的属性springMVC不会映射得到,也就是在携带的请求参数中,即使给yScale赋值了,yScale实际上也是没有值的,需要添加@JsonProperty("yScale")注解来解决。


4、发送http请求提交任务

具体代码: 

@Slf4j
@Component
public class AliYunAiApi {

    // 读取配置文件(事先在配置文件中,按这个路径配置好)
    @Value("${aliYunAi.apiKey}")
    private String apiKey;

    // 创建任务地址
    public static final String CREATE_PICTURE_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting";



    //创建扩图任务
    public CreateOutPaintingTaskResponse createOutPaintingTask(CreateOutPaintingTaskRequest createOutPaintingTaskRequest) {
        
        //...一下校验逻辑

        // 发送请求
        HttpRequest httpRequest = HttpRequest.post(CREATE_OUT_PAINTING_TASK_URL)
                .header(Header.AUTHORIZATION, "Bearer " + apiKey)
                // 必须开启异步处理,设置为enable。
                .header("X-DashScope-Async", "enable")
                .header(Header.CONTENT_TYPE, ContentType.JSON.getValue())
                .body(JSONUtil.toJsonStr(createOutPaintingTaskRequest));
        try (HttpResponse httpResponse = httpRequest.execute()) {
            if (!httpResponse.isOk()) {
                log.error("请求异常:{}", httpResponse.body());
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 扩图失败");
            }
            CreateOutPaintingTaskResponse response = JSONUtil.toBean(httpResponse.body(), CreateOutPaintingTaskResponse.class);
            String errorCode = response.getCode();
            if (StrUtil.isNotBlank(errorCode)) {
                String errorMessage = response.getMessage();
                log.error("扩图失败,errorCode:{}, errorMessage:{}", errorCode, errorMessage);
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 扩图接口响应异常");
            }
            return response;
        }
    }
}

这里使用hutool 发送了http请求,并且根据官方文档的响应示例,编写响应实体来接受http请求发送后获取的响应体。

注意:创建任务的响应体根据创建成功或异常,返回的响应体是不同,那我们后端直接把这两个不同的响应体的字段合并成一个响应实体即可。返回响应体时,直接判断code字段有没有值,如果有值,说明出现异常了。如果响应成功,会返回一个任务id,这个任务id非常重要,后面要根据这个任务id,来查询这个任务是否已经完成

创建任务时的响应实体:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CreateOutPaintingTaskResponse {

    private Output output;

    /**
     * 表示任务的输出信息
     */
    @Data
    public static class Output {

        /**
         * 任务 ID
         */
        private String taskId;

        /**
         * 任务状态
         *     PENDING:排队中
         *     RUNNING:处理中
         *     SUSPENDED:挂起
         *     SUCCEEDED:执行成功
         *     FAILED:执行失败
         *     UNKNOWN:任务不存在或状态未知
         */
        private String taskStatus;
    }

    /**
     * 接口错误码。
     * 接口成功请求不会返回该参数。
     */
    private String code;

    /**
     * 接口错误信息。
     *接口成功请求不会返回该参数。
     */
    private String message;

    /**
     * 请求唯一标识。
     * 可用于请求明细溯源和问题排查。
     */
    private String requestId;

}


5、查看任务进度的流程设计

如果提交了很多任务,任务可能会阻塞,同一时间只有一个任务正在被执行,在查看任务进度时,这个任务未必就已经完成能拿到新的图片url。所以我们要不断地发送请求,知道能拿到新图片的url为止,即轮询。

业务有关的问题:前端向AI服务器发送请求询问,还是后端发送请求?

是前端不停地请求AI服务器还是后端不停地请求AI服务器?从这个业务来讲,一定是后端发送请求的,因为要涉及到一个API的key,总不能把key保存到前端吧。即使是先请求后端获取到key再通过前端请求AI服务器也是不妥的,因为前端不能实时保存任务,如果用户刷新了界面,那任务就可能丢失了。所以使用后端来调用AI服务器更加合适一些。

关于轮询:在开发时是前端轮询还是后端轮询呢?

  • 前端轮询:前端每隔一定时间,向后端发送请求询问,然后后端向AI服务器发送请求。
  • 后端轮询:前端只需要发送一次请求给后端,后端通过定时给AI服务器发送请求询问。

使用后端轮询的话比较占用线程,容易阻塞,比如前端发送了四五十个请求,那么这四五十个线程都要阻塞等待AI服务器返回结果才能响应给前端,资源容易耗尽,性能不好。所以我们使用的是前端轮询。


6、后端查看任务进度代码 

查看任务进度的响应实体:阿里云百炼https://bailian.console.aliyun.com/?tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2796845.html

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GetOutPaintingTaskResponse {

    /**
     * 请求唯一标识
     */
    private String requestId;

    /**
     * 输出信息
     */
    private Output output;

    /**
     * 表示任务的输出信息
     */
    @Data
    public static class Output {

        /**
         * 任务 ID
         */
        private String taskId;

        /**
         * 任务状态
         *     PENDING:排队中
         *     RUNNING:处理中
         *     SUSPENDED:挂起
         *     SUCCEEDED:执行成功
         *     FAILED:执行失败
         *     UNKNOWN:任务不存在或状态未知
         */
        private String taskStatus;

        /**
         * 提交时间
         * 格式:YYYY-MM-DD HH:mm:ss.SSS
         */
        private String submitTime;

        /**
         * 调度时间
         * 格式:YYYY-MM-DD HH:mm:ss.SSS
         */
        private String scheduledTime;

        /**
         * 结束时间
         * 格式:YYYY-MM-DD HH:mm:ss.SSS
         */
        private String endTime;

        /**
         * 输出图像的 URL
         */
        private String outputImageUrl;

        /**
         * 接口错误码
         * <p>接口成功请求不会返回该参数</p>
         */
        private String code;

        /**
         * 接口错误信息
         * <p>接口成功请求不会返回该参数</p>
         */
        private String message;

        /**
         * 任务指标信息
         */
        private TaskMetrics taskMetrics;
    }

    /**
     * 表示任务的统计信息
     */
    @Data
    public static class TaskMetrics {

        /**
         * 总任务数
         */
        private Integer total;

        /**
         * 成功任务数
         */
        private Integer succeeded;

        /**
         * 失败任务数
         */
        private Integer failed;
    }
}

 后端发送查询任务进度的http请求:
 

@Slf4j
@Component
public class AliYunAiApi {
    // 读取配置文件
    @Value("${aliYunAi.apiKey}")
    private String apiKey;

 
    // 查询任务状态
    public static final String GET_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/tasks/%s";

    

    /**
     * 查询创建的任务
     */
    public GetOutPaintingTaskResponse getOutPaintingTask(String taskId) {
        if (StrUtil.isBlank(taskId)) {
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "任务 id 不能为空");
        }
        try (HttpResponse httpResponse = HttpRequest.get(String.format(GET_TASK_URL, taskId))
                .header(Header.AUTHORIZATION, "Bearer " + apiKey)
                .execute()) {
            if (!httpResponse.isOk()) {
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "获取任务失败");
            }
            return JSONUtil.toBean(httpResponse.body(), GetOutPaintingTaskResponse.class);
        }
    }
}



三、总结 

        至此,我们就完成了调用AI大模型的工作了 ,接下来就只剩测试。其实也就是在后端发送http请求的过程,主要的设计是在轮询这方面。总体来看还是非常简单的 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【神经网络结构的组成】深入理解 转置卷积与转置卷积核

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 …

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus]&#xff08;简称 MP&#xff09;是一个 [MyBatis]的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis-plus总结&#xff1a; 注意&#xff1a;mybatis-puls仅局限于单表操作。 自动生成单表的C…

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法&#xff0c;超级快&#xff01; 上图左侧是我的原文档&#xff0c;右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型&#xff0c;然后本地模型生成有关问题&#xff0c;并基于文…

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c…

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档&#xff1a;https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…

Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程

在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ ​ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…

关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析

以下是关于 JDK 中的 jce.jar 的详细解析&#xff0c;涵盖其作用、内容、历史背景及使用注意事项&#xff1a; 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库&#xff0c;提供 加密算法支持&#xff0c;包括&#xff1a; 对称加密&…

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新一个对象时&#xff0c;你需要创建一个新的对象&#xff08;或者将其拷贝一份&#xff09;…

算法思想之模拟

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之模拟 发布时间&#xff1a;2025.4.14 隶属专栏&#xff1a;算法 目录 算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路代码实现…

测试基础笔记第四天(html)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签&#xff08;变形金刚&#xff09;form标签列表标签 htm…

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …

十九、UDP编程和IO多路复用

1、UDP编程 服务端&#xff1a; #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…

DeepSeek使用001:Word中配置DeepSeek AI的V3和R1模型

文章目录 Word中配置DeepSeek大模型1、勾选开发工具2、信任中心设置3、添加DeepSeek-V3模型4、获取API KEY5、添加DeepSeek-R1模型6、新建组7、测试使用 Word中配置DeepSeek大模型 1、勾选开发工具 打开【选项】 选择【自定义功能区】 2、信任中心设置 打开【信任中心】&…

华为OD机试真题——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 华为OD机试真题《攀登者2》&#xff1a; 目录 题目名称&#xff1a;攀登者2…

Windows卸载重装Docker

卸载 删除C:\Program Files\Docker &#xff0c;如果更改了路径的就找到相关位置进行删除 删除 C:\Users\<用户名>\.docker 清理注册表&#xff0c;不然重装会报错 Exising installation is up to date 按下WindowR唤起命令输入界面&#xff0c;输入regedit打开注…

双目视觉中矩阵等参数说明及矫正

以下是标定文件中各个参数的详细解释&#xff1a; 1. 图像尺寸 (imageSize) 参数值: [1280, 1024]含义: 相机的图像分辨率&#xff0c;宽度为1280像素&#xff0c;高度为1024像素。 2. 相机内参矩阵 (leftCameraMatrix / rightCameraMatrix) 结构: yaml data: [fx, 0, cx, 0,…

PyTorch核心函数详解:gather与where的实战指南

PyTorch中的torch.gather和torch.where是处理张量数据的关键工具&#xff0c;前者实现基于索引的灵活数据提取&#xff0c;后者完成条件筛选与动态生成。本文通过典型应用场景和代码演示&#xff0c;深入解析两者的工作原理及使用技巧&#xff0c;帮助开发者提升数据处理的灵活…

Go:接口

接口既约定 Go 语言中接口是抽象类型 &#xff0c;与具体类型不同 &#xff0c;不暴露数据布局、内部结构及基本操作 &#xff0c;仅提供一些方法 &#xff0c;拿到接口类型的值 &#xff0c;只能知道它能做什么 &#xff0c;即提供了哪些方法 。 func Fprintf(w io.Writer, …