Spring AI 简介
Spring AI:是一个面向AI工程的应用框架。
目标是:简化JavaAI应用程序开发,帮助我们快速调用AI,从而实现各种功能场景。
但是重点:它对于国内开发者不太友好已经不太支持了。于是乎Spring Cloud Alibaba AI出世了!
Spring Cloud Alibaba AI简介
Spring Cloud Alibaba AI 基于 Spring AI 0.8.1 版本完成通义系列大模型的接入。DashScope灵积模型服务建立在 模型即服务(Model-as-a-Service,MaaS)的理念基础之上,围绕AI各领域模型,通过标准化的API提供包括模型推理、模型微调训练在内的多种模型服务。目前支持的模型主要有:对话、文生图、文生语音,更多功能特性正在适配中。那以上介绍完之后咱们就完成一些案例来看看效果吧
开发环境
JDK17,Maven3.5以上,Spring Boot2.0+,Spring Cloud2021+
创建工程
创建父工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>springcloudAI</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>aliai</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.7.18</spring-boot.version>
<spring-cloud.version>2021.0.8</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
创建子工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>springcloudAI</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>aliai</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-ai</artifactId>
<version>2023.0.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>SpringMilestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.18</version>
<configuration>
<mainClass>com.usian.AliApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
添加配置文件
主要配置阿里云申请的api-key:https://dashscope.console.aliyun.com/model
server.port=8081
spring.cloud.ai.tongyi.api-key:your api-key
代码实现【单轮对话、文生图、文本转语音】
Service类
package com.tongyi.servise;
import org.springframework.ai.image.ImageResponse;
import java.util.Map;
/**
* @Author qingzhou
* @Date 2024/9/6 11:51
* @Version 1.0
*/
public interface TongYiService {
/**
* 基本问答
*
* @param message
* @return
*/
String completion(String message);
/**
* 文生图
* @param imgPrompt
* @return
*/
ImageResponse getImage(String imgPrompt);
/**
* 文本转语音
* @param text
* @return
*/
String genAudio(String text);
}
Service实现类
package com.tongyi.servise.impl;
import com.alibaba.cloud.ai.tongyi.audio.api.SpeechClient;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat;
import com.tongyi.servise.TongYiService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.StreamingChatClient;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.image.ImageClient;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
/**
* @Author qingzhou
* @Date 2024/9/9 11:02
* @Version 1.0
*/
@Service
@Slf4j
public class TongYiServiceImpl implements TongYiService {
@Resource
private ChatClient chatClient;
@Resource
private ImageClient imageClient;
@Resource
private StreamingChatClient streamingChatClient;
@Resource
private SpeechClient speechClient;
@Override
public String completion(String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return chatClient.call(prompt).getResult().getOutput().getContent();
}
@Override
public ImageResponse getImage(String imgPrompt) {
ImagePrompt imagePrompt = new ImagePrompt(imgPrompt);
return imageClient.call(imagePrompt);
}
/**
* 语音合成模型
*
* @param message 消息内容
* @return AI答案
*/
@Override
public String genAudio(String message) {
var resWAV = speechClient.call(message);
return save(resWAV, SpeechSynthesisAudioFormat.WAV.getValue());
}
/**
* 保存语音文件
*
* @param audio 语音内容
* @param type 类型
* @return 文件信息
*/
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;
}
}
编写业务层代码
package com.tongyi.controller;
import com.tongyi.servise.TongYiService;
import org.springframework.ai.image.ImageResponse;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @Author qingzhou
* @Date 2024/9/9 11:05
* @Version 1.0
*/
@RestController
@RequestMapping("/api")
public class TongYiController {
@Resource
private TongYiService tongYiService;
@GetMapping("/simple")
public String completion(@RequestParam(value = "message",defaultValue = "AI时代下Java开发者该何去何从?") String message){
return tongYiService.completion(message);
}
@GetMapping("/image")
public ImageResponse getImage(@RequestParam(value = "imgPrompt",defaultValue = "画:赤壁赋场景") String imgPrompt){
return tongYiService.getImage(imgPrompt);
}
@GetMapping("/audio")
public String genAudio(@RequestParam(value = "message", defaultValue = "Hello,Spring Cloud Alibaba AI.") String message) {
return tongYiService.genAudio(message);
}
}
项目启动类
package com.tongyi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author qingzhou
* @Date 2024/9/9 14:41
* @Version 1.0
*/
@SpringBootApplication
public class SpringCloudAiDemoApplication {
public static void main(String[] args){
SpringApplication.run(SpringCloudAiDemoApplication.class);
}
}
项目结构
测试效果
简单对话
访问:http://localhost:8081/api/simple?message=工作流框架
文生图
访问:http://localhost:8081/api/image?imagePrompt=描绘赤壁赋的场景
接口会返回图片url和base64格式的图片,根据url下载图片或把base64转化为图片即可
文字转语言