【SpringAI】4.多模态提问

发布于:2025-07-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

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);
}

注意事项

  1. 接口一定要是POST接口,避免消息报文超大
  2. 文件大小限制:需要考虑模型的处理能力
  3. 模型兼容性:确保使用的模型支持多模态输入
  4. 性能考虑:图像处理可能比纯文本慢,尽可能不要传递过多的历史消息作为上下文