Spring AI 框架整合的圖片大模型
2022年出現的三款文生圖的現象級產品,DALL-E、Stable Diffusion、Midjourney。
OpenAI
dall-e-3
dall-e-2
Auzre OpenAI
dall-e-3
dall-e-2
Stability
stable-diffusion-v1-6
ZhiPuAI
cogview-3 ( github.com/THUDM/CogVi… )
OpenAI 與 Auzer OpenAI 使用的圖片大模型都是 dall-e 系列的。還有一些其它圖片大模型,Spring AI 框架並未支援整合,如:Midjourney 釋出的 Midjourney 模型。
一探文生圖大模型的技術核心
關鍵詞:Diffusion模型、CLIP 模型、熱平衡、熵驅動、馬爾可夫鏈。
Diffusion模型
Diffusion模型亦即擴散模型,最早是2015年在《基於非平衡熱力學的深度無監督學習》(Deep Unsupervised Learning using Nonequilibrium Thermodynamics)論文中提出的。作者受統計熱力學的啓發,開發了一種新的生成模型。想法其實很簡單:首先向訓練資料集中的影象不斷加入噪聲,使之最終變成一張模糊的影象,這個過程就類似於向水中加入一滴墨水,墨水擴散,水變成淡藍色,然後教模型學習如何逆轉這一過程,將噪聲轉化為影象。
擴散模型的演算法實現分為兩個過程:
正向擴散過程可以描述為逐漸將
高斯噪聲
應用於影象,直到影象變得完全無法識別。整個過程可以描述為正向過程的馬爾可夫鏈
(描述從一個狀態到另一個狀態的轉換的隨機過程)。同理我們可以將每一張圖片定義為一個狀態,那每一張圖片是什麼樣子只跟上一張圖片有關逆向擴散過程透過神經網路學習的方式近似計算逆向過程的機率分佈。
CLIP 模型
CLIP全稱為contrastive language-image pre-training,即基於對比學習的大規模圖文預訓練模型。CLIP模型不僅有著語義理解的功能,還有將文字資訊和影象資訊結合,並透過注意力機制進行耦合的功能。
我們看一下 Stability AI 公司開發的 Stability AI 模型,其中就使用了CLIP 模型,首先看下其實現架構;
文字編碼器:將語義轉化為計算機可以處理的語言,
文字編碼器就是使用了CLIP模型,對文字進行編碼處理
影象生成器:將編碼後的結果轉換為符合語義的影象
CLIP模型就是在從網上收集到的4億張圖片和它們對應的文字描述基礎上訓練出來的。其訓練過程如下;
CLIP模型在Stable Diffusion的文字編碼器部分發揮了最核心的作用。 該部分內容參考丁磊·生成式人工智慧
Spring AI 接入OpenAI實現文生圖
程式碼實現
package org.ivy.controller; import jakarta.annotation.Resource; import org.springframework.ai.image.Image; import org.springframework.ai.image.ImagePrompt; import org.springframework.ai.image.ImageResponse; import org.springframework.ai.openai.OpenAiImageModel; import org.springframework.ai.openai.OpenAiImageOptions; import org.springframework.ai.openai.api.OpenAiImageApi; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ImageController { @Resource private OpenAiImageModel openAiImageModel; /** * 根據提示詞生成圖片,並返回圖片的URL * * @param prompt 提示詞 * @return 圖片的URL */ @GetMapping("/image") public String image(String prompt) { ImageResponse imageResponse = openAiImageModel.call( new ImagePrompt(prompt, OpenAiImageOptions.builder() // 預設model為 dall-e-3 .withModel(OpenAiImageApi.ImageModel.DALL_E_2.getValue()) .withResponseFormat("url") // url or base .build() ) ); Image image = imageResponse.getResult().getOutput(); return String.format("<img src='%s' alt='%s'>", image.getUrl(), prompt); } }
瀏覽器測試結果
使用的dall-e-2模型生成,看著生成的小狗還是比較醜的。
OpenAiImageOptions 引數說明
spring.ai.openai.image.options.n:一次生成圖片的張數,dell-e-2時n為1~10, dell-e-3時,n只能為1
spring.ai.openai.image.options.model:指定的模型,預設dell-e-3
spring.ai.openai.image.options.quality:圖片生成的質量,只對dell-e-3模型生效
spring.ai.openai.image.options.response_format:圖片返回的方式,url和b64_json兩種
spring.ai.openai.image.options.size:圖片生成的尺寸,dell-e-2只能是 256x256, 512x512, 1024x1024 ,dell-e-3只能是1024x1024, 1792x1024,1024x1792