)
注本章内容没有实际测试过Spring AI官网使用的例子都是国外的大模型国内模型于Spring AI版本更新速度不一致且国内模型兼容open AI格式有限折腾很久放弃了。本章内容权且做扩展阅读就好如果想测试可以使用具体大模型接口如百炼平上的APISpring AI 的Image Model API是构建 AI 图像生成应用的核心基础设施。它为开发者提供了一套简洁且可移植的接口用于与各种 AI 图像生成模型如 OpenAI DALL-E、Stability AI进行交互。无论你使用的是 DALL-E 3、Stable Diffusion 还是其他图像模型Image Model API 都能让你以最小的代码改动在不同模型之间切换。本教程将深入讲解 Image Model API 的核心组件、设计哲学与实战用法帮助你快速上手并在实际项目中应用。一、AI 图像生成核心概念1.1 什么是 AI 图像生成AI 图像生成是利用深度学习模型根据文本描述Prompt自动生成图像的技术。用户只需用自然语言描述想要的画面AI 模型就能生成对应的图片。┌─────────────────────────────────────────────────────────┐ │ AI 图像生成 原理 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 文本 Prompt ────▶ AI 图像模型 ────▶ 生成图像 │ │ │ │ 一只可爱的橘猫 ┌──────────────┐ ┌─────┐ │ │ 在阳光下的草地上 ──▶ │ DALL-E 3 │ ──▶ │ │ │ │ │ Stability AI │ │ │ │ │ │ ... │ │ │ │ │ └──────────────┘ └─────┘ │ │ │ └─────────────────────────────────────────────────────────┘1.2 典型应用场景场景说明创意设计为广告、海报、产品原型快速生成视觉素材游戏开发批量生成游戏资产如角色头像、场景图内容创作为文章、社交媒体生成配图电商展示为产品生成不同风格的展示图艺术创作探索 AI 辅助的艺术创作可能性教育演示生成教学所需的插图和示意图1.3 关键术语术语说明Prompt文本描述告诉 AI 要生成什么样的图像Seed种子控制随机生成的起始值相同种子相同输入可复现结果CFG Scale引导强度控制图像与 Prompt 的贴合程度Steps扩散模型的采样步数影响图像质量Negative Prompt描述不想出现在图像中的元素部分模型支持Style Preset风格预设如电影感、插画等二、API 整体架构2.1 设计哲学Spring AI Image Model API 的设计遵循了 Spring 框架一贯的设计理念可移植性Portability通过统一的ImageModel接口让底层图像模型实现可自由切换开发者几乎无需修改业务代码简单性Simplicity提供直观的 API将与各大 AI 厂商 SDK 交互的复杂性封装在框架内部关注点分离将请求构建ImagePrompt、模型调用ImageModel、响应解析ImageResponse清晰分离2.2 核心组件一览组件职责类比理解ImageModel图像模型的统一接口类似JdbcTemplate的数据访问抽象ImagePrompt封装图像生成请求的输入和选项类似 SQL 查询参数的封装ImageMessage封装单条 Prompt 文本及权重类似 SQL 中的参数值ImageResponse封装图像生成模型的输出结果类似 SQL 查询的返回结果集ImageGeneration单条图像生成结果类似结果集中的一行记录ImageOptions图像生成请求的配置选项类似查询的排序/分页选项2.3 类关系图┌──────────────────┐ extends ┌──────────────────┐ │ ImageModel │─────────────▶│ ModelReq,Resp │ └──────┬───────────┘ └──────────────────┘ │ │ uses ▼ ┌──────────────────┐ ┌──────────────────┐ │ ImagePrompt │────────▶│ ImageResponse │ └──────┬───────────┘ └──────┬───────────┘ │ │ │ contains │ contains ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ │ ListImageMessage│ │ ImageGeneration │ │ ImageOptions │ │ ImageResponse │ └──────────────────┘ │ Metadata │ └──────────────────┘ │ ▼ ┌──────────────────┐ │ ImageGeneration │ │ Metadata │ │ Image 数据 │ └──────────────────┘2.4 与 Spring AI Model API 的关系Image Model API 构建在 Spring AI 通用 Model API 之上ImageModel继承ModelImagePrompt, ImageResponse接口ImagePrompt实现ModelRequestListImageMessageImageResponse实现ModelResponseImageGenerationImageGeneration实现ModelResultImage这种设计确保了 API 的一致性使得 Spring AI 家族中的 Chat、Embedding、Image 等模型都遵循相同的调用模式。三、ImageModel 接口详解3.1 接口定义ImageModel是所有图像模型的统一顶级接口使用FunctionalInterface标注FunctionalInterfacepublicinterfaceImageModelextendsModelImagePrompt,ImageResponse{/** * 核心方法调用图像模型处理请求 */OverrideImageResponsecall(ImagePromptrequest);}3.2 最简调用示例当你只需要快速生成一张图片时ServicepublicclassSimpleImageService{privatefinalImageModelimageModel;publicSimpleImageService(ImageModelimageModel){this.imageModelimageModel;}/** * 最简方式直接传入文本描述生成图像 */publicImageResponsegenerateImage(Stringprompt){ImagePromptimagePromptnewImagePrompt(prompt);returnimageModel.call(imagePrompt);}}3.3 带选项的调用示例当你需要控制图像的尺寸、数量、风格等参数时使用ImageOptionsServicepublicclassAdvancedImageService{privatefinalImageModelimageModel;publicAdvancedImageService(ImageModelimageModel){this.imageModelimageModel;}/** * 带自定义选项的图像生成 */publicImageResponsegenerateWithOptions(Stringprompt){ImagePromptimagePromptnewImagePrompt(prompt,ImageOptionsBuilder.builder().width(1024).height(1024).n(2)// 生成 2 张图片.responseFormat(url)// 返回 URL 格式.build());returnimageModel.call(imagePrompt);}}3.4 模型特定选项调用各模型实现提供了特有的选项配置可以在运行时覆盖默认配置/** * 使用 OpenAI 特有选项 */publicImageResponsegenerateWithOpenAIOptions(Stringprompt){returnimageModel.call(newImagePrompt(prompt,OpenAiImageOptions.builder().quality(hd)// 高清质量.style(vivid)// 生动风格.n(4).height(1024).width(1024).build()));}/** * 使用 Stability AI 特有选项 */publicImageResponsegenerateWithStabilityAIOptions(Stringprompt){returnimageModel.call(newImagePrompt(prompt,StabilityAiImageOptions.builder().stylePreset(cinematic)// 电影感风格.cfgScale(7)// 引导强度.steps(30)// 采样步数.seed(12345)// 随机种子.N(4).height(1024).width(1024).build()));}四、核心数据结构4.1 ImagePromptImagePrompt是ModelRequest的实现封装了图像生成请求的所有输入参数publicclassImagePromptimplementsModelRequestListImageMessage{privatefinalListImageMessagemessages;// Prompt 消息列表privateImageOptionsimageModelOptions;// 图像生成选项OverridepublicListImageMessagegetInstructions(){returnthis.messages;}OverridepublicImageOptionsgetOptions(){returnthis.imageModelOptions;}// 构造方法和工具方法省略}构建方式// 最简方式直接传入字符串ImagePromptprompt1newImagePrompt(一只可爱的橘猫在阳光下的草地上);// 带选项方式ImagePromptprompt2newImagePrompt(一只可爱的橘猫在阳光下的草地上,ImageOptionsBuilder.builder().width(1024).height(1024).n(1).build());// 使用 ImageMessage 构建支持权重ImageMessagemessagenewImageMessage(一只可爱的橘猫,0.8f// 权重正值增强此描述的影响);ImagePromptprompt3newImagePrompt(List.of(message));4.2 ImageMessageImageMessage封装了单条 Prompt 文本及其权重设置。权重可以是正值增强该描述或负值减弱该描述的影响publicclassImageMessage{privateStringtext;// Prompt 文本描述privateFloatweight;// 权重可选部分模型支持publicStringgetText(){returnthis.text;}publicFloatgetWeight(){returnthis.weight;}// 构造方法和工具方法省略}使用示例// 简单文本消息ImageMessagesimpleMessagenewImageMessage(一个宁静的山谷);// 带权重的消息ImageMessageweightedMessagenewImageMessage(一座古老的城堡,0.5f// 正值强调城堡的古老感);// 负权重部分模型支持ImageMessagenegativeMessagenewImageMessage(现代建筑,-0.3f// 负值减弱现代建筑元素的影响);4.3 ImageOptionsImageOptions是所有图像生成模型的通用配置选项基接口定义了可移植的通用选项publicinterfaceImageOptionsextendsModelOptions{/** * 生成的图像数量1-10 */IntegergetN();/** * 使用的模型名称 */StringgetModel();/** * 图像宽度像素 */IntegergetWidth();/** * 图像高度像素 */IntegergetHeight();/** * 响应格式URL、base64、byte[] 等 */StringgetResponseFormat();}通用选项说明选项类型说明nInteger生成的图像数量通常 1-10 张modelString使用的模型名称widthInteger图像宽度像素heightInteger图像高度像素responseFormatString返回格式url、b64_json、byte[]构建示例// 使用通用 ImageOptionsImageOptionsoptionsImageOptionsBuilder.builder().width(1024).height(1024).n(2).responseFormat(url).build();// 使用模型特定选项如 OpenAIOpenAiImageOptionsopenAiOptionsOpenAiImageOptions.builder().quality(hd).style(vivid).width(1024).height(1024).n(1).build();4.4 ImageResponseImageResponse封装了图像生成模型的完整输出publicclassImageResponseimplementsModelResponseImageGeneration{privatefinalImageResponseMetadataimageResponseMetadata;privatefinalListImageGenerationimageGenerations;OverridepublicImageGenerationgetResult(){returnthis.imageGenerations.get(0);}OverridepublicListImageGenerationgetResults(){returnthis.imageGenerations;}OverridepublicImageResponseMetadatagetMetadata(){returnthis.imageResponseMetadata;}// 其他方法省略}使用示例ImageResponseresponseimageModel.call(imagePrompt);// 获取第一张生成的图像ImageGenerationfirstGenerationresponse.getResult();ImagefirstImagefirstGeneration.getOutput();// 获取所有生成的图像ListImageGenerationallGenerationsresponse.getResults();for(ImageGenerationgeneration:allGenerations){Imageimagegeneration.getOutput();System.out.println(图像: image.getUrl());}// 获取响应元数据ImageResponseMetadatametadataresponse.getMetadata();System.out.println(模型: metadata.getModel());4.5 ImageGenerationImageGeneration代表一次图像生成的完整结果实现了ModelResultImage接口publicclassImageGenerationimplementsModelResultImage{privateImageGenerationMetadataimageGenerationMetadata;privateImageimage;OverridepublicImagegetOutput(){returnthis.image;}OverridepublicImageGenerationMetadatagetMetadata(){returnthis.imageGenerationMetadata;}// 其他方法省略}4.6 ImageImage类封装了生成的图像数据及相关信息publicclassImage{privateStringurl;// 图像 URL远程存储privatebyte[]imageData;// 图像二进制数据privateStringmimeType;// MIME 类型如 image/png、image/jpegpublicStringgetUrl(){returnthis.url;}publicbyte[]getImageData(){returnthis.imageData;}publicStringgetMimeType(){returnthis.mimeType;}}使用示例ImageResponseresponseimageModel.call(imagePrompt);Imageimageresponse.getResult().getOutput();if(image.getUrl()!null){// URL 方式下载图像StringimageUrlimage.getUrl();System.out.println(图像地址: imageUrl);}elseif(image.getImageData()!null){// 二进制方式直接保存byte[]dataimage.getImageData();Files.write(Paths.get(output.png),data);}五、可用实现概览Spring AI 已为以下主流 AI 服务提供了图像模型实现实现提供商支持的模型OpenAI ImageOpenAIDALL-E 2、DALL-E 3、GPT Image 1Stability AI ImageStability AIStable Diffusion v1.6 等Azure OpenAI ImageMicrosoft AzureAzure 托管的 DALL-E 模型5.1 切换模型示例得益于 Spring AI 的抽象设计切换底层图像模型只需修改配置// 使用 OpenAI DALL-EBeanpublicImageModelopenAiImageModel(OpenAiClientclient){returnnewOpenAiImageModel(client,options);}// 切换为 Stability AIBeanpublicImageModelstabilityAiImageModel(StabilityAiApiapi){returnnewStabilityAiImageModel(api,options);}业务代码完全一致// 无论底层是 DALL-E 还是 Stability AI调用方式都相同ImageResponseresponseimageModel.call(newImagePrompt(一只可爱的橘猫));六、最佳实践与常见问题6.3 Prompt 编写技巧技巧说明示例详细描述越详细的 Prompt 通常能生成更好的结果“一只橘色的长毛猫坐在阳光透过窗户照射的木地板上背景有绿植”指定风格明确指定想要的艺术风格“水彩画风格的山景”、“赛博朋克风格的城市夜景”指定视角指定相机角度和构图“鸟瞰视角”、“特写镜头”、“广角全景”指定光照描述光照条件“柔和的侧光”、“黄昏的金色光线”、“霓虹灯下”使用权重部分模型支持加权的 Prompt 元素正权重强调负权重排除6.4 错误处理建议ServicepublicclassSafeImageService{privatefinalImageModelimageModel;publicSafeImageService(ImageModelimageModel){this.imageModelimageModel;}publicImageResponsesafeGenerate(Stringprompt){try{ImagePromptimagePromptnewImagePrompt(prompt);returnimageModel.call(imagePrompt);}catch(Exceptione){// 常见异常// - NetworkException: 网络连接问题// - RateLimitExceededException: API 速率限制// - InvalidRequestException: Prompt 过长或参数错误// - ContentPolicyException: Prompt 违反内容政策log.error(图像生成失败: {},prompt,e);thrownewImageGenerationException(图像生成失败: e.getMessage(),e);}}}// 自定义异常publicclassImageGenerationExceptionextendsRuntimeException{publicImageGenerationException(Stringmessage,Throwablecause){super(message,cause);}}6.5 性能优化建议合理设置生成数量批量生成多张图片时n值越大消耗越多资源选择合适的尺寸尺寸越大生成时间越长消耗越多使用 URL 响应格式对于 Web 应用URL 格式更方便直接展示缓存常用参数对固定的选项配置进行缓存异步处理对于批量生成场景考虑异步并行调用6.6 成本控制建议策略说明选择合适的模型gpt-image-1-mini比dall-e-3成本更低合理设置尺寸避免不必要的大尺寸控制生成数量根据实际需要设置n值批量请求将多个 Prompt 打包在一次 API 调用中处理模型支持时本地缓存对相同 Prompt 的结果进行缓存避免重复生成七、总结Spring AI Image Model API 通过一套优雅的抽象帮助开发者轻松集成各种 AI 图像生成模型。其核心优势在于统一性ImageModel接口为所有图像模型提供一致的调用方式可移植性通过ImagePrompt、ImageResponse、ImageGeneration等标准化组件实现不同模型间的无缝切换灵活性支持启动时默认选项配置和运行时选项覆盖满足不同场景需求扩展性清晰的接口设计使得添加新的图像模型实现变得简单实用性内置多模型支持、多种响应格式URL/Base64/字节数组等实用特性