java接入gpt開發

前情提要

本次文章使用編譯器為IDEA2020

使用GPT模型為百度旗下的千帆大模型

如果是個人用或者不流傳出去,可以無腦入,因為會免費送20塊錢(夠用上萬次)

代金卷查看

正式教程:

百度智能云控制臺 (baidu.com)

按照步驟創建什么都不要擔心

獲取AccessToken?
無論是實現調用免費的接口還是付費接口,都要先獲取AccessToken,目的是鑒權。

查看對應文檔獲取access_token 獲取access_token - 千帆大模型平臺 | 百度智能云文檔 (baidu.com)

根據文檔我們知道我們向接口發起一個POST請求。一個請求頭以及三個Query參數。

首先我們在pom文件中導入了如下jar包

    <dependencies><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.8.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.19</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.36</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency></dependencies>

編寫測試獲取AccessToken的方法?

@Slf4j
public class Chat {private final String ACCESS_TOKEN_URI = "https://aip.baidubce.com/oauth/2.0/token";private String apiKey = "yourApikey";private String secretKey = "yourSecetkey";private String accessToken;private OkHttpClient client = new OkHttpClient();public boolean getAccessToken(){MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "");//創建一個請求Request request = new Request.Builder().url(ACCESS_TOKEN_URI+"?client_id=" + apiKey + "&client_secret=" + secretKey + "&grant_type=client_credentials").method("POST",body).addHeader("Content-Type", "application/json").build();try {//使用瀏覽器對象發起請求Response response = client.newCall(request).execute();//只能執行一次response.body().string()。下次再執行會拋出流關閉異常,因此需要一個對象存儲返回結果String responseMessage = response.body().string();log.debug("獲取accessToken成功");JSONObject jsonObject = JSON.parseObject(responseMessage);accessToken = (String) jsonObject.get("access_token");return true;} catch (IOException e) {e.printStackTrace();}return false;}
}

我們將調用的獲取AccessToken接口獲取到的信息轉為JSON格式后,獲取access_token屬性值,復制給類屬性。?

測試

public class Main {public static void main(String[] args) throws InterruptedException {Chat chat = new Chat();boolean result = chat.getAccessToken();System.out.println(result);}
}

19:46:13,387 DEBUG Chat:48 - 獲取accessToken成功
true

實現Prompt模板接口調用

Prompt模板 - 千帆大模型平臺 | 百度智能云文檔 (baidu.com)查看對應文檔Prompt模板 - 千帆大模型平臺 | 百度智能云文檔 (baidu.com)

要想調用該接口,我們需要事先創建好Promet模板。創建模板過程如下

創建好模板后,我們后續需要調用模板ID。

