阿里版 Spring AI 问世,真的强!
共 9752字,需浏览 20分钟
·
2024-06-20 15:53
JavaGuide官方网站:javaguide.cn
原文:https://juejin.cn/post/7361752279726866432
阿里巴巴在 Spring AI 的基础上推出了 Spring Cloud Alibaba AI,方便国内的 Java 开发者快速对接通义系列大模型。这篇文章会简单介绍一下 Spring Cloud Alibaba AI。
什么是 Spring AI?
Spring AI 是从著名的 Python 项目LangChain和LlamaIndex中汲取灵感,它不是这些项目的直接移植,它的成立信念是,下一波生成式人工智能应用程序将不仅适用于 Python 开发人员,而且将在许多编程语言中无处不在。
我们可以从 Spring AI 的官网描述中,总结出 Spring AI 的几个核心的关键词:
-
提供抽象能力 -
简化 AI 应用的开发 -
模型与向量支持 -
AI 集成与自动配置
Spring AI 简化了我们构建大型复杂的 AI 应用的过程,当然如果你的项目仅仅是需要调用一个 AI 接口,那其实直接调用官方 SDK 反而更方便。
Spring AI 提供的功能如下:
-
支持所有主要的模型提供商,如 OpenAI,Microsoft,Amazon,Google 和 Huggingface。支持的模型类型包括聊天和文本到图像。 -
跨 AI 提供商的可移植 API,用于聊天和嵌入模型。支持同步和流 API 选项。还支持下拉以访问特定于模型的功能。 -
将 AI 模型输出映射到 POJO。 -
支持所有主要的向量数据库,例如 Azure Vector Search、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。 -
跨 Vector Store 提供程序的可移植 API,包括新颖的类似 SQL 的元数据过滤器 API,该 API 也是可移植的。 -
AI 模型和矢量存储的 Spring Boot stater。 -
用于数据工程的 ETL 框架
什么是 Spring Cloud Alibaba AI?
原始的 Spring AI 并没有国内相关大模型的接入,对国内开发者不太友好。
总的来说,Spring Cloud Alibaba AI 目前基于 Spring AI 0.8.1 版本 API 完成通义系列大模型的接入。
在当前最新版本中,Spring Cloud Alibaba AI 主要完成了几种常见生成式模型的适配,包括对话、文生图、文生语音等,开发者可以使用 Spring Cloud Alibaba AI 开发基于通义的聊天、图片或语音生成 AI 应用,框架还提供 OutParser、Prompt Template、Stuff 等实用能力。
Spring Cloud Alibaba AI 官方还提供了包括聊天对话、文生图、文生语音等多种应用的开发示例,具体可以前往官网查看:https://sca.aliyun.com/docs/2023/user-guide/ai/quick-start/ 。
动手体验 Spring Cloud Alibaba AI
首先新建一个 Maven 项目,JDK 选的是 17 版本。
Maven 文件需要引入spring-cloud-alibaba-dependencies
和spring-cloud-starter-alibaba-ai
两个依赖。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-ai</artifactId>
</dependency>
</dependencies>
配置阿里云通义千问的 Api-Key,没有的读者可以从官网上申请。
server:
port: 8080
spring:
application:
name: alibaba-spring-ai-demo
cloud:
ai:
tongyi:
api-key: 你的api-key
新建 SpringBoot 启动类:
@SpringBootApplication
public class MyAiApplication {
public static void main(String[] args) {
SpringApplication.run(MyAiApplication.class,args);
}
}
对接文本模型
我们首先测试如何对接文本大模型。
新建一个控制器类:新建/simple
接口,用来测试基本 QA。
@RestController
@RequestMapping("/ai")
@CrossOrigin
public class TongYiController {
@Autowired
@Qualifier("tongYiSimpleServiceImpl")
private TongYiService tongYiSimpleService;
@GetMapping("/simple")
public String completion(
@RequestParam(value = "message", defaultValue = "AI时代下Java开发者该何去何从?")
String message
) {
return tongYiSimpleService.completion(message);
}
}
新建一个TongyiService
服务类:
public interface TongYiService {
/**
* 基本问答
*/
String completion(String message);
/**
* 文生图
*/
ImageResponse genImg(String imgPrompt);
/**
* 语音合成
*/
String genAudio(String text);
}
具体的实现类如下:由 Spring AI 自动注入 ChatClient
、StreamingChatClient
,ChatClient
屏蔽底层通义大模型交互细节,后者用于流式调用。
对于 QA 而言,仅仅通过client.call(prompt)
一行代码就可以完成对模型的调用。
@Service
@Slf4j
public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {
/**
* 自动注入ChatClient、StreamingChatClient,屏蔽模型调用细节
*/
private final ChatClient chatClient;
private final StreamingChatClient streamingChatClient;
@Autowired
public TongYiSimpleServiceImpl(ChatClient chatClient, StreamingChatClient streamingChatClient) {
this.chatClient = chatClient;
this.streamingChatClient = streamingChatClient;
}
/**
* 具体实现:
*/
@Override
public String completion(String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatClient.call(prompt).getResult().getOutput().getContent();
}
}
我们发送一个请求,prompt 是AI时代下Java开发者该何去何从?
测试结果如下:
文生图模型
这里只给出 service 的代码,其它代码同上面的文本问答。
可以看到,只需要实例化一个imagePrompt
,再调用模型即可。
@Slf4j
@Service
public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final ImageClient imageClient;
@Autowired
public TongYiImagesServiceImpl(ImageClient client) {
this.imageClient = client;
}
@Override
public ImageResponse genImg(String imgPrompt) {
var prompt = new ImagePrompt(imgPrompt);
return imageClient.call(prompt);
}
}
测试的 prompt 是:Painting a boy coding in front of the desk, with his dog.
,测试结果如下,效果还是很不错的:
语音合成模型
@Slf4j
@Service
public class TongYiAudioSimpleServiceImpl extends AbstractTongYiServiceImpl {
private static final Logger logger = LoggerFactory.getLogger(TongYiService.class);
private final SpeechClient speechClient;
@Autowired
public TongYiAudioSimpleServiceImpl(SpeechClient client) {
this.speechClient = client;
}
@Override
public String genAudio(String text) {
logger.info("gen audio prompt is: {}", text);
var resWAV = speechClient.call(text);
// save的代码省略,就是将音频保存到本地而已
return save(resWAV, SpeechSynthesisAudioFormat.WAV.getValue());
}
}
测试结果也是成功的:
使用体验小结
不得不说,阿里在 Java 开发领域一直是走在国内的前沿的,我也期待阿里继续完善 Spring Cloud Alibaba AI 的相关功能,为我们这些国内 Java 开发者提供更加方便的开发工具。
本文仅仅简单测试了文本问答、文生图以及语音合成三个功能,(最后一个没列出来),Spring Cloud Alibaba AI 还有很多丰富的功能,如流式调用、POJO 转换、AI Role 等功能,各位读者感兴趣可以自行前往官方 example 仓库查看。后续也我打算利用 Spring Cloud Alibaba AI 尝试构建一个 RAG 问答应用。
下面给出我的使用小结:
-
简化开发。个人开发者如果仅仅需要简答的问答接口,无需使用 Spring AI,然而,当项目中需要开发比较复杂的 AI 功能,如果仅仅使用官方的 SDK,写出的代码可能不太容易长期维护。 -
响应时间。接口响应时间还有很大的优化空间,可以看到基本的文本问答的响应就耗费了 10s,不过这也取决于所处理任务的大小。 -
模型选择。之前使用 SDK 可以自己选择通义提供的各种模型,而使用 Spring AI 框架,暂时不知道如何选择其它模型进行调用,有知道的掘友也可以在评论区说一下。
未来,Spring Cloud Alibaba AI 还将继续完成 VectorStore、Embedding、ETL Pipeline 等更多适配,简化 RAG 等更多 AI 应用开发场景。身为 Java 开发者,我也将继续关注 Spring Cloud Alibaba 社区的最新动态。
⭐️合集推荐:
点击下方卡片进入公众号
回复 「PDF」 即可领取原创PDF技术面试手册
回复 「学习路线」 即可获取最新版Java学习路线
回复 「开源」 即可获取优质Java开源项目合集
免费分享无套路,有帮助点个赞就好!