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

相关推荐
wuqingshun3141591 小时前
String、StringBuffer、StringBuilder的应用场景
java·开发语言·jvm
日月云棠2 小时前
JDK 17 特性详解
java
追随者永远是胜利者2 小时前
(LeetCode-Hot100)19. 删除链表的倒数第 N 个结点
java·算法·leetcode·链表·go
树码小子2 小时前
Mybatis(14)Mybatis-Plus入门 & 简单使用
java·mybatis-plus
人道领域2 小时前
Maven配置加载:动态替换的艺术
java·数据库·后端
MX_93592 小时前
@Import整合第三方框架原理
java·开发语言·后端·spring
坚持就完事了2 小时前
Java实现数据结构中的链表
java·数据结构·链表
玩具猴_wjh2 小时前
JWT优化方案
java·服务器·数据库
坚持就完事了2 小时前
Java各种命名规则
java·开发语言