Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo

文章目录

  • [Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo](#Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo)

Spring AI Alibaba文生图实战:从零开始编写AI图片生成Demo

本文面向初学Spring AI Alibaba的开发者,手把手教你实现文生图功能。

本文将详细介绍如何使用 Spring AI Alibaba 框架快速集成阿里云百炼大模型服务,实现文生图(Text-to-Image)功能。通过本教程,你将学会创建一个简单的Spring Boot应用,只需几行代码就能让AI根据你的文字描述生成图片。

一、什么是文生图?

文生图是指通过文字描述生成对应图像的技术。在没有AI之前,要获得符合自己想法的图片通常需要自己绘制(需要美术功底)、拍照或付费请专业人士制作。而现在,借助AI大模型,我们只需将想法(提示词)告诉AI,程序就能生成相应的图片。

二、环境准备

1. 环境要求

在开始之前,请确保你的开发环境满足以下要求:

  • JDK 17及以上(本文使用JDK 17)
  • Spring Boot 3.x及以上(本文使用Spring Boot 3.5.7)
  • Maven 3.6及以上

2. 获取API Key

  1. 访问阿里云百炼平台并登录你的账号
  2. 开通"百炼大模型"服务(新用户通常有一定免费额度)
  3. 在控制台中生成API Key并保存

使用某个模型时,建议开启该模型的"免费额度用完即停"功能,防止测试中超额扣费。

三、创建Spring Boot项目

1. 初始化项目

访问 start.spring.io 快速创建项目,配置如下:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.5.7
  • Group: com.example
  • Artifact: spring-ai-demo
  • Java: 17
  • Dependencies: Spring Web

点击"Generate"下载项目压缩包并解压到本地。

2. 配置pom.xml

pom.xml中添加Spring AI Alibaba依赖和仓库配置:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.7</version>
        <relativePath/>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>spring-ai-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai-demo</name>
    
    <properties>
        <java.version>17</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter</artifactId>
            <version>1.0.0-M5.1</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!-- 添加Spring Milestones仓库 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

由于Spring AI相关依赖尚未发布到中央仓库,所以需要添加Spring Milestones仓库。

四、配置应用参数

  • 这里的API_KEY是上面获取的阿里云百炼的key

1. 配置API Key

src/main/resources/application.yml中添加配置:

yaml 复制代码
spring:
  application:
    name: spring-ai-demo
  ai:
    dashscope:
      api-key: ${AI_DASHSCOPE_API_KEY}
      image:
        options:
          model: qwen-image-edit-plus

安全提示:不建议将API Key直接写在代码中,可以通过环境变量设置:

Windows系统:

cmd 复制代码
set AI_DASHSCOPE_API_KEY=你的API_KEY

Mac/Linux系统:

bash 复制代码
export AI_DASHSCOPE_API_KEY=你的API_KEY

2. 可选模型配置

Spring AI Alibaba支持多种文生图模型,初期可免费使用,可以在配置文件中指定:

yaml 复制代码
spring:
  ai:
    dashscope:
      api-key: ${AI_DASHSCOPE_API_KEY}
      image:
        options:
          model: wan2.5-t2i-preview  # 可选模型

常用模型有:

  • wan2.5-i2i-preview
  • qwen-image-edit-plus
  • wan2.5-t2i-preview

五、实现文生图接口

1. 创建ImageController

创建ImageController.java文件,实现文生图功能:

java 复制代码
package com.example.spring_ai_demo.controller;

import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ai")
public class ImageController {
    
    private final ImageModel imageModel;

    public ImageController(ImageModel imageModel) {
        this.imageModel = imageModel;
    }

    @GetMapping("/image")
    public String generateImage(@RequestParam(value = "input", defaultValue = "一只在草地上玩耍的可爱小猫") String input) {
        ImagePrompt imagePrompt = new ImagePrompt(input);
        ImageResponse response = imageModel.call(imagePrompt);
        String imageUrl = response.getResult().getOutput().getUrl();
        
        return "redirect:" + imageUrl;
    }
}

2. 进阶版本:支持自定义参数

如需更多控制,可以使用ImageOptions自定义参数:

java 复制代码
package com.example.spring_ai_demo.controller;

import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.ai.image.ImageOptionsBuilder;
import org.springframework.ai.image.ImageOptions;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ai")
public class ImageModelController {
    
    private final ImageModel imageModel;

    public ImageModelController(ImageModel imageModel) {
        this.imageModel = imageModel;
    }

    @GetMapping("/image/advanced")
    public String generateImageAdvanced(
            @RequestParam String input,
            @RequestParam(defaultValue = "wan2.5-t2i-preview") String model,
            @RequestParam(defaultValue = "1024") int width,
            @RequestParam(defaultValue = "1024") int height) {
        
        ImageOptions options = ImageOptionsBuilder.builder()
                .model(model)
                .width(width)
                .height(height)
                .build();

        ImagePrompt imagePrompt = new ImagePrompt(input, options);
        ImageResponse response = imageModel.call(imagePrompt);
        String imageUrl = response.getResult().getOutput().getUrl();
        
        return "生成的图片URL: " + imageUrl + "<br><img src='" + imageUrl + "' alt='生成的图片'>";
    }
}

3. 直接返回图片的接口

如果需要直接返回图片数据,可以使用以下实现:

java 复制代码
@GetMapping("/image/direct")
public void generateImageDirect(
        @RequestParam String input, 
        HttpServletResponse response) throws IOException {
    
    ImageResponse imageResponse = imageModel.call(new ImagePrompt(input));
    String imageUrl = imageResponse.getResult().getOutput().getUrl();
    
    try (InputStream in = URI.create(imageUrl).toURL().openStream()) {
        response.setHeader("Content-Type", "image/png");
        response.getOutputStream().write(in.readAllBytes());
        response.getOutputStream().flush();
    }
}

完整ImageController代码

java 复制代码
package com.example.spring_ai_demo.controller;

import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.image.*;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

@RestController
@RequestMapping("/ai")
public class ImageController {

    private final ImageModel imageModel;

    public ImageController(ImageModel imageModel) {
        this.imageModel = imageModel;
    }

    @GetMapping("/image")
    public String generateImage(@RequestParam(value = "input", defaultValue = "一只在草地上玩耍的可爱小猫") String input) {
        ImagePrompt imagePrompt = new ImagePrompt(input);
        ImageResponse response = imageModel.call(imagePrompt);
        String imageUrl = response.getResult().getOutput().getUrl();

        return "redirect:" + imageUrl;
    }

    @GetMapping("/image/advanced")
    public String generateImageAdvanced(
            @RequestParam String input,
            @RequestParam(defaultValue = "wan2.5-t2i-preview") String model,
            @RequestParam(defaultValue = "1024") int width,
            @RequestParam(defaultValue = "1024") int height) {

        ImageOptions options = ImageOptionsBuilder.builder()
                .model(model)
                .width(width)
                .height(height)
                .build();

        ImagePrompt imagePrompt = new ImagePrompt(input, options);
        ImageResponse response = imageModel.call(imagePrompt);
        String imageUrl = response.getResult().getOutput().getUrl();

        return "生成的图片URL: " + imageUrl + "<br><img src='" + imageUrl + "' alt='生成的图片'>";
    }

    @GetMapping("/image/direct")
    public void generateImageDirect(
            @RequestParam String input,
            HttpServletResponse response) throws IOException {

        ImageResponse imageResponse = imageModel.call(new ImagePrompt(input));
        String imageUrl = imageResponse.getResult().getOutput().getUrl();

        try (InputStream in = URI.create(imageUrl).toURL().openStream()) {
            response.setHeader("Content-Type", "image/png");
            response.getOutputStream().write(in.readAllBytes());
            response.getOutputStream().flush();
        }
    }
}

六、创建应用启动类

确保在项目中有Spring Boot启动类:

java 复制代码
package com.example.spring_ai_demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringAiDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringAiDemoApplication.class, args);
        System.out.println("============== Spring AI Demo启动成功 ==============");
        System.out.println("============== 文生图测试地址: http://localhost:8080/ai/image?input=你的提示词 ==============");
    }
}

