LangChain4j 多模态

多模态

简单来说,多模态指的是模型能够同时理解和处理多种不同类型的信息(即"模态")。

比如用户上传一张图片,让大模型解释图片中的内容,这就包含了文本和图片的两种不同的处理能力。

在传统的单模态大模型中:

  • 语言大模型:只能处理文本。你输入文字,它输出文字。它不认识图片,也听不懂音频。
  • 视觉大模型:只能处理图像。它可以识别图片里有什么,但无法和你进行复杂的语言对话。

多模态大模型打破了这种壁垒。它在一个统一的框架下,学习文字、图像、声音、视频等多种数据之间的关系和对应。

在 LangChain4j 中使用多模态模型,核心逻辑非常简单:关键在于选对支持多模态的模型,并通过 UserMessage 将文本和图片等内容一起发给它

文本+图片

java 复制代码
@Configuration
public class LLMConfig {
    @Bean("qwen")
    public ChatModel chatModelQwen() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("ALI_QWEN_API_KEY"))
                .modelName("qwen3-vl-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .logRequests(true) // request 日志
                .logResponses(true) // response 日志
                .build();
    }
}

ImageController

java 复制代码
@RestController
@RequestMapping("image")
public class ImageController {
    @Resource(name = "qwen")
    private ChatModel chatModelQwen;

    @Value("classpath:static/mysql.png")
    private org.springframework.core.io.Resource resource;

    @GetMapping("/qwen/img1")
    public String img1() {
        try {
            // 将图片转为 Base64 字符串
            byte[] byteArray = resource.getContentAsByteArray();
            String base64 = Base64.getEncoder().encodeToString(byteArray);

            // 构建用户消息
            UserMessage userMessage = UserMessage.from(
                	// 指定提示词
                    TextContent.from("从这张图片中 mysql 事务相关的步骤,请帮我解读这张图要表达的意思。"),
                	// 图片资源
                    ImageContent.from(base64, "image/png")
            );

            // 调用 API
            ChatResponse response = chatModelQwen.chat(userMessage);

            // 输出
            return response.aiMessage().text();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

与第三方平台集成 ------ 生成图

这里我们集成第三方平台-百炼-通义万相。

java 复制代码
@Configuration
public class LLMConfig {
    ...
    @Bean("wanx")
    public WanxImageModel wanxImageModel() {
        return WanxImageModel.builder()
                .apiKey(System.getenv("ALI_QWEN_API_KEY"))
                .modelName("wanx2.1-t2i-turbo")
                .build();
    }
}

ImageController

java 复制代码
@RestController
@RequestMapping("image")
public class ImageController {
    @Resource(name = "wanx")
    private WanxImageModel wanxImageModel;

    @GetMapping("/wanx/img1")
    public String wanximg1() {
        Response<Image> response = wanxImageModel.generate("可爱的石头");
        String url = response.content().url().toString();
        return String.format("<img src='%s' />", url);
    }

    @GetMapping("/wanx/img2")
    public String wanximg2() {
        String prompt = "青春活力的少年";
        // 图片设置
        ImageSynthesisParam param = ImageSynthesisParam.builder()
                .apiKey(System.getenv("ALI_QWEN_API_KEY"))
                .model(ImageSynthesis.Models.WANX_V1)
                .prompt(prompt)
//                .style("<watercolor>")
                .n(1)
                .size("1024*1024")
                .build();

        try {
            ImageSynthesis imageSynthesis = new ImageSynthesis();
            ImageSynthesisResult result = imageSynthesis.call(param);
            
            return JsonUtils.toJson(result);
        } catch (NoApiKeyException e) {
            throw new RuntimeException(e);
        }
    }
}

优先发在:https://juejin.cn/post/7606224197803737107

相关推荐
橙淮13 小时前
并发编程(六)
java·jvm
拽着尾巴的鱼儿14 小时前
springboot openfeign 自定义feign 接口重试机制
java·spring boot·后端
白露与泡影14 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
EntyIU14 小时前
JVM内存与GC笔记
java·jvm·笔记
XS03010615 小时前
并发编程 六
java·后端
yaoxin52112315 小时前
419. 现代 Java IO 最佳实践 - 写入文本文件
java·windows·python
雪宫街道15 小时前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
x***r15115 小时前
linux安装 jdk-8u291-linux-x64.tar.gz 详细步骤(解压配置环境变量)
java
极光代码工作室16 小时前
基于SpringBoot的校园论坛系统
java·springboot·web开发·后端开发
XS03010616 小时前
Spring Bean 作用域 & 生命周期
java·后端·spring