Spring AI文生图(Image Model API)入门示例
目录
Spring AI文生图(Image Model API)入门示例
本章节示例演示如何基于Spring Boot集成Spring AI开源框架,快速集成调用阿里云的百炼大模型AI服务,验证AI大模型“文生图”的功能。
欢迎关注我的公众号
1、Image Model API概述
在Spring AI框架中,Image Model API旨在为与专注于图像生成的各种AI模型进行交互提供一个简单且可移植的接口,使开发者能够以最小的代码改动切换不同的图像相关模型。这一设计符合Spring模块化和互换性的理念,确保开发者可以快速调整其应用程序以适应不同的图像处理相关的AI能力。
此外,通过支持像ImagePrompt这样的辅助类来进行输入封装以及使用ImageResponse来处理输出,图像模型API统一了与致力于图像生成的AI模型之间的通信。它管理请求准备和响应解析的复杂性,为图像生成功能提供直接而简化的API交互。
Image Model API建立在Spring AI通用模型API之上,提供了特定于图像的抽象和实现。
2、Image Model API接口及相关类
- ImageModel(图像模型)
这里展示的是ImageModel接口定义:
@FunctionalInterface
public interface ImageModel extends Model<ImagePrompt, ImageResponse> {
ImageResponse call(ImagePrompt request);
}
- ImagePrompt(图像提示)
ImagePrompt是一个封装了ImageMessage对象列表及可选模型请求选项的ModelRequest。下面显示的是ImagePrompt类的一个简化版本,省略了构造函数和其他工具方法:
public class ImagePrompt implements ModelRequest<List<ImageMessage>> {
private final List<ImageMessage> messages;
private ImageOptions imageModelOptions;
@Override
public List<ImageMessage> getInstructions() {...}
@Override
public ImageOptions getOptions() {...}
}
-
ImageMessage(图像消息)
ImageMessage类封装了用于影响生成图像的文本及其权重。对于支持权重的模型,它们可以是正数或负数。
public class ImageMessage {
private String text;
private Float weight;
public String getText() {...}
public Float getWeight() {...}
}
-
ImageOptions(图像选项)
表示可以传递给图像生成模型的选项。ImageOptions接口扩展了ModelOptions接口,并用于定义可以传递给AI模型的一些可移植选项。
public interface ImageOptions extends ModelOptions {
Integer getN();
String getModel();
Integer getWidth();
Integer getHeight();
String getResponseFormat(); // openai - url or base64 : stability ai byte[] or base64
}
-
ImageResponse(图像响应)
持有AI模型的输出,每个ImageGeneration实例包含来自单一提示的可能多个输出结果之一。
public class ImageResponse implements ModelResponse<ImageGeneration> {
private final ImageResponseMetadata imageResponseMetadata;
private final List<ImageGeneration> imageGenerations;
@Override
public ImageGeneration getResult() {
// get the first result
}
@Override
public List<ImageGeneration> getResults() {...}
@Override
public ImageResponseMetadata getMetadata() {...}
}
-
ImageGeneration(图像生成)
最终,ImageGeneration类扩展自ModelResult,代表输出响应及有关此结果的元数据。
public class ImageGeneration implements ModelResult<Image> {
private ImageGenerationMetadata imageGenerationMetadata;
private Image image;
@Override
public Image getOutput() {...}
@Override
public ImageGenerationMetadata getMetadata() {...}
}
3、Spring Boot集成Spring AI框架
如何基于Springboot集成Spring AI框架,并调用阿里云AI服务,请参考文章Spring AI Alibaba入门示例,这里不再重复说明。
4、创建ImageController
Spring AI框架的ImageModel API 抽象了应用程序通过模型调用实现“文生图”的交互过程,即应用程序接收文本,调用模型生成图片。ImageModel 的入参为包装类型ImagePrompt,输出类型为ImageResponse
本示例使用spring ai alibaba开源框架,spring-ai-alibaba-starter AutoConfiguration 默认初始化了 ImageModel 实例,我们可以选择直接注入并使用默认实例。
package com.wcy.ai.controller;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.image.ImageModel;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
/**
* @desc 文生图
* @date: 2025/3/11
* @version: 1.0
*/
@RestController
@RequestMapping("/ai")
public class ImageController {
private final ImageModel imageModel;
private static final String DEFAULT_PROMPT = "为人工智能生成一张富有科技感的图片!";
public ImageController(ImageModel imageModel) {
this.imageModel = imageModel;
}
@GetMapping("/image")
public void image(HttpServletResponse response) {
ImageResponse imageResponse = imageModel.call(new ImagePrompt(DEFAULT_PROMPT));
String imageUrl = imageResponse.getResult().getOutput().getUrl();
try {
URL url = URI.create(imageUrl).toURL();
InputStream in = url.openStream();
response.setHeader("Content-Type", MediaType.IMAGE_PNG_VALUE);
response.getOutputStream().write(in.readAllBytes());
response.getOutputStream().flush();
} catch (IOException e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
}
5、启动Springboot工程并测试
启动成功后把下面地址输入到浏览器里,验证AI大模型文生图:
http://localhost:8080/ai/image
显示图片: