聊聊Spring AI的Multimodality
序
本文主要研究一下Spring AI的Multimodality
示例
chatModel示例
var imageResource = new ClassPathResource("/multimodal.test.png");var userMessage = new UserMessage("Explain what do you see in this picture?", // contentnew Media(MimeTypeUtils.IMAGE_PNG, this.imageResource)); // mediaChatResponse response = chatModel.call(new Prompt(this.userMessage));
chatClient示例
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();
目前是如下几种模型支持多模态
- Anthropic Claude 3
- AWS Bedrock Converse
- Azure Open AI (e.g. GPT-4o models)
- Mistral AI (e.g. Mistral Pixtral models)
- Ollama (e.g. LLaVA, BakLLaVA, Llama3.2 models)
- OpenAI (e.g. GPT-4 and GPT-4o models)
- Vertex AI Gemini (e.g. gemini-1.5-pro-001, gemini-1.5-flash-001 models)
源码
UserMessage
org/springframework/ai/chat/messages/UserMessage.java
public class UserMessage extends AbstractMessage implements MediaContent {protected final List<Media> media;public UserMessage(String textContent) {this(MessageType.USER, textContent, new ArrayList<>(), Map.of());}public UserMessage(Resource resource) {super(MessageType.USER, resource, Map.of());this.media = new ArrayList<>();}public UserMessage(String textContent, List<Media> media) {this(MessageType.USER, textContent, media, Map.of());}public UserMessage(String textContent, Media... media) {this(textContent, Arrays.asList(media));}public UserMessage(String textContent, Collection<Media> mediaList, Map<String, Object> metadata) {this(MessageType.USER, textContent, mediaList, metadata);}public UserMessage(MessageType messageType, String textContent, Collection<Media> media,Map<String, Object> metadata) {super(messageType, textContent, metadata);Assert.notNull(media, "media data must not be null");this.media = new ArrayList<>(media);}@Overridepublic String toString() {return "UserMessage{" + "content='" + getText() + '\'' + ", properties=" + this.metadata + ", messageType="+ this.messageType + '}';}@Overridepublic List<Media> getMedia() {return this.media;}@Overridepublic String getText() {return this.textContent;}}
UserMessage实现了MediaContent的getMedia方法
Media
org/springframework/ai/model/Media.java
public class Media {private static final String NAME_PREFIX = "media-";/*** An Id of the media object, usually defined when the model returns a reference to* media it has been passed.*/@Nullableprivate String id;private final MimeType mimeType;private final Object data;/*** The name of the media object that can be referenced by the AI model.* <p>* Important security note: This field is vulnerable to prompt injections, as the* model might inadvertently interpret it as instructions. It is recommended to* specify neutral names.** <p>* The name must only contain:* <ul>* <li>Alphanumeric characters* <li>Whitespace characters (no more than one in a row)* <li>Hyphens* <li>Parentheses* <li>Square brackets* </ul>*/private String name;//......
}
Media定义了id、mimeType、data、name属性
Format
public static class Format {// -----------------// Document formats// -----------------/*** Public constant mime type for {@code application/pdf}.*/public static final MimeType DOC_PDF = MimeType.valueOf("application/pdf");/*** Public constant mime type for {@code text/csv}.*/public static final MimeType DOC_CSV = MimeType.valueOf("text/csv");/*** Public constant mime type for {@code application/msword}.*/public static final MimeType DOC_DOC = MimeType.valueOf("application/msword");/*** Public constant mime type for* {@code application/vnd.openxmlformats-officedocument.wordprocessingml.document}.*/public static final MimeType DOC_DOCX = MimeType.valueOf("application/vnd.openxmlformats-officedocument.wordprocessingml.document");/*** Public constant mime type for {@code application/vnd.ms-excel}.*/public static final MimeType DOC_XLS = MimeType.valueOf("application/vnd.ms-excel");/*** Public constant mime type for* {@code application/vnd.openxmlformats-officedocument.spreadsheetml.sheet}.*/public static final MimeType DOC_XLSX = MimeType.valueOf("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");/*** Public constant mime type for {@code text/html}.*/public static final MimeType DOC_HTML = MimeType.valueOf("text/html");/*** Public constant mime type for {@code text/plain}.*/public static final MimeType DOC_TXT = MimeType.valueOf("text/plain");/*** Public constant mime type for {@code text/markdown}.*/public static final MimeType DOC_MD = MimeType.valueOf("text/markdown");// -----------------// Video Formats// -----------------/*** Public constant mime type for {@code video/x-matros}.*/public static final MimeType VIDEO_MKV = MimeType.valueOf("video/x-matros");/*** Public constant mime type for {@code video/quicktime}.*/public static final MimeType VIDEO_MOV = MimeType.valueOf("video/quicktime");/*** Public constant mime type for {@code video/mp4}.*/public static final MimeType VIDEO_MP4 = MimeType.valueOf("video/mp4");/*** Public constant mime type for {@code video/webm}.*/public static final MimeType VIDEO_WEBM = MimeType.valueOf("video/webm");/*** Public constant mime type for {@code video/x-flv}.*/public static final MimeType VIDEO_FLV = MimeType.valueOf("video/x-flv");/*** Public constant mime type for {@code video/mpeg}.*/public static final MimeType VIDEO_MPEG = MimeType.valueOf("video/mpeg");/*** Public constant mime type for {@code video/mpeg}.*/public static final MimeType VIDEO_MPG = MimeType.valueOf("video/mpeg");/*** Public constant mime type for {@code video/x-ms-wmv}.*/public static final MimeType VIDEO_WMV = MimeType.valueOf("video/x-ms-wmv");/*** Public constant mime type for {@code video/3gpp}.*/public static final MimeType VIDEO_THREE_GP = MimeType.valueOf("video/3gpp");// -----------------// Image Formats// -----------------/*** Public constant mime type for {@code image/png}.*/public static final MimeType IMAGE_PNG = MimeType.valueOf("image/png");/*** Public constant mime type for {@code image/jpeg}.*/public static final MimeType IMAGE_JPEG = MimeType.valueOf("image/jpeg");/*** Public constant mime type for {@code image/gif}.*/public static final MimeType IMAGE_GIF = MimeType.valueOf("image/gif");/*** Public constant mime type for {@code image/webp}.*/public static final MimeType IMAGE_WEBP = MimeType.valueOf("image/webp");}
Format定义了常用的几种MimeType
小结
Spring AI设计了各种message类型用于支持多模态,其中UserMessage有个media属性,类型List<Media>,支持传入图像、音频、视频,MimeType用于指定是哪种类型。
doc
- multimodality
相关文章:
聊聊Spring AI的Multimodality
序 本文主要研究一下Spring AI的Multimodality 示例 chatModel示例 var imageResource new ClassPathResource("/multimodal.test.png");var userMessage new UserMessage("Explain what do you see in this picture?", // contentnew Media(MimeTy…...
区块链点燃游戏行业新未来——技术变革与实践指南
区块链点燃游戏行业新未来——技术变革与实践指南 在数字时代,游戏行业无疑是创新的热土。从简单像素风的街机游戏到沉浸式的虚拟现实,我们见证了技术如何一步步塑造游戏的样貌。然而,在传统游戏模式中,玩家权益往往无法得到保障…...
Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像
引擎:3.8.5 您好,我是鹤九日! 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味,让很多人选择了放弃。然而不得不说:任何新知识、新领域的学习,本身面临的都是问题! 互联网和AI给了我…...
大模型SFT用chat版还是base版 SFT后灾难性遗忘怎么办
大模型SFT用chat版还是base版 进行 SFT 时,基座模型选用 Chat 还是 Base 模型? 选 Base 还是 Chat 模型,首先先熟悉 Base 和 Chat 是两种不同的大模型,它们在训练数据、应用场景和模型特性上有所区别。 在训练数据方面…...
【AI论文】VCR-Bench:视频链式思考推理的综合评估框架
摘要:思想链(CoT)推理的进步显著增强了大型语言模型(LLMs)和大型视觉语言模型(LVLMs)的能力。 然而,目前仍然缺乏一个严格的视频CoT推理评估框架。 目前的视频基准测试无法充分评估推…...
数据中台、BI业务访谈(二):组织架构梳理的坑
这是数据中台、BI业务访谈系列的第二篇文章,在上一篇文章中,我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后,就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…...
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例)
【零基础实战】Ubuntu搭建DVWA漏洞靶场全流程详解(附渗透测试示例) (声明:实际操作请遵守网络安全法,仅在授权环境进行测试,仅供个人研究) 一、DVWA靶场简介 DVWA(Damn Vulnerable Web Application)是专为网络安全学习者设计的漏洞演练平台,包含SQL注入、XSS、文件…...
库学习04——numpy
一、基本属性 二、 创建数组 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话,默认是从0到n-1的一维数组。 (二)自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …...
Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作
本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写,将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说,立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…...
SLAM(七)-卡尔曼滤波
SLAM(七)-卡尔曼滤波 一、卡尔曼滤波(KF)二、扩展卡尔曼滤波(EKF)三、误差状态卡尔曼滤波(ESKF) 参考《概率机器人》、《Principles of GNSS,lnertial and Multisensor lntegrated Navigation Systems (Second Edition)》 一、卡尔曼滤波(KF)…...
如何解决DDoS攻击问题 ?—专业解决方案深度分析
本文深入解析DDoS攻击面临的挑战与解决策略,提供了一系列防御技术和实践建议,帮助企业加强其网络安全架构,有效防御DDoS攻击。从攻击的识别、防范措施到应急响应,为网络安全工作者提供了详细的操作指引。 DDoS攻击概览:…...
解决 Ubuntu 上 Docker 安装与网络问题:从禁用 IPv6 到配置代理
解决 Ubuntu 上 Docker 安装与网络问题的实践笔记 在 Ubuntu(Noble 版本)上安装 Docker 时,我遇到了两个常见的网络问题:apt-get update 失败和无法拉取 Docker 镜像。通过逐步排查和配置,最终成功运行 docker run he…...
Windows for Redis 后台服务运行
下载 redis 安装包 地址:https://github.com/tporadowski/redis/releases 解压zip压缩包,执行 redis-server.exe 即可以窗口模式运行(窗口关闭则服务关闭) 运行窗口可以看到,端口是 6379 我这里使用 nvaicat 客服端测…...
AMGCL库的Backends及使用示例
AMGCL库的Backends及使用示例 AMGCL是一个用于解决大型稀疏线性方程组的C库,它提供了多种后端(backends)实现,允许用户根据不同的硬件和性能需求选择合适的计算后端。 AMGCL支持的主要Backends 内置Backends: builtin - 默认的纯C实现block - 支持块状…...
【前端】【css】flex布局详解
Flex 布局(Flexible Box Layout,弹性盒子布局)是 CSS3 中的一种布局模式,用于在容器中更高效地分配空间并对齐内容,即使它们的大小是动态未知的。它非常适用于响应式设计。 一、Flex 布局的基本概念 1. 启用 Flex 布局…...
Java面试黄金宝典43
1. 零拷贝技术 零拷贝(Zero - copy)技术是一种高效的数据传输技术,它旨在减少数据在用户空间和内核空间之间的拷贝次数,以此提升系统的数据传输性能。在传统数据传输过程中,数据往往需要多次在用户空间和内核空间之间拷贝,这会消耗大量的 CPU 资源,而零拷贝技术能避免这…...
C语言超详细指针知识(二)
在上一篇有关指针的博客中,我们介绍了指针的基础知识,如:内存与地址,解引用操作符,野指针等,今天我们将更加深入的学习指针的其他知识。 1.指针的使用和传址调用 1.1strlen的模拟实现 库函数strlen的功能是…...
华为机试—最大最小路
题目 对于给定的无向无根树,第 i 个节点上有一个权值 wi 。我们定义一条简单路径是好的,当且仅当:路径上的点的点权最小值小于等于 a ,路径上的点的点权最大值大于等于 b 。 保证给定的 a<b,你需要计算有多少条简…...
[Linux]从零开始的ARM Linux交叉编译与.so文件链接教程
一、前言 最近在项目需要将C版本的opencv集成到原本的代码中从而进行一些简单的图像处理。但是在这其中遇到了一些问题,首先就是原本的opencv我们需要在x86的架构上进行编译然后将其集成到我们的项目中,这里我们到底应该将opencv编译为x86架构的还是编译…...
【模板】缩点
洛谷p3387 思路: 算法:tarjan算法 根据题意,我们只要找到一个路径,使得最终权重最大即可,首先,根据题目可知,如果一个点在一个环上,那么我们就将这整个环都选上,题目上允许我们能够重复走,因此,我们可以将环缩成点,将环所称点后,就可以转换成树,从没有父节点的结点开始,我们向…...
Rag实现流程
Rag实现流程 目录 Rag实现流程1. 加载问答链代码解释`chain_type="stuff"` 的含义其他 `chain_type` 参数选项及特点1. `map_reduce`2. `refine`3. `map_rerank`示例代码展示不同 `chain_type` 的使用其他参数类型2. 提出问题3. 检索相关文档代码解释其他参数类型4. …...
计算机网络- 传输层安全性
传输层安全性 7. 传输层安全性7.1 传输层安全基础7.1.1 安全需求机密性(Confidentiality)完整性(Integrity)真实性(Authenticity)不可否认性(Non-repudiation) 7.1.2 常见安全威胁窃…...
常青藤快速选择系统介绍
功能特点 支持多种属性和特性:可依据实体属性(如实体类型、图层、颜色、线宽等)以及实体特性(如直线长度、圆面积、文字内容等)进行筛选。多过滤条件与运算符号:支持多个过滤条件组合,基本涵盖实…...
【c语言】指针习题
练习一:使用指针打印数组内容 #include <stdio.h> void print(int* p, int sz) {int i 0;for (i 0; i < sz; i) {printf("%d ", *p);//printf("%d ", *(p i));} } int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof…...
KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破
引言:数据智能的第三范式 在数字化转型进入深水区的2025年,企业数据系统正面临三重悖论:数据规模指数级增长与实时决策需求之间的矛盾、多模态数据孤岛与业务连续性要求之间的冲突、静态存储范式与动态场景适配之间的鸿沟。KWDB(K…...
Sqoop常用指令
Sqoop(SQL-to-Hadoop)是一个开源工具,旨在将关系型数据库中的数据导入到Hadoop的HDFS中,或者从HDFS导出到关系型数据库中。以下是一些常用的Sqoop命令: 导入数据到HDFS 1. 基本导入 sqoop import \ --connect jdbc:mys…...
银行业务知识序言
银行业务知识体系全景解析 第一章 金融创新浪潮下的银行业务知识革命 1.1 数字化转型驱动金融业态重构 在区块链、人工智能、物联网等技术的叠加作用下,全球银行业正经历着"服务无形化、流程智能化、风控穿透化"的深刻变革。根据麦肯锡《2023全球银行业…...
智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战
一、说明 PyScada,一个基于Python和Django框架的开源SCADA(数据采集与监视控制系统)系统,采用HTML5技术打造人机界面(HMI)。它兼容多种工业协议,如Modbus TCP/IP、RTU、ASCII等,并具…...
畅游Diffusion数字人(23):字节最新表情+动作模仿视频生成DreamActor-M1
畅游Diffusion数字人(0):专栏文章导航 前言:之前有很多动作模仿或者表情模仿的工作,但是如果要在实际使用中进行电影级的复刻工作,仅仅表情或动作模仿还不够,需要表情和动作一起模仿。最近字节跳动提出了一个表情+动作模仿视频生成DreamActor-M1。 目录 贡献概述 核心动…...
【Unity网络编程知识】C#的 Http相关类学习
1、搭建HTTP服务器 使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用)自己编写HTTP服务器应用程序,一般作为Web服务器或者短连接游戏服务器时使用该方式(工作后由后端程序员来做&#…...
