快速体验 Spring Cloud Alibaba AI
JDK要求最低17
1.SpringAI
Spring AI 旨在简化包含人工智能相关功能的应用程序的开发,避免不必要的复杂性。
Spring AI 的核心是提供抽象,作为开发 AI 应用程序的基础。这些抽象有多种实现方式,只需极少的代码改动即可轻松实现各个大模型之间的切换。
Spring AI 提供以下功能:
- 支持所有主要模型提供商,例如 OpenAI、Microsoft、Amazon、Google 和 Huggingface。
- 支持的模型类型包括“聊天”和“文本到图像”,还有更多模型类型正在开发中。
- 跨 AI 提供商的可移植 API,用于聊天和嵌入模型。支持同步和流 API 选项。还支持下拉访问模型特定功能。
- AI 模型输出到 POJO 的映射。
- 支持所有主要矢量数据库提供商,例如 Azure 矢量搜索、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate
- 跨 Vector Store 提供商的可移植 API,包括同样可移植的新颖的类似 SQL 的元数据过滤器 API。
- 函数调用
- AI 模型和向量存储的 Spring Boot 自动配置和启动器。
- 数据工程的 ETL 框架
2.Spring Cloud Alibaba AI
Spring Cloud Alibaba AI (以下简称 SCA AI)基于 Spring AI 0.8.1 版本完成通义系列大模型的接入。
DashScope灵积模型服务建立在 模型即服务(Model-as-a-Service,MaaS)的理念基础之上,围绕AI各领域模型,通过标准化的API提供包括模型推理、模型微调训练在内的多种模型服务。
SCA AI 目前支持的模型主要有:对话、文生图、文生语音,更多功能特性正在适配中。
3.创建SCA AI 应用
在 pom.xml 中引入如下依赖配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-ai</artifactId>
</dependency>
<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>
<!-- 因为 Spring AI 还没有正式发布到 maven 仓库,所以需要添加此配置项 目前 maven 仓库为假的。
issue:https://github.com/spring-projects/spring-ai/issues/537
-->
<repositories>
<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>
4.api-key 配置
在正式开始体验之前,需要申请到模型的 api-key。申请地址:https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key
您可以通过 DashScope 提供的方式配置 api-key,SCA AI 完全兼容 DashScope 环境变量配置 key 的方式:https://help.aliyun.com/zh/dashscope/developer-reference/api-key-settings
当然也可以通过 SCA AI 中提供的如下配置项配置:
在application.yml中配置:
spring:
cloud:
ai:
tongyi:
# api-key setting:
api-key: sk-xxxxxxxxxxxxxxxxxxx
5.聊天对话体验
public class ChatService {
// 聊天客户端
private final ChatClient chatClient;
// stream 流式客户端
private final StreamingChatClient streamingChatClient;
@Autowired
public ChatService(ChatClient chatClient, StreamingChatClient streamingChatClient) {
this.chatClient = chatClient;
this.streamingChatClient = streamingChatClient;
}
@Override
public String normalCompletion(String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatClient.call(prompt).getResult().getOutput().getContent();
}
@Override
public Map<String, String> streamCompletion(String message) {
StringBuilder fullContent = new StringBuilder();
streamingChatClient.stream(new Prompt(message))
.flatMap(chatResponse -> Flux.fromIterable(chatResponse.getResults()))
.map(content -> content.getOutput().getContent())
.doOnNext(fullContent::append)
.last()
.map(lastContent -> Map.of(message, fullContent.toString()))
.block();
return Map.of(message, fullContent.toString());
}
}
之后,创建 controller 接口调用 service 服务:
@Autowired
private ChatService chatService;
@GetMapping("/example")
public String completion(
@RequestParam(value = "message", defaultValue = "Tell me a joke")
String message
) {
return chatService.completion(message);
}
@GetMapping("/stream")
public Map<String, String> streamCompletion(
@RequestParam(value = "message", defaultValue = "请告诉我西红柿炖牛腩怎么做?")
String message
) {
return chatService.streamCompletion(message);
}
调用/example
Sure, here’s one for you: Why was the math book sad? Because it had too many problems!
调用/stream
{
“请告诉我西红柿炖牛腩怎么做?”: “材料材料:\n材料:\n牛材料:\n牛腩1000材料:\n牛腩1000g,西红柿3个(大),材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰糖调味,继续小火炖煮材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰糖调味,继续小火炖煮直至蔬菜熟透;\n6. 最材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰糖调味,继续小火炖煮直至蔬菜熟透;\n6. 最后根据个人口味加盐调味即可材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰糖调味,继续小火炖煮直至蔬菜熟透;\n6. 最后根据个人口味加盐调味即可出锅。\n\n这道菜色香味材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰糖调味,继续小火炖煮直至蔬菜熟透;\n6. 最后根据个人口味加盐调味即可出锅。\n\n这道菜色香味俱全,营养丰富,非常适合家庭材料:\n牛腩1000g,西红柿3个(大),土豆2个,胡萝卜1根。调料:生姜、料酒、冰糖、盐各适量。\n\n做法:\n\n1. 牛腩切块,用开水焯一下去腥;\n2. 西红柿、土豆、胡萝卜洗净后切成滚刀块备用;\n3. 锅中倒油加热,放入姜片和牛腩翻炒至表面变色;\n4. 加入料酒继续翻炒几下,然后加入足够的水没过牛肉,大火烧开后转小火慢炖至牛肉软烂;\n5. 放入西红柿、土豆、胡萝卜,再加少许冰糖调味,继续小火炖煮直至蔬菜熟透;\n6. 最后根据个人口味加盐调味即可出锅。\n\n这道菜色香味俱全,营养丰富,非常适合家庭日常食用。”
}
6.文生图体验
public class ImagesService {
// 图像生成客户端
private final ImageClient imageClient;
@Autowired
public ImagesService(ImageClient client) {
this.imageClient = client;
}
@Override
public ImageResponse genImg(String imgPrompt) {
var prompt = new ImagePrompt(imgPrompt);
return imageClient.call(prompt);
}
}
文生图对应的 controller 接口如下:
@Autowired
private ImagesService imagesService;
@GetMapping("/img")
public ResponseEntity<ByteArrayResource> getImageAsByteArray(@RequestParam(value = "prompt", defaultValue = "Painting a picture of blue water and blue sky.") String imgPrompt) {
// imagesService.genImg(imgPrompt),返回包含Base64编码图片的ImageResponse对象
ImageResponse imageResponse = imagesService.genImg(imgPrompt);
// 解析Base64编码的JSON字符串,获取Base64编码的图片数据
String b64Json = imageResponse.getResult().getOutput().getB64Json();
// 将Base64编码的字符串解码为字节数组
byte[] imageBytes = Base64.getDecoder().decode(b64Json);
// 构建 ByteArrayResource 对象
ByteArrayResource resource = new ByteArrayResource(imageBytes);
// 构建 HTTP 响应头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_JPEG); // 根据实际图片类型设置
headers.setContentLength(imageBytes.length);
// 返回包含图片字节数组资源的 ResponseEntity
return ResponseEntity.ok()
.headers(headers)
.body(resource);
}
调用/img
7.文生语音体验
public class AudioService {
private final SpeechClient speechClient;
@Autowired
public AudioService(SpeechClient client) {
this.speechClient = client;
}
@Override
public String genAudio(String text) {
var resWAV = speechClient.call(text);
return save(resWAV, SpeechSynthesisAudioFormat.WAV.getValue());
}
// 辅助方法,用于将模型的响应保存到本地.
private String save(ByteBuffer audio, String type) {
String currentPath = System.getProperty("user.dir");
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-HH-mm-ss");
String fileName = currentPath + File.separator + now.format(formatter) + "." + type;
File file = new File(fileName);
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(audio.array());
}
catch (Exception e) {
throw new RuntimeException(e);
}
return fileName;
}
}
controller 接口代码如下:
@Autowired
private AudioService audioService;
@GetMapping("/audio")
public String genAudio(@RequestParam(value = "prompt",
defaultValue = "你好,Spring Cloud Alibaba AI 框架!") String prompt) {
return audioService.genAudio(prompt);
}
调用/audio
至此,Spring Cloud Alibaba AI 提供的三种基本功能已经体验完成,后续您还可以通过设置一些个性化的参数来使大模型生成各种各样的图片和音频等。
更多配置项可以参考:https://help.aliyun.com/zh/dashscope/developer-reference/api-details。社区相关的文档正在完善,更多功能正在开发中!