具體實現代碼如下

    /*** 調用Prompt接口* @param param*/public void getPrompt(int id,String param){Request request = new Request.Builder()
//        https://aip.baidubce.com/rest/2.0/wenxinworkshop/api/v1/template/info?access_token=xxx&id=7964&name=value.url(CHAT_URI + "?access_token="+accessToken+"&id="+id+"&name="+param).addHeader("Content-Type", "application/json").method("GET",null).build();try {Response responseMessage = client.newCall(request).execute();JSONObject jsonObject = JSON.parseObject(responseMessage.body().string());log.debug(jsonObject.toString());Object result = jsonObject.get("result");log.debug("{}",result.toString());} catch (IOException e) {e.printStackTrace();}}

測試

public class Main {public static void main(String[] args) throws InterruptedException {Chat chat = new Chat();boolean result = chat.getAccessToken();if (result){chat.getPrompt(7964,"zmbwcx");}}
}

19:48:04,906 DEBUG Chat:48 - 獲取accessToken成功
19:48:05,144 DEBUG Chat:99 - {"result":{"templateName":"測試接口調用","templateContent":"文章內容:{name}測試接口調用成功","templateId":7964,"content":"文章內容:zmbwcx測試接口調用成功","templateVariables":"name"},"log_id":"0hkyy9izb4azvsgp","success":true,"status":200}
19:48:05,145 DEBUG Chat:101 - {"templateName":"測試接口調用","templateContent":"文章內容:{name}測試接口調用成功","templateId":7964,"content":"文章內容:zmbwcx測試接口調用成功","templateVariables":"name"}

實現對話接口調用

同樣是觀察文檔,不過實現對話接口調用比實現調用Prompt接口稍微復雜一些。需要創建一些類來設置我們的參數。

創建請求參數類

@Data
public class RequestMessage {/*** 聊天上下文*/List<Message> messages = new ArrayList<>();/*** 范圍(0~1.0]* 較高的數值會使輸出更加隨機*/float temperature = Float.parseFloat("0.95");/*** 影響文本的多樣性,取值越大生成的文本多樣性越強* 建議該參數與temperature只設置一個。建議top_p和temperature不要同時更改*/float top_p = Float.parseFloat("0.8");/*** 通過對已生成的token增加懲罰,減少重復生成的現象* 值越大,懲罰越大* 取值范圍[1,2]*/float penalty_score = Float.parseFloat("1.0");/*** 是否以流式接口形式返回數據*/boolean stream = false;/*** 模型人設*/String system = null;/*** 表示用戶唯一標識符,用于監測和檢測濫用行為。防止接口惡意調用。*/String user_id = "";public void addMessage(Message message){this.messages.add(message);}
}

創建Message類?

@Data
public class Message {/*** 用戶角色* 目前支持:* user 用戶* assistant 對話助手*/String role;/*** 對話內容。*/String content;public Message(String role, String content) {this.role = role;this.content = content;}
}

設置接收響應信息類

@Data
public class ResponseMessage {//本輪對話idString id;//回包類型。 chat.completion:多輪對話返回String object;//時間戳int created;//表示當前子句的序號。只有在流式接口模式下才會返回該字段int sentence_id;//表示當前子句是否是最后一句。只有在流式接口模式下會返回該字段。boolean is_end;//對話返回結果。String result;/*** 表示用戶輸入是否存在安全,是否關閉當前會話,清理歷史回話信息。* true:是,表示用戶輸入存在安全風險,建議關閉當前會話,清理歷史會話信息。* false:否,表示用戶輸入無安全風險。*/boolean need_clear_history;//token統計信息,token數 = 漢字數+單詞數*1.3 (僅為估算邏輯)。Usage usage;
}

?設置Usage類

public class Usage {//問題token數int prompt_tokens;//回答token數int completion_tokens;//token總數int total_tokens;
}

?如果看文檔不太清楚的話,我們可以通過在線調試平臺觀察一下請求所需要的必須參數與響應過來的參數結構。

接下來我們編寫Chat類?

@Slf4j
public class Chat {private final String ACCESS_TOKEN_URI = "https://aip.baidubce.com/oauth/2.0/token";private final String CHAT_URI = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant";private String apiKey = "yourApikey";private String secretKey = "yourSecretkey";private String accessToken = "";private OkHttpClient client ;//請求參數private RequestMessage requestBody = new RequestMessage();//響應超時時間private int responseTimeOut = 5000;public Chat(){this.client = new OkHttpClient.Builder().readTimeout(responseTimeOut,TimeUnit.SECONDS).build();}public Chat(int responseTimeOut){this.client = new OkHttpClient.Builder().readTimeout(responseTimeOut,TimeUnit.SECONDS).build();}public boolean getAccessToken(){MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "");//創建一個請求Request request = new Request.Builder().url(ACCESS_TOKEN_URI+"?client_id=" + apiKey + "&client_secret=" + secretKey + "&grant_type=client_credentials").method("POST",body).addHeader("Content-Type", "application/json").build();try {//使用瀏覽器對象發起請求Response response = client.newCall(request).execute();//只能執行一次response.body().string()。下次再執行會拋出流關閉異常,因此需要一個對象存儲返回結果String responseMessage = response.body().string();log.debug("獲取accessToken成功");JSONObject jsonObject = JSON.parseObject(responseMessage);accessToken = (String) jsonObject.get("access_token");return true;} catch (IOException e) {e.printStackTrace();}return false;}/**** 獲取問題參數,返回答案* @param question*/public void getAnswer(String question){//通過參數獲取一個MessageMessage message = new Message("user",question);//將新的問題添加到消息上下文requestBody.addMessage(message);String jsonStr = JSON.toJSONString(requestBody);MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, jsonStr);Request request = new Request.Builder().url(CHAT_URI + "?access_token="+accessToken).addHeader("Content-Type", "application/json").method("POST",body).build();try {Response response = client.newCall(request).execute();log.debug("發送一次請求,詢問問題:{}",question);String responseJsonStr = response.body().string();ResponseMessage responseMessage = JSON.parseObject(responseJsonStr, ResponseMessage.class);System.out.println("返回的響應結果為:"+responseJsonStr);String result = responseMessage.getResult();String answer = result.replaceAll("\n+", "\n");log.debug("{}",answer);Message assistant = new Message("assistant", answer);requestBody.addMessage(assistant);} catch (IOException e) {e.printStackTrace();}}public void getRequestBody(){System.out.println(JSON.toJSONString(requestBody));}    
}

測試

public class Main {public static void main(String[] args) throws InterruptedException {Chat chat = new Chat();boolean result = chat.getAccessToken();if (result){Scanner scanner = new Scanner(System.in);String question = scanner.nextLine();while(!"q".equals(question)){chat.getAnswer(question);chat.getRequestBody();question = scanner.nextLine();}}}
}

注意!!

以上信息均為使用Java調用千帆大模型接口-CSDN博客大佬教程(此處抄襲僅為整合自用)

但是我需要的是可以提供閱讀背景式的調用,接下來以我的web作業為例:

我需要gpt扮演我的網站客服為用戶回答問題:實現場景如下

ok,進入正題:

根據要求配置插件后在插件詳情頁面有

我們來看一下開發文檔域內知識搜索增強插件API調用說明 - 千帆大模型平臺 | 百度智能云文檔 (baidu.com)

注意請求體發生了改變!!!

我一直以為一樣結果在這里被坑慘了

java代碼簡單修改一下

 /**** 獲取問題參數,返回答案* @param question*/public String getAnswer(String question) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();Map<String, Object> payload = new HashMap<>();payload.put("query", question);payload.put("verbose", true);String jsonString = mapper.writeValueAsString(payload);MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, jsonString);Request request = new Request.Builder().url(CHAT_URI + "?access_token="+accessToken).addHeader("Content-Type", "application/json").method("POST",body).build();try {Response response = client.newCall(request).execute();log.debug("發送一次請求,詢問問題:{}",question);String responseJsonStr = response.body().string();ResponseMessage responseMessage = JSON.parseObject(responseJsonStr, ResponseMessage.class);System.out.println("返回的響應結果為:"+responseJsonStr);String result = responseMessage.getResult();return result;} catch (IOException e) {e.printStackTrace();return null;}}

