多模态 API
“所有自然相关的事物都应结合在一起教授” - 约翰·阿摩司·夸美纽斯,《世界图解》,1658 年
人类处理知识时,会同时通过多种数据输入模式进行。我们学习的方式以及我们的经验都是多模态的。我们不仅仅有视觉、听觉和文本。
与这些原则相反,机器学习通常专注于处理单一模态的专用模型。例如,我们开发了用于文本到语音或语音到文本任务的音频模型,以及用于对象检测和分类等任务的计算机视觉模型。
然而,新一代的多模态大型语言模型开始涌现。例如,OpenAI 的 GPT-4o、Google 的 Vertex AI Gemini 1.5、Anthropic 的 Claude3,以及开源产品 Llama3.2、LLaVA 和 Balklava 都能够接受多种输入,包括文本、图像、音频和视频,并通过整合这些输入生成文本响应。
多模态大语言模型(LLM)功能使模型能够结合其他模态(如图像、音频或视频)处理和生成文本。
Spring AI 多模态
多模态(Multimodality)指的是一个模型能够同时理解和处理来自多种来源的信息,包括文本、图像、音频以及其他数据格式的能力。
Spring AI 消息 API 提供了所有必要的抽象,以支持多模态 LLM。
UserMessage 的 content
字段主要用于文本输入,而可选的 media
字段允许添加一个或多个不同模态的附加内容,例如图像、音频和视频。MimeType
指定了模态类型。根据所使用的 LLM,Media
数据字段可以是原始媒体内容作为 Resource
对象,也可以是内容的 URI
。
media
字段目前仅适用于用户输入消息(例如 UserMessage
)。它对系统消息没有意义。包含 LLM 响应的 AssistantMessage
仅提供文本内容。要生成非文本的媒体输出,你应该使用专用的单模态模型。*
例如,我们可以将以下图片(multimodal.test.png
)作为输入,并要求 LLM 解释它所看到的内容。
对于大多数多模态 LLM 来说,Spring AI 代码通常会如下所示:
var imageResource = new ClassPathResource("/multimodal.test.png");
var userMessage = new UserMessage(
"Explain what do you see in this picture?", // content
new Media(MimeTypeUtils.IMAGE_PNG, this.imageResource)); // media
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();
并产生如下响应:
这是一个设计简单的水果碗图像。碗由金属制成,带有弯曲的金属丝边缘,形成了一个开放的结构,使得水果可以从各个角度清晰可见。碗内有两根黄色的香蕉,它们放在一个看似是红苹果的水果上。香蕉略微过熟,从它们皮上的褐色斑点可以看出。碗的顶部有一个金属环,可能是用来作为提手的。碗被放置在一个平坦的表面上,背景为中性色调,清晰地展示了碗内的水果。
Spring AI 为以下聊天模型提供了多模态支持: