找回密码
 立即注册
首页 业界区 科技 6. LangChain4j + 多模态视觉理解详细说明

6. LangChain4j + 多模态视觉理解详细说明

髭赌 昨天 12:20
LangChain4j + 多模态视觉理解详细说明

@
目录

  • LangChain4j + 多模态视觉理解详细说明

    • LangChain4j进行图像理解

  • LangChain4j 多模态实战

    • 结合LangChain4j进行图像理解,其支持视觉-语言的多模态任务
    • 结合阿里巴巴通义万相进行图像生成(文本生成图像)

  • 最后:

LangChain4j进行图像理解

多模态之视觉理解:

  • https://docs.langchain4j.dev/tutorials/chat-and-language-models#multimodality


  • TextContent 文本交流大模型
  • ImageContent图像交流大模型
  • AudioContent 音频交流大模型
  • VideoContent 视频交流大模型
  • PdfFileContent PDF 交流大模型
1.png

eg:
2.png

3.png

LangChain4j 多模态实战

首先:准备工作:切换阿里百炼大模型选择选择模型qwen-vl-max,能支持图像的qwen-vl-max。
阿里百炼地址:https://bailian.console.aliyun.com/
4.png

5.png


  • https://help.aliyun.com/zh/model-studio/models#850732b1aabs0
6.png


  • https://help.aliyun.com/zh/model-studio/models#3f1f1c8913fvo
7.png

结合LangChain4j进行图像理解,其支持视觉-语言的多模态任务

就是让大模型,解读我们图像信息。
编写 Moudle 项目:

  • 导入 pom.xml 依赖。
8.png
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <parent>
  5.         <groupId>com.rainbowsea</groupId>
  6.         langchain4j-studys</artifactId>
  7.         <version>1.0-SNAPSHOT</version>
  8.     </parent>
  9.     langchain4j-04chat-image</artifactId>
  10.     <packaging>jar</packaging>
  11.     <name>langchain4j-04chat-image</name>
  12.     <url>http://maven.apache.org</url>
  13.     <properties>
  14.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15.     </properties>
  16.     <dependencies>
  17.         <dependency>
  18.             <groupId>org.springframework.boot</groupId>
  19.             spring-boot-starter-web</artifactId>
  20.         </dependency>
  21.         
  22.         
  23.         <dependency>
  24.             <groupId>dev.langchain4j</groupId>
  25.             langchain4j-open-ai</artifactId>
  26.         </dependency>
  27.         
  28.         <dependency>
  29.             <groupId>dev.langchain4j</groupId>
  30.             langchain4j</artifactId>
  31.         </dependency>
  32.         
  33.         <dependency>
  34.             <groupId>org.projectlombok</groupId>
  35.             lombok</artifactId>
  36.             <optional>true</optional>
  37.         </dependency>
  38.         
  39.         <dependency>
  40.             <groupId>cn.hutool</groupId>
  41.             hutool-all</artifactId>
  42.             <version>5.8.22</version>
  43.         </dependency>
  44.         <dependency>
  45.             <groupId>junit</groupId>
  46.             junit</artifactId>
  47.             <version>3.8.1</version>
  48.             <scope>test</scope>
  49.         </dependency>
  50.     </dependencies>
  51. </project>
复制代码

  • 编写大模型基本配置三件套(大模型 key,大模型 name,大模型 url)的配置类
9.png
  1. package com.rainbowsea.langchain4j04chatimage.config;
  2. import dev.langchain4j.model.chat.ChatModel;
  3. import dev.langchain4j.model.openai.OpenAiChatModel;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /**
  7. * https://docs.langchain4j.dev/tutorials/chat-and-language-models/#image-content
  8. */
  9. @Configuration
  10. public class LLMConfig {
  11.     @Bean
  12.     public ChatModel ImageModel() {
  13.         return OpenAiChatModel.builder()
  14.                 .apiKey(System.getenv("aliQwen_api"))
  15.                 //qwen-vl-max 是一个多模态大模型,支持图片和文本的结合输入,适用于视觉-语言任务。
  16.                 .modelName("qwen-vl-max")
  17.                 .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
  18.                 .build();
  19.     }
  20. }
