本文是一篇介绍spring ai的文章,主要介绍了生成文本内容,以及读取图片中内容两个能力。
之所以介绍这两个能力,是因为 大模型目前最适合做的事情有两个:
1) 非结构化数据的结构化(图片转文字,转excel)
2) 基于结构化数据做文字和图片的输出
这两个能力可以有效的提高应用与用户的交互效率。
目录
SpringBoot集成Spring AI Alibaba实现对话模型
使用Spring AI Alibaba实现图像识别的详尽示例
Spring AI 介绍:
当前在Java中调用大模型时,往往缺乏一个成熟且易于使用的AI应用框架。为了解决这个问题,Spring作为老牌的Java应用框架厂商,推出了Spring AI。它借鉴了langchain的一些核心设计理念,并结合了Java面向对象编程的优势,旨在提供一种更高效、灵活的方式来与各种大模型进行交互。Spring AI的核心优势在于其统一了不同AI服务提供商(如OpenAI、阿里云等)的接口实现,使得开发者只需编写一次代码,通过简单的配置更改即可轻松切换至不同的AI实现,极大地提升了开发效率和可维护性。此外,该框架还有专门的团队负责维护和更新。本次示例将以Spring AI Alibaba接入通义大模型为例,展示如何利用这一强大工具来快速构建基于Java的大模型应用;当然,在熟悉整个过程后,开发者也可以根据自身需求,方便地替换为自己所需的其他大模型支持。
Spring AI Alibaba简介:
Spring AI Alibaba是Spring AI针对阿里云生态的实现,它继承了Spring生态系统的设计原则如可移植性和模块化设计,并专注于将这些原则应用于AI领域。作为国内最好的Spring AI实现之一,Spring AI Alibaba整合了阿里巴巴的最佳实践,提供了与Spring Cloud Alibaba相似的集成度和易用性。通过Spring AI Alibaba,开发者能够轻松地在应用程序中接入各种AI能力,包括但不限于模型调用、Prompt模板、RAG(检索增强生成)、文生图以及文字识别等。本文将以Prompt模板和模型调用为例,展示如何利用Spring AI Alibaba来丰富您的项目功能。
通义千问Qwen简介:
通义千问Qwen是阿里巴巴云推出的一种先进的语言模型,在多个权威基准测评中表现出色。它在MMLU、TheoremQA和GPQA等评测指标上超越了Llama 3 70B,并在Hugging Face的开源大模型排行榜Open LLM Leaderboard上位居第一,展示了其卓越的性能和广泛的应用潜力。
另外,在真人参与评测的arena里面,它不仅在思南平台 上仅次于国际知名的GPT和Claude系列,还在 Hugging Face的视觉模型竞技场 中稳居中国首位。
SpringBoot集成Spring AI Alibaba实现对话模型
为了基于Spring Boot集成Spring AI Alibaba,并完成一个简单的对话模型,构建支持prompt的流返回接口的项目,你需要按照以下步骤进行操作。根据提供的我了解的信息,以下是详细的执行步骤:
环境要求
- JDK版本需要在17(含)以上。
- Spring Boot版本需在3.3.x以上。
申请API Key
首先,前往阿里云百炼页面开通“百炼大模型推理”服务,并创建一个新的API Key。请记录下这个Key,之后将它配置到你的项目中。
配置环境变量与项目属性
设置环境变量以存储您的API Key:
export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}
并在application.properties
文件中加入API Key配置:
spring.ai.dashscope.api-key: ${AI_DASHSCOPE_API_KEY}
添加仓库和依赖
由于Spring AI Alibaba相关的库还未提交到Maven中央仓库,您需要添加Spring自有的仓库及快照仓库到您的pom.xml文件里:
<repositories>
<repository>
<id>sonatype-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
同时,在dependencies部分添加对spring-ai-alibaba-starter
的依赖:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2</version>
</dependency>
创建Controller类
定义一个Controller类来处理GET请求,该请求将接收用户输入并通过ChatClient
调用通义千问模型,最后返回Flux形式的结果。记得启用跨域资源共享(CORS)以允许来自不同源的请求。
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*") // 允许所有来源的CORS
public class ChatController {
private final ChatClient chatClient;
@Value("classpath:correct-and-expand.st")
Resource resource;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/steamChat")
public Flux<String> steamChat(@RequestParam String input) {
PromptTemplate promptTemplate = new PromptTemplate(resource);
Prompt prompt = promptTemplate.create(Map.of("input", input));
return chatClient.prompt(prompt)
.stream()
.content();
}
}
这段代码首先注入了ChatClient
实例,然后通过构造函数接受一个Prompt模板路径用于动态生成提示内容。当访问/ai/steamChat?input=...
时,会根据传入参数调用AI模型并以流的形式返回结果。
确保已经正确设置了项目的入口点以及相关配置后,启动应用程序。现在,你应该能够通过指定的URL向聊天机器人发送消息,并获得相应的回复了。
此解决方案充分利用了Spring AI Alibaba提供的功能,包括但不限于使用ChatClient
进行文本生成、应用Prompt模板定制化输入以及利用Stream API实现异步响应。
使用Spring AI Alibaba实现图像识别的详尽示例
1. 前置准备
在开始之前,请确保满足以下条件:
- JDK版本为JDK 17或更高。
- Spring Boot版本为3.3.x或更高。
2. 申请开通资源
- 访问阿里云百炼页面并登录您的阿里云账号。
- 选择开通“百炼大模型推理”服务,并等待开通成功的短信通知。
- 开通成功后,再次登录阿里云百炼页面,点击右上角的小人图标,选择API-KEY选项,然后点击【创建新的API-KEY】生成一个API-KEY。请记录这个key,后续需要配置使用。
3. 配置百炼 API KEY
在终端中运行以下命令来配置百炼 API KEY:
export AI_DASHSCOPE_API_KEY=${REPLACE-WITH-VALID-API-KEY}
将${REPLACE-WITH-VALID-API-KEY}
替换为您实际的API-KEY值。
4. 开通通义万象图像生成模型
- 打开百炼控制台。
- 在左侧列表栏中选择模型广场,找到图像生成模块下的通义万象模型。
- 点击通义万象模型对应的“API调用”按钮。
- 在打开的页面左上角,找到模型英文名(qwen-vl-max-latest),这是后面配置时需要指定的模型名称。
5. 添加Spring仓库和依赖
首先,在项目的pom.xml文件中添加Spring自己的仓库以及snapshot仓库,如下所示:
<repositories>
<repository>
<id>sonatype-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
接着,在pom.xml文件中添加spring-ai-alibaba-starter
依赖项以及Spring Boot的父依赖项:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M3.1</version>
</dependency>
...other dependencies...
</dependencies>
6. 构建读图代码
创建一个新的Controller类ChatModelController
,并在其中注入ChatClient
实例。同时设置默认Prompt为“识别图中的文字”,默认模型为“qwen-vl-max-latest”。
@RestController
@RequestMapping("/ai")
public class ChatModelController {
private static final Logger logger = LoggerFactory.getLogger(ChatModelController.class);
@Value("classpath:qrcode.png")
private Resource imageResource;
private final ChatModel chatModel;
public ChatModelController(ChatModel chatModel) {
this.chatModel = chatModel;
}
private static final String DEFAULT_PROMPT = "识别图中的文字";
private static final String DEFAULT_MODEL = "qwen-vl-max-latest";
@GetMapping("/imageRecognition")
public Flux<String> imageRecognition(
@RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT) String prompt,
HttpServletResponse response)
throws Exception {
response.setCharacterEncoding("UTF-8");
List<Media> mediaList = List.of(
new Media(
MimeTypeUtils.IMAGE_PNG,
imageResource));
UserMessage message = new UserMessage(prompt, mediaList);
message.getMetadata().put(DashScopeChatModel.MESSAGE_FORMAT, MessageFormat.IMAGE);
Flux<ChatResponse> fluxResponse = chatModel.stream(
new Prompt(
message,
DashScopeChatOptions.builder()
.withModel(DEFAULT_MODEL)
.withMultiModel(true)
.build()));
Flux<String> fluxString = fluxResponse.map(resp -> resp.getResult().getOutput().getContent());
return fluxString;
}
}
确保将二维码图片命名为qrcode.png
,并将其放置在src/main/resources/
目录下。
7. 运行项目
完成上述步骤后,您可以启动项目并访问http://localhost:8080/ai/imageRecognition
来让模型识别本地二维码图片,并以流式返回结果。
通过以上详细步骤,您就可以基于Spring AI Alibaba实现二维码图像识别功能了。