如何在5步内使用 Spring AI 和 OpenAI 的 DALL-E 3 生成图像

embedded/2025/2/5 3:42:33/

将 Spring AI 与 OpenAI 的 DALL-E 3 集成,以生成图像。轻松设置 Spring Boot、配置 API 集成并自定义设置。

大家好!这是关于 Spring AI 系列介绍文章的第一篇。今天,我们将了解如何通过文本提示轻松生成图片。为此,我们将利用 OpenAI API 和 DALL-E 3 模型。

在本文中,我将跳过一些 Spring 基础概念的讲解,比如 Bean 管理、启动器等,因为本文的主要目的是探索 Spring AI 的功能。同样,我也不会详细介绍如何生成 OpenAI API 密钥。

前提条件

如果你还没有有效的 OpenAI API 密钥,请按以下步骤操作:

  1. OpenAI 上创建一个账户。
  2. 在 API 密钥页面生成令牌。

步骤 1:设置项目

要快速生成包含所有必要依赖项的项目模板,可以使用https://start.spring.io/ 。

在我的示例中,我将使用 Java 17 和 Spring Boot 3.4.1。我们还需要包含以下依赖项:

  • Spring WEB:该依赖项使我们能够创建一个 Web 服务器,并将 REST 端点作为应用程序的入口点公开。
  • OpenAI:通过编写几行代码和配置,这个依赖项能让我们顺利地与 OpenAI 集成。

点击生成后,在你使用的 IDE 中打开下载的文件,并确认pom.xml中存在所有必要的依赖项。

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

步骤 2:设置配置文件

接下来,我们需要配置属性文件。默认情况下,Spring 使用application.yaml或application.properties文件。在这个示例中,我将使用 yaml 格式。如果你更习惯使用.properties 格式,可以将代码重新格式化为.properties文件。

我们需要在application.yaml文件中添加以下所有配置:

spring:ai:openai:api-key: [你的OpenAI API密钥]image:options:model: dall-e-3size: 1024x1024style: vividquality: standardresponse-format: url
  • 模型:在撰写本文时,Spring AI 中唯一可用的模型是dall-e-3,所以我们将使用它。
  • 尺寸:用于配置生成图像的大小。对于 dall-e-3 模型,它必须是1024x1024、1792x1024或1024x1792中的一种。
  • 风格:vivid风格会生成更超现实的图像。如果你希望图片看起来更真实,可以将值设置为natural。
  • 质量:有两个选项,standard(标准)或HD(高清)。
  • 响应格式:有两个选项,url和b64_json。为了演示方便,我将使用 URL。生成后,图像将在一小时内通过 URL 可用。

步骤 3:创建 ImageGenerationService

让我们创建一个负责生成图像的服务。

java">@Service
public class ImageGenerationService {@AutowiredImageModel imageModel;public String generateImage(String prompt) {ImagePrompt imagePrompt = new ImagePrompt(prompt);ImageResponse imageResponse = imageModel.call(imagePrompt);return imageResponse.getResult().getOutput().getUrl();}
}

我们创建了一个新类,并将其标注为Service。我们还自动注入了ImageModel Bean。

ImageModel是用于生成图片的主要接口。由于我们在步骤 2 中提供了所有必要的配置,Spring Boot Starter 会自动为我们生成这个接口的一个实现类OpenAiImageModel。

配置好类后,我们可以开始实现一个方法,该方法调用 OpenAI API,使用我们的提示生成图片。这就是 Spring AI 真正神奇的地方。让我们来看看。

使用 Spring AI 生成图像实际上只需要三行代码。是不是很神奇?

第一步,我们通过提供一个字符串提示创建了一个新的ImagePrompt。

接下来,我们使用imageModel.call(imagePrompt)进行 API 调用,并将响应存储在ImageResponse变量中。

最后一步,我们返回生成图像的 URL。请记住,图像仅在一小时内可用;之后,链接将不再可用。所以别忘了保存你的杰作!

在这里插入图片描述

步骤 4:创建 ImageGenerationController 来运行代码

我们需要创建最后一个文件,以便用户执行我们的集成。它可能如下所示:

java">@RestController()
@RequestMapping("/image")
public class ImageGenerationController {@AutowiredImageGenerationService imageService;@GetMapping("/generate")public ResponseEntity<String> generateImage(@RequestParam String prompt) {return ResponseEntity.ok(imageService.generateImage(prompt));}
}

如你所见,我们创建了一个简单的控制器,其中只有一个 GET 端点。这个端点将在
localhost:8080/image/generate可用。

步骤 5:运行应用程序

要启动我们的应用程序,需要运行以下命令:

mvn spring-boot:run

应用程序运行后,我们可以通过执行以下 curl 命令(使用你想要的任何提示)来查看结果。我使用的是:“Cute cat playing chess”。如果你使用命令行调用端点,别忘了用%20代替空格:

