Spring AI 多模态 API

在人工智能(AI)领域,多模态(Multimodal) 指的是模型能够处理、理解或生成多种不同类型的信息(即 “模态”),并实现不同模态之间的交互与融合。这些模态通常对应人类感知世界的多种方式,如视觉、听觉、语言等,也包括文本、图像、音频、视频、传感器数据等具体形式。

模态” 本质上是信息的载体或表现形式。常见的模态包括:

  • 文本(Text):如自然语言句子、段落、文档等;

  • 图像(Image):如照片、图表、截图等视觉信息;

  • 音频(Audio):如语音、音乐、环境声音等;

  • 视频(Video):连续的图像序列 + 音频的组合;

  • 其他:如传感器数据(温度、加速度)、3D 点云、手势动作等。

单模态模型只能处理一种模态(如纯文本模型只能理解文字,纯图像模型只能识别图片),而多模态模型则能同时处理两种或以上模态,甚至在不同模态间进行转换(如“图像转文字”和“文字生成音频”)。

人类通过多模态数据输入并行处理知识。我们的学习方式和体验都是多模态的 —— 不只有视觉、听觉或文本的单一感知。

然而,机器学习往往专注于处理单一模态的专用模型。例如,我们开发音频模型用于文本转语音或语音转文本任务,开发计算机视觉模型用于目标检测和分类等任务。

然而,新一代多模态大语言模型正在兴起。例如 OpenAI 的 GPT-4o、Google 的 Vertex AI Gemini 1.5、Anthropic 的 Claude3,以及开源模型 Llama3.2、LLaVA 和 BakLLaVA,都能接受文本、图像、音频和视频等多种输入,并通过整合这些输入生成文本响应。

多模态大语言模型(LLM)的特性使其能够结合图像、音频或视频等其他模态处理并生成文本。


Spring AI 多模态

多模态性指模型同时理解和处理文本、图像、音频及其他数据格式等多源信息的能力。Spring AI 的 Message API 提供了支持多模态 LLM 所需的所有抽象。类图如下:

Spring AI 多模态 API

上图,UserMessage 的 content 字段主要用于文本输入,而可选的 media 字段允许添加图像、音频和视频等多模态内容。MimeType 指定模态类型,根据所用 LLM 的不同,Media 数据字段可以是原始媒体内容(作为 Resource 对象)或内容 URI。

🌈注意:目前 media 字段仅适用于用户输入消息(如 UserMessage),对系统消息无意义。包含 LLM 响应的 AssistantMessage 仅提供文本内容。要生成非文本媒体输出,应使用专用的单模态模型。

  

简单示例

我们可以将下图(multimodal.test.png)作为输入,要求 LLM 解释它所识别的内容。

Spring AI 多模态 API

配置信息如下:

spring:
  application:
    name: springai_demo1
  # 数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/chat_db
    username: root
    password: aaaaaa
  # AI配置
  ai:
    # openai相关配置
    openai:
      # 基础地址
      base-url: https://api.xty.app
      # AI KEY
      api-key: sk-vHTHX8D3wNZBfRya831a6f562**************************
      # 聊天模型配置
      chat:
        options:
          model: gpt-3.5-turbo
      # 图片模型配置
      image:
        options:
          # 需要高级接口
          model: dall-e-3
    chat:
      memory:
        # 会话历史持久化
        repository:
          jdbc:
            # 启动时不自动执行初始化SQL脚本,手动创建数据表
            initialize-schema: never
      client:
        # true 开启,自动注入 ChatClient,false 关闭,需要手动创建 ChatClient
        enabled: true

# 日志配置
logging:
  charset:
    console: UTF-8
  level:
    root: info
    org.springframework.ai: debug

对于大多数多模态 LLM,Spring AI 代码通常如下所示:

package com.hxstrive.springai.springai_openai.multi_modal1.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.content.Media;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
class MyController {

    @Autowired
    private ChatModel chatModel;

    // http://localhost:8080/ai
    @GetMapping(value = "/ai",produces = "text/html; charset=UTF-8")
    public String ai() {
        // 图片资源
        Resource imageResource = new ClassPathResource("/static/image/multimodal.test.png");

        UserMessage userMessage = UserMessage.builder()
                // 提示语
                .text("解释一下你在这张图片中看到了什么?")
                // 添加图片资源
                .media(new Media(MimeTypeUtils.IMAGE_PNG, imageResource))
                .build();

        ChatClient chatClient = ChatClient.builder(chatModel)
                .defaultAdvisors(new SimpleLoggerAdvisor())
                .build();
        return chatClient.prompt(new Prompt(userMessage)).call().content();
    }

}

运行应用,效果如下图:

或使用 Fluent 风格的 ChatClient API 实现,如下:

package com.hxstrive.springai.springai_openai.multi_modal2.controller;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
class MyController {

    @Autowired
    private ChatModel chatModel;

    // http://localhost:8080/ai
    @GetMapping(value = "/ai",produces = "text/html; charset=UTF-8")
    public String ai() {
        // 图片资源
        Resource imageResource = new ClassPathResource("/static/image/multimodal.test.png");
        return ChatClient.create(chatModel).prompt()
                .advisors(new SimpleLoggerAdvisor())
                .user(u -> u.text("解释一下你在这张图片中看到了什么?")
                        .media(MimeTypeUtils.IMAGE_PNG, imageResource))
                .call()
                .content();
    }

}

