"所有自然关联的事物都应当被结合起来教授" - 约翰·阿摩司·夸美纽斯,《世界图解》,1658
人类通过多种数据输入模式同时处理知识。我们的学习方式和经历都是多模态的——我们不仅仅有视觉、听觉或文本处理能力。
与这些原则相反,机器学习传统上通常专注于处理单一模态的专用模型。例如:
开发音频模型用于文本转语音或语音转文本
开发计算机视觉模型用于目标检测和分类
然而,新一代多模态大语言模型正在兴起。代表性模型包括:
OpenAI 的 GPT-4o
谷歌的 Vertex AI Gemini 1.5
Anthropic 的 Claude3
开源模型 Llama3.2、LLaVA 和 BakLLaVA
这些模型能够接受多种输入(包括文本、图像、音频和视频),并通过整合这些输入生成文本响应。
多模态大语言模型(LLM) 的特性使模型能够结合图像、音频或视频等其他模态处理并生成文本。
Spring AI 多模态支持
多模态指模型同时理解和处理多种来源信息的能力,包括文本、图像、音频及其他数据格式。
Spring AI 的 Message API 提供了支持多模态 LLM 所需的所有抽象。
UserMessage
的content
字段主要用于文本输入可选的
media
字段允许添加一个或多个不同模态的附加内容(如图像、音频、视频)MimeType
指定模态类型根据使用的 LLM,
Media
数据字段可以是:原始媒体内容(作为
Resource
对象)指向内容的 URI
重要限制:
media
字段目前仅适用于用户输入消息(如UserMessage
)对系统消息无意义
AssistantMessage
(包含 LLM 响应)仅提供文本内容生成非文本媒体输出需使用专用单模态模型
使用示例
以下面的图片(multimodal.test.png)作为输入,要求 LLM 解释其内容:
对于大多数多模态 LLM,Spring AI 代码类似这样:
// 加载图片资源
var imageResource = new ClassPathResource("/multimodal.test.png");
// 创建用户消息(文本+图片)
var userMessage = new UserMessage(
"解释你在这张图片中看到了什么?", // 文本内容
new Media(MimeTypeUtils.IMAGE_PNG, imageResource) // 媒体内容
);
// 调用模型获取响应
ChatResponse response = chatModel.call(new Prompt(userMessage));
或使用流式 ChatClient API:
String response = ChatClient.create(chatModel).prompt()
.user(u -> u
.text("解释你在这张图片中看到了什么?") // 文本
.media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("/multimodal.test.png")) // 图片
)
.call()
.content(); // 获取响应文本
模型可能返回如下响应:
这是一个水果碗的图片,设计简洁。碗由金属制成,带有弯曲的金属丝边缘,形成开放式结构,可以从各个角度看到水果。碗内有两根黄色香蕉覆盖在一个红苹果上。香蕉皮上的棕色斑点表明它们略微过熟。碗顶部有一个金属环,可能用作提手。碗放置在一个平面上,中性色背景清晰地展现了碗内的水果。
Spring AI 支持的多模态模型
Anthropic Claude 3
AWS Bedrock Converse
Azure OpenAI (如 GPT-4o 系列模型)
Mistral AI (如 Mistral Pixtral 系列模型)
Ollama (如 LLaVA, BakLLaVA, Llama3.2 模型)
OpenAI (如 GPT-4 和 GPT-4o 系列模型)
Vertex AI Gemini (如 gemini-1.5-pro-001, gemini-1.5-flash-001 模型)
评论区