使用 Java 中的 OpenAI DALL·E 3 產生 AI 影像
1. 概述
人工智慧正在改變我們建立 Web 應用程式的方式。人工智慧的一個令人興奮的應用是根據基於文字的描述生成圖像。 OpenAI 的 DALL·E 3是一種流行的文本到圖像模型,可以幫助我們實現這一目標。
在本教程中,我們將探索如何使用 Spring AI 透過 OpenAI 的 DALL·E 3 模型產生影像。
要學習本教程,我們需要一個OpenAI API 金鑰。
2. 設定項目
在開始產生 AI 影像之前,我們需要包含 Spring Boot 啟動器相依性並正確配置我們的應用程式。
2.1.依賴關係
讓我們先將spring-ai-openai-spring-boot-starter
依賴項新增到專案的pom.xml
檔案中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M3</version>
</dependency>
從目前版本開始, 1.0.0-M3
是一個里程碑版本,我們還需要將 Spring Milestones 儲存庫新增到我們的 pom.xml
:
<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 中央儲存庫。
上述入門依賴項為我們提供了必要的類,以便從我們的應用程式與 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
配置為用於影像生成的model
。
為了獲得完美的正方形影像,我們指定1024×1024
作為size
。另外 2 個允許的size
選項是1792×1024
和1024×1792
。
接下來,我們將style
設定為vivid
——告訴人工智慧模型產生超現實和戲劇性的圖像。另一個可用的選項是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
,表示我們想要產生的圖像的文字描述。
接下來,我們使用prompt
參數建立一個ImagePrompt
物件。然後,我們將其傳遞給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
選項可幫助我們將圖像生成請求與特定的最終用戶連結。建議將此作為防止濫用的安全最佳實踐。
根據要求,我們也可以在ImageOptions
物件中覆寫其他影像選項,例如style
、 quality
和response-format
。
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);
在這裡,我們將prompt
傳遞給ImageGenerator's generate()
方法。經過短暫的處理時間後,我們將收到包含生成圖像的 URL 或 Base64 編碼字串的response
,具體取決於配置的response-format
屬性。
讓我們看看 DALL·E 3 為我們產生了什麼:
正如我們所看到的,生成的圖像與我們的prompt
完全匹配。這展示了 DALL·E 3 在理解自然語言描述並將其轉化為圖像方面的強大功能。
六、結論
在本文中,我們探討如何使用 Spring AI 從文字描述產生 AI 圖像。我們在底層使用了 OpenAI 的 DALL·E 3 模型。
我們完成了必要的配置並開發了一個服務類別來產生 AI 影像。此外,我們還研究了預設圖像選項以及如何動態覆蓋它們。
透過 Spring AI 將 DALL·E 3 整合到我們的 Java 應用程式中,我們可以輕鬆添加圖像生成功能,而無需培訓和託管我們自己的模型的開銷。
與往常一樣,本文中使用的所有程式碼範例都可以在 GitHub 上找到。