curl -X GET "http://localhost:8080/image/generate?prompt=Cute%20cat%20playing%20chess"

执行后,等待几秒钟,因为 OpenAI 生成图像需要一些时间。

恭喜!你刚刚创建并测试了你的第一个 Spring AI 应用程序,它可以使用自定义提示生成图像!

步骤 6:在生成图像时提供更多灵活性(可选)

在第二步中,我们为模型配置了默认行为,并在application.yaml文件中提供了所有必要的配置。但是,我们能否为用户提供更多灵活性,让他们自行提供配置呢?答案是肯定的!

要做到这一点,我们需要使用ImageOptions接口。

以下是一个示例:

java">public String generateImage(GenerateImageRequest imageRequest) {ImageOptions options = OpenAiImageOptions.builder().withQuality("standard").withStyle("vivid").withHeight(1024).withWidth(1024).withResponseFormat("url").build();ImagePrompt imagePrompt = new ImagePrompt(imageRequest.getPrompt(), options);ImageResponse imageResponse = imageModel.call(imagePrompt);return imageResponse.getResult().getOutput().getUrl();
}

为了实现这一点,我们需要使用在application.yaml中设置的所有配置以编程方式构建选项,并在创建ImagePrompt对象时提供这些选项。你可以在 Spring AI 文档中找到更多配置选项。

结论

Spring AI 是一个很棒的工具,它帮助开发人员顺利地与不同的 AI 模型集成。在撰写本文时,Spring AI 支持五种图像模型,包括但不限于 Azure AI 和 Stability。

希望本文对你有所帮助,并能激发你更深入地探索 Spring AI。


http://www.ppmy.cn/embedded/159646.html

相关文章

Go优雅实现redis分布式锁

前言 系统为了保证高可用&#xff0c;通常会部署多实例&#xff0c;并且会存在同时对共享资源并发读写&#xff0c;这时候为了保证读写的安全&#xff0c;常规手段是会引入分布式锁&#xff0c;本文将介绍如何使用redis设计一个优雅的Go分布式锁。 设计 redis分布式锁是借助…

Golang —协程池(panjf2000/ants/v2)

Golang —协程池&#xff08;panjf2000/ants/v2&#xff09; 1 ants1.1 基本信息1.2 ants 是如何运行的&#xff08;流程图&#xff09; 1 ants 1.1 基本信息 代码地址&#xff1a;github.com/panjf2000/ants/v2 介绍&#xff1a;ants是一个高性能的 goroutine 池&#xff0c…

YOLOV11-1:YoloV11-安装和CLI方式训练模型

YoloV11-安装和CLI方式训练模型 1.安装和运行1.1安装的基础环境1.2安装yolo相关组件1.3命令行方式使用1.3.1 训练1.3.2 预测 本文介绍yoloV11的安装和命令行接口 1.安装和运行 1.1安装的基础环境 GPU环境&#xff0c;其中CUDA是12.4版本 1.2安装yolo相关组件 # 克隆github…

深度解析近期爆火的 DeepSeek

最近&#xff0c;AI 领域有个名字频繁出现在大众视野 ——DeepSeek&#xff0c;它的火爆程度就像一颗投入平静湖面的巨石&#xff0c;激起千层浪。今天&#xff0c;咱们就来深入了解一下这个 “AI 新星”。 官网&#xff1a;DeepSeek - 探索未至之境 DeepSeek 是什么 DeepSeek…

C++并发编程指南04

文章目录 共享数据的问题3.1.1 条件竞争双链表的例子条件竞争示例恶性条件竞争的特点 3.1.2 避免恶性条件竞争1. 使用互斥量保护共享数据结构2. 无锁编程3. 软件事务内存&#xff08;STM&#xff09; 总结互斥量与共享数据保护3.2.1 互斥量使用互斥量保护共享数据示例代码&…

JavaScript语言的面向对象编程

JavaScript语言的面向对象编程 引言 面向对象编程&#xff08;OOP&#xff09;是一种以对象为中心的程序设计思想&#xff0c;旨在通过将数据和操作数据的行为组合在一起&#xff0c;提高代码的可重用性、可维护性和可扩展性。而JavaScript作为一种强大的脚本语言&#xff0c…

go-zero学习笔记(二)

利用goctl生成api服务 编写api文件 //版本信息&#xff0c; import中的版本信息必须与被import的api版本信息一样 syntax"v1"// 支持引入其他api文件 // 这在多接口下非常有用 // 如果不可以引入&#xff0c;对于多接口情况&#xff0c;所有的接口写在同一个文件&…

嵌入式C语言:大小端详解

目录 一、大小端的概念 1.1. 大端序&#xff08;Big-endian&#xff09; 1.2. 小端序&#xff08;Little-endian&#xff09; 二、大小端与硬件体系的关系 2.1. 大小端与处理器架构 2.2. 大小端与网络协议 2.3. 大小端对硬件设计的影响 三、判断系统的大小端方式 3.1.…