最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java調用ChatGPT(基于SpringBoot和Vue)實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API

 更新時間:2023年04月28日 11:53:27   作者:mikey桑  
這篇文章主要介紹了Java調用ChatGPT(基于SpringBoot和Vue),實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API(可自定義實現(xiàn)AI助手),文中代碼示例介紹的非常詳細,感興趣的朋友可以參考下

本文Demo地址:https://github.com/asleepyfish/chatgpt-demo

源碼及更詳細的介紹說明參見Git上的ReadME.md文檔
https://github.com/asleepyfish/chatgpt

流式輸出結合Vue的Demo地址:https://github.com/asleepyfish/chatgpt-vue

注意:流式輸出在2.4節(jié),請仔細閱讀到最后,謝謝!

1. 配置階段

1.1 依賴引入

pom.xml中引入依賴(當前最新版本為1.1.4,可前往Github頁面查看當前最新版本)

        <dependency>
            <groupId>io.github.asleepyfish</groupId>
            <artifactId>chatgpt</artifactId>
            <version>1.1.4</version>
        </dependency>

1.2 配置application.yml文件

application.yml文件中配置相關參數(shù)(Optional為可選參數(shù))

參數(shù)解釋
token申請的API KEYS
proxy-host代理的ip
proxy-port代理的端口
model (Optional)model可填可不填,默認即text-davinci-003
chat-model (Optional)可填可不填,默認即gpt-3.5-turbo (ChatGPT當前最強模型,生成回答使用的就是這個模型)
retries (Optional)指的是當chatgpt第一次請求回答失敗時,重新請求的次數(shù)(增加該參數(shù)的原因是因為大量訪問的原因,在某一個時刻,chatgpt服務將處于無法訪問的情況,不填的默認值為5)
session-expiration-time (Optional)(單位(min))為這個會話在多久不訪問后被銷毀,這個值不填的時候,即表示所有問答處于同一個會話之下,相同user的會話永不銷毀(增加請求消耗)

例:

chatgpt:
  token: sk-xxxxxxxxxxxxxxx
  proxy-host: 127.0.0.1
  proxy-port: xxxx
  session-expiration-time: 30

其中token、proxy-host、proxy-port是必填的

上面的session-expiration-time參數(shù)很重要,是用來表示這個會話在多久不訪問后被銷毀,從而實現(xiàn)聯(lián)系上下文的連續(xù)對話。

實現(xiàn)方式是通過ChatCompletionRequest中的user來區(qū)分某個會話,而session-expiration-time表示這個會話在多久不訪問后被銷毀。

如果這里看不懂請看2.1節(jié)示例

1.3 注解添加

啟動類上加入圖中的注解則將服務注入到Spring中。

2 使用

2.1 生成回答

提供了工具類OpenAiUtils,里面提供了相關方法進行調用。
其中最簡單的使用方法是:

OpenAiUtils.createChatCompletion(content);// 不建議使用

入?yún)?code>content即輸入的問題的字符串。但是不建議使用。

這里建議使用下面的方式,通過傳入user的值,再結合session-expiration-time參數(shù),可以實現(xiàn)指定某次會話,或者某個用戶的連續(xù)對話。

OpenAiUtils.createChatCompletion(content, user);// 建議使用

入?yún)hatCompletionRequest 里包含模型的一些可調參數(shù)。

OpenAiUtils類中還提供了多個可供選擇的靜態(tài)方法,可以自行查看。

上述方法的返回參數(shù)是一個list,是因為調整參數(shù)返回答案n可以一次性返回多條不同的解答(n為ChatCompletionRequest類中一個參數(shù))。

2.1.1 測試

測試代碼:

@PostMapping("/chatTest")
public List<String> chatTest(String content) {
    return OpenAiUtils.createChatCompletion(content, "testUser");
}

Post請求

入?yún)⑤斎耄篔ava序列化的方式

返回結果:

[
  "\n\nJava序列化是將Java對象轉換為字節(jié)序列的過程,以便在網(wǎng)絡上傳輸或將其保存到磁盤上。Java提供了兩種序列化方式:\n\n1. 基于Serializable接口的序列化\n\nSerializable接口是Java提供的一個標記接口,用于標記一個類可以被序列化。如果一個類實現(xiàn)了Serializable接口,那么它的所有非瞬態(tài)字段都會被序列化。序列化的過程可以通過ObjectOutputStream類來實現(xiàn),反序列化的過程可以通過ObjectInputStream類來實現(xiàn)。\n\n2. 基于Externalizable接口的序列化\n\nExternalizable接口也是Java提供的一個標記接口,用于標記一個類可以被序列化。與Serializable接口不同的是,Externalizable接口需要實現(xiàn)writeExternal和readExternal方法,這兩個方法分別用于序列化和反序列化。在序列化的過程中,只有被writeExternal方法顯式寫入的字段才會被序列化,而在反序列化的過程中,只有被readExternal方法顯式讀取的字段才會被反序列化。\n\n總的來說,基于Serializable接口的序列化更加簡單,但是它會序列化所有非瞬態(tài)字段,包括一些不需要序列化的字段,而基于Externalizable接口的序列化可以更加靈活地控制序列化的過程。"
]