复制代码

  • 业务类的编写:
1)resources目录下放入mi.jpg图片。该图片就是用于让大模型读取的图片资料。
10.png

11.png


  • https://docs.langchain4j.dev/tutorials/chat-and-language-models/#multimodality
12.png

13.png
  1. package com.rainbowsea.langchain4j04chatimage.controller;
  2. import dev.langchain4j.data.message.ImageContent;
  3. import dev.langchain4j.data.message.TextContent;
  4. import dev.langchain4j.data.message.UserMessage;
  5. import dev.langchain4j.model.chat.ChatModel;
  6. import dev.langchain4j.model.chat.response.ChatResponse;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.beans.factory.annotation.Value;
  10. import org.springframework.core.io.Resource;
  11. import org.springframework.web.bind.annotation.GetMapping;
  12. import org.springframework.web.bind.annotation.RestController;
  13. import java.io.IOException;
  14. import java.util.Base64;
  15. /**
  16. *
  17. */
  18. @RestController
  19. @Slf4j
  20. public class ImageModelController {
  21.     @Autowired
  22.     private ChatModel chatModel;
  23.     @Value("classpath:static/images/mi.jpg")
  24.     // 图片也是一种资源,也可以用 @Value 进行赋值注入
  25.     // classpath表示 resources 根目录
  26.     private Resource resource;    //import org.springframework.core.io.Resource;
  27.     /**
  28.      * @Description: 通过Base64编码将图片转化为字符串,结合ImageContent和TextContent
  29.      * 一起发送到模型进行处理。
  30.      * 测试地址:http://localhost:9004/image/call
  31.      */
  32.     @GetMapping(value = "/image/call")
  33.     public String readImageContent() throws IOException {
  34.         // 注意:这里我们的计算机还是大模型是无法直接识别,传输图片的
  35.         // 我们需要将图片转换为 byte[] 二进制比特数据才能传输,才能识别
  36.         byte[] byteArray = resource.getContentAsByteArray();
  37.         String base64Data = Base64.getEncoder().encodeToString(byteArray);
  38.         // 将发送给大模型的信息,封装到 UserMessage 对象当中
  39.         UserMessage userMessage = UserMessage.from(
  40.                 TextContent.from("从以下图片中获取来源网站名称,股价走势和5月30号股价"),
  41.                 // mimeType 指明让大模型解读的文件类型是::image/jpg ,让大模型更容易解读
  42.                 ImageContent.from(base64Data, "image/jpg")
  43.         );
  44.         ChatResponse chatResponse = chatModel.chat(userMessage);
  45.         String result = chatResponse.aiMessage().text();
  46.         System.out.println(result);
  47.         return result;
  48.     }
  49. }
复制代码
运行测试:
14.png

结合阿里巴巴通义万相进行图像生成(文本生成图像)


  • https://docs.langchain4j.dev/integrations/language-models/
15.png

LangChain4J引l入第3方平台和自己整合:
注意:这里我们的 DashScope 是 Qwen 通义千问。

  • https://docs.langchain4j.dev/integrations/language-models/dashscope
16.png

官方说明,新增 Maven 配置
17.png


  • **导入对应大模型依赖的 xml **
这里我们统一一下,将配置放到我们的顶级 pom.xml 当中。
18.png

19.png
  1.         
  2.         <langchain4j-community.version>1.0.1-beta6</langchain4j-community.version>
复制代码
  1.             
  2.             <dependency>
  3.                 <groupId>dev.langchain4j</groupId>
  4.                 langchain4j-community-bom</artifactId>
  5.                 <version>${langchain4j-community.version}</version>
  6.                 <type>pom</type>
  7.                 <scope>import</scope>
  8.             </dependency>
复制代码
阿里巴巴通义万相 WanxlmageModel:

  • https://docs.langchain4j.dev/integrations/language-models/dashscope#configurable-parameters
20.png

21.png

切换通义万相-文生图模型 wanx2.1-t2i-turbo ,它支持通过一句话生成图像

  • https://help.aliyun.com/zh/model-studio/text-to-image
