前言:
随着大模型的升级迭代,现在越来越多的人都开始接入API接口了,尤其是JAVA的同学们,上一篇文章介绍了,从零搭建一个环境,用于调用openai的key,进行访问AI接口,进行一些对话的功能,本篇文章主要介绍生成图片的接口。希望可以帮助到正在学习spring.ai的同学一些参考。
概念介绍:
一、OpenAiImageClient
的核心功能
OpenAiImageClient
是 Spring AI 框架中用于与 OpenAI 图像生成接口(如 DALL·E)交互的客户端工具,提供以下核心能力:
- 图像生成
根据文本描述生成高质量图像,支持多种参数配置(如分辨率、生成数量、质量等) - API 封装
简化与 OpenAI 图像 API 的通信流程,包括 HTTP 请求构建、身份验证(API Key)、参数序列化及响应解析9。 - 灵活配置
支持通过配置文件(如application.yml
)或代码动态覆盖参数,适配不同场景需求
二、OpenAiImageClient
的使用方法
1. 基础配置
在 application.yml
中配置 OpenAI 的 API 密钥及默认参数:
spring: ai: openai: api-key: sk-xxxxxxxxxxxxxxxx # 替换为实际 API 密钥 base-url: https://api.openai.com/v1 # OpenAI 接口地址 image: options: model: gpt-4-dalle # 使用的模型(如 DALL·E) quality: hd # 图像质量(标准/高清) n: 1 # 生成图像数量 height: 1024 # 图像高度 width: 1024 # 图像宽度
此配置会作为全局默认值生效9。
2. 依赖注入与接口调用
在控制器中注入 OpenAiImageClient
,并调用其生成图像的接口:
@RestController public class ImageController { @Resource private OpenAiImageClient openAiImageClient; @RequestMapping("/ai/image") public Object generateImage(@RequestParam String msg) { // 构造请求:包含文本提示和配置选项 ImagePrompt prompt = new ImagePrompt( msg, OpenAiImageOptions.builder() .withQuality("hd") .withN(1) .withHeight(1024) .withWidth(1024) .build() ); // 调用 API 生成图像 ImageResponse response = openAiImageClient.call(prompt); // 提取结果中的图像 URL String imageUrl = response.getResult().getOutput().getUrl(); return imageUrl; } }
- 代码说明:
ImagePrompt
封装了用户输入的文本提示(如 "一只太空猫")及配置参数。call()
方法同步发送请求,返回ImageResponse
对象,包含生成图像的元数据和 URL9。
3. 动态参数覆盖
若需在代码中动态修改配置(如临时调整图像尺寸):
ImageResponse response = openAiImageClient.call( new ImagePrompt(msg, OpenAiImageOptions.builder() .withQuality("standard") .withWidth(512) .withHeight(512) .build() );
注意:代码中的配置优先级高于全局配置文件9。
三、底层逻辑解析
1. 请求流程
- 参数封装:
OpenAiImageClient
将用户输入的文本和配置参数封装为符合 OpenAI API 规范的 JSON 请求体。 - HTTP 通信:通过 Spring 的
RestTemplate
或WebClient
发送 POST 请求至 OpenAI 的/images/generations
端点。 - 身份验证:自动在请求头中添加
Authorization: Bearer {api-key}
9。
2. 响应处理
- 数据解析:将 OpenAI 返回的 JSON 响应反序列化为
ImageResponse
对象。 - 结果提取:从
ImageResponse
中提取图像 URL 或二进制数据,供业务层处理(如存储、展示)9。
3. 错误处理
- 异常捕获:自动处理网络错误、API 限流(如 HTTP 429)及 OpenAI 返回的业务错误(如无效参数)。
- 重试机制:可通过 Spring Retry 模块配置重试策略(需额外依赖)9。
四、应用场景示例
- 创意设计:根据用户描述生成 Logo、插画或广告素材。
- 教育工具:将抽象概念(如量子力学)可视化。
- 电商平台:自动生成商品展示图。
五、注意事项
- 成本控制:OpenAI 按生成图像数量计费,需合理设置
n
(生成数量)参数。 - 内容安全:需审核生成内容,避免生成违规图像(如暴力、色情)。
- 性能优化:高分辨率图像生成耗时较长,可结合异步处理(如
@Async
)提升用户体验
实战代码:
一:写一个提示词返回图片的方法:
package org.example; 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.OpenAiChatClient; import org.springframework.ai.openai.OpenAiImageClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class AiController { @Resource private OpenAiChatClient aiClient; @Autowired private OpenAiImageClient openAiImageClient; @PostMapping("/ask") public String askQuestion(@RequestBody String prompt) { return aiClient.call(prompt); } @GetMapping("/get") public String GetInfo() { return aiClient.call("JAVA学习路线"); } /** * 生成图片 */ @GetMapping(value = "generateImage",produces = "text/html") public String generateImage(String prompt) { ImageResponse response = openAiImageClient.call(new ImagePrompt(prompt)); Image outImage = response.getResult().getOutput(); //url地址 String url = outImage.getUrl(); return "<img src='"+url+"'/>"; } }
二:执行结果的返回:
三、生成的效果:
最后:
生成图片需要注意风险点,不能违规生成图片,以及进行测试的时候,注意到描述提示词的用法,表达的越仔细要求的token越多,现在使用这个key对于token的消耗还是很大的。