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接口,避免消息報文超大
- 文件大小限制:需要考慮模型的處理能力
- 模型兼容性:確保使用的模型支持多模態輸入
- 性能考慮:圖像處理可能比純文本慢,盡可能不要傳遞過多的歷史消息作為上下文