多模态
简单来说,多模态指的是模型能够同时理解和处理多种不同类型的信息(即"模态")。
比如用户上传一张图片,让大模型解释图片中的内容,这就包含了文本和图片的两种不同的处理能力。
在传统的单模态大模型中:
- 语言大模型:只能处理文本。你输入文字,它输出文字。它不认识图片,也听不懂音频。
- 视觉大模型:只能处理图像。它可以识别图片里有什么,但无法和你进行复杂的语言对话。
而多模态大模型打破了这种壁垒。它在一个统一的框架下,学习文字、图像、声音、视频等多种数据之间的关系和对应。
在 LangChain4j 中使用多模态模型,核心逻辑非常简单:关键在于选对支持多模态的模型,并通过
UserMessage将文本和图片等内容一起发给它
文本+图片
java
@Configuration
public class LLMConfig {
@Bean("qwen")
public ChatModel chatModelQwen() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("ALI_QWEN_API_KEY"))
.modelName("qwen3-vl-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.logRequests(true) // request 日志
.logResponses(true) // response 日志
.build();
}
}
ImageController
java
@RestController
@RequestMapping("image")
public class ImageController {
@Resource(name = "qwen")
private ChatModel chatModelQwen;
@Value("classpath:static/mysql.png")
private org.springframework.core.io.Resource resource;
@GetMapping("/qwen/img1")
public String img1() {
try {
// 将图片转为 Base64 字符串
byte[] byteArray = resource.getContentAsByteArray();
String base64 = Base64.getEncoder().encodeToString(byteArray);
// 构建用户消息
UserMessage userMessage = UserMessage.from(
// 指定提示词
TextContent.from("从这张图片中 mysql 事务相关的步骤,请帮我解读这张图要表达的意思。"),
// 图片资源
ImageContent.from(base64, "image/png")
);
// 调用 API
ChatResponse response = chatModelQwen.chat(userMessage);
// 输出
return response.aiMessage().text();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
与第三方平台集成 ------ 生成图
这里我们集成第三方平台-百炼-通义万相。
java
@Configuration
public class LLMConfig {
...
@Bean("wanx")
public WanxImageModel wanxImageModel() {
return WanxImageModel.builder()
.apiKey(System.getenv("ALI_QWEN_API_KEY"))
.modelName("wanx2.1-t2i-turbo")
.build();
}
}
ImageController
java
@RestController
@RequestMapping("image")
public class ImageController {
@Resource(name = "wanx")
private WanxImageModel wanxImageModel;
@GetMapping("/wanx/img1")
public String wanximg1() {
Response<Image> response = wanxImageModel.generate("可爱的石头");
String url = response.content().url().toString();
return String.format("<img src='%s' />", url);
}
@GetMapping("/wanx/img2")
public String wanximg2() {
String prompt = "青春活力的少年";
// 图片设置
ImageSynthesisParam param = ImageSynthesisParam.builder()
.apiKey(System.getenv("ALI_QWEN_API_KEY"))
.model(ImageSynthesis.Models.WANX_V1)
.prompt(prompt)
// .style("<watercolor>")
.n(1)
.size("1024*1024")
.build();
try {
ImageSynthesis imageSynthesis = new ImageSynthesis();
ImageSynthesisResult result = imageSynthesis.call(param);
return JsonUtils.toJson(result);
} catch (NoApiKeyException e) {
throw new RuntimeException(e);
}
}
}