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