惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
量子位
腾讯CDC
A
About on SuperTechFans
小众软件
小众软件
Microsoft Azure Blog
Microsoft Azure Blog
T
Tailwind CSS Blog
V
V2EX
B
Blog RSS Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
罗磊的独立博客
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
V
Visual Studio Blog
D
DataBreaches.Net
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
有赞技术团队
有赞技术团队

博客园 - cn2025

K8s -sentinel-dashboard【nacos版本】集 20260815 kubeSphere【ks-controller-manager-webhook-cert】证书 20260814 K8s -nacos集 20260813 K8s - 安装部署redis集群-哨兵sentinels集(支持从K8s外部访问)20260812 k8s-deployment发布测试(pv-pvc-deployment-service) 20260810 K8s - 安装部署Kafka、Zookeeper集群教程(支持从K8s外部访问)20260808 k8s-关机及启动脚本工具 【kubeSphere发布ruoyi-pro前端】工具脚本20260731 【k8s】 etcd服务端及客户端版本及快照【定时】备份 20260730 harbor【https启用】及k8节点部证书20260728 kube-flannel.yml k8s集群-安装helm 【kubeShpere】 官网 20260710 kubesphere-KDP 工具脚本【kubeSphere发布ruoyi-pro前端】20260720 HbuilderX 内置终端转为 gitBash 20260720 kubeSphere发布ruoyi-pro后端-用到脚本 kubeSphere发布ruoyi-web前端 20260711 kubeSphere发布ruoyi-pro后端 k8s集群-kubeShpere 20260710 安装Helm 20260710 k8s-portainer docker 镜像查询 k8集群一键重置 docker run OceanBase spring ai alibaba doc 世界只有一个墨脱 AI2.0 【Mcp-client】 20260611 AI2.0 【Mcp-server】 20260611 GoLand 配Go SDK AI2.0 【redis向量-Rag】 问答顾问器QuestionAnswerAdvisor 20260608
AI2.0 【多模态】 20260615
cn2025 · 2026-06-15 · via 博客园 - cn2025

统一封装任意二进制媒体数据,解决不同文件类型、本地 / 网络资源适配问题,双核心属性:

  1. mimeType:媒体类型标识,标准 MIME 格式
    • 图像:image/png / image/jpeg
    • 音频:audio/wav / audio/mp3
    • 视频:video/mp4(取决于模型支持)
  2. resource:Spring 标准Resource资源对象,兼容 Spring 全套资源体系:
    • ClassPathResource:classpath 内静态图片
    • FileSystemResource:服务器本地磁盘文件
    • UrlResource:网络图片 URL
    • ByteArrayResource:内存二进制字节流(前端上传图片)

        3. ChatClient 流畅式调用 API

Spring AI 2.0 主推的业务层工具,基于建造者模式封装多模态请求全流程,优势:

  • 链式调用,无需手动组装UserMessage/Prompt底层对象
  • 内置系统提示词、参数配置、工具调用、结构化输出能力
  • 自动适配多模态参数传递逻辑,降低多模态代码复杂度

1、pom

<properties>
<java.version>17</java.version>
<spring-ai.version>2.0.0-M5</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
<!-- Redis 向量库-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>
<!--Redis 客户端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- Tika 通用文档读取器 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>
<!-- Markdown 文档读取器 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-markdown-document-reader</artifactId>
</dependency>
<!-- 问答顾问器 advisor-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
<!-- MCP 客户端:通过 SSE 连接本机 mcp-server(默认端口 18089) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

2、application.yml

2.1

${OPENAI_API_KEY}

image


spring:
autoconfigure:
exclude: #禁用 Ollama Embedding(如果你用 OpenAI),不然会冲突
- org.springframework.ai.model.ollama.autoconfigure.OllamaEmbeddingAutoConfiguration
application:
name: dashscope18088
data:
redis:
url: redis://192.168.91.165:6379
client-type: jedis
ai:
openai:
api-key: ${OPENAI_API_KEY}
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
chat:
options:
model: qwen3.6-plus
embedding:
options:
model: text-embedding-v4
dimensions: 2048 # 输出向量维度2048
# chat:
# model: qwen3.6-plus
mcp:
client:
enabled: true
type: SYNC
# 与 mcp-server 一致;须先启动 mcp-server(默认 http://localhost:18089)
sse:
connections:
mcp-weather-server:
url: http://localhost:18089
vectorstore:
redis:
initialize-schema: true #是否在启动时创建/初始化向量索引等结构
index-name: sf2026_ai_vector_index # RediSearch 里的索引名
prefix: sf2026 #存向量文档用的Redis键前级
ollama:
base-url: http://192.168.91.164:11434
chat:
model: qwen2.5:0.5b

# options:
# temperature: 0.7
# max-tokens: 2000
server:
port: 18088
logging:
level:
org.springframework.ai: debug
org.springframework.ai.mcp: debug


3、controller

image

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyMultimodalityController {

@Autowired
private ChatClient chatClient;

@GetMapping("/aiimg")
public String analyzeImage(){
String result= chatClient.prompt()
.user(u -> u
.text("请详细描述这张图片的内容,包括物体、颜色、场景和可能的用途")
.media(MediaType.IMAGE_PNG, new ClassPathResource("apple.png"))
)
.call()
.content();
System.out.println("【aiimg】"+result);
return "【aiimg】"+result;
}
}

4、http://localhost:18088/aiimg

image