Spring AI集成通义千问,为Java项目添加AI功能的步骤指南
本文旨在快速介绍如何通过Spring AI让Java项目接入通义千问国产大模型,从而为你的业务增添AI能力。
我们将引导您完成从环境准备到代码实现的全过程。
以本例子使用spring ai alibaba QWen千问api完成,你可以跑通以后换自己的实现。
QWen目前有100万免费Token额度,可以快速实现需求。同时,因为qwen也是个开源的模型,我们可以自己搭建模型来实现免费使用。
Spring AI 介绍
在过去,Java 缺乏一个统一且高效的AI应用框架,这使得开发者在使用不同的AI服务时面临诸多不便。Spring AI 的出现填补了这一空白。
它是一个专为AI工程设计的应用框架,致力于将Spring生态系统的设计原则应用于AI领域。Spring AI的核心优势在于提供了一套标准化的接口,支持多种AI提供商(如OpenAI、Azure、阿里云等),允许开发者编写一次代码即可通过修改配置轻松切换不同的AI实现。
此外,Spring AI与现有的Spring生态完美兼容,并且充分利用了Java面向对象编程的优势,进一步简化了开发流程。
Spring AI的核心功能
# 能力名字:模型 Model
一句话说明:提供对多种生成式AI模型的支持,简化开发者与不同AI供应商的集成。
输入:配置信息、请求参数
输出:模型处理后的响应
举例:通过简单的配置切换OpenAI、Azure或阿里云等不同AI提供商。
# 能力名字:提示Prompt
一句话说明:向AI模型发送请求时携带的具体内容,用于引导模型生成期望的回答。
输入:文本字符串
输出:模型基于prompt生成的响应
举例:输入“写一篇关于环保的文章”,模型会根据这个提示生成相关文章。
# 能力名字:提示词模板Prompt Template
一句话说明:一种动态生成提示词的方式,支持在运行时填充变量。
输入:模板字符串及待填充的数据
输出:完整的提示词
举例:使用“{name}最喜欢的颜色是{color}”作为模板,填充后得到“张三最喜欢的颜色是蓝色”。
# 能力名字:嵌入Embedding
一句话说明:将文本转换为数值向量表示的技术,便于进行相似度计算等操作。
输入:一段或多段文本
输出:相应文本的向量形式
举例:将句子“今天天气真好”转换成一个特定维度的数字数组。
# 能力名字:结构化输出Structured Output
一句话说明:将非结构化的自然语言结果转换为预定义格式(如Java Bean)的能力。
输入:来自AI模型的非结构化文本
输出:按照指定格式解析后的数据对象
举例:将模型返回的一段描述演员及其电影列表的文字转换为包含演员姓名和电影名称列表的Java对象。
# 能力名字:检索增强生成RAG
一句话说明:结合检索技术与生成模型,利用外部知识库提高生成质量。
输入:用户查询、知识库中的相关信息
输出:综合了检索到的信息和生成模型预测的答案
举例:询问某个历史事件的细节时,先从文档库中找到相关资料再生成回答。
# 能力名字:智能体agent
一句话说明:封装了一组功能,使程序能够执行更复杂的任务。
输入:任务指令
输出:完成任务的结果
举例:让智能体去完成一个涉及多个步骤的工作流程,如数据分析报告的自动生成。
# 能力名字:函数调用Function Calling
一句话说明:允许AI模型调用应用程序中定义的功能,以实现更复杂的应用场景。
输入:需要执行的任务描述
输出:调用对应函数后的结果
举例:当用户问及某条消息的状态时,模型可以调用事先定义好的查询状态函数来获取并返回准确的信息。
# 能力名字:向量存储
一句话说明:存储和管理用于检索的向量数据,支持高效地进行相似性搜索。
输入:待存储的向量数据
输出:检索结果或更新/删除操作的状态
举例:上传一份文档,并将其转换为向量后存入数据库,在后续查询时快速找到与其最相似的内容。
Spring AI Alibaba:简化阿里云大模型接入的开发工具
Spring AI Alibaba 是一个针对 Spring AI 的实现,它基于 Spring AI 的 API 完成了整个阿里云百炼系列云产品的大模型,后台是基于通义千问的实现。
通过使用 Spring AI Alibaba,开发者可以轻松地利用阿里云提供的通义大模型来开发聊天、图片或语音生成等AI应用。
它的核心优势在于提供了一套良好的抽象层,极大减少了对接不同AI服务的工作量,并且支持了包括对话、文生图、文生语音等功能在内的多种应用场景。
阿里云通义千问简介
通义千问是由阿里集团推出的开源大模型服务,支持全尺寸和多模态的大模型。在中文开源模型领域,通义千问表现出色,在国内的思南大模型竞技场排名中名列前茅。
通义千问的核心优势包括:
- 能力排名靠前:QWen在MMLU、TheoremQA、GPQA等客观评测指标上超越了Llama 3 70B。
- 可访问性和合规性:API调用具有安全保护措施,无需担心恶意攻击问题。
- 完全开源:提供了全尺寸的多模态大模型开源版本,用户可以根据需求选择适合的模型大小。
- 价格合理:提供100万免费token,并且调用API的成本较低,甚至可以通过自建方式免费使用。
关于大模型的能力评估方法,主要有两种。一种是基准测试,通过设置考题和答案来评分,如GSM-8K、MMLU、TheoremQA和GPQA。另一种是人类评估或竞技场模式,即由人根据两个不同模型的回答选择更优的答案。这两种方法结合使用可以得到更全面的性能评价。更多详细信息可以参考以下链接:
基于Spring AI Alibaba实现聊天功能的详细示例
后续主要步骤包括:
确保开发环境满足要求、申请必要的API密钥、配置Spring项目以使用阿里云通义大模型以及编写相关代码来处理用户输入并调用AI模型。
接下来将按照上述逻辑详细说明每一步骤。
步骤详解
- 准备开发环境
-
- 确保你的Java Development Kit (JDK) 版本不低于17。
-
- Spring Boot框架版本应为3.3.x或更高。
- 获取API密钥
-
- 访问阿里云百炼页面,登录账号后选择开通“百炼大模型推理”服务。
-
- 成功开通后,前往个人中心创建新的API密钥,并记下该密钥值。
- 配置Maven仓库与依赖
-
- 在项目的
pom.xml
文件中加入以下内容以引入Spring AI Alibaba所需仓库:
- 在项目的
<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>
-
- 添加Spring Boot父项目和Spring AI Alibaba启动器依赖:
<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>
<!-- 其他依赖... -->
</dependencies>
- 应用程序属性配置
-
- 在
application.properties
文件中设置API密钥和其他必要配置项:
- 在
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
- 编写控制器类
-
- 创建一个新的Controller类,用于接收用户请求并通过
ChatClient
与AI模型进行通信。下面是一个简单的示例:
- 创建一个新的Controller类,用于接收用户请求并通过
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
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("/chat")
public String chat(String input) {
return this.chatClient.prompt()
.user(input)
.call()
.content();
}
@GetMapping(value = "/chatStream")
public Flux<String> chatSteam(@RequestParam String input, HttpServletResponse response) {
// 如果乱码,就需要增加这个Encoding 。
response.setCharacterEncoding("UTF-8");
PromptTemplate promptTemplate = new PromptTemplate(resource);
Prompt prompt = promptTemplate.create(Map.of("input", input));
return chatClient.prompt(prompt)
.stream().content();
}
}
- 运行应用
-
- 完成以上配置后,启动Spring Boot应用。
-
- 测试API端点,例如访问
http://localhost:8080/ai/chat?input=你好
或者http://localhost:8080/ai/chatStream?input=你好
来查看响应。
- 测试API端点,例如访问