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.pswp.cn/diannao/38720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38720.shtml
英文地址,請注明出處:http://en.pswp.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; 數據類型占用…