LangChain4j多模态
本文最后更新于 2025年12月31日
未完待续
1.多模态概述
模态,就是感知事物的方式,比如视觉,听觉等,对应的信息传播媒介可以是文字,图片,视频,音频等。多模态就是从多个模态表达和感知事物。
很多模型都是单模态,输入和输出都只能是文本,是语言模型,例如deepseek,即使能上传图片,也是识别图片中的文字。但是除了语言模型,还有除语言外还支持其他模态的模型,便是多模态的模型。
即便多模态模型支持很多模态,也很难像人类一样,完完全全支持全模态。
多模态模型实现形式有很多,有的能根据文字生成图片视频,有的则是根据图片生成文字;有的还能根据图片生成图片实现AI试衣,有的不仅支持图文,还支持其他的媒体,比如会议转录文字,听歌识曲等。
LangChain4j框架当然也对多模态模型接入使用提供了支持,本文以阿里巴巴qwen3-vl-plus模型为例介绍。
2.图片内容理解(图生文)
以这张图片(src/main/resources/image.png)为例

pom.xml中和简单的prompt工程需要的依赖是一样的
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.4</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>1.8.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<name>Central Portal Snapshots</name>
<id>central-portal-snapshots</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>application.yml配置也是和简单的prompt工程需要的依赖是一样的,阿里云百炼多模态支持模型同样适用OpenAI接口协议格式。
langchain4j:
open-ai:
chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: ${QWKEY}
model-name: qwen3-vl-plus
log-requests: true
log-responses: true
return-thinking: true
logging:
level:
dev.langchain4j: debug编写测试类测试多模态,将图片上传给大模型,并根据图片内容提问:图片中的统计数据是谁发布的,大学学历网民占比是多少。
package org.example.test;
import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.example.Main;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.Base64;
import java.util.List;
@SpringBootTest(classes = Main.class)
@Slf4j
public class MTest {
@Resource
private ChatModel chatModel;
@Value("classpath:image.png")
private org.springframework.core.io.Resource resource;
@Test
public void imageToText() throws IOException {
byte[] byteArray = resource.getContentAsByteArray();
String base64 = Base64.getEncoder().encodeToString(byteArray);
UserMessage userMessage = UserMessage.from(
TextContent.from("图片中的统计数据是谁发布的,大学学历网民占比是多少。"),
ImageContent.from(base64, "image/png")
);
ChatResponse chatResponse = chatModel.chat(List.of(userMessage));
log.info("******** chatResponse: {}", chatResponse);
}
}
发送base64形式图片时,url参数会标记为data:image/png;base64,,并将base64图片放到url中,上传到大模型
有的大模型服务平台,图片URL除了base64外,还可以写图片的http网络地址
2026-01-10T18:42:56.278+08:00 INFO 20808 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP request:
- method: POST
- url: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
- headers: [Authorization: Beare...48], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {
"model" : "qwen3-vl-plus",
"messages" : [ {
"role" : "user",
"content" : [ {
"type" : "text",
"text" : "图片中的统计数据是谁发布的,大学学历网民占比是多少。"
}, {
"type" : "image_url",
"image_url" : {
"url" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5YAAAHmCAIAAACH1IbBAAAQAElEQVR4Aez9C6BsSVUf/u/aux93BmYYQBAZGGZ4DEKEAQOaqIAkDIkIo0RgAgaBqKhAYghEjREBo1F5hGgEeUVAIwpojMA/0UCigJrkB0YGlPCSGV4SHgIDzMzp197/T+3qU71P9znnvu89fW73Xad61apVVbu+tWrV2rW7+5bN5nWIEKjrejqdjsfjm266aTKZnK2RjcbjG268cS+68cYbRyMq41ldn60rPCX9wnlra2uvYZLftLVlnLP2dUp6PNcagdyEQXubzYAJ0kRMiAwa0ptGoySUbm1tkZBv6NQi0AX5hptuqusazpwMzBPduLWVhEqTRGo6jnoZqZalNGpfsketcsgUjB1WexFT50OWYLEmYJur4E0H6s4IOAFFqIWseVSGsoVm71jqUVPrQq7cqNPV4oGzOmrDBLvSpNZNYduFkVoq1SZIu+adm9UFtW4tvFqayjoYOoQbOrUIlMXmtf4IsAkLjN/h7KwTu77YMK3PszK4Qb/f7/Wqsgyd7kNZllU1GAyGw+FgEFXK0C3vqB54FuDQ5qFE4UsXa1BlWfaqajgYIOOURUtqm+w+CIB3OpttMeXxeDqZzKbTEELV6+UqTVEweFny0MhhWwJ0ecZ8WtvjOicR5/aOlzHv7y56XVSbBviQrqoqj94s1E0TSDua2tds1ukyqcgKEhaYZy7LjFMm76qdIzxvyVGgiF/Y4RU
......大模型回复如下,可以看出精准理解了图片内容,并且能进行一定的分析推理。
2026-01-10T18:43:04.808+08:00 INFO 20808 --- [ main] d.l.http.client.log.LoggingHttpClient : HTTP response:
- status code: 200
- headers: [vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding], [x-request-id: 3ac74322-599b-9042-b069-0d381d984c69], [x-dashscope-call-gateway: true], [content-type: application/json], [content-length: 1276], [req-cost-time: 7143], [req-arrive-time: 1768041778270], [resp-start-time: 1768041785413], [x-envoy-upstream-service-time: 6827], [date: Sat, 10 Jan 2026 10:43:05 GMT], [server: istio-envoy]
- body: {"choices":[{"message":{"content":"根据图片信息:\n\n1. **统计数据发布方**: \n 图片底部明确标注“来源:CNNIC 中国互联网络发展状况统计调查”,因此该数据是由 **中国互联网络信息中心(CNNIC)** 发布的。\n\n2. **大学学历网民占比**: \n 图表中“大学本科及以上”学历对应的数据显示:\n - **2016年12月**:占比为 **11.5%**\n - **2017年6月**:占比为 **11.6%**\n\n✅ 因此,截至2017年6月,**大学本科及以上学历的网民占比为 11.6%**。\n\n---\n\n📌 补充说明: \n“大学本科及以上”通常包括本科、硕士、博士等高等教育学历,是衡量网民受教育程度的重要指标。从数据看,该比例在半年内略有上升,但整体仍低于初中和高中/中专/技校学历群体。","reasoning_content":"","role":"assistant"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":457,"completion_tokens":211,"total_tokens":668,"prompt_tokens_details":{"image_tokens":437,"text_tokens":20},"completion_tokens_details":{"text_tokens":211}},"created":1768041785,"system_fingerprint":null,"model":"qwen3-vl-plus","id":"chatcmpl-3ac74322-599b-9042-b069-0d381d984c69"}
2026-01-10T18:43:04.839+08:00 INFO 20808 --- [ main] org.example.test.MTest : ******** chatResponse: ChatResponse { aiMessage = AiMessage { text = "根据图片信息:
1. **统计数据发布方**:
图片底部明确标注“来源:CNNIC 中国互联网络发展状况统计调查”,因此该数据是由 **中国互联网络信息中心(CNNIC)** 发布的。
2. **大学学历网民占比**:
图表中“大学本科及以上”学历对应的数据显示:
- **2016年12月**:占比为 **11.5%**
- **2017年6月**:占比为 **11.6%**
✅ 因此,截至2017年6月,**大学本科及以上学历的网民占比为 11.6%**。
---
📌 补充说明:
“大学本科及以上”通常包括本科、硕士、博士等高等教育学历,是衡量网民受教育程度的重要指标。从数据看,该比例在半年内略有上升,但整体仍低于初中和高中/中专/技校学历群体。", thinking = null, toolExecutionRequests = [], attributes = {} }, metadata = OpenAiChatResponseMetadata{id='chatcmpl-3ac74322-599b-9042-b069-0d381d984c69', modelName='qwen3-vl-plus', tokenUsage=OpenAiTokenUsage { inputTokenCount = 457, inputTokensDetails = OpenAiTokenUsage.InputTokensDetails { cachedTokens = null }, outputTokenCount = 211, outputTokensDetails = OpenAiTokenUsage.OutputTokensDetails { reasoningTokens = null }, totalTokenCount = 668 }, finishReason=STOP, created=1768041785, serviceTier='null', systemFingerprint='null', rawHttpResponse=dev.langchain4j.http.client.SuccessfulHttpResponse@3fe8ad3f, rawServerSentEvents=[]} }"如果文章对您有帮助,可以请作者喝杯咖啡吗?"
微信支付
支付宝