ai-api-union項目,適配各AI廠商api

項目地址:alpbeta/ai-api-union

需求:實現兼容各大模型廠商api的流式對話和同步對話接口,本項目現兼容智譜、豆包、通義、通義版deepseek

設計

一個ChatController類對外暴露這兩個接口,入參都為ChatRequest請求類,屬性有會話id,大模型標識符和聊天消息列表,其中消息是一個實體類包含,消息id,關聯會話id,發送者角色,消息內容,創建時間。

流式對話返回的是響應式變成中的Flux類型,同步調用返回的是Sring類型。

一個ModelService接口,包含流式調用和同步調用兩個方法,入參為String字符串,出參與上述一致。

四個大模型api接口分別實現這個接口創建對應的實現類。

簡單工廠模式

創建一個工廠類,基于傳入的參數創建對應的大模型接口實現類。

工廠方法模式

創建一個工廠抽象類,繼承該接口創建各個大模型工廠類,各個大模型工廠類實現大模型接口實現類。

創建一個獲取工廠類,基于傳入的參數創建對應的大模型工廠,再創建對應大模型接口實現類

示意圖

image

實施

創建項目

通過 Spring Initializr 網站快速生成一個包含 Spring Boot 依賴的項目骨架,修改對應的partent版本,創建application.yml 激活dev環境,設置profiels.active:dev,創建application-dev.yml,修改端口為8090,server.port:8090(也可以不修改,默認.properties,偏向于yml)

創建測試controller

項目中如果沒有controller類,訪問8080端口時會報錯,找不到路徑;

創建一個ChatController類,增加@RestController @RequestMapping("api/chat")注解

創建testChat方法,方法前添加注解 @GetMapping("/testChat"), 入參為空,出參為String,方法內輸入return "test chat";

啟動項目,訪問http:localhost:8090/api/chat/testChat,頁面顯示上述方法返回的內容 test chat

創建dto包

創建Message實體類,ChatRequest請求類;

ChatRequest請求類,屬性有會話id,大模型標識符和聊天消息列表,其中消息是一個實體類包含,消息id,關聯會話id,發送者角色,消息內容,創建時間。基于這些內容創建對應的私有屬性,數據類型有Integer,String, TimeStamp, List,在類前加@Data注解,需先引入lombok依賴,引入該注解后,可以自動生成樣板代碼,如getter, setter, toString, equals, 無參構造函數,不需要顯示編寫這些方法,提高開發效率。

如需生成清晰的API文檔,需引入swagger依賴,或knif4j,再補充對應的配置文件,之后在實體類的類名和屬性前通過@Schema(description="xx")備注類和屬性名對應的含義。之后通過訪問http://項目ip:端口號/doc.html,可以訪問對應的接口文檔,如果接口的入參和出參有用到@Scheme注解的實體類,會顯示對應的備注內容。

創建項目實現接口類

在ChatController類增加syncChat和streamChat方法

兩個方法前增加PostMapping注解,路徑分別是("/syncChat")和("/stramChat")。入參增加@RequestBody注解,類型為ChatRequest。 出參分別是String和Flux

增加IModelService接口,包含synChat和stramChat方法,入參都為String,出參與上述保持一致

增加各大模型廠商api實現類

智譜接口實現類 ChatGLMServiceImpl,豆包接口實現類 ArkServiceImpl,通義接口實現類DashScopeServeceImpl,通義-deepseek實現類 DeepSeekServiceImple,都實現IModelService接口

引入各模型依賴,并在application.yml中配置api-key和modelname

分別在各模型接口類中實現同步調用和異步調用方法

實現豆包接口示例

在類前增加@Service注解表示為服務類bean容器,通過@Value注解,從配置文件中獲取api-key和modelName的值映射到該類對應屬性中。豆包大模型的火山引擎提供的ArkService服務類聲明為一個私有屬性,后續會使用該服務的方法。

該實現類除接口在的兩個方法,還增加了初始化和后處理方法,分別通過@PostConstruct和@PreDestory注解,在接口實現類Bean初始化完成后執行ArkService服務類的實例化,在Bean銷毀之前關閉ArkService的所有資源。

