主题
多模态 API
// image::orbis-sensualium-pictus2.jpg[Orbis Sensualium Pictus, align="center"]
“凡是天生相关联的事物,都应当结合起来教授” —— 约翰·阿姆斯·夸美纽斯,《世界图绘》(Orbis Sensualium Pictus),1658
人类在处理知识时,是同时在多种数据输入模式之间进行的。 我们学习的方式、我们的经验,都是多模态的。 我们并非只有视觉、只有听觉、只有文本。
与这些原则相反,机器学习往往专注于为处理单一模式而定制的专门模型。 例如,我们为文本转语音或语音转文本之类的任务开发音频模型,为物体检测与分类之类的任务开发计算机视觉模型。
然而,新一波多模态大语言模型开始涌现。 例如 OpenAI 的 GPT、Google 的 Gemini、Anthropic 的 Claude,以及开源的 Llama、LLaVA 和 BakLLaVA,它们能够接受多种输入,包括文本、图像、音频和视频,并通过整合这些输入来生成文本响应。
NOTE
多模态大语言模型(LLM)特性使模型能够结合其他模式(如图像、音频或视频)来处理并生成文本。
Spring AI 多模态
多模态指的是模型同时理解和处理来自各种来源(包括文本、图像、音频及其他数据格式)的信息的能力。
Spring AI Message API 提供了支持多模态 LLM 所需的全部抽象。
UserMessage 的 content 字段主要用于文本输入,而可选的 media 字段允许添加一种或多种不同模式的附加内容,如图像、音频和视频。 MimeType 指定模式的类型。 依据所使用的 LLM,Media 数据字段可以是作为 Resource 对象的原始媒体内容,或是指向该内容的 URI。
NOTE
媒体字段目前仅适用于用户输入消息(例如 UserMessage)。它对系统消息没有意义。包含 LLM 响应的 AssistantMessage 仅提供文本内容。要生成非文本的媒体输出,你应使用某个专门的、单一模式的模型。*
例如,我们可以把下面这张图片(multimodal.test.png)作为输入,并让 LLM 解释它看到了什么。
对于大多数多模态 LLM,Spring AI 代码看起来大致像这样:
java
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
.build();
ChatResponse response = chatModel.call(new Prompt(this.userMessage));或者使用流式 ChatClient API:
java
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();并产生类似这样的响应:
这是一张设计简约的水果碗图片。碗由金属制成,带有弯曲的金属丝边缘,形成开放结构,使水果从各个角度都可见。碗内有两根黄色香蕉,搁在看似一个红苹果的物体之上。香蕉略微过熟,从果皮上的褐色斑点可以看出。碗顶部有一个金属环,可能用作提拿的把手。碗被放置在一个平面上,背景为中性色,清晰地展现了碗内的水果。
Spring AI 为以下聊天模型提供多模态支持: