用户发了张图片,系统怎么自动切到视觉模型?
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。如果用户一次发了多张图片,传列表就行了。
第三步,发起调用
后面的流程和纯文本调用完全一样。
Prompt prompt = new Prompt(msg);
String result = chatClient.prompt(prompt)
.call().content();
如果需要...
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
回复