LangChain4J-(4)-多模态视觉理解
多模态视觉理解指的是从视觉与其他多种不同模态,像文本、音频等的数据中提取并融合信息,进而更全面、深入地理解数据含义的技术。
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 {@Autowiredprivate 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 {@Autowiredprivate 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
打开图片,试试效果。