Spring AI 从文本到图像生成实战代码示例

后端 潘老师 2个月前 (02-20) 58 ℃ (0) 扫码查看

本文主要通过具体示例介绍Spring AI其图像生成的基础知识,以及如何借助OpenAI的DALL-E和Stability AI来实现从文本生成图像的功能。

一、添加Maven依赖

要在项目中使用Spring AI的图像生成功能,首先得添加相关的依赖。如果想用OpenAI的API来生成图像,那就添加spring-ai-openai-spring-boot-starter依赖。添加这个依赖后,Spring会自动把OpenAiImageClient配置成imageClient这个Bean。要是不想用它的自动配置,可以在配置文件里把spring.ai.openai.image.enabled属性设为false。添加依赖的代码如下:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

要是想用Stability AI的API,就得添加spring-ai-stability-ai-spring-boot-starter依赖。这个依赖会自动把imageClient配置成StabilityAiImageClient的实例。同样,如果不想用自动配置,把spring.ai.stabilityai.image.enabled属性设为false就行。依赖代码如下:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-stability-ai-spring-boot-starter</artifactId>
</dependency>

二、图像生成API解析

在Spring AI里,文本转图像功能涉及到不少类和接口,下面来详细介绍一下:

  • ImageModel:这是一个很关键的函数式接口,里面只有一个call(imagePrompt)方法,调用这个方法会返回ImageResponse,也就是图像生成的响应结果。
  • ImageMessage:它主要用来封装生成图像时用到的文本,以及这个文本对生成图像的影响权重。
  • ImagePrompt:把ImageMessage对象组成的列表,还有一些可选的请求参数封装在一起。
  • ImageOptions:存放那些要传给图像生成模型的可选请求参数。
  • ImageResponse:保存着AI模型的输出,里面可能包含由一个提示生成的多个图像生成结果。
  • ImageGeneration:代表单个图像生成结果的输出响应和相关元数据。
  • ImageGenerationMetadata:表示和单个ImageResponse相关的元数据。

ImageClient根据给定的文本或提示生成图像的一般语法是这样的:

// 创建ImageResponse对象,调用ImageModel的call方法,传入包含提示文本和图像选项的ImagePrompt
ImageResponse response = imageModel.call(
        new ImagePrompt("A cat chasing a mouse",
                ImageOptions.builder()
                        .withQuality("hd")
                        .withN(1)
                        .withHeight(1024)
                        .withWidth(1024)
                        .build())
);

三、创建ImageModel

Spring AI提供了两个实现ImageModel接口的类,分别用于不同的图像生成服务:

  • OpenAiImageModel:专门用来调用OpenAI的DALL-E生成图像。
  • StabilityAiImageModel:通过Stability AI来生成图像。

我们可以在应用的配置文件里创建ImageModel的Bean,根据项目的实际需求选择创建OpenAiImageModel还是StabilityAiImageModel的实例。下面是配置文件的示例代码:

import org.springframework.ai.image.ImageModel;
import org.springframework.ai.openai.OpenAiImageApi;
import org.springframework.ai.openai.OpenAiImageClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 配置类,用于定义Spring容器中的Bean
@Configuration 
public class AppConfiguration {
    // 根据需求定义其中一个Bean
    // 配置OpenAI的ImageModel Bean
    @Bean 
    ImageModel imageModel(@Value("${spring.ai.openai.api-key}") String apiKey) {
        // 创建OpenAiImageClient实例,传入OpenAiImageApi对象(包含API密钥)
        return new OpenAiImageClient(new OpenAiImageApi(apiKey)); 
    }
    // 配置Stability的ImageModel Bean(这里注释掉,根据实际需求启用)
    /*@Bean
    ImageModel imageModel(@Value("${spring.ai.stability.api-key}") String apiKey) {
        return new StabilityAiImageClient(new StabilityAiApi(apiKey));
    }*/
}

这里的API密钥是从application.properties文件里读取的,而application.properties里的值又是从环境变量获取的。这样做能避免把密钥写在源代码里,提高了应用的安全性。在application.properties文件里可以这样配置:

spring.ai.openai.api-key=${OPENAI_API_KEY}
# 或者
spring.ai.stability.api-key=${STABILITY_API_KEY}

四、图像生成控制器

接下来,我们写一个REST控制器。这个控制器的作用是接收用户输入,然后返回生成图像的URL。这样,调用API的人就能用这个URL在应用里或者浏览器里下载图像了。下面的例子展示了如何用OpenAI的图像生成API生成图像,在DALL-E 3模型里,一个输入文本只会生成一张图像。

import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImageOptionsBuilder;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

// 定义一个RestController,用于处理HTTP请求
@RestController 
public class OpenAiImageController {
    // 注入ImageModel实例
    private final ImageModel imageModel; 

    // 通过构造函数注入ImageModel
    public OpenAiImageController(ImageModel imageModel) {
        this.imageModel = imageModel;
    }

    // 处理GET请求,路径为/image-gen
    @GetMapping("/image-gen") 
    public String imageGen(@RequestParam String message) {
        // 创建ImageOptions对象,设置生成图像的模型、高度、宽度等参数
        ImageOptions options = ImageOptionsBuilder.builder()
              .withModel("dall-e-3")
              .withHeight(1024)
              .withWidth(1024)
              .build(); 

        // 创建ImagePrompt对象,传入提示文本和ImageOptions
        ImagePrompt imagePrompt = new ImagePrompt(message, options); 
        // 调用ImageModel的call方法生成图像,获取响应
        ImageResponse response = imageModel.call(imagePrompt); 
        // 获取生成图像的URL
        String imageUrl = response.getResult().getOutput().getUrl(); 

        // 返回重定向到图像URL的字符串
        return "redirect:" + imageUrl; 
    }
}

这段代码稍微改改也能用在Stability AI的API上,只需要把OpenAiImageClient换成StabilityAiImageClient就行,具体配置方法前面已经讲过了。

五、基础URL属性配置

默认情况下,图像生成使用的URL是由spring.ai.openai.image.base-urlspring.ai.stabilityai.base-url这两个属性的默认值决定的。要是想修改这个端点URL,可以在配置文件里覆盖这些属性。默认的URL如下:

spring.ai.openai.image.base-url=api.openai.com
# 或者
spring.ai.stabilityai.image.base-url=api.stability.ai/v1

除了这个,还有不少其他的图像生成属性,它们能控制我们的应用和OpenAI API或者Stability API之间的交互。如果想深入了解,可以去官方文档查看。

六、实例演示

现在来测试一下图像生成API。我们发送一个“一只猫在追一只老鼠”的提示,看看生成的图像怎么样。在浏览器地址栏输入http://localhost:8080/image-gen?message=A cat chasing a mouse,然后发送请求。
请求后,我们会得到一个生成图像的URL。把这个URL复制到浏览器地址栏里,就能看到生成的图像了。如果一切正常,说明我们成功地用Spring AI的OpenAI图像生成API,根据输入提示生成了图像。

七、总结

本文通过一个简洁的示例,详细介绍了Spring AI中与OpenAI和Stability AI相关的图像生成API的基础知识。不仅讲解了这些API的原理,还通过实际代码演示了它们的用法。在实例中,我们成功根据输入提示生成了图像,并对生成的图像进行了验证。希望大家通过本文的学习,能在图像生成开发中有所收获,要是遇到问题,欢迎一起交流探讨!

归属教程 Spring AI 快速入门教程汇总

文章目录 Spring AI是什么?有啥优势? 如何在项目中使用Spring AI? Spring AI详细功 […]


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/14815.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】