syncChat同步方法,使用該模型依賴提供的ChatMeaasge類創建消息列表對象,調用對應的add,role,content,build方法完成消息參數構建,再通過ChatCompletionRequest構建請求參數對象,通過arkService.creatChatCompletion方法輸入請求參數,獲取模型返回結果

stramChat異步調用方法,消息對象和請求對象構建方式與同步調用方式一致,通過arkService.streamChatCompletion方法獲取流式響應結果。返回類型為Flowable,需將其轉換成Flux,通過Flux.from(.map(response ->{return response...})).filter(content->!content.isEmpty())獲取返回結果

其他大模型實現類通過類似方法進行實現,通義與通義deepseek異步和同步返回的方法不一樣,前者通過result.getOutput().getText();獲取返回結果,后者方法調用更長一些

創建簡單工廠實現類

ModelSimpleFactory,基于傳入的參數返回不同的模型接口實現類,實現一個createModelService的方法。實現類用到@value注解從配置文件中獲取變量值,不能通過new的方式創建模型類,需通過反射機制,通過上下文的getbean方法創建:applicationContext.getBean。

在ChatController類補充syncChat和streamChat方法邏輯

獲取請求對象中的模型標識,消息列表。基于標識創建模型服務對象,將消息傳入模型服務返回響應的結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73854.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73854.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73854.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【QT】QT樣式設計

QT樣式設計 一、QT工程中添加資源文件1.資源文件:2. 添加步驟:3. 新增資源文件以及刪除現有的資源文件4. 使用資源文件 二、QT中的qss語句(樣式設計語句)1. 樣式設計2.常見的qss語句示例代碼: 一、QT工程中添加資源文件 1.資源文件&#xff…

Megatron-LM中的deepseek-v3實現

Megatron-LM:https://github.com/NVIDIA/Megatron-LM/tree/main 使用此倉庫構建的著名的庫也有很多,如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平臺PAI算法團隊研發,ai-Megatron-Patch…

[mlr3] Bootstrap與交叉驗證k-fold cross validation

五折交叉驗證因其無放回分層抽樣和重復驗證機制,成為超參數調優的首選; 而Bootstrap因有放回抽樣的重復性和驗證集的不穩定性,主要服務于參數估計(置信區間的計算)而非調優。 實際應用中,可結合兩者優勢&am…

某大麥手機端-搶票

引言 僅供學習研究,歡迎交流 搶票難,難于上青天!無論是演唱會、話劇還是體育賽事,大麥網的票總是秒光。作為一名技術愛好者,你是否想過用技術手段提高搶票成功率?本文將為你揭秘大麥手機端搶票的核心技術…

最常使用的現代C++新特性介紹

現代 C泛指的是從 C11 之后的 C標準. 從 C11 開始, C標準委員會實行班車制, 沒三年發布一個新版本, 如果一個功能在新版本發布之前已經準備好, 則可以加入該版本中, 否則延后到下一個版本. 語言核心 自 C11 開始, 語言語法層面加了許多語法糖, 還有增加了一些新語法.使得 C語…

SQL Server:當在刪除數據庫時因為存在觸發器而無法刪除

當在刪除數據庫時因為存在觸發器而無法刪除,你可以通過禁用觸發器來解決這個問題。下面為你介紹在 SQL Server 里禁用和啟用觸發器的方法。 禁用數據庫中所有表的觸發器 你可以使用系統視圖 sys.triggers 來查詢數據庫里所有的觸發器,然后生成禁用這些…

【Linux篇】進程入門指南:操作系統中的第一步

步入進程世界:初學者必懂的操作系統概念 一. 馮諾依曼體系結構1.1 背景與歷史1.2 組成部分1.3 意義 二. 進程2.1 進程概念2.1.1 PCB(進程控制塊) 2.2 查看進程2.2.1 使用系統文件查看2.2.2 使?top和ps這些??級?具來獲取2.2.3 通過系統調用…

銷售易vs紛享銷客:制造行業CRM選型深度解析

