在过去,Java 缺乏一个统一且高效的 AI 应用框架,这导致开发者在使用不同 AI 提供商(如 OpenAI、Azure 或阿里云)时需要频繁地调整代码和接口适配。
现在有了Spring 团队推出的spring AI, 他能够很好的解决上面的问题,本文会先介绍一下spring ai 这个应用框架的核心能力和功能。
然后再用spring ai alibaba做一个例子,来具体讲解怎么快速入门spring ai。
Spring AI:为Java生态系统带来统一高效的AI应用框架
Spring ai 为 Java 生态系统带来了一套标准化的接口实现,使得一次编写的代码能够通过简单的配置变更轻松切换至不同的 AI 服务提供者。此外,Spring AI 与 Spring 框架及其生态完美兼容,同时遵循 Java 面向对象编程的最佳实践,利用 POJOs 构建应用组件。这种设计不仅简化了开发流程,还极大地降低了跨平台迁移的成本,让 Java Spring AI 成为了构建可移植、模块化 AI 解决方案的理想选择。
Spring AI的核心功能介绍
能力名字:模型(Model)
一句话说明
Spring AI 支持多种AI模型的接入,包括阿里云百炼大模型、OpenAI等,开发者可以通过配置轻松切换不同模型。
输入输出举例
输入:ChatClient.prompt().user("生成一个科幻故事").call()
输出:一段科幻故事文本。
能力名字:提示(Prompt)
一句话说明
通过定义和使用提示,可以实现与AI模型的复杂交互,提示包含了用户查询、背景信息等多种消息。
输入输出举例
输入:chatClient.prompt().user("给我讲个笑话").call()
输出:一个笑话文本。
能力名字:提示词模板(Prompt Template)
一句话说明
提示词模板提供了一种可重用且参数化的提示方式,允许开发者通过简单的参数替换来创建复杂的提示。
输入输出举例
输入:PromptTemplate promptTemplate = new PromptTemplate("Tell me a {adjective} joke about {topic}");
输出:"Tell me a funny joke about cows"
能力名字:嵌入(Embedding)
一句话说明
Spring AI 提供了对各种嵌入模型的支持,包括阿里云百炼自带的嵌入模型和其他流行的嵌入模型。
输入输出举例
输入:EmbeddingModel embeddingModel = new EmbeddingModel();
输出:给定文本的向量表示。
能力名字:结构化输出(Structured Output)
一句话说明
借助OutputParser工具,Spring AI 可以将模型返回的字符串自动映射到指定的POJO对象,从而简化数据处理流程。
输入输出举例
输入:OutputParser parser = new OutputParser(MyPojo.class);
输出:根据解析规则从模型响应中提取的数据实例化为MyPojo
对象。
能力名字:检索增强生成(RAG)
一句话说明
通过结合外部知识库,RAG技术能够显著提升生成内容的相关性和准确性。
输入输出举例
输入:调用ragService.queryWithDocumentRetrieval("2024年6月止,云智能集团的营收是多少?")
输出:基于知识库内容生成的回答。
能力名字:函数调用(Function Calling)
一句话说明
当AI模型需要执行特定任务时,如数学计算或API调用,可通过预定义的功能让模型直接请求应用程序执行相关操作。
输入输出举例
输入:定义并注册了一个名为messageStatusFunction
的功能后,在聊天请求中指定了这个功能。
输出:消息ID的状态信息。
能力名字:向量存储
一句话说明
Spring AI 兼容多种向量存储解决方案,包括阿里云提供的服务及开源选项,支持高效地存储和检索大规模向量数据。
输入输出举例
输入:初始化VectorStore vectorStore = new DashScopeCloudStore(dashscopeApi, new DashScopeStoreOptions("knowledge-base-name"));
输出:成功创建或更新了向量数据库中的记录
通义千问Qwen的介绍:
通义千问Qwen 是阿里的一款开源的大模型,也在阿里云提供了API的访问能力,本文为了方便,选择使用阿里云的API来做样例。
在MMLU等测试中超越Llama 3 70B,登顶Hugging Face开源模型榜 通义千问Qwen在MMLU、TheoremQA、GPQA等基准测评中表现出色,超越了Llama 3 70B ,在85+分数,与gpt和claude等同属 第一梯队 ,并在Hugging Face开源大模型排行榜Open LLM Leaderboard上荣登榜首。
MMLU 和 GPQA都是 目前客观评分中最公认的两个评测标准,客观评分来说这俩是最好的。
另外,在真人参与评测的arena里面,它不仅在思南平台 上仅次于国际知名的GPT和Claude系列,还在 Hugging Face的视觉模型竞技场 中稳居中国首位。
Spring AI Alibaba介绍:
Spring AI Alibaba 是基于 Spring AI 构建的实现,专注于对接阿里云的通义大模型服务,包括对话、文生图、文生语音等功能。其核心优势在于能够为开发者提供一套标准化接口来访问和利用国产大模型如通义千问及万象等的能力,从而显著减少在不同AI供应商间切换的成本与复杂度。通过使用Spring AI Alibaba,程序员可以更高效地集成并利用这些先进的AI能力,而无需深入了解每个API的具体细节,这得益于框架提供的自动POJO映射、Prompt Template支持以及外部数据接入功能,极大地简化了开发流程。
基于Spring AI Alibaba构建聊天应用的详尽示例
具体步骤
1. 环境准备
- JDK版本:确保使用JDK 17或更高。
- Spring Boot版本:推荐使用3.3.x版本。
- 阿里云账号:需要注册并登录阿里云账号以获取通义千问的API Key。
2. 获取API Key
访问阿里云百炼页面,按照指示开通“百炼大模型推理”服务,并创建一个新的API Key。请保存好该Key,后续配置中会用到。
3. 配置环境变量
在本地开发环境中设置环境变量AI_DASHSCOPE_API_KEY
为刚刚获得的API Key值。
export AI_DASHSCOPE_API_KEY=您的API密钥
同时,在项目的application.properties
文件中添加:
spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}
4. 添加仓库和依赖
在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>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2</version>
</dependency>
<!-- Spring Boot Starter Web for RESTful APIs -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Optional: For handling cross-origin requests -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
5. 创建Chat Controller
接下来定义一个REST控制器,用于处理来自用户的聊天请求,并以流的形式返回响应。
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*") // 允许跨域请求
public class ChatController {
private final ChatClient chatClient;
@Autowired
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
@GetMapping("/chatStream")
public Flux<String> chatSteam(@RequestParam String input) {
return chatClient.prompt()
.user(input)
.stream()
.content();
}
}
此代码片段中的关键点是使用了ChatClient
实例调用prompt()
方法发送用户输入,然后利用.stream().content()
来异步接收并返回AI模型的回复内容。
6. 运行应用程序
完成上述所有步骤后,您可以启动您的Spring Boot应用程序,并通过HTTP客户端测试/ai/chatStream?input=你好
这样的URL路径,应该能够看到来自通义千问模型的实时响应流。