Spring AI 对多模态的支持,API 层面其实很简单——构建一个 Media 对象,塞进 UserMessage,就完事了。
但到了生产环境,就有新的问题了。
用户发了一张图片过来,系统怎么知道该用视觉模型而不是文本模型?多个供应商都支持视觉能力,模型怎么选?不同用户想用不同的视觉模型,配置怎么隔离?
这篇内容就从 Spring AI 的多模态 API 讲起,再拆解求职派在它基础上做的三层设计——Media 构建、模型自动检测、用户偏好路由。读完你就能搞清楚,一个对接了微信、钉钉、飞书三个渠道的 Agent 系统,到底怎么处理用户发来的图片。
系好安全带,我们粗粗发~
01、多模态到底是什么?
先把概念理清楚。
多模态(Multimodal)指的是大模型能够同时处理多种类型的输入——文本、图片、音频、视频,然后生成自然语言的输出。

举个例子:用户在微信上给求职派发了一张招聘海报的截图,然后问“这个岗位适合我吗?”。大模型需要同时理解图片里的岗位信息和用户的文字提问,才能给出有意义的回答。
这就是多模态的典型场景,输入不是纯文本,而是文本 + 图片的组合。
目前支持多模态输入的主流模型包括智谱的 GLM-5V 系列、通义千问的 qwen3.7 系列等。求职派实际对接的多模态供应商是智谱和千问,所以后面的例子以这两家为主。
在 Spring AI 之前,要对接不同供应商的多模态能力,需要分别处理各家的 API 差异。
有的用 base64 编码传图,有的用 URL 引用,参数格式也各不相同。Spring AI 把这些差异屏蔽掉了,提供了统一的 Media 抽象,一套代码就能对接所有支持多模态的供应商。
02、Spring AI 的多模态 API 怎么用?
Spring AI 把多模态的接入抽象成了三个步骤,构建 Media、组装 UserMessage、发起调用。

第一步,构建 Media
Media 是 Spring AI 对媒体资源的统一封装,支持 builder 模式。
Media media = Media.builder()
.mimeType(MimeTypeUtils.IMAGE_PNG)
.data(imageBytes)
.build();
mimeType 指定媒体类型(PNG、JPEG、PDF 等),data 传入字节数组。如果图片来自本地文件,也可以用 FileSystemResource。
new Media(mimeType, new FileSystemResource(path.toFile()));
两种构造方式的区别在于数据来源。
字节数组适合网络下载的图片,文件资源适合本地存储的图片。
builder 模式下还有两个可选字段,name 用于标识媒体资源(批量处理时方便日志追踪),id 用于唯一标识(多轮对话中引用特定图片时使用)。
第二步,组装 UserMessage
把 Media 和文本提示词一起塞进 UserMessage。
UserMessage msg = UserMessage.builder()
.text("识别这张图片中的食物,计算卡路里")
.media(media)
.build();
.media() 方法既接受单个 Media 对象,也接受 List<media>。如果用户一次发了多张图片,传列表就行了。
第三步,发起调用
后面的...
回复