多模态视觉理解指的是从视觉与其他多种不同模态,像文本、音频等的数据中提取并融合信息,进而更全面、深入地理解数据含义的技术。

LangChain4j可接入多种支持多模态视觉理解的大模型,以完成图像描述、视觉问答等基于图像内容理解分析的任务。

一、支持多模态的模型

  • DashScope 多模态模型:阿里达摩院 DashScope 的多模态能力已在 LangChain4j 中获得内置支持。利用它可完成多样的图像理解任务,像是识别图片中的猫咪品种,分析 UI 截图能够进行的操作,解读流程图核心逻辑等。可选模型含 qwen-vl、qwen-vl-plus 等,后者更适配流程图、漫画分析之类的复杂视觉推理任务。

  • 智谱清言多模态模型:LangChain4j 集成了智谱清言的能力,图像识别任务运用 ZhipuAiChatModel 对象发送消息,在 UserMessage 里指定待处理图像与对应文字任务描述即可。若为图像生成任务,则需采用 ZhipuAiImageModel 对象。

二、撸代码-图像理解

step1

准备一张图片,让大模型去理解,笔者在同花顺截取了一张图;

step2

选一个能做图像理解的大模型,笔者选择的是qwen-vl-max

step3

在笔者之前的工程中修改LLMConfig

package com.xxx.demo.config;

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;


@Configuration
public class LLMConfig {
    @Bean(name = "qwen")
    public ChatModel chatModelQwen()
    {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliqwen-apikey"))
                .modelName("qwen-vl-max")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }
}

step4

将图片发送到大模型并接收结果

按以下思路实现:

  • 图片转码:通过Base64编码将图片转化成字符串;

  • 提示词指定:结合ImageContent和TextContent一起发送到模型进行处理

  • API调用:使用OpenAiChatModel来构建请求,并通过chat()方法调用模型。请求内容包括文本提示和图片,模型根据输入返回分析结果。

  • 解析与输出:从ChatResponse中获取AI大模型的回复,打印处理后的结果。

package com.xxx.demo.controller;

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.chat.ChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.output.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.Base64;


@RestController
public class Image2ChatController {
    @Autowired
    private ChatModel chatModel;

    @Value("classpath:image/jieguo.png")
    private Resource resource;

    /**
     * @Description: 通过Base64编码将图片转化为字符串,结合ImageContent和TextContent
     * 一起发送到模型进行处理。
     * @Auther: zzyybs@126.com
     *测试地址:http://localhost:9006/image/call
     */
    @GetMapping(value = "/image/call")
    public String readImageContent() throws IOException
    {

        byte[] byteArray = resource.getContentAsByteArray();
        String base64Data = Base64.getEncoder().encodeToString(byteArray);

        UserMessage userMessage = UserMessage.from(
                TextContent.from("从以下图片中获取股价走势"),
                ImageContent.from(base64Data,"image/jpg")
        );

        ChatResponse chatResponse = chatModel.chat(userMessage);
        String result = chatResponse.aiMessage().text();

        System.out.println(result);

        return result;
    }
}

step5

查看结果

三、撸代码-文生图

文生图顾名思义就是给模型一句话生成图片。

step1

选择一个合适的模型,这次我们选择wanx2.1-t2i-turbo

step2

在我们从第一张开始构建的父工程pom中添加依赖

        <!--langchain4j-community 引入阿里云百炼平台依赖管理清单-->
        <langchain4j-community.version>1.0.1-beta6</langchain4j-community.version>         
		<!--引入阿里云百炼平台依赖管理清单
           https://docs.langchain4j.dev/integrations/language-models/dashscope
           -->
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-community-bom</artifactId>
                <version>${langchain4j-community.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

step3

在实现文生图的子工程的pom中添加依赖

        <!--DashScope (Qwen)接入阿里云百炼平台
            https://docs.langchain4j.dev/integrations/language-models/dashscope
        -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
        </dependency>

step4

修改LLMConfig,添加文生图的调用

    /**
     * @Description: 测试通义万象来实现图片生成,
     * 官网说明:https://help.aliyun.com/zh/model-studio/text-to-image
     **/    
public WanxImageModel wanxImageModel()
    {
        return WanxImageModel.builder()
                .apiKey(System.getenv("aliqwen-apikey"))
                .modelName("wanx2.1-t2i-turbo") //图片生成 https://help.aliyun.com/zh/model-studio/text-to-image
                .build();
    }

step5

写一个controller试试效果

package com.xxx.demo.controller;

import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.JsonUtils;
import dev.langchain4j.community.model.dashscope.WanxImageModel;
import dev.langchain4j.data.image.Image;
import dev.langchain4j.model.output.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;


@RestController
public class WanxImageModelController {
    @Autowired
    private WanxImageModel wanxImageModel;

    // http://localhost:9006/image/create2
    @GetMapping(value = "/image/create2")
    public String createImageContent2() throws IOException
    {
        System.out.println(wanxImageModel);
        Response<Image> imageResponse = wanxImageModel.generate("美女");

        System.out.println(imageResponse.content().url());

        return imageResponse.content().url().toString();

    }


    @GetMapping(value = "/image/create3")
    public String createImageContent3() throws IOException
    {

        String prompt = "影子飒爽的短发美女,中国古典风格,近景";
        ImageSynthesisParam param =
                ImageSynthesisParam.builder()
                        .apiKey(System.getenv("aliqwen-apikey"))
                        .model(ImageSynthesis.Models.WANX_V1)
                        .prompt(prompt)
                        .style("<watercolor>")
                        .n(1)
                        .size("1024*1024")
                        .build();

        ImageSynthesis imageSynthesis = new ImageSynthesis();
        ImageSynthesisResult result = null;
        try {
            System.out.println("---sync call, please wait a moment----");
            result = imageSynthesis.call(param);
        } catch (ApiException | NoApiKeyException e){
            throw new RuntimeException(e.getMessage());
        }


        System.out.println(JsonUtils.toJson(result));

        return JsonUtils.toJson(result);
    }
}

step6

打开图片,试试效果。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