22.png
23.png


  • 在我们对应的子模块的 pom.xml 当中导入我们 '通义千问文图' 的依赖 jak 包
版本信息,从顶级 pom.xml 当中继承获取
24.png


  • 切换我们配置类当中的大模型为 “wanx2.1-t2i-turbo”可以文生图的大模型
25.png
  1. package com.rainbowsea.langchain4j04chatimage.config;
  2. import dev.langchain4j.community.model.dashscope.WanxImageModel;
  3. import dev.langchain4j.model.chat.ChatModel;
  4. import dev.langchain4j.model.openai.OpenAiChatModel;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. /**
  8. * https://docs.langchain4j.dev/tutorials/chat-and-language-models/#image-content
  9. */
  10. @Configuration
  11. public class LLMConfig {
  12.     /**
  13.      * @Description: 测试通义万象来实现图片生成,
  14.      * 知识出处,https://help.aliyun.com/zh/model-studio/text-to-image
  15.      * @Auther: zzyybs@126.com
  16.      */
  17.     @Bean
  18.     public WanxImageModel wanxImageModel()
  19.     {
  20.         return WanxImageModel.builder()
  21.                 .apiKey(System.getenv("aliQwen_api"))
  22.                 .modelName("wanx2.1-t2i-turbo") //图片生成 https://help.aliyun.com/zh/model-studio/text-to-image
  23.                 .build();
  24.     }
  25. }
复制代码

  • 编写 文生图的 controller 类方法
26.png

27.png
  1. package com.rainbowsea.langchain4j04chatimage.controller;
  2. import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
  3. import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
  4. import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
  5. import com.alibaba.dashscope.exception.ApiException;
  6. import com.alibaba.dashscope.exception.NoApiKeyException;
  7. import com.alibaba.dashscope.utils.JsonUtils;
  8. import dev.langchain4j.community.model.dashscope.WanxImageModel;
  9. import dev.langchain4j.data.image.Image;
  10. import dev.langchain4j.model.output.Response;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.web.bind.annotation.GetMapping;
  14. import org.springframework.web.bind.annotation.RestController;
  15. import java.io.IOException;
  16. /**
  17. */
  18. @RestController
  19. @Slf4j
  20. public class WanxImageModelController
  21. {
  22.     @Autowired
  23.     private WanxImageModel wanxImageModel;
  24.     // http://localhost:9006/image/create2
  25.     @GetMapping(value = "/image/create2")
  26.     public String createImageContent2() throws IOException
  27.     {
  28.         System.out.println(wanxImageModel);
  29.         Response<Image> imageResponse = wanxImageModel.generate("小兔子");
  30.         System.out.println(imageResponse.content().url());
  31.         return imageResponse.content().url().toString();
  32.     }
  33.     // http://localhost:9006/image/create3
  34.     @GetMapping(value = "/image/create3")
  35.     public String createImageContent3() throws IOException
  36.     {
  37.         String prompt = "近景镜头,18岁的中国女孩,古代服饰,圆脸,正面看着镜头," +
  38.                 "民族优雅的服装,商业摄影,室外,电影级光照,半身特写,精致的淡妆,锐利的边缘。";
  39.         ImageSynthesisParam param =
  40.                 ImageSynthesisParam.builder()
  41.                             .apiKey(System.getenv("aliQwen-api"))
  42.                             .model(ImageSynthesis.Models.WANX_V1)
  43.                             .prompt(prompt)
  44.                             .style("<watercolor>")
  45.                             .n(1)
  46.                             .size("1024*1024")
  47.                         .build();
  48.         ImageSynthesis imageSynthesis = new ImageSynthesis();
  49.         ImageSynthesisResult result = null;
  50.         try {
  51.             System.out.println("---sync call, please wait a moment----");
  52.             result = imageSynthesis.call(param);
  53.         } catch (ApiException | NoApiKeyException e){
  54.             throw new RuntimeException(e.getMessage());
  55.         }
  56.         System.out.println(JsonUtils.toJson(result));
  57.         return JsonUtils.toJson(result);
  58.     }
  59. }
复制代码

  • 运行测试:
28.png

最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
29.gif


来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册