多模态
约 1312 字大约 4 分钟
2026-09-15
📌 原文地址:https://docs.spring.io/java-ai/reference/api/multimodality.html 📌 原文版本:Java AI 2.0.1(Stable,稳定版)
"All things that are naturally connected ought to be taught in combination"(凡是天然相关联的事物,都应当结合起来一起教)—— John Amos Comenius(约翰·阿莫斯·夸美纽斯),《Orbis Sensualium Pictus》(《世界图解》),1658 年
人类会同时通过多种数据输入模式来处理知识。我们学习的方式、我们的经历,本质上都是多模态的——我们可不是只有视觉、只有听觉、只有文字。
与这些原则相反,机器学习领域过去往往专注于只处理单一模态的专用模型。比如说,我们开发了用于文本转语音、语音转文本这类任务的音频模型,也开发了用于物体检测与分类这类任务的计算机视觉模型。
不过,新一波多模态大语言模型正开始兴起。像 OpenAI 的 GPT、Google 的 Gemini、Anthropic 的 Claude,以及开源界的 Llama、LLaVA、BakLLaVA,它们都能接受多种输入——包括文本、图像、音频和视频——并通过整合这些输入来生成文本回复。
多模态大语言模型的能力,让模型可以结合其他模态(比如图像、音频或视频)来处理并生成文本。
白话解读
"多模态"说白了就是:让 AI 不只会"读文字",还会"看图""听声音"。你扔给它一张照片加一句"这是啥?",它能边看图边回答——就像人一样,眼、耳、文字一起上。
Java AI Multimodality(Java AI 的多模态)
多模态指的是模型同时理解和处理来自各种来源信息的能力,这些来源包括文本、图像、音频以及其他数据格式。
Java AI 的 Message API(消息 API)提供了支持多模态 LLM 所需的全部抽象。
UserMessage 的 content(内容)字段主要用于文本输入,而可选的 media(媒体)字段则允许附加一个或多个其他模态的内容,比如图像、音频和视频。MimeType(MIME 类型)用来指定模态类型。取决于你用的是哪家的 LLM,Media 的数据字段既可以是用 Resource 对象表示的原始媒体内容,也可以是指向该内容的 URI(统一资源标识符)。
media 字段目前只对用户输入消息(例如 UserMessage)有效,对 system message(系统消息)没有意义。而承载 LLM 回复的 AssistantMessage(助手消息)只提供文本内容。如果你想生成非文本的媒体输出,应该改用专门的单一模态模型。
白话解读
记住一个不对称性:输入可以多模态,输出目前只有文本。也就是说,模型能"看图说话",但不能"说话生图"。要生成图片或语音,得去找专门的 Image Models(图像模型)或 Audio Models(音频模型)。
例如,我们可以拿下面这张图片作为输入,让 LLM 解释一下它看到了什么。

对大多数多模态 LLM 来说,Java AI 的代码大概长这样:
// 从 classpath 加载测试用的图片资源
var imageResource = new ClassPathResource("/multimodal.test.png");
var userMessage = UserMessage.builder()
.text("Explain what do you see in this picture?") // content(文本内容):"解释一下你在图片里看到了什么?"
.media(new Media(MimeTypeUtils.IMAGE_PNG, this.imageResource)) // media(媒体内容):以 PNG 格式附带图片
.build();
// 把用户消息包进 Prompt,调用 ChatModel 完成一轮对话
ChatResponse response = chatModel.call(new Prompt(this.userMessage));或者使用链式风格的 ChatClient API(聊天客户端 API):
String response = ChatClient.create(chatModel).prompt() // 创建 ChatClient 并开始构建提示词
.user(u -> u.text("Explain what do you see on this picture?") // 用户文本提问:"解释一下你在图片里看到了什么?"
.media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("/multimodal.test.png"))) // 附加 PNG 图片媒体
.call() // 发起调用
.content(); // 直接取回纯文本回复内容得到的回复大概长这样:
这是一张简约风格水果碗的图片。碗由金属制成,弯折的金属丝边缘形成开放式结构,让人能从各个角度看到里面的水果。碗中有两根黄色香蕉,搁在一个看起来是红苹果的水果上面。香蕉皮上有些褐色斑点,说明它们稍微有点熟过头了。碗的顶部有一个金属环,估计是用来当提手、方便端起整只碗的。碗被放置在一个平面上,背景是中性色调,能让人清楚看到碗里的水果。
白话解读
两种写法效果一样,区别在于"手动挡"和"自动挡":第一种自己动手拼 UserMessage 和 Prompt,控制粒度更细;第二种用 ChatClient 链式调用,一路点到底,代码更简洁。日常业务开发推荐用 ChatClient,需要精细控制消息结构时再上底层 API。
Java AI 为以下聊天模型提供了多模态支持:
- Anthropic Claude
- AWS Bedrock Converse
- Mistral AI(例如 Mistral Pixtral 模型)
- Ollama(例如 LLaVA、BakLLaVA、Llama 模型)
- OpenAI(例如 GPT 模型)
- Google Gemini