Spring Cloud Alibaba AI 大模型使用示例

1 pom.xml, 注意版本(jdk17) ,仓库地址,排除的依赖(日志错误)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo_mvn_test_1</artifactId><version>0.0.1-SNAPSHOT</version><name>demo_mvn_test_1</name><description>demo_mvn_test_1</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version></properties><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><exclusions><exclusion><artifactId>slf4j-simple</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>

2 yml 文件,key申请查看帮助

如何开通DashScope并创建API-KEY_模型服务灵积(DashScope)-阿里云帮助中心

spring:cloud:ai:tongyi:api-key: xxxxxxxx

3 service类接口,抽象类,实现类编写,你想简单也行,自己改

import org.springframework.ai.image.ImageResponse;
import java.util.Map;public interface TongYiService {/*** 基本问答*/String completion(String message);/*** 基本问答,流式返回*/Map<String, String> streamCompletion(String message);/*** 文生图,根据文本描述生成图片*/ImageResponse genImg(String imgPrompt);/*** 语音合成,将文本转成语音文件*/String genAudio(String text);
}
import com.example.demo_mvn_test_1.service.TongYiService;
import org.springframework.ai.image.ImageResponse;
import java.util.Map;public abstract class AbstractTongYiServiceImpl implements TongYiService {@Overridepublic String completion(String message) {return null;}@Overridepublic Map<String, String> streamCompletion(String message) {return null;}@Overridepublic ImageResponse genImg(String imgPrompt) {return null;}@Overridepublic String genAudio(String text) {return null;}
}
import lombok.RequiredArgsConstructor;
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.stereotype.Service;
import reactor.core.publisher.Flux;
import java.util.Map;@Service
//自动注入ChatClient、StreamingChatClient,屏蔽模型调用细节
@RequiredArgsConstructor
public class TongYiSimpleServiceImpl extends AbstractTongYiServiceImpl {private final ChatClient chatClient;private final StreamingChatClient streamingChatClient;//方式1@Overridepublic String completion(String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatClient.call(prompt).getResult().getOutput().getContent();}//方式2,streaming的方式@Overridepublic 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());}
}
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.image.ImageClient;
import org.springframework.ai.image.ImagePrompt;
import org.springframework.ai.image.ImageResponse;
import org.springframework.stereotype.Service;@Slf4j
@Service
@RequiredArgsConstructor
public class TongYiImagesServiceImpl extends AbstractTongYiServiceImpl {private final ImageClient imageClient;@Overridepublic ImageResponse genImg(String imgPrompt) {var prompt = new ImagePrompt(imgPrompt);return imageClient.call(prompt);}
}
import com.alibaba.cloud.ai.tongyi.audio.api.SpeechClient;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;@Slf4j
@Service
@RequiredArgsConstructor
public class TongYiAudioSimpleServiceImpl extends AbstractTongYiServiceImpl {private final SpeechClient speechClient;@Overridepublic String genAudio(String text) {log.info("gen audio prompt is: {}", text);var resWAV = speechClient.call(text);// save的代码省略,就是将音频保存到本地而已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;}}

4 controller层调用测试

import com.example.demo_mvn_test_1.service.TongYiService;
import org.springframework.ai.image.ImageResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;@RestController
@RequestMapping("/ai")
public class TongYiController {@Autowired@Qualifier("tongYiSimpleServiceImpl")private TongYiService tongYiSimpleService;@Autowired@Qualifier("tongYiImagesServiceImpl")private TongYiService tongYiSimpleService_img;@Qualifier("tongYiAudioSimpleServiceImpl")@Autowiredprivate TongYiService yinpinService;//基本回答@GetMapping("/simple")public String completion(@RequestParam(value = "message", defaultValue = "荷花怎么种植") String message) {return tongYiSimpleService.completion(message);}//基本回答@GetMapping("/simple_stream")public Map<String, String> completion_stream(@RequestParam(value = "message", defaultValue = "荷花怎么种植") String message) {Map<String, String> stringStringMap = tongYiSimpleService.streamCompletion(message);return stringStringMap;}//图片生成,返回的是图片的地址和图片的base64@RequestMapping("/getimg")public ImageResponse genImg(@RequestParam(value = "message", defaultValue = "荷花怎么种植") String message) {ImageResponse imageResponse = tongYiSimpleService_img.genImg(message);return imageResponse;}//语音生成//文字不要放太多了@RequestMapping("/getaudio")public String genAudio(@RequestParam(value = "message", defaultValue = "荷花怎么种植") String message) {String audio = yinpinService.genAudio(message);return audio;}}



 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能测试中的场景设计和测试执行

假设一个内部系统要求响应时间在 3s 以内&#xff0c;支持最大用户数为4万。根据二八原则&#xff0c;80%用户在20%时间使用系统(4w80%)/(24h20%)≈1.9点击/秒。并发数TPS&#xff08;运行时间思考时间&#xff09;1.9&#xff08;30.50.330.50.30.53&#xff09;21。 注意&am…

Flutter循序渐进==>数据结构(列表、映射和集合)和错误处理

导言 填鸭似的教育确实不行&#xff0c;我高中时学过集合&#xff0c;不知道有什么用&#xff0c;毫无兴趣&#xff0c;等到我学了一门编程语言后&#xff0c;才发现集合真的很有用&#xff1b;可以去重&#xff0c;可以看你有我没有的&#xff0c;可以看我有你没有的&#xf…

毫米波雷达深度学习技术-1.7训练一个神经网络

1.7 训练一个神经网络 对于训练神经网络&#xff0c;有两个步骤&#xff0c;即前向传递和误差反向传播。 1.7.1 前向传播和反向传播 在前向传递中&#xff0c;输入被馈送到模型并与权重向量相乘&#xff0c;并为每一层添加偏差以计算模型的输出。密集层或全连接层第l层的输入、…

SQL面试题练习 —— 查询前2大和前2小用户并有序拼接

目录 1 题目2 建表语句3 题解 1 题目 有用户账户表&#xff0c;包含年份&#xff0c;用户id和值,请按照年份分组&#xff0c;取出值前两小和前两大对应的用户id&#xff0c;需要保持值最小和最大的用户id排首位。 样例数据 ------------------------- | year | user_id | v…

网络基础-RIP协议

RIP&#xff08;Routing Information Protocol&#xff09;是一个基于距离矢量的动态路由协议&#xff0c;常用于小型到中型网络。RIP是较早的路由协议之一&#xff0c;具有简单易用的特点。以下是关于RIP协议的详细介绍&#xff1a; RIP的主要特点 ①使用跳数&#xff08;ho…

非标设备行业的数智化项目管理

近年来&#xff0c;中国制造快速发展&#xff0c;企业迫切需要加快转型升级。与传统制造业相比&#xff0c;高端制造业具有明显的优势&#xff1a;高技术、高附加值、低污染、低排放、竞争优势强。一方面&#xff0c;企业对于生产效率和自动化水平的要求不断提高&#xff0c;期…

开发个人OpenUI--1 项目介绍

开发个人OpenUI--1 项目介绍 开发个人OpenUI--1 项目介绍知识点大纲文章目录项目地址 开发个人OpenUI–1 项目介绍 本文将以一个使用Ollama部署的ChatGPT为背景&#xff0c;主要还是介绍和学习使用 go-zero 框架&#xff0c;开发个人OpenUI的服务器后端&#xff0c;使用Docker…

武汉星起航:成功挂牌上股交,领航亚马逊跨境电商,共创未来辉煌

在全球电商的竞争格局中&#xff0c;亚马逊凭借其卓越的服务、丰富的商品种类和高效的物流体系&#xff0c;始终稳坐全球电商市场的头把交椅。而在这股不可阻挡的电商浪潮中&#xff0c;武汉星起航电子商务有限公司凭借其前瞻性的战略布局和强大的运营能力&#xff0c;成功在20…

名企面试必问30题(十二)——简单介绍一下你的家庭情况

1.思路 对于面试官来说&#xff0c;他提出这个问题&#xff0c;只是为了深挖您的性格、稳定性、行事风格&#xff0c;包括未来定居规划、生育规划等基础信息&#xff0c;这是正常情况。您不要过多围绕其他家庭成员来讲&#xff0c;否则面试官无法获取他想要的&#xff0c;您也难…

【单片机毕业设计选题24040】-基于STM32的蓝牙防丢器设计

系统功能: 系统上电后显示“欢迎使用蓝牙防丢系统请稍后”两秒钟显示正常界面&#xff0c;如果蓝牙正常连接OLED显示Connected, 蓝牙未连接则显示DisConnected同时蜂鸣器报警 蓝牙正常连接后在APP上每隔三秒显示一个Connected 系统功能框图: 主要功能模块原理图: 电源时钟…

大数据之Zookeeper部署

文章目录 集群规划环境准备集群部署参考资料 集群规划 确定使用Hadoop101、hadoop102和hadoop103三台服务器来构建Zookeeper集群。 hadoop101hadoop102hadoop103zookeeperzookeeperzookeeper 环境准备 安装zookeeper前需要确保下面的环境配置成功&#xff0c;具体可以参考大…

AI智能剪辑发展到哪种地步?来看看云微客就知道了!

不是短视频团队招不起&#xff0c;而是矩阵账号更有性价比。企业做短视频有反思过为什么干不过同行吗&#xff1f;我们来看看大佬是怎么做的。云微客AI智能剪辑系统用几百个账号做矩阵布局&#xff0c;系统每天自动进行批量剪视频、写文案、一键自动化发布视频&#xff0c;一个…

[漏洞复现] MetInfo5.0.4文件包含漏洞

[漏洞复现] MetInfo5.0.4文件包含漏洞 MetInfo5.0.4 漏洞代码审计 漏洞出现在about/index.php中&#xff0c;因为利用了动态地址&#xff0c;所以存在漏洞。 漏洞检查语句&#xff08;&#xff01;192.168.109.100是我的服务器ip&#xff0c;需要换成自己的&#xff09;&…

华为仓颉语言体验:一个简单的socket服务端实现

前言 由于仓颉目前是内测状态&#xff0c; 不能展示仓颉的详细信息&#xff0c;但是华为仓颉官网的公共文档的内容是可以公开的。 我相信有不少喜欢编程的朋友都申请了内测&#xff0c;但是一些编程初学者应该和我一样&#xff0c;处于摸索阶段。所以&#xff0c;我这里把我测…

排序题目:多数元素 II

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;多数元素 II 出处&#xff1a;229. 多数元素 II 难度 3 级 题目描述 …

css高度0到高度auto,过渡的设置

1.css从高度0到高度auto,过渡设置 方法(vue代码) 你可以通过设置transform: scale(0);到 transform: scale(1); 来实现,具体代码 你也可以通过设置transform: scaleY(0);到 transform: scaleY(1); 这两种展示的效果不一样,你可以看看你喜欢那种 // css代码// 原来的css类 .s…

港口危险货物安全管理人员考试题库(含答案)

一、单选题 1.化学品安全标签内容中警示词有( )种分别进行危害程度的警示。 A、3 B、4 C、5 参考答案:A 2.运输放射性物品&#xff0c;应当使用( )的放射性物品运输包装容器(以下简称运输容器)。 A、专业 B、专用 C、统一 D、定制 参考答案:B 3.库区仪表及计算机监控管理系…

中电金信:金Gien乐道 | 6月热门新闻盘点 回顾这一月的焦点事件

“以检之力 e企守护”——上海市检一分院与中电金信开展联学联建 6月24日&#xff0c;上海市人民检察院第一分院与中电金信数字科技集团股份有限公司联合开展“以检之力 e企守护”联学联建活动。双方共同参观了全国检察机关证券期货犯罪办案基地和重大职务犯罪案件办理&#xf…

HTML5与3D打印:探索网页内容的物理化可能

随着科技的飞速发展&#xff0c;互联网与物理世界的交汇点日益增多。HTML5作为当前网页开发的主流标准&#xff0c;不仅推动了网页内容的丰富性和互动性&#xff0c;还在与3D打印技术的结合中&#xff0c;展现出了将网页内容物理化的巨大潜力。本文将探讨HTML5与3D打印的结合点…

C++ 中的数据类型

C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存. 1 整型 作用&#xff1a;整型变量表示的是整数类型的数据 C中能够表示整型的类型有以下几种方式&#xff0c;区别在于所占内存空间不同&#xff1a; 数据类型占用…