LangChain4j系列:LangChain4j 实现文字生成图片与编辑图片功能

本篇文章将介绍LangChain4j框架集成的图片大模型,并接入OpenAI实现文字生成图片功能!

集成图片模型

模型提供商 模型名称 API 接入示例
OpenAI Dall·E (2/3) OpenAiImageModel OpenAiImageModelExamples
Azure OpenAI Dall·E (2/3) AzureOpenAiImageModel AzureOpenAIDallEExample
Google Imagen VertexAiImageModel VertexAiImageModelIT
Cloudflare Workers AI WorkersAiImageModel WorkersAiImageModelIT
Zhipu AI Zhipu AI ZhipuAiImageModel ZhipuAiImageModelIT

关于图片大模型的知识网站:

Workers AI: developers.cloudflare.com/workers-ai/

Google Imagen:An article about image generation with Imagen

智普: www.zhipuai.cn// open.bigmodel.cn/

图片大模型实现原理

# 08. Spring AI 接入OpenAI实现文字生成图片功能 文章中介绍了关于大模型的一些技术原理。

ImageModel源码

java 复制代码
/**
 * 文本生成图片模型对接API
 */
public interface ImageModel {
    /**
     * 根据提示词生成图片
     * @param prompt 提示词.
     * @return 根据提示词生成的图片对象.
     */
    Response<Image> generate(String prompt);

    /**
     * 根据提示词,生成n张图片,并不是所有的模型都支持
     *
     * @param prompt 提示词.
     * @param n 指定生成几张图片.
     * @return 返回生成图片的对象列表.
     * @throws IllegalArgumentException 如果操作不被支持,则会抛出异常.
     */
    default Response<List<Image>> generate(String prompt, int n) {
        throw new IllegalArgumentException("Operation is not supported");
    }

    /**
     * 根据存在的图片,根据提示词编辑该图片。
     *
     * @param image  需要编辑图像的对象.
     * @param prompt 编辑图像的提示词.
     * @return 生成图片的对象.
     */
    default Response<Image> edit(Image image, String prompt) {
        throw new IllegalArgumentException("Operation is not supported");
    }

    /**
     * 根据现有的图片,根据提示词以及根据给定另外一张图片的不同生成新的图片
     *
     * @param image  需要编辑的图片对象.
     * @param mask   mask图对象,mask图作用就是指定要编辑的区域,并画到原图上。
     * @param prompt 提示词.
     * @return 生成图片对象.
     */
    default Response<Image> edit(Image image, Image mask, String prompt) {
        throw new IllegalArgumentException("Operation is not supported");
    }
}

接入大模型对于图片的操作,仅支持文生图、图片编辑功能,对于后三个方法的功能并不是所有的模型都支持。具体看模型对接时是否实现了后三个方法。

类结构

classDiagram ImageModel <|-- OpenAiImageModel ImageModel <|-- AzureOpenAiImageModel ImageModel <|-- ZhipuAiImageModel ImageModel <|-- WorkersAiImageModel ImageModel <|-- VertexAiImageModel ImageModel: +generate(String prompt) ImageModel: +generate(String prompt, int n) {} ImageModel: +edit(Image image, String prompt) {} ImageModel: +edit(Image image, Image mask, String prompt){} class OpenAiImageModel{ -String modelName 模型的名称 -String size 生成图片的尺寸 -String quality 生成图片的质量,仅della3生效 -String style 生成图片的风格「生动或自然的」 -String user 请求用户唯一标识 -String responseFormat 响应的格式,url/b64_json -int maxRetries 请求重试的次数 -OpenAiClient client 对接OpenAI Client +generate(String prompt) +generate(String prompt, int n) } class AzureOpenAiImageModel{ -OpenAIClient client 对接AzureOpenAi -String deploymentName 模型名称 -ImageGenerationQuality quality 图片生成质量 -ImageSize size 图片生成尺寸 -String user 请求用户唯一标识 -ImageGenerationStyle style 生成图片风格 -ImageGenerationResponseFormat responseFormat; +generate(String prompt) } class ZhipuAiImageModel{ -String model 模型名称 -String userId 请求用于唯一标识 -Integer maxRetries 重试次数 -ZhipuAiClient client +generate(String prompt) } class WorkersAiImageModel{ -String accountId -String modelName -WorkersAiApi workerAiClient +generate(String prompt) +edit(Image image, String prompt) +edit(Image image, Image mask, String prompt) } class VertexAiImageModel{ -Long seed 随机种子数 0 到 2^32-1 -String endpoint 请求base url -MimeType mimeType 格式 image/png image/jpeg -Integer compressionQuality 压缩质量 -String cloudStorageBucket 云存储,比如生成图片存储在oss上 -EndpointName endpointName **不知道啥意思,后续研究** -String language -Integer guidanceScale -String negativePrompt -ImageStyle sampleImageStyle 生成图片风格 -Integer sampleImageSize -AspectRatio aspectRatio 图片比例 比如4:3/16:9 -PersonGeneration personGeneration -Boolean addWatermark 是否添加水印 -int maxRetries 重试次数 -Boolean withPersisting -String modelName 模型名称 -Path tempDirectory 生成图片临时存储路径 -Boolean logRequests 记录请求日志 -Boolean logResponses 记录返回日志 +generate(String prompt) +generate(String prompt,int n) +edit(Image image, String prompt) +edit(Image image, Image mask, String prompt) }

