一、前言
1.1 AI大模型
近几年,AI大模型的发展迅速,成为全球科技竞争的新高地,具有极大的发展潜力和广泛的应用前景。中国在AI大模型领域的发展尤为显著,不仅在算力规模上与美国差距不大,而且在中文语料和文化理解方面具有天然优势。中国企业在大模型开发方面起步较晚,但发展迅速,涌现出如百度的ERNIE、阿里巴巴的M6等代表性的大模型产品。
AI大模型的应用场景广泛,包括但不限于自然语言处理、图像识别、语音识别、推荐系统、自动驾驶、游戏、科学研究等。随着技术的进步,AI大模型正在不断推动人工智能技术的边界,为各行各业带来革命性的变化。
1.2 Spring AI
Spring AI 是 Spring 官方社区项目,旨在简化 Java AI 应用程序开发,让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。
Spring AI项目从最初专注于处理语言输入和生成语言输出的模型开始,逐渐发展成为一个提供多种AI功能集成的框架。它提供了跨AI提供商的可移植API支持,包括聊天、文本到图像、嵌入模型等,并支持同步和流式API选项。
主要功能特点:
- 多模型支持:Spring AI支持多种聊天模型,包括Amazon Bedrock、Anthropic Claud、Azure Open AI等。
- 矢量数据库集成:支持多种矢量数据库,如Apache Cassandra、Elasticsearch、Milvus等。
- Spring Boot集成:提供Spring Boot自动配置和启动器,简化了AI模型和矢量存储的集成。
- ETL框架:提供了数据工程的ETL框架,便于将文档传输到模型提供商,并存储在矢量数据库中。
- 函数调用:允许声明
java.util.Function
实现,以供OpenAI模型在其提示响应中使用。
1.3 Spring Cloud Alibaba AI
Spring Cloud Alibaba AI 以 Spring AI 为基础,并在此基础上提供阿里云通义系列大模型全面适配,让用户能快速开发基于通义大模型的 Java AI 应用。
Spring Cloud Alibaba AI 目前基于 Spring AI 0.8.1 版本 API 完成通义系列大模型的接入。通义接入是基于阿里云 灵积模型服务,灵积模型服务建立在“模型即服务”(Model-as-a-Service,MaaS)的理念基础之上,围绕 AI 各领域模型,通过标准化的API提供包括模型推理、模型微调训练在内的多种模型服务。
在当前最新版本中,Spring Cloud Alibaba AI 主要完成了几种常见生成式模型的适配,包括对话、文生图、文生语音等,开发者可以使用 Spring Cloud Alibaba AI 开发基于通义的聊天、图片或语音生成 AI 应用,框架还提供 OutParser、Prompt Template、Stuff 等实用能力。
二、项目环境准备
开发工具:IDEA
Java环境:JDK17
构建工具:Maven
通义模型key
获取通义api key步骤:
1.阿里云官网开通服务
模型服务灵积 DashScope - 阿里云
2.创建key
三、项目开发
3.1 创建工程及配置
3.1.1创建maven工程
idea创建maven工程
初始化
3.1.2添加依赖
<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>
备注:
添加依赖,出现报错:Cannot resolve org.springframework.ai:spring-ai-core:0.8.1
添加额外的Repository:在pom.xml文件中,添加如下仓库配置段落,这会指引Maven去查找Spring的里程碑和快照仓库,这些仓库可能包含了spring-ai-core或其他sca相关的依赖。
<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>
添加后,reload导入
3.1.3 application.yml配置
新建文件夹
新建application.yml文件
内容如下:
server:
port: 8080
spring:
application:
name: alibaba-spring-ai-demo
cloud:
ai:
tongyi:
api-key: 你的api-key
3.1.4 新建SpringBoot启动类
3.2 实现代码
3.2.1 新建包
3.2.2 TongYiController
@RestController@RequestMapping("/api")publicclassTongYiController{@ResourceprivateTongYiService tongYiService;@GetMapping("/simple")publicStringcompletion(@RequestParam(value ="message",defaultValue ="AI时代下Java开发者该何去何从?")String message){return tongYiService.completion(message);}@GetMapping("/stream_completion")publicMap<String,String>streamCompletion(@RequestParam(value ="message",defaultValue ="AI时代下Java开发者该何去何从?")String message){return tongYiService.streamCompletion(message);}@GetMapping("/image")publicImageResponsegetImage(@RequestParam(value ="imgPrompt",defaultValue ="画一只狗")String imgPrompt){return tongYiService.getImage(imgPrompt);}}
3.2.3
TongYiService
publicinterfaceTongYiService{/**
* 基本问答
*
* @param message
* @return
*/Stringcompletion(String message);/**
* Stream call
*
* @param message
* @return
*/Map<String,String>streamCompletion(String message);/**
* 文生图
*
* @param imgPrompt
* @return
*/ImageResponsegetImage(String imgPrompt);}
3.2.4
TongYiSimpleServiceImpl
@Service@Slf4jpublicclassTongYiServiceImplimplementsTongYiService{@ResourceprivateChatClient chatClient;@ResourceprivateImageClient imageClient;@ResourceprivateStreamingChatClient streamingChatClient;@OverridepublicStringcompletion(String message){Prompt prompt =newPrompt(newUserMessage(message));return chatClient.call(prompt).getResult().getOutput().getContent();}@OverridepublicMap<String,String>streamCompletion(String message){StringBuilder fullContent =newStringBuilder();
streamingChatClient.stream(newPrompt(message)).flatMap(chatResponse ->Flux.fromIterable(chatResponse.getResults())).map(content->content.getOutput().getContent()).doOnNext(fullContent::append).last().map(lastContent ->Map.of(message,fullContent.toString())).block();
log.info("fullContent:{}",fullContent);returnMap.of(message,fullContent.toString());}@OverridepublicImageResponsegetImage(String imgPrompt){ImagePrompt imagePrompt =newImagePrompt(imgPrompt);return imageClient.call(imagePrompt);}}
3.3 测试
3.3.1 启动服务
3.3.2 基本对话
3.3.3 文生图
版权归原作者 qq_17153885 所有, 如有侵权,请联系我们删除。