再次輸入:有沒有更加高效的序列化框架

 返回結果:

[
  "是的,Java中有很多高效的序列化框架,以下是一些常用的序列化框架:\n\n1. Protobuf\n\nProtobuf是Google開發(fā)的一種高效的序列化框架,它可以將結構化數(shù)據(jù)序列化為二進制格式,支持多種編程語言。相比于Java自帶的序列化方式,Protobuf序列化后的數(shù)據(jù)更小,解析速度更快。\n\n2. Kryo\n\nKryo是一個快速、高效的Java序列化框架,它可以將Java對象序列化為字節(jié)數(shù)組,支持多種數(shù)據(jù)類型。Kryo序列化的速度比Java自帶的序列化方式快很多,序列化后的數(shù)據(jù)也更小。\n\n3. FST\n\nFST是一個高性能的Java序列化框架,它可以將Java對象序列化為字節(jié)數(shù)組,支持多種數(shù)據(jù)類型。FST序列化的速度比Java自帶的序列化方式快很多,序列化后的數(shù)據(jù)也更小。\n\n4. Avro\n\nAvro是一個高效的數(shù)據(jù)序列化系統(tǒng),它可以將結構化數(shù)據(jù)序列化為二進制格式,支持多種編程語言。Avro序列化后的數(shù)據(jù)比Java自帶的序列化方式更小,解析速度也更快。\n\n總的來說,這些高效的序列化框架都比Java自帶的序列化方式更快、更小、更靈活,可以根據(jù)具體的需求選擇合適的框架。"
]

可以看出上述兩次問答是在一次會話中的,而前面所說的參數(shù)session-expiration-time即這個user所代表的會話多久沒被繼續(xù)訪問時的銷毀時間。單位(min)

2.2 生成圖片

最簡單的使用方式是

OpenAiUtils.createImage(prompt);

入?yún)⒈硎旧蓤D片的描述文字,還提供了一個通用的靜態(tài)方法

public static List<String> createImage(CreateImageRequest createImageRequest) {...}

入?yún)reateImageRequest中有一些可以使用的參數(shù),其中n表示生成圖片的數(shù)量,responseFormat表示生成圖片的格式,格式中分為url和b64_json兩種,如果希望返回的是url,則返回的url會在生成一個小時后消失,默認值是url。

2.2.1 測試

測試代碼

    @Test
    public void testGenerateImg() {
        OpenAiUtils.createImage("英短").forEach(System.out::println);
    }

結果
默認情況下會生成一個url,點擊去就可以看到圖片。

2.3 下載圖片

在3.2的基礎上做了優(yōu)化,直接使用responseFormatb64_json然后解析成圖片返回。簡單使用方式如下:

OpenAiUtils.downloadImage(prompt, response);

通用方式如下:

public static void downloadImage(CreateImageRequest createImageRequest, HttpServletResponse response) {...}

CreateImageRequest對象中設置的返回參數(shù)n大于1時,會將圖片打包成一個zip包返回,當n等于1時直接返回圖片。

2.3.1 測試

測試代碼

@RestController
public class ChatGPTController {
    @GetMapping("/downloadImage")
    public void downloadImage(String prompt, HttpServletResponse response) {
        OpenAiUtils.downloadImage(prompt, response);
    }
}

發(fā)送get請求,然后選擇Send and Download

我用的get 工具是idea里面下載的插件Fast Request的,用Postman也是可以的,但是要選擇 Send and Download,上圖中綠色的箭頭是Send,藍色的是Send and Download。

2.4 生成流式回答

生成流式回答的方法是OpenAiUtilscreateStreamChatCompletion方法,本工具類重載了同名的多個參數(shù)的方法,其中最通用的方法是

public static void createStreamChatCompletion(ChatCompletionRequest chatCompletionRequest, OutputStream os) {...}

最簡單的方法是

public static void createStreamChatCompletion(String content) {...}

其中的content即本次對話的問題。

這里需要主義的是,上述第一個方法中的OutputStream os其實是一個必傳的對象,上述的最簡單的方法實際上是默認傳遞的System.out這個os對象,也就是將流式問答的結果顯示到IDEA的控制臺。

如果需要將流式問答的結果顯示到其他界面可以自發(fā)的傳入OutputStream os對象,這里有一個簡便的方法是

public static void createStreamChatCompletion(String content, OutputStream os) {...}

只需要輸入問題,和輸出流對象即可。