LangChain4j集成5种图片大模型,其中图片大模型的能力参差不齐,从控制参数以及实现的功能上由强到弱;

VertexAiImageModel > WorkersAiImageModel > OpenAiImageModel > AzureOpenAiImageModel > ZhipuAiImageModel

但是具体模型的生成效果的优劣还的需要通过实际验证。从功能上看VertexAiImageModel完胜

接入 OpenAI 实现文生图

application.yml

yml 复制代码
spring:
  application:
    name: image-service

server:
  port: 8808

langchain4j:
  open-ai:
    image-model:
      base-url: xxx
      api-key: xxx

Service

java 复制代码
package org.ivy.image.service;

import dev.langchain4j.data.image.Image;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ImageContent;
import dev.langchain4j.data.message.TextContent;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiImageModel;
import dev.langchain4j.model.output.Response;
import org.springframework.stereotype.Service;

@Service
public class ImageService {

    private final OpenAiImageModel openAiImageModel;
    private final OpenAiChatModel openAiChatModel;

    public ImageService(OpenAiImageModel openAiImageModel, OpenAiChatModel openAiChatModel) {
        this.openAiImageModel = openAiImageModel;
        this.openAiChatModel = openAiChatModel;
    }

    public String generateImage(String prompt) {
        Response<Image> generate = openAiImageModel.generate(prompt);
        String url = generate.content().url().toString();
        return String.format("<img src='%s' alt='%s'>", url, prompt);
    }

    public String see(String prompt) {
        UserMessage userMessage = UserMessage.from(
                TextContent.from(prompt),
                ImageContent.from("https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png")
        );
        Response<AiMessage> generate = openAiChatModel.generate(userMessage);
        return generate.content().text();
    }
}

Controller

java 复制代码
package org.ivy.image.controller;

import org.ivy.image.service.ImageService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ImageController {
    private final ImageService imageservice;

    public ImageController(ImageService imageservice) {
        this.imageservice = imageservice;
    }

    @GetMapping("/image")
    public String generateImage(@RequestParam(
            value = "prompt",
            defaultValue = "Donald Duck in New York, cartoon style")
                                String prompt) {
        return imageservice.generateImage(prompt);
    }

    @GetMapping("/see")
    public String see(@RequestParam(required = false,defaultValue = "What do you see?") String prompt) {
        return imageservice.see(prompt);
    }
}

测试

代码示例与总结

代码示例:image

本文主要介绍了对大模型的基本使用,没有提供过多的图片大模型的底层实现细节。仅从提供的功能和参数控制对集成的图片大模型进行了对比。

相关推荐
阿里云大数据AI技术几秒前
PAI支持一键部署Qwen3.8-Flash-Next、GLM-5.3等最新开源模型
人工智能·开源·llm
SleepNW_POV2 分钟前
家居科普|床垫溜边塌陷成因解析与边缘加固床垫选购指南
人工智能·科技·智能家居·睡眠
FII工业富联科技服务2 分钟前
从 Vera Rubin NVL72 拆解高密度 AI 液冷:GPU 的热到底怎么被带走?
大数据·人工智能
oliver_sys_log3 分钟前
RocketMQ 4.5.1 延迟消息"发送成功但消费不到"排查分析报告
后端·rocketmq
码上观网5 分钟前
VXLAN 中的 ARP 代答:从原理到 SONiC 代码实现
后端
磐时信息技术15 分钟前
SASETalk | 当智能驾驶驶入未知场景:谈谈关于SOTIF、AI安全与工程落地的思考
人工智能·安全·预期功能安全·sotif
147API24 分钟前
蒸馏模型量化上线前,先查精度退化和算子兼容
大数据·人工智能·深度学习·机器学习·蒸馏
计算机毕设定制辅导-无忧学长35 分钟前
《基于SpringBoot的马术俱乐部管理系统》
java·spring boot·后端
摇滚侠36 分钟前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
橙时数据 FineInsight1 小时前
AI 能回答数据问题,但能解释业务原因吗?
大数据·人工智能·数据分析·指标平台·fineinsight