Spring AI 从文本到图像生成实战代码示例
本文主要通过具体示例介绍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-url
或spring.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的原理,还通过实际代码演示了它们的用法。在实例中,我们成功根据输入提示生成了图像,并对生成的图像进行了验证。希望大家通过本文的学习,能在图像生成开发中有所收获,要是遇到问题,欢迎一起交流探讨!