“以客戶為中心”,顧名思義就是指讓客戶貫穿企業市場、研發、生產、銷售、服務全流程,以客戶需求為導向進行經營。CRM作為企業數字化建設基礎設施,在企業高質量發展進程中扮演著重要角色。在眾多CRM解決方案中,騰訊旗下CRM銷售易憑…

【JavaScript】九、JS基礎練習

文章目錄 1、練習:對象數組的遍歷2、練習:猜數字3、練習:生成隨機顏色 1、練習:對象數組的遍歷 需求:定義多個對象,存數組,遍歷數據渲染生成表格 let students [{ name: 小明, age: 18, gend…

代碼隨想錄day31 貪心part05

56.合并區間 以數組 intervals 表示若干個區間的集合,其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間,并返回 一個不重疊的區間數組,該數組需恰好覆蓋輸入中的所有區間 。 示例 1: 輸入:in…

《C++11:通過thread類編寫C++多線程程序》

關于多線程的概念與理解,可以先了解Linux下的底層線程。當對底層線程有了一定程度理解以后,再學習語言級別的多線程編程就輕而易舉了。 【Linux】多線程 -> 從線程概念到線程控制 【Linux】多線程 -> 線程互斥與死鎖 語言級別的…

c++位運算總結

在C中,位運算是對二進制位進行操作的運算,主要有以下幾種: 1. 按位與( & ):兩個操作數對應位都為1時,結果位才為1,否則為0。例如 3 & 5 , 3 二進制是 0000 0011…

1.1 計算機網絡的概念

首先來看什么是計算機網絡,關于計算機網絡的定義并沒有一個統一的標準,不同的教材有 不同的說法(這是王道書對于計算機網絡的定義),我們可以結合自己的生活經驗去體會這個 定義。 可以用不同類型的設備去連接計算機網絡…

用LLama factory時報類似Process 2504721 got signal: 1的解決方法

之前用nohup來遠程跑LLama factory微調腳本,是沒有問題的,但今天發現運行類似下面這個命令時, nohup llamafactory-cli train examples/train_qlora/qwen_lora.yaml 只要一關閉ssh session,就會終止訓練,報類似&…

python常用內置時間函數+藍橋杯時間真題

1.time 1.1 time.time() 時間戳指:1970年1月1日開始到現在所經過的秒數 import time print(time.time()) # 輸出可得1970年1月1日開始到執行此代碼所經過的秒數 1.2 time.localtime() 返回一個當前時間的時間對象,具體信息,并且可以單獨…

一個用 C 語言打印出所有三位數水仙花數的程序

水仙花數(Narcissistic number)是指一個三位數,其各位數字的立方和等于該數本身。例如:153 是一個水仙花數,因為 (1^3 5^3 3^3 153)。 以下是一個用 C 語言打印出所有三位數水仙花數的程序: 代碼實現 …

利用 VSCode 配置提升 vibe coding 開發效率

利用 VSCode 配置提升 vibe coding 開發效率 Vibe Coding(氛圍編程)是一種基于AI的編程方法,其核心在于通過自然語言描述軟件需求,再由大規模語言模型(LLM)自動生成代碼,從而實現對傳統手寫編程…

練習題:110

目錄 Python題目 題目 題目分析 需求理解 關鍵知識點 實現思路分析 代碼實現 代碼解釋 函數定義: 計算值的總和: 測試函數: 運行思路 結束語 Python題目 題目 定義一個函數,接受一個字典作為參數,返回字…

處理 Linux 信號:進程控制與異常管理的核心

個人主頁:chian-ocean 文章專欄-Linux 前言: 在 Linux 操作系統中,信號是用于進程間通信的一種機制,能夠向進程發送通知,指示某些事件的發生。信號通常由操作系統內核、硬件中斷或其他進程發送。接收和處理信號是 Li…

通信協議之串口

文章目錄 簡介電平標準串口參數及時序USART與UART過程引腳配置 簡介 點對點,只能兩設備通信只需單向的數據傳輸時,可以只接一根通信線當電平標準不一致時,需要加電平轉換芯片(一般從控制器出來的是信號是TTL電平)地位…