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

相关推荐
老赵全栈实战1 天前
【每日一技MyBatis trim标签核心用法
java·mybatis·orm
beata1 天前
Java基础-19:Java 死锁深度解析:从原理、检测到预防与实战指南
java·前端
吾日三省Java1 天前
Spring Cloud架构下的日志追踪:传统MDC vs 王炸SkyWalking
java·后端·架构
爱玩泥巴的小t1 天前
new Thread().start()底层做了什么?
java
码路飞1 天前
GPT-5.4 Computer Use 实战:3 步让 AI 操控浏览器帮你干活 🖥️
java·javascript
祈安_1 天前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
皮皮林5512 天前
拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
java·spring boot
顺风尿一寸2 天前
从 Java NIO poll 到 Linux 内核 poll:一次系统调用的完整旅程
java
程途知微2 天前
JVM运行时数据区各区域作用与溢出原理
java
华仔啊2 天前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端