七、运行和测试

1. 启动应用

直接在IDE中运行SpringAiDemoApplication类。

2. 测试文生图功能

由于大模型生产需要时间,所以接口返回时间较长,调用接口后请耐心等待!!!

打开浏览器,访问以下地址进行测试:

复制代码
http://localhost:8080/ai/image?input=一只在太空站穿宇航服的猫

调用效果如下:
或者使用自定义参数版本:

复制代码
http://localhost:8080/ai/image/advanced?input=冬天的梅花&model=wan2.5-t2i-preview&width=1024&height=1024

调用效果如下:

3. 提示词技巧

为了提高生成图片的质量,可以尝试以下提示词技巧:

  • 具体描述:"一只在草地上玩耍的橘色小猫,阳光明媚,背景有花朵"
  • 风格指定:"水彩画风格,一座被樱花环绕的日本传统寺庙"
  • 细节描述:"富有科技感的未来城市,飞行汽车,霓虹灯光,赛博朋克风格"

八、常见问题及解决方案

1. 依赖解析失败

如果出现依赖解析错误,请确保:

  • 已正确配置Spring Milestones仓库
  • 使用的是推荐的Spring Boot和JDK版本

2. API Key错误

如果遇到认证错误:

  • 检查API Key是否正确设置
  • 确认百炼大模型服务已开通
  • 验证API Key是否有足够的余额或免费额度

