1. 概述
人工智能正在改變我們構建 Web 應用程序的方式。人工智能的一個激動人心的應用是從文本描述生成圖像。OpenAI 的 DALL·E 3 是一個流行的文本到圖像模型,幫助我們實現這一目標。
在本教程中,我們將探索如何使用 Spring AI 生成圖像,利用 OpenAI 的 DALL·E 3 模型。
要遵循本教程,我們需要一個 OpenAI API 密鑰。
2. 項目設置
為了開始生成 AI 圖像,我們需要包含 Spring Boot starter 依賴項並正確配置應用程序。
2.1. 依賴項
讓我們首先將 <a href="https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-openai/latest"><em >spring-ai-openai-spring-boot-starter</em></a > 依賴項添加到我們項目的 `pom.xml 文件中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M3</version>
</dependency><div>
<div>
當前版本 <em >1.0.0-M3</em> 是一個里程碑發佈,因此我們需要在 <em >pom.xml</em> 中添加 Spring Milestones 倉庫:
</div>
</div>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>此倉庫是發佈里程版本的地方,與標準的 Maven Central 倉庫不同。
上述啓動依賴項為我們提供了與 OpenAI 服務以及使用其 DALL·E 3 模型生成 AI 圖像所需的類。
2.2. 配置 OpenAI API 密鑰
現在,要與 OpenAI 服務交互,我們需要在我們的 application.yaml 文件中配置 API 密鑰:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}我們使用 ${} 屬性佔位符從環境變量中加載我們的屬性值。
在配置有效的 API 密鑰後,Spring AI 將自動為我們創建 ImageModel Bean。我們將將其自動注入到我們的服務層,併發送請求以生成 AI 圖像。
2.3. 配置默認圖片選項
接下來,我們還將配置一些默認圖片選項,這些選項將被用於生成我們的圖片:
spring:
ai:
openai:
image:
options:
model: dall-e-3
size: 1024x1024
style: vivid
quality: standard
response-format: url我們首先配置 dall-e-3 作為用於圖像生成的 模型。
為了獲得完美的正方形圖像,我們指定 1024×1024 作為尺寸。 另外兩個允許的尺寸選項是 1792×1024 和 1024×1792。
接下來,我們將樣式設置為 vivid —— 這會告訴 AI 模型生成超現實和戲劇性的圖像。 另一個可用的選項是 natural,我們可以使用它來生成更自然、不太超現實的圖像。
對於 quality 選項,我們將其設置為 standard,這將適用於大多數用例。 但是,如果我們需要具有增強細節和更好一致性的圖像,我們可以將其設置為 hd。 需要注意的是,具有 hd 質量的圖像生成所需時間更長。
最後,我們將 response-format 選項設置為 url。 生成的圖像將可通過 60 分鐘有效期的 URL 訪問。 或者,我們可以將其設置為 b64_json 以接收圖像為 Base64 編碼的字符串。
稍後在本教程中,我們將探討如何覆蓋這些默認圖像選項。
3. 使用 DALL·E 3 生成 AI 圖像
現在我們已經配置好應用程序,接下來讓我們創建一個 ImageGenerator 類。我們將自動注入 ImageModel Bean 並將其用於生成 AI 圖像:
public String generate(String prompt) {
ImagePrompt imagePrompt = new ImagePrompt(prompt);
ImageResponse imageResponse = imageModel.call(imagePrompt);
return resolveImageContent(imageResponse);
}
private String resolveImageContent(ImageResponse imageResponse) {
Image image = imageResponse.getResult().getOutput();
return Optional
.ofNullable(image.getUrl())
.orElseGet(image::getB64Json);
}在這裏,我們創建了一個 generate() 方法,它接受一個 prompt String,代表我們想要生成的圖像的文本描述。
接下來,我們創建一個 ImagePrompt 對象,並使用我們的 prompt 參數。然後,我們將它傳遞給我們的 ImageModel bean 的 call() 方法,以發送圖像生成請求。
imageResponse 將包含一個 URL 或一個 Base64 編碼的 String 格式的圖像表示,具體取決於我們在 application.yaml 文件中配置的 response-format 選項。為了解決正確的輸出屬性,我們創建一個 resolveImageContent() 輔助方法並將其作為響應返回。
4. 覆蓋默認圖片選項
在某些情況下,我們可能需要覆蓋我們在 application.yaml 文件中配置的默認圖片選項。
讓我們通過重載我們的 generate() 方法來了解如何做到這一點:
public String generate(ImageGenerationRequest request) {
ImageOptions imageOptions = OpenAiImageOptions
.builder()
.withUser(request.username())
.withHeight(request.height())
.withWidth(request.width())
.build();
ImagePrompt imagePrompt = new ImagePrompt(request.prompt(), imageOptions);
ImageResponse imageResponse = imageModel.call(imagePrompt);
return resolveImageContent(imageResponse);
}
record ImageGenerationRequest(
String prompt,
String username,
Integer height,
Integer width
) {}我們首先創建一個 ImageGenerationRequest 記錄,該記錄除了包含我們的 prompt 之外,還包含 username 和所需的圖像 height 和 width。
我們使用這些附加值來創建 ImageOptions 實例並將其傳遞給 ImagePrompt 構造函數。 重要的是要注意,OpenAiImageOptions 類沒有 size 屬性,因此我們分別提供 height 和 width 值。
user 選項 幫助我們將圖像生成請求與特定終端用户關聯。 這是一個推薦的安全最佳實踐,以防止濫用。
根據要求,我們還可以覆蓋其他圖像選項,例如 style、quality 和 response-format 在我們的 ImageOptions 對象中。
5. 測試我們的 ImageGenerator 類
現在我們已經實現了 ImageGenerator 類,讓我們對其進行測試:
String prompt = """
A cartoon depicting a gangster donkey wearing
sunglasses and eating grapes in a city street.
""";
String response = imageGenerator.generate(prompt);在這裏,我們將我們的 提示詞 傳遞給 ImageGenerator 的 generate() 方法。經過短暫的處理時間,我們將收到一個 響應,其中包含我們生成的圖像的 URL 或 Base64 編碼字符串,具體取決於配置的 response-format 屬性。
讓我們看看 DALL·E 3 為我們生成的圖像:
正如我們所見,生成的圖像準確匹配了我們的 提示詞。 這展示了 DALL·E 3 理解自然語言描述並將其轉換為圖像的能力
6. 結論
在本文中,我們探討了如何使用 Spring AI 從文本描述生成 AI 圖像。我們使用了 OpenAI 的 DALL·E 3 模型作為底層。
我們詳細介紹了所需的配置,並開發了一個服務類來生成 AI 圖像。此外,我們還研究了默認圖像選項以及如何動態地覆蓋它們。
通過將 DALL·E 3 集成到我們的 Java 應用程序中,並通過 Spring AI 實現,我們可以輕鬆地在應用程序中添加圖像生成功能,而無需訓練和託管我們自己的模型。