下面將舉例具體說明。(本文所有Demo的示例地址: https://github.com/asleepyfish/chatgpt-demo

2.4.1 流式回答輸出到IDEA控制臺

代碼如下:

@GetMapping("/streamChat")
public void streamChat(String content) {
    // OpenAiUtils.createStreamChatCompletion(content, System.out);
    // 下面的默認和上面這句代碼一樣,是輸出結果到控制臺
    OpenAiUtils.createStreamChatCompletion(content);
}

然后使用Postman或者其他可以發(fā)送Get請求的工具發(fā)送請求。

本次測試的結果如下面的Gif圖所示

2.4.2 流式回答輸出到瀏覽器頁面

上述的方法中輸出流傳入的是System.out對象,該對象實際上就是一個PrintStream對象,會把輸出結果展示到控制臺。

如果需要將輸出結果在瀏覽器展示,可以從前端傳入一個HttpServletResponse response對象,拿到這個response以后將response.getOutputStream()這個輸出流對象傳入createStreamChatCompletion方法的入?yún)⒅小M瑫r,為了避免結果輸出到瀏覽器產(chǎn)生亂碼和支持流式輸出,需要ContentType和CharacterEncoding。

@GetMapping("/streamChatWithWeb")
public void streamChatWithWeb(String content, HttpServletResponse response) throws IOException {
    // 需要指定response的ContentType為流式輸出,且字符編碼為UTF-8
    response.setContentType("text/event-stream");
    response.setCharacterEncoding("UTF-8");
    // 禁用緩存
    response.setHeader("Cache-Control", "no-cache");    
    OpenAiUtils.createStreamChatCompletion(content, response.getOutputStream());
}

測試結果過程的Gif圖如下所示:

2.4.3 流式回答結合Vue輸出到前端界面

調用的后端方法同2.4.2節(jié)方法streamChatWithWeb,前端只需要在界面?zhèn)魅雴栴},點擊提問按鈕即可返回結果流式輸出到文本框中。

測試結果過程的Gif圖如下所示:

Vue3 Demo的Git地址在文章開頭有~

3 AI助手展示

接入微信公眾號,AI助手可自動回復。

以上就是Java調用ChatGPT(基于SpringBoot和Vue)實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API的詳細內容,更多關于Java調用ChatGPT實現(xiàn)可對話ChatGPT API的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架

    詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架

    這篇文章主要介紹了SpringBoot中使用JPA作為數(shù)據(jù)持久化框架的相關知識,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • MyBatis-plus的五種批量插入方式對比分析

    MyBatis-plus的五種批量插入方式對比分析

    本文主要介紹了MyBatis-plus的五種批量插入方式對比分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • springboot整合freemarker的踩坑及解決

    springboot整合freemarker的踩坑及解決

    這篇文章主要介紹了springboot整合freemarker的踩坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • idea啟動與jar包啟動中使用resource資源文件路徑的問題

    idea啟動與jar包啟動中使用resource資源文件路徑的問題

    這篇文章主要介紹了idea啟動與jar包啟動中使用resource資源文件路徑的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java輕松使用工具類實現(xiàn)獲取wav時間長度

    Java輕松使用工具類實現(xiàn)獲取wav時間長度

    在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來獲取一個wav文件的時間長度,感興趣的同學繼續(xù)往下閱讀吧
    2021-10-10
  • Java基礎學習之ArrayList類概述與常用方法

    Java基礎學習之ArrayList類概述與常用方法

    這篇文章主要為大家簡單的介紹Java中ArrayList類的概述、常用方法及存儲字符串并遍歷,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-08-08
  • java 中的封裝介紹及使用方法

    java 中的封裝介紹及使用方法

    這篇文章主要介紹了java 中的封裝介紹及使用方法的相關資料,封裝是指一種將抽象性函式接口的實現(xiàn)細節(jié)部份包裝、隱藏起來的方法,需要的朋友可以參考下
    2017-08-08
  • 關于Spring Cloud健康檢查的陷阱

    關于Spring Cloud健康檢查的陷阱

    這篇文章主要介紹了關于Spring Cloud健康檢查的陷阱,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • mybatis?實現(xiàn)多層級collection嵌套

    mybatis?實現(xiàn)多層級collection嵌套

    這篇文章主要介紹了mybatis?實現(xiàn)多層級collection嵌套,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • mybatisplus添加真正的批量新增、批量更新的實現(xiàn)

    mybatisplus添加真正的批量新增、批量更新的實現(xiàn)

    這篇文章主要介紹了mybatisplus添加真正的批量新增、批量更新的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論

关岭| 上饶县| 安新县| 连州市| 延津县| 交城县| 宜君县| 金川县| 扶余县| 寿阳县| 岐山县| 南平市| 白城市| 鲁甸县| 巴里| 郧西县| 望江县| 平凉市| 永年县| 聂拉木县| 丹阳市| 东兰县| 汽车| 望江县| 鹤壁市| 筠连县| 花莲县| 洛宁县| 文昌市| 花垣县| 剑河县| 玉屏| 玉树县| 和平区| 正定县| 扎囊县| 临潭县| 吴堡县| 大冶市| 黑龙江省| 靖西县|