OpenAI接口調用示例

最近為公司做了一個ChatGPT工具,這里展示一下OpenAI接口的調用

前提條件

訪問OpenAI官網(國內需要翻墻)的賬號,需要sk
地址:https://platform.openai.com

依賴

使用開源工具調用OpenAI接口,依賴如下:

        <dependency><groupId>com.unfbx</groupId><artifactId>chatgpt-java</artifactId><version>1.1.2-beta0</version></dependency>

代碼示例


import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;import com.unfbx.chatgpt.OpenAiClient;
import com.unfbx.chatgpt.entity.chat.ChatChoice;
import com.unfbx.chatgpt.entity.chat.ChatCompletion;
import com.unfbx.chatgpt.entity.chat.ChatCompletionResponse;
import com.unfbx.chatgpt.entity.chat.Message;
import com.unfbx.chatgpt.function.KeyRandomStrategy;
import com.unfbx.chatgpt.interceptor.OpenAILogger;
import com.unfbx.chatgpt.interceptor.OpenAiResponseInterceptor;
import com.unfbx.chatgpt.utils.TikTokensUtil;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import okhttp3.logging.HttpLoggingInterceptor;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;/*** 請求OpenAI接口示例*/
@Slf4j
public class OpenAIDemo {public static void main(String[] args) {getOpenAiResult("你好");}private static OpenAiResult getOpenAiResult(String questionContent) {OpenAiClient openAiClient = builderOpenAiClient();//聊天模型:gpt-3.5Message message = Message.builder().role(Message.Role.USER).content(questionContent).build();ChatCompletion chatCompletion = ChatCompletion.builder().messages(Collections.singletonList(message)).model(ChatCompletion.Model.GPT_3_5_TURBO_0613.getName()) //指定模型.build();ChatCompletionResponse chatCompletionResponse = openAiClient.chatCompletion(chatCompletion);List<ChatChoice> choices = chatCompletionResponse.getChoices();//獲取請求的tokens數量long tokens = chatCompletion.tokens();//這種方式也可以
//        long tokens = TikTokensUtil.tokens(chatCompletion.getModel(),messages);log.info("Message集合文本:【{}】", questionContent);log.info("本地計算的請求的tokens數{}", tokens);log.info("本地計算的返回的tokens數{}", TikTokensUtil.tokens(chatCompletion.getModel(), chatCompletionResponse.getChoices().get(0).getMessage().getContent()));log.info("Open AI 官方計算的總的tokens數{}", chatCompletionResponse.getUsage().getTotalTokens());log.info("Open AI 官方計算的請求的tokens數{}", chatCompletionResponse.getUsage().getPromptTokens());log.info("Open AI 官方計算的返回的tokens數{}", chatCompletionResponse.getUsage().getCompletionTokens());OpenAiResult result = new OpenAiResult();result.setChatCompletion(chatCompletion).setChatCompletionResponse(chatCompletionResponse).setLocalToken(tokens).setCompletionTokens(chatCompletionResponse.getUsage().getCompletionTokens()).setTotalTokens(chatCompletionResponse.getUsage().getTotalTokens()).setPromptTokens(chatCompletionResponse.getUsage().getPromptTokens());if (CollUtil.isNotEmpty(choices)) {result.setContent(choices.get(0).getMessage().getContent());log.info("Open AI 官方計算的返回的結果{}", result.getContent());}return result;}private static OpenAiClient builderOpenAiClient() {Map<String, String> proxyUser = setProxyUser();//可以為nullProxy proxy = new Proxy(Proxy.Type.HTTP,new InetSocketAddress(proxyUser.get("PROXY_HOST"), Integer.valueOf(proxyUser.get("PROXY_PORT"))));//設置socks代理服務器ip端口Authenticator proxyAuthenticator = new Authenticator() {@Overridepublic Request authenticate(Route route, Response response) throws IOException {String credential = Credentials.basic(proxyUser.get("PROXY_USERNAME"), proxyUser.get("PROXY_PASSWORD"));return response.request().newBuilder().header("Proxy-Authorization", credential).build();}};HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());//!!!!千萬別再生產或者測試環境打開BODY級別日志!!!!//!!!生產或者測試環境建議設置為這三種級別:NONE,BASIC,HEADERS,!!!httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);OkHttpClient okHttpClient = new OkHttpClient.Builder().proxy(proxy).proxyAuthenticator(proxyAuthenticator).addInterceptor(httpLoggingInterceptor).addInterceptor(new OpenAiResponseInterceptor()).connectTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build();OpenAiClient openAiClient = OpenAiClient.builder()//支持多key傳入,請求時候隨機選擇 openAiSk.apiKey(Arrays.asList("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"))
//            .apiKey(Arrays.asList("sk-########"))//自定義key的獲取策略:默認KeyRandomStrategy.keyStrategy(new KeyRandomStrategy()).okHttpClient(okHttpClient)//自己做了代理就傳代理地址
//                .apiHost("https://自己代理的服務器地址/").build();return openAiClient;}/**
*因為國內不能直接訪問OpenAI接口,必須通過翻墻工具訪問
*/private static Map<String, String> setProxyUser() {Map<String, String> proxyUser = MapUtil.newHashMap();proxyUser.put("PROXY_USERNAME", "****");proxyUser.put("PROXY_PASSWORD", "****");proxyUser.put("PROXY_HOST", "****");proxyUser.put("PROXY_PORT", "****");return proxyUser;}
}
import com.unfbx.chatgpt.entity.chat.ChatCompletion;
import com.unfbx.chatgpt.entity.chat.ChatCompletionResponse;
import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class OpenAiResult {/*** 本地接口請求信息*/private ChatCompletion chatCompletion;/*** OpenAI接口返回信息對象*/private ChatCompletionResponse chatCompletionResponse;/*** 本地請求計算的token*/private long localToken;/*** OpenAI接口返回信息*/private String content;/*** 官方計算的請求的tokens數*/private long promptTokens;/*** 官方計算的返回的tokens數{*/private long completionTokens;/*** 官方計算的總的tokens數*/private long totalTokens;
}

調用結果

在這里插入圖片描述

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

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

相關文章

js中箭頭函數簡單介紹

1.箭頭函數是 ES6 中新增的一種函數定義方式&#xff0c; 簡單舉例為 var nameA function(a){return a} 可以用箭頭函數簡化為 var nameA a >a; 返回的是你輸入的值 比如 nameA(5) 返回的就是5 nameA(2) 返回的就是2 以上兩個表達的含義是一樣的。nameA為名字 2.…

Vue3封裝一個輪播圖組件

先看效果 編寫組件代碼 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

centos7部署docker

文章目錄 &#xff08;1&#xff09;安裝前準備&#xff08;2&#xff09;卸載舊版Docker&#xff08;3&#xff09;安裝docker&#xff08;4&#xff09;配置鏡像加速 &#xff08;1&#xff09;安裝前準備 在開始安裝之前&#xff0c;首先需要檢查內核版本。使用 uname -r 命…

nodejs微信小程序+python+PHP個性化服裝搭配系統APP-計算機畢業設計推薦 android

目 錄 摘 要 I ABSTRACT II 目 錄 II 第1章 緒論 1 1.1背景及意義 1 1.2 國內外研究概況 1 1.3 研究的內容 1 第2章 相關技術 3 2.1 nodejs簡介 4 2.2 express框架介紹 6 2.4 MySQL數據庫 4 第3章 系統分析 5 3.1 需求分析 5 3.2 系統可行性分析 5 3.2.1技術可行性&#xff1a;…

redis(設置密碼)配置文件詳細

1.設置賬號密碼端口 config set requirepass 123456 設置密碼為123456 config get requirepass 查看賬號密碼 auth 123456 登入的時候輸入這個確定賬號密碼 1. 首先連接到Redis服務器: redis-cli 2. 然后使用CONFIG SET命令設置requirepass參數并指定密碼: CONFIG SET requi…

【PyTorch】現代卷積神經網絡

文章目錄 1. 理論介紹1.1. 深度卷積神經網絡&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型設計 1.2. 使用塊的網絡&#xff08;VGG&#xff09;1.3. 網絡中的網絡&#xff08;NiN&#xff09;1.4. 含并行連結的網絡&#xff08;GoogLeNet&#xff09; 2. 實例解析2.1…

家具制造ERP軟件包含哪些功能?家具制造業ERP系統哪個好

不同的家具有不同的用料、品質、制造工時、營銷渠道等&#xff0c;而有些家具制造企業采用傳統的管理方式在處理物料BOM、生產實際成本核算、庫存盤點、供應商選擇、班組計件核對、生產領用以及物料追溯等方面存在不少提升空間。 與此同時也有很多的皮具制造企業借助ERP軟件優…

Linux16 ftp文件服務區、vsftpd文件系統服務安裝、lftp客戶端安裝、NFS遠程共享存儲

目錄 一、FTP基礎ftp主動模式ftp被動模式 二、vsftpd配置共享目錄編輯配置文件使用windows 訪問 三、客戶端安裝 &#xff08;lftp&#xff09;匿名用戶的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用戶登錄配置本地用戶ftp配置文件 lftp操作 NFS遠程共享存儲安裝n…

新的側通道攻擊可泄露處理器的 Root 密碼

阿姆斯特丹自由大學的一組科學家開發了一種名為 SLAM&#xff08;Spectre Linear Address Masking&#xff09;的側信道攻擊。 該攻擊利用旨在提高新型Intel、AMD 和 Arm 處理器安全性的硬件功能&#xff0c;從內核內存中提取根密碼哈希。 重現 SLAM 攻擊所需的代碼和所有數據…

dockerfile:創建鏡像的方式,船艦自定義的鏡像

dockerfile&#xff1a;創建鏡像的方式&#xff0c;船艦自定義的鏡像 包括配置文件&#xff0c;掛載點&#xff0c;對外暴露的端口&#xff0c;設置環境變量 docker創建鏡像的方式 1、基于已有鏡像進行創建。 根據官方提供的鏡像源&#xff0c;創建鏡像&#xff0c;然后拉起…

IP與以太網的轉發操作

TCP模塊在執行連接、收發、斷開等各階段操作時&#xff0c;都需要委托IP模塊將數據封裝成包發送給通信對象。 網絡中有路由器和集線器兩種不同的轉發設備&#xff0c;它們在傳輸網絡包時有著各自的分工。 (1)路由器根據目標地址判斷下一個路由器的位置 (2)集線器在子網中將網…

docker的鏡像創建 dockerfile

dockerfile Dokcer鏡像的創建 創建鏡像有三種方法&#xff0c;分別為【基于已有鏡像創建】、【基于本地模板創建】以及【基于Dockerfile創建】。 &#xff08;1&#xff09;首先啟動一個鏡像&#xff0c;在容器里做修改 docker run -itd --name web centos:7 /bin/bash …

k8s pod日志寫入ELK的具體實現

shigen堅持更新文章的博客寫手&#xff0c;擅長Java、python、vue、shell等編程語言和各種應用程序、腳本的開發。記錄成長&#xff0c;分享認知&#xff0c;留住感動。 在上一部分&#xff0c;shigen講到了k8spod的日志寫入ELK的三種技術方案&#xff0c;并在最后展示了一下我…

QMainWindow和QWidget有什么區別

2023年12月12日&#xff0c;周二上午 QMainWindow 和 QWidget 是 Qt 框架中兩個不同的類&#xff0c;用于創建用戶界面的窗口部件。它們之間的主要區別在于它們的設計和用途。 QMainWindow: QMainWindow 是用于創建主窗口的類&#xff0c;通常包含了一個應用程序的主要界面。…

NFR 數字權益開發流程

NFR 在技術開發領域通常指的是“非功能性需求”&#xff08;Non-Functional Requirements&#xff09;&#xff0c;這些是描述系統屬性如安全性、性能、可用性、兼容性等方面的需求。然而&#xff0c;如果在這里 NFR 被用來指代與數字權益或非同質化代幣&#xff08;NFT&#x…

C++ 構造函數 調用方法

構造函數 調用方法 //括號法&#xff08;常用&#xff09; Person p1(100); //有參構造 Person p2(p1); //拷貝構造//注意&#xff1a;不要用括號法調用無參構造&#xff0c;會和 函數聲明 混淆。//顯示法 Person p3 Person(); //無參構造 Person p4 Person(100); //有參構…

【USRP】LFTX / LFRX

LFTX/LFRX 設備概述 LFTX 子板利用兩個高速運算放大器來允許 0-30 MHz 的傳輸。該板僅接受實模式信號。LFTX 非常適合 HF 頻段的應用&#xff0c;或使用外部前端來上變頻和放大中間信號的應用。LFTX 的輸出可以獨立處理&#xff0c;也可以作為單個 I/Q 對進行處理。 主要特征…

Python - 搭建 Flask 服務實現圖像、視頻修復需求

目錄 一.引言 二.服務構建 1.主函數 upload_gif 2.文件接收 3.專屬目錄 4.圖像修復 5.gif2mp4 6.mp42gif 7.圖像返回 三.服務測試 1.服務啟動 2.服務調用 四.總結 一.引言 前面我們介紹了如何使用 Real-ESRGAN 進行圖像增強并在原始格式 jpeg、jpg、mp4 的基礎上…

HeartBeat監控Redis狀態

目錄 一、概述 二、 安裝部署 三、配置 四、啟動服務 五、查看數據 一、概述 使用heartbeat可以實現在kibana界面對redis服務存活狀態進行觀察&#xff0c;如有必要&#xff0c;也可在服務宕機后立即向相關人員發送郵件通知 二、 安裝部署 參照文章&#xff1a;HeartBeat監…

Java實現多線程的三種方式

Java 有三種方式實現多線程&#xff0c;繼承 Thread 類、實現 Runnable 接口、實現 Callable 接口。還有匿名內部類方式&#xff0c;Lambda 表達式方式簡化開發。 1、Thread Thread 創建線程方式&#xff1a;創建線程類 start() 方法底層其實是給 CPU 注冊當前線程&#xff0…