多模态 API
“凡是自然相关的事物,都应当结合起来教授。” —— 约翰·阿莫斯·科门纽斯,《Orbis Sensualium Pictus》,1658
人类处理知识时,会同时依赖多种数据输入方式。我们的学习方式和经历都是多模态的——我们不仅仅依赖视觉、音频或文字,而是多种感官共同作用。
然而,传统的机器学习往往专注于处理单一模态的专用模型。例如,我们开发了音频模型来完成文本转语音或语音转文本任务,开发了计算机视觉模型来完成目标检测和分类任务。
如今,新一代的多模态大型语言模型(LLM)正在兴起。例如,OpenAI 的 GPT-4o、Google 的 Vertex AI Gemini 1.5、Anthropic 的 Claude3,以及开源方案如 Llama3.2、LLaVA 和 BakLLaVA,这些模型能够接收多种输入,包括文本、图像、音频和视频,并通过整合这些输入生成文本回应。
Spring AI 多模态
多模态(Multimodality)指模型能够同时理解和处理来自多种来源的信息,包括文本、图像、音频以及其他数据格式。
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 = UserMessage.builder()
.text("Explain what do you see in this picture?") // 文本内容
.media(new Media(MimeTypeUtils.IMAGE_PNG, this.imageResource)) // 媒体内容
.build();
ChatResponse response = chatModel.call(new Prompt(this.userMessage));
或使用流式 ChatClient API:
String response = ChatClient.create(chatModel).prompt()
.user(u -> u.text("Explain what do you see on this picture?")
.media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("/multimodal.test.png")))
.call()
.content();
生成的响应可能类似于:
这是一个简单设计的水果碗的图像。碗由金属制成,边缘为弯曲的金属丝结构,形成开放的设计,可以从各个角度看到碗内的水果。碗内有两根黄色香蕉,放在一颗红苹果上方。香蕉略显过熟,表皮上有棕色斑点。碗顶部有一个金属环,可能用于提拿。碗置于平面表面,背景颜色中性,清晰地展示了碗内的水果。