SpringAI多模态提问
概述
SpringAI支持多模态输入,允许AI模型同时处理文本和图像内容。这对于需要视觉理解的AI应用场景非常有用,如图像描述、视觉问答、图像分析等。
核心概念
1. Media类
SpringAI使用Media
类来表示多模态内容,支持图像、音频、视频等多种媒体类型。
2. UserMessage构建器
通过UserMessage.builder()
可以构建包含媒体内容的消息,支持同时传递文本和媒体文件。
关键代码实现
1. 多模态消息构建
@PostMapping(value = "/generateStreamWithFile", consumes = "application/json", produces = "text/event-stream;charset=UTF-8")
public Flux<FluxVO> generateStreamWithFile(@RequestBody QuestionVO body) {
String model = body.getModel();
// 1. 将Base64编码的图像转换为Media对象
List<Media> mediaList = new ArrayList<>();
for (String fileBase64 : body.getFilebase64s()) {
// 解码Base64字符串为字节数组
byte[] imageBytes = Base64.getDecoder().decode(fileBase64);
// 创建ByteArrayResource包装字节数组
ByteArrayResource imageResource = new ByteArrayResource(imageBytes);
// 创建Media对象,指定MIME类型为PNG图像
mediaList.add(new Media(MimeTypeUtils.IMAGE_PNG, imageResource));
}
// 2. 构建消息列表
List<Message> messageList = new ArrayList<>();
UserMessage userMessage;
// 3. 根据是否有媒体内容选择不同的消息构建方式
if (!mediaList.isEmpty()) {
// 构建包含媒体内容的多模态消息
userMessage = UserMessage.builder()
.text(body.getMessage()) // 设置文本内容
.media(mediaList) // 设置媒体内容列表
.build();
} else {
// 构建纯文本消息
userMessage = new UserMessage(body.getMessage());
}
messageList.add(userMessage);
// 4. 添加系统提示词
String systemPrompt = body.getSystemPrompt();
String finalSystemPrompt = (systemPrompt != null && !systemPrompt.trim().isEmpty())
? systemPrompt
: "中文回答";
messageList.add(new SystemMessage(finalSystemPrompt));
// 5. 获取指定模型并生成响应
DynamicModelFactory.MyModel myModel = dynamicModelFactory.getModelByName(model);
if (myModel == null) {
throw new RuntimeException("未找到指定模型: " + model);
}
// 6. 自定义处理流式输出内容
return getFluxVOFlux(messageList, myModel);
}
注意事项
- 接口一定要是POST接口,避免消息报文超大
- 文件大小限制:需要考虑模型的处理能力
- 模型兼容性:确保使用的模型支持多模态输入
- 性能考虑:图像处理可能比纯文本慢,尽可能不要传递过多的历史消息作为上下文