多模态 API
“一切天然相关的事物都应结合起来教授”——约翰·阿摩司·夸美纽斯,《世界图解》,1658年
人类同时通过多种数据输入模式处理知识。我们的学习方式、我们的经历都是多模态的。我们不仅仅有视觉、仅仅有音频或仅仅有文本。
与这些原则相反,机器学习往往侧重于针对单一模态进行特化的专用模型。例如,我们开发了用于文本转语音或语音转文本等任务的音频模型,以及用于目标检测和分类等任务的计算机视觉模型。
然而,新一波多模态大语言模型开始涌现。例如,OpenAI 的 GPT、Google 的 Gemini、Anthropic 的 Claude,以及开源方案 Llama、LLaVA 和 BakLLaVA,它们能够接受多种输入,包括文本、图像、音频和视频,并通过整合这些输入来生成文本响应。
多模态大语言模型(LLM)特性使模型能够结合图像、音频或视频等其他模态来处理和生成文本。
Spring AI 多模态
多模态指的是模型能够同时理解并处理来自各种来源的信息的能力,这些来源包括文本、图像、音频和其他数据格式。
Spring AI 的 Message API 提供了支持多模态 LLM 所需的全部抽象。
Spring AI Message APIUserMessage的content字段主要用于文本输入,而可选的media字段则允许添加一个或多个其他模态的附加内容,例如图像、音频和视频。MimeType用于指定模态类型。根据所使用的 LLM,Media的数据字段既可以是作为Resource对象的原始媒体内容,也可以是内容的 URI。
目前,media字段仅适用于用户输入消息(例如UserMessage),对于系统消息没有意义。包含 LLM 响应的AssistantMessage仅提供文本内容。要生成非文本媒体输出,应使用专用的单模态模型之一。*
例如,我们可以将以下图片(multimodal.test.png)作为输入,并要求 LLM 解释它所看到的内容。
多模态测试图像
对于大多数多模态 LLM,Spring AI 的代码大致如下:
varimageResource=newClassPathResource("/multimodal.test.png");varuserMessage=UserMessage.builder().text("解释一下你在这张图片中看到了什么?")// content.media(newMedia(MimeTypeUtils.IMAGE_PNG,this.imageResource))// media.build();ChatResponseresponse=chatModel.call(newPrompt(this.userMessage));或者使用流畅的 ChatClient API:
Stringresponse=ChatClient.create(chatModel).prompt().user(u->u.text("解释一下你在这张图片中看到了什么?").media(MimeTypeUtils.IMAGE_PNG,newClassPathResource("/multimodal.test.png"))).call().content();并产生类似这样的响应:
这是一张水果碗的图片,设计简约。碗由金属制成,带有弯曲的金属丝边缘,构成开放式结构,使水果从各个角度都可见。碗里有两根黄香蕉,放在一个看起来像是红苹果的上面。香蕉略微过熟,果皮上有棕色斑点。碗顶部有一个金属环,很可能用作提手。碗被放置在一个平坦的表面上,背景为中性色,可以清晰地看到里面的水果。
Spring AI 为以下聊天模型提供了多模态支持:
- Anthropic Claude
- AWS Bedrock Converse
- Mistral AI(例如 Mistral Pixtral 模型)
- Ollama(例如 LLaVA、BakLLaVA、Llama 模型)
- OpenAI(例如 GPT 模型)
- Google Gemini