运行应用,输出如下图:

查看一下后端输出日志,了解请求和响应格式,如下:

2025-07-31T20:29:23.900+08:00 DEBUG 23044 --- [springai_demo1] [nio-8080-exec-2] o.s.a.c.c.advisor.SimpleLoggerAdvisor    : request: ChatClientRequest[prompt=Prompt{messages=[UserMessage{content='解释一下你在这张图片中看到了什么?', properties={messageType=USER}, messageType=USER}], modelOptions=OpenAiChatOptions: {"streamUsage":false,"model":"gpt-3.5-turbo","temperature":0.7}}, context={}]

2025-07-31T20:30:32.150+08:00 DEBUG 23044 --- [springai_demo1] [nio-8080-exec-2] o.s.a.c.c.advisor.SimpleLoggerAdvisor    : response: {
  "result" : {
    "output" : {
      "messageType" : "ASSISTANT",
      "metadata" : {
        "role" : "ASSISTANT",
        "messageType" : "ASSISTANT",
        "finishReason" : "STOP",
        "refusal" : "",
        "index" : 0,
        "annotations" : [ ],
        "id" : "chatcmpl-k77GzVbVcCEt1rHC4bP1nsvWXWFDI"
      },
      "toolCalls" : [ ],
      "media" : [ ],
      "text" : "在这张图片中,我看到一个金属水果篮,篮子里有一些香蕉和红色的苹果。香蕉的皮上有一些小斑点,看起来成熟且略有些老化,而苹果则比较圆润且色泽鲜亮。背景色较为简单,给人一种温馨、宁静的感觉。"
    },
    "metadata" : {
      "finishReason" : "STOP",
      "contentFilters" : [ ],
      "empty" : true
    }
  },
  "metadata" : {
    "id" : "chatcmpl-k77GzVbVcCEt1rHC4bP1nsvWXWFDI",
    "model" : "gpt-3.5-turbo-0613",
    "rateLimit" : {
      "requestsLimit" : null,
      "requestsRemaining" : null,
      "requestsReset" : null,
      "tokensLimit" : null,
      "tokensRemaining" : null,
      "tokensReset" : null
    },
    "usage" : {
      "promptTokens" : 449,
      "completionTokens" : 123,
      "totalTokens" : 572,
      "nativeUsage" : {
        "completion_tokens" : 123,
        "prompt_tokens" : 449,
        "total_tokens" : 572
      }
    },
    "promptMetadata" : [ ],
    "empty" : false
  },
  "results" : [ {
    "output" : {
      "messageType" : "ASSISTANT",
      "metadata" : {
        "role" : "ASSISTANT",
        "messageType" : "ASSISTANT",
        "finishReason" : "STOP",
        "refusal" : "",
        "index" : 0,
        "annotations" : [ ],
        "id" : "chatcmpl-k77GzVbVcCEt1rHC4bP1nsvWXWFDI"
      },
      "toolCalls" : [ ],
      "media" : [ ],
      "text" : "在这张图片中,我看到一个金属水果篮,篮子里有一些香蕉和红色的苹果。香蕉的皮上有一些小斑点,看起来成熟且略有些老化,而苹果则比较圆润且色泽鲜亮。背景色较为简单,给人一种温馨、宁静的感觉。"
    },
    "metadata" : {
      "finishReason" : "STOP",
      "contentFilters" : [ ],
      "empty" : true
    }
  } ]
}

目前,Spring AI 为以下聊天模型提供多模态支持:

  • Anthropic Claude 3  是人工智能公司 Anthropic 推出的新一代大语言模型系列,包含 Claude 3 Opus、Claude 3 Sonnet、Claude 3 Haiku 等不同参数规模的版本,分别针对高性能、平衡性能与效率、轻量化等场景设计。

  • AWS Bedrock Converse  是 AWS Bedrock 服务中的一个核心 API 操作,主要用于与 Bedrock 支持的各类基础模型(如大语言模型、多模态模型等)进行交互。

  • Azure Open AI (e.g. GPT-4o models)  是微软 Azure 云服务与 OpenAI 合作推出的服务,提供对 OpenAI 系列模型(如 GPT-4o 等)的云端访问。

  • Mistral AI (e.g. Mistral Pixtral models)  是一家来自法国的人工智能公司,专注于开发高效、开源的大语言模型。其推出的 Mistral 和 Pixtral 系列模型是典型代表。

  • Ollama (e.g. LLaVA, BakLLaVA, Llama3.2 models)  是一个用于本地运行大语言模型和多模态模型的工具,支持在个人设备上便捷部署、管理模型,无需依赖云端服务。

  • OpenAI (e.g. GPT-4 and GPT-4o models)  是一家知名的人工智能研究公司,其开发的 GPT 系列模型是基于大语言模型(LLM)的代表性产品。

  • Vertex AI Gemini (e.g. gemini-1.5-pro-001, gemini-1.5-flash-001 models)  是谷歌云平台(Google Cloud)推出的基于 Gemini 大模型的人工智能服务,主要包含 gemini-1.5-pro-001 和 gemini-1.5-flash-001 等模型。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号