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接口,避免消息报文超大
- 文件大小限制:需要考虑模型的处理能力
- 模型兼容性:确保使用的模型支持多模态输入
- 性能考虑:图像处理可能比纯文本慢,尽可能不要传递过多的历史消息作为上下文