阿里版 Spring AI 問(wèn)世,真的強(qiáng)!
共 9752字,需瀏覽 20分鐘
·
2024-06-20 15:53
JavaGuide官方網(wǎng)站:javaguide.cn
原文:https://juejin.cn/post/7361752279726866432
阿里巴巴在 Spring AI 的基礎(chǔ)上推出了 Spring Cloud Alibaba AI,方便國(guó)內(nèi)的 Java 開(kāi)發(fā)者快速對(duì)接通義系列大模型。這篇文章會(huì)簡(jiǎn)單介紹一下 Spring Cloud Alibaba AI。
什么是 Spring AI?
Spring AI 是從著名的 Python 項(xiàng)目LangChain和LlamaIndex中汲取靈感,它不是這些項(xiàng)目的直接移植,它的成立信念是,下一波生成式人工智能應(yīng)用程序?qū)⒉粌H適用于 Python 開(kāi)發(fā)人員,而且將在許多編程語(yǔ)言中無(wú)處不在。
我們可以從 Spring AI 的官網(wǎng)描述中,總結(jié)出 Spring AI 的幾個(gè)核心的關(guān)鍵詞:
-
提供抽象能力 -
簡(jiǎn)化 AI 應(yīng)用的開(kāi)發(fā) -
模型與向量支持 -
AI 集成與自動(dòng)配置
Spring AI 簡(jiǎn)化了我們構(gòu)建大型復(fù)雜的 AI 應(yīng)用的過(guò)程,當(dāng)然如果你的項(xiàng)目?jī)H僅是需要調(diào)用一個(gè) AI 接口,那其實(shí)直接調(diào)用官方 SDK 反而更方便。
Spring AI 提供的功能如下:
-
支持所有主要的模型提供商,如 OpenAI,Microsoft,Amazon,Google 和 Huggingface。支持的模型類(lèi)型包括聊天和文本到圖像。 -
跨 AI 提供商的可移植 API,用于聊天和嵌入模型。支持同步和流 API 選項(xiàng)。還支持下拉以訪問(wèn)特定于模型的功能。 -
將 AI 模型輸出映射到 POJO。 -
支持所有主要的向量數(shù)據(jù)庫(kù),例如 Azure Vector Search、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。 -
跨 Vector Store 提供程序的可移植 API,包括新穎的類(lèi)似 SQL 的元數(shù)據(jù)過(guò)濾器 API,該 API 也是可移植的。 -
AI 模型和矢量存儲(chǔ)的 Spring Boot stater。 -
用于數(shù)據(jù)工程的 ETL 框架
什么是 Spring Cloud Alibaba AI?
原始的 Spring AI 并沒(méi)有國(guó)內(nèi)相關(guān)大模型的接入,對(duì)國(guó)內(nèi)開(kāi)發(fā)者不太友好。
總的來(lái)說(shuō),Spring Cloud Alibaba AI 目前基于 Spring AI 0.8.1 版本 API 完成通義系列大模型的接入。
在當(dāng)前最新版本中,Spring Cloud Alibaba AI 主要完成了幾種常見(jiàn)生成式模型的適配,包括對(duì)話、文生圖、文生語(yǔ)音等,開(kāi)發(fā)者可以使用 Spring Cloud Alibaba AI 開(kāi)發(fā)基于通義的聊天、圖片或語(yǔ)音生成 AI 應(yīng)用,框架還提供 OutParser、Prompt Template、Stuff 等實(shí)用能力。
Spring Cloud Alibaba AI 官方還提供了包括聊天對(duì)話、文生圖、文生語(yǔ)音等多種應(yīng)用的開(kāi)發(fā)示例,具體可以前往官網(wǎng)查看:https://sca.aliyun.com/docs/2023/user-guide/ai/quick-start/ 。
動(dòng)手體驗(yàn) Spring Cloud Alibaba AI
首先新建一個(gè) Maven 項(xiàng)目,JDK 選的是 17 版本。
Maven 文件需要引入spring-cloud-alibaba-dependencies和spring-cloud-starter-alibaba-ai兩個(gè)依賴。
<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>
配置阿里云通義千問(wèn)的 Api-Key,沒(méi)有的讀者可以從官網(wǎng)上申請(qǐng)。
server:
port: 8080
spring:
application:
name: alibaba-spring-ai-demo
cloud:
ai:
tongyi:
api-key: 你的api-key
新建 SpringBoot 啟動(dòng)類(lèi):
@SpringBootApplication
public class MyAiApplication {
public static void main(String[] args) {
SpringApplication.run(MyAiApplication.class,args);
}
}
對(duì)接文本模型
我們首先測(cè)試如何對(duì)接文本大模型。
新建一個(gè)控制器類(lèi):新建/simple接口,用來(lái)測(cè)試基本 QA。
@RestController
@RequestMapping("/ai")
@CrossOrigin
public class TongYiController {
@Autowired
@Qualifier("tongYiSimpleServiceImpl")
private TongYiService tongYiSimpleService;
@GetMapping("/simple")
public String completion(
@RequestParam(value = "message", defaultValue = "AI時(shí)代下Java開(kāi)發(fā)者該何去何從?")
String message
) {
return tongYiSimpleService.completion(message);
}
}
新建一個(gè)TongyiService服務(wù)類(lèi):
public interface TongYiService {
/**
* 基本問(wèn)答
*/
String completion(String message);
/**
* 文生圖
*/
ImageResponse genImg(String imgPrompt);
/**
* 語(yǔ)音合成
*/
String genAudio(String text);
}
具體的實(shí)現(xiàn)類(lèi)如下:由 Spring AI 自動(dòng)注入 ChatClient、StreamingChatClient,ChatClient 屏蔽底層通義大模型交互細(xì)節(jié),后者用于流式調(diào)用。
對(duì)于 QA 而言,僅僅通過(guò)client.call(prompt)一行代碼就可以完成對(duì)模型的調(diào)用。
@Service
@Slf4j
public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {
/**
* 自動(dòng)注入ChatClient、StreamingChatClient,屏蔽模型調(diào)用細(xì)節(jié)
*/
private final ChatClient chatClient;
private final StreamingChatClient streamingChatClient;
@Autowired
public TongYiSimpleServiceImpl(ChatClient chatClient, StreamingChatClient streamingChatClient) {
this.chatClient = chatClient;
this.streamingChatClient = streamingChatClient;
}
/**
* 具體實(shí)現(xiàn):
*/
@Override
public String completion(String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatClient.call(prompt).getResult().getOutput().getContent();
}
}
我們發(fā)送一個(gè)請(qǐng)求,prompt 是AI時(shí)代下Java開(kāi)發(fā)者該何去何從?測(cè)試結(jié)果如下:
文生圖模型
這里只給出 service 的代碼,其它代碼同上面的文本問(wèn)答。
可以看到,只需要實(shí)例化一個(gè)imagePrompt,再調(diào)用模型即可。
@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);
}
}
測(cè)試的 prompt 是:Painting a boy coding in front of the desk, with his dog.,測(cè)試結(jié)果如下,效果還是很不錯(cuò)的:
語(yǔ)音合成模型
@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());
}
}
測(cè)試結(jié)果也是成功的:
使用體驗(yàn)小結(jié)
不得不說(shuō),阿里在 Java 開(kāi)發(fā)領(lǐng)域一直是走在國(guó)內(nèi)的前沿的,我也期待阿里繼續(xù)完善 Spring Cloud Alibaba AI 的相關(guān)功能,為我們這些國(guó)內(nèi) Java 開(kāi)發(fā)者提供更加方便的開(kāi)發(fā)工具。
本文僅僅簡(jiǎn)單測(cè)試了文本問(wèn)答、文生圖以及語(yǔ)音合成三個(gè)功能,(最后一個(gè)沒(méi)列出來(lái)),Spring Cloud Alibaba AI 還有很多豐富的功能,如流式調(diào)用、POJO 轉(zhuǎn)換、AI Role 等功能,各位讀者感興趣可以自行前往官方 example 倉(cāng)庫(kù)查看。后續(xù)也我打算利用 Spring Cloud Alibaba AI 嘗試構(gòu)建一個(gè) RAG 問(wèn)答應(yīng)用。
下面給出我的使用小結(jié):
-
簡(jiǎn)化開(kāi)發(fā)。個(gè)人開(kāi)發(fā)者如果僅僅需要簡(jiǎn)答的問(wèn)答接口,無(wú)需使用 Spring AI,然而,當(dāng)項(xiàng)目中需要開(kāi)發(fā)比較復(fù)雜的 AI 功能,如果僅僅使用官方的 SDK,寫(xiě)出的代碼可能不太容易長(zhǎng)期維護(hù)。 -
響應(yīng)時(shí)間。接口響應(yīng)時(shí)間還有很大的優(yōu)化空間,可以看到基本的文本問(wèn)答的響應(yīng)就耗費(fèi)了 10s,不過(guò)這也取決于所處理任務(wù)的大小。 -
模型選擇。之前使用 SDK 可以自己選擇通義提供的各種模型,而使用 Spring AI 框架,暫時(shí)不知道如何選擇其它模型進(jìn)行調(diào)用,有知道的掘友也可以在評(píng)論區(qū)說(shuō)一下。
未來(lái),Spring Cloud Alibaba AI 還將繼續(xù)完成 VectorStore、Embedding、ETL Pipeline 等更多適配,簡(jiǎn)化 RAG 等更多 AI 應(yīng)用開(kāi)發(fā)場(chǎng)景。身為 Java 開(kāi)發(fā)者,我也將繼續(xù)關(guān)注 Spring Cloud Alibaba 社區(qū)的最新動(dòng)態(tài)。
??合集推薦:
點(diǎn)擊下方卡片進(jìn)入公眾號(hào)
回復(fù) 「PDF」 即可領(lǐng)取原創(chuàng)PDF技術(shù)面試手冊(cè)
回復(fù) 「學(xué)習(xí)路線」 即可獲取最新版Java學(xué)習(xí)路線
回復(fù) 「開(kāi)源」 即可獲取優(yōu)質(zhì)Java開(kāi)源項(xiàng)目合集
免費(fèi)分享無(wú)套路,有幫助點(diǎn)個(gè)贊就好!