3. 生成时间较长

文生图功能可能需要一定时间(通常30-70秒),这是正常现象。

4. 同步与异步调用

本文示例使用的是同步调用方式,Spring AI Alibaba也支持异步调用,适合生成时间较长的场景。

九、核心原理简介

Spring AI Alibaba通过以下组件实现文生图功能:

  1. ImageModel:抽象的图像生成模型接口
  2. ImagePrompt:封装输入提示词和参数
  3. ImageResponse:包含生成结果的响应

框架自动装配了与阿里云百炼服务通信的组件,开发者只需关注业务逻辑。

十、总结

通过本教程,你已成功实现了:

  • ✅ 创建Spring Boot项目并集成Spring AI Alibaba
  • ✅ 配置阿里云百炼大模型服务
  • ✅ 实现文生图接口
  • ✅ 通过HTTP API生成图片

完整项目结构

复制代码
spring-ai-demo
├── src/main/java
│   └── com/example/spring_ai_demo
│       ├── controller
│       │   └── ImageController.java
│       └── SpringAiDemoApplication.java
├── src/main/resources
│   └── application.yml
└── pom.xml

现在你可以继续探索Spring AI的更多功能,如文本生成、语音合成等多模态AI能力。尝试不同的提示词,发挥创造力,让你的应用更具智能化!

参考资源

希望本教程对你有所帮助,如有问题欢迎在评论区讨论!

相关推荐
未知数Tel23 分钟前
Dify离线安装插件
python·阿里云·pip·dify
热爱专研AI的学妹43 分钟前
【搭建工作流教程】使用数眼智能 API 搭建 AI 智能体工作流教程(含可视化流程图)
大数据·数据库·人工智能·python·ai·语言模型·流程图
dylanstudy2 小时前
【Droidrun自然语言控制Android和iOS设备】
ai·智能手机·系统架构
咕噜企业分发小米2 小时前
阿里云与华为云基因测序数据分析性能对比?
阿里云·华为云·云计算
阿杰学AI2 小时前
AI核心知识62——大语言模型之PRM (简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·aigc·prm·过程奖励模型
探索宇宙真理.2 小时前
Langflow CORS链式漏洞 | CVE-2025-34291 复现&研究
经验分享·ai·安全漏洞·cors
梁萌3 小时前
idea使用AI插件(CodeGeeX)
java·ide·ai·intellij-idea·插件·codegeex
阿里云大数据AI技术4 小时前
Hologres Dynamic Table:高效增量刷新,构建实时统一数仓的核心利器
大数据·人工智能·阿里云·实时数仓·hologres
吴爃4 小时前
N8N调用系统接口进行AI分析
运维·人工智能·ai
tokepson4 小时前
反向传播
深度学习·算法·ai·反向传播