Controller層代碼:

 @PostMappingpublic String ai(@RequestBody String text) throws JsonProcessingException {log.info("溝通文本為:{}",text);//ai接口Chat chat = new Chat();boolean result = chat.getAccessToken();if(result) {String ai = chat.getAnswer(text);return  "美女客服:"+ai;}return  "客服忙去了~";}

ok,完美解決

最后總結!

遇到一個新東西,不要想當然的操作,還是要去看一下開發者文檔!!!!

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

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

相關文章

JMS(Java Message Service)使用指南

介紹 JMS即Java消息服務&#xff08;Java Message Service&#xff09;應用程序接口&#xff0c;是一個Java平臺中關于面向消息中間件&#xff08;MOM&#xff09;的API&#xff0c;用于在兩個應用程序之間&#xff0c;或分布式系統中發送消息&#xff0c;進行異步通信。它是一…

基于單片機智能病床呼叫系統設計

**單片機設計介紹&#xff0c;基于單片機智能病床呼叫系統設計 文章目錄 一 概要二、功能設計設計思路 三、 軟件設計原理圖 五、 程序六、 文章目錄 一 概要 基于單片機的智能病床呼叫系統是一種利用單片機技術設計的醫療設備&#xff0c;它能夠幫助病人在住院期間快速、方便…

國內大廠機器人賽道產品

大疆 大疆無人機自然不必說&#xff0c;除此之外大疆搞機甲大師&#xff0c;教育機器人。 字節 當前字節在機器人領域只是初步探索階段&#xff0c;目前尚未發布相關產品&#xff08;截止至23.12&#xff09;。 管理層想法&#xff1a; 跟已有業務做結合&#xff0c;服務好…

Java設計模式分類

java的設計模式大體上分為三大類&#xff1a; 創建型模式&#xff08;5種&#xff09;&#xff1a;工廠方法模式&#xff0c;抽象工廠模式&#xff0c;單例模式&#xff0c;建造者模式&#xff0c;原型模式。 結構型模式&#xff08;7種&#xff09;&#xff1a;適配器模式&am…

傳感器(一) :IMU / 陀螺儀模塊

IMU / 陀螺儀模塊 一、概述二、注意參數2.1 陀螺儀芯片標準&#xff08;MPU6050)2.2 參數說明 三、IMU模式使用注意事項3.1 IMU模塊安裝注意事項3.2 為什么IMU要安裝在機器中心位置 四、常見陀螺儀芯片品牌 一、概述 IMU全稱為慣性測量單元&#xff0c;可以通過測量物體在三維空…

Linux實用操作

一、各類小技巧&#xff08;快捷鍵&#xff09; 1.1 ctrl c 強制停止 Linux某些程序的運行&#xff0c;如果想要強制停止它&#xff0c;可以使用快捷鍵ctrl c 命令輸入錯誤&#xff0c;也可以通過快捷鍵ctrl c&#xff0c;退出當前輸入&#xff0c;重新輸入 1.2 ctrl d…

Leetcode刷題筆記——摩爾投票法

摩爾投票法的核心思想為對拼消耗。 摩你媽&#xff0c;學不會&#xff01;&#xff01;&#xff01;&#xff01; 229. 多數元素 II - 力扣&#xff08;LeetCode&#xff09;

ReLU(Rectified Linear Unit)和Sigmoid激活函數

ReLU&#xff08;Rectified Linear Unit&#xff09;和Sigmoid都是神經網絡中常用的激活函數。 特點&#xff1a; ReLU是一種簡單而有效的激活函數。它對于正數部分直接返回輸入&#xff0c;對于負數部分返回零。這種非線性轉換有助于網絡學習更復雜的表示。ReLU在許多深度學習…

自治調優!人大金倉解放DBA雙手

數據庫系統的性能是確保整個應用系統高效運轉的關鍵因素&#xff0c;因此數據庫性能調優工作至關重要。KingbaseES通過將人工調優過程內化為數據庫內核&#xff0c;成功實現了自治調優。這種創新的調優方案為DBA提供了更高效且準確的性能調優途徑&#xff0c;同時也顯著降低了數…

23秋 操作系統真題回憶

總結&#xff1a; 量大 綜合性強 結合實驗很緊密具體的題目 不是很記得了 只記了大概希望有人可以一起參與把這個題的答案做出來&#xff0c;有可以的 可以私信我謝謝 需要你們的想法因為可能涉及學校內部的試題&#xff0c;禁止轉載 2013題目 真題 2023題目 進程 代碼執…

構建VREP和MATLAB聯合仿真實驗平臺,控制機械臂末端按照固定軌跡移動

構建VREP和MATLAB聯合仿真實驗平臺&#xff0c;控制機械臂末端按照固定軌跡移動。主要工作如下&#xff1a; &#xff08;1&#xff09;solidworks構建機械臂模型&#xff1b; &#xff08;2&#xff09;將solidworks中構建的模型導入VREP中建立機械臂的多體動力學模型&#xf…

【Unity動畫】什么是任意狀態(Any state)

&#xff08;Any state&#xff09;可以從某個狀態A直接切換到另一個狀態 B\C\D\E\F 比如A到C的過渡&#xff0c;直接設置從Any state 到C的過渡線觸發參數即可。而不需要讓A到C直接在連接&#xff0c;同樣&#xff0c;B到C之間也無需直接鏈接。 這樣設計是在每一個動畫之間都…

HP-UNIX 系統安全基線 安全加固操作

目錄 賬號管理、認證授權 賬號 ELK-HP-UX-01-01-01 ELK -HP-UX-01-01-02 ELK -HP-UX-01-01-03 ??????? ELK-HP-UX-01-01-04 ???????ELK-HP-UX-01-01-05 ???????口令 ELK-HP-UX-01-02-01 ??????? ELK-HP-UX-01-02-02 ??????? ELK-HP…

Spring 核心特性之表達式(SpEL)

Spring 核心特性之表達式(SpEL)_spring spel-CSDN博客 -- 寫的還行 關于SpEL的幾個概念&#xff1a; 表達式&#xff08;“干什么”&#xff09;&#xff1a;SpEL的核心&#xff0c;所以表達式語言都是圍繞表達式進行的。解析器&#xff08;“誰來干”&#xff09;&#xff1…

【論文筆記】Gemini: A Family of Highly Capable Multimodal Models——細看Gemini

Gemini 【一句話總結&#xff0c;對標GPT4&#xff0c;模型還是transformer的docoder部分&#xff0c;提出三個不同版本的Gemini模型&#xff0c;Ultra的最牛逼&#xff0c;Nano的可以用在手機上。】 谷歌提出了一個新系列多模態模型——Gemini家族模型&#xff0c;包括Ultra…

Java 何時會觸發一個類的初始化

Java 何時會觸發一個類的初始化&#xff1f; 使用new關鍵字創建對象訪問類的靜態成員變量 或 對類的靜態成員變量進行賦值調用類的靜態方法反射調用類時&#xff0c;如 Class.forName()初始化子類時&#xff0c;會先初始化其父類&#xff08;如果父類還沒有進行過初始化的話&a…

找不到WMVCORE.dll怎么辦?一鍵解決WMVCORE.dll缺失的詳細方法分享

當打開軟件時提示wmvcore.dll丟失&#xff0c;這可能是由于以下幾個原因導致的&#xff1a; 系統文件損壞&#xff1a;wmvcore.dll是系統文件&#xff0c;可能會因為各種原因&#xff08;如病毒感染、系統錯誤、軟件卸載等&#xff09;而損壞。 軟件依賴問題&#xff1a;某些…

用 Python 自動創建 Markdown 表格

更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com Markdown表格是文檔中整理和展示數據的重要方式之一。然而&#xff0c;手動編寫大型表格可能會費時且容易出錯。本文將介紹如何使用Python自動創建Markdown表格&#xff0c;通過示例代碼詳細展示各種場景下的創建…

Linux基礎指令詳解(1)

操作系統的概念 百度百科 操作系統&#xff08;英語&#xff1a;Operating System&#xff0c;縮寫&#xff1a;OS&#xff09;是一組主管并控制計算機操作、運用和運行硬件、軟件資源和提供公共服務來組織用戶交互的相互關聯的系統軟件程序。根據運行的環境&#xff0c;操作系…

【Python網絡爬蟲入門教程1】成為“Spider Man”的第一課:HTML、Request庫、Beautiful Soup庫

Python 網絡爬蟲入門&#xff1a;Spider man的第一課 寫在最前面背景知識介紹蛛絲發射器——Request庫智能眼鏡——Beautiful Soup庫 第一課總結 寫在最前面 有位粉絲希望學習網絡爬蟲的實戰技巧&#xff0c;想嘗試搭建自己的爬蟲環境&#xff0c;從網上抓取數據。 前面有寫一…