欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

源碼及更詳細(xì)的介紹說(shuō)明參見(jiàn)Git上的ReadME.md文檔
https://github.com/asleepyfish/chatgpt

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

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

1. 配置階段

1.1 依賴(lài)引入

pom.xml中引入依賴(lài)(當(dāng)前最新版本為1.1.4,可前往Github頁(yè)面查看當(dāng)前最新版本)

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

1.2 配置application.yml文件

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

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

例:

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ù)很重要,是用來(lái)表示這個(gè)會(huì)話(huà)在多久不訪(fǎng)問(wèn)后被銷(xiāo)毀,從而實(shí)現(xiàn)聯(lián)系上下文的連續(xù)對(duì)話(huà)。

實(shí)現(xiàn)方式是通過(guò)ChatCompletionRequest中的user來(lái)區(qū)分某個(gè)會(huì)話(huà),而session-expiration-time表示這個(gè)會(huì)話(huà)在多久不訪(fǎng)問(wèn)后被銷(xiāo)毀。

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

1.3 注解添加

啟動(dòng)類(lèi)上加入圖中的注解則將服務(wù)注入到Spring中。

2 使用

2.1 生成回答

提供了工具類(lèi)OpenAiUtils,里面提供了相關(guān)方法進(jìn)行調(diào)用。
其中最簡(jiǎn)單的使用方法是:

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

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

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

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

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

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

上述方法的返回參數(shù)是一個(gè)list,是因?yàn)檎{(diào)整參數(shù)返回答案n可以一次性返回多條不同的解答(n為ChatCompletionRequest類(lèi)中一個(gè)參數(shù))。

2.1.1 測(cè)試

測(cè)試代碼:

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

Post請(qǐng)求

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

返回結(jié)果:

[
  "\n\nJava序列化是將Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程,以便在網(wǎng)絡(luò)上傳輸或?qū)⑵浔4娴酱疟P(pán)上。Java提供了兩種序列化方式:\n\n1. 基于Serializable接口的序列化\n\nSerializable接口是Java提供的一個(gè)標(biāo)記接口,用于標(biāo)記一個(gè)類(lèi)可以被序列化。如果一個(gè)類(lèi)實(shí)現(xiàn)了Serializable接口,那么它的所有非瞬態(tài)字段都會(huì)被序列化。序列化的過(guò)程可以通過(guò)ObjectOutputStream類(lèi)來(lái)實(shí)現(xiàn),反序列化的過(guò)程可以通過(guò)ObjectInputStream類(lèi)來(lái)實(shí)現(xiàn)。\n\n2. 基于Externalizable接口的序列化\n\nExternalizable接口也是Java提供的一個(gè)標(biāo)記接口,用于標(biāo)記一個(gè)類(lèi)可以被序列化。與Serializable接口不同的是,Externalizable接口需要實(shí)現(xiàn)writeExternal和readExternal方法,這兩個(gè)方法分別用于序列化和反序列化。在序列化的過(guò)程中,只有被writeExternal方法顯式寫(xiě)入的字段才會(huì)被序列化,而在反序列化的過(guò)程中,只有被readExternal方法顯式讀取的字段才會(huì)被反序列化。\n\n總的來(lái)說(shuō),基于Serializable接口的序列化更加簡(jiǎn)單,但是它會(huì)序列化所有非瞬態(tài)字段,包括一些不需要序列化的字段,而基于Externalizable接口的序列化可以更加靈活地控制序列化的過(guò)程。"
]

再次輸入:有沒(méi)有更加高效的序列化框架

 返回結(jié)果:

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

可以看出上述兩次問(wèn)答是在一次會(huì)話(huà)中的,而前面所說(shuō)的參數(shù)session-expiration-time即這個(gè)user所代表的會(huì)話(huà)多久沒(méi)被繼續(xù)訪(fǎng)問(wèn)時(shí)的銷(xiāo)毀時(shí)間。單位(min)

2.2 生成圖片

最簡(jiǎn)單的使用方式是

OpenAiUtils.createImage(prompt);

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

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

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

2.2.1 測(cè)試

測(cè)試代碼

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

結(jié)果
默認(rèn)情況下會(huì)生成一個(gè)url,點(diǎn)擊去就可以看到圖片。

2.3 下載圖片

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

OpenAiUtils.downloadImage(prompt, response);

通用方式如下:

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

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

2.3.1 測(cè)試

測(cè)試代碼

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

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

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

2.4 生成流式回答

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

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

最簡(jiǎn)單的方法是

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

其中的content即本次對(duì)話(huà)的問(wèn)題。

這里需要主義的是,上述第一個(gè)方法中的OutputStream os其實(shí)是一個(gè)必傳的對(duì)象,上述的最簡(jiǎn)單的方法實(shí)際上是默認(rèn)傳遞的System.out這個(gè)os對(duì)象,也就是將流式問(wèn)答的結(jié)果顯示到IDEA的控制臺(tái)。

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

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

只需要輸入問(wèn)題,和輸出流對(duì)象即可。

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

2.4.1 流式回答輸出到IDEA控制臺(tái)

代碼如下:

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

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

本次測(cè)試的結(jié)果如下面的Gif圖所示

2.4.2 流式回答輸出到瀏覽器頁(yè)面

上述的方法中輸出流傳入的是System.out對(duì)象,該對(duì)象實(shí)際上就是一個(gè)PrintStream對(duì)象,會(huì)把輸出結(jié)果展示到控制臺(tái)。

如果需要將輸出結(jié)果在瀏覽器展示,可以從前端傳入一個(gè)HttpServletResponse response對(duì)象,拿到這個(gè)response以后將response.getOutputStream()這個(gè)輸出流對(duì)象傳入createStreamChatCompletion方法的入?yún)⒅小M瑫r(shí),為了避免結(jié)果輸出到瀏覽器產(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());
}

測(cè)試結(jié)果過(guò)程的Gif圖如下所示:

2.4.3 流式回答結(jié)合Vue輸出到前端界面

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

測(cè)試結(jié)果過(guò)程的Gif圖如下所示:

Vue3 Demo的Git地址在文章開(kāi)頭有~

3 AI助手展示

接入微信公眾號(hào),AI助手可自動(dòng)回復(fù)。

以上就是Java調(diào)用ChatGPT(基于SpringBoot和Vue)實(shí)現(xiàn)可連續(xù)對(duì)話(huà)和流式輸出的ChatGPT API的詳細(xì)內(nèi)容,更多關(guān)于Java調(diào)用ChatGPT實(shí)現(xiàn)可對(duì)話(huà)ChatGPT API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效

    win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效

    這篇文章主要介紹了win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringCloud?Ribbon負(fù)載均衡流程分析

    SpringCloud?Ribbon負(fù)載均衡流程分析

    在Eureka注冊(cè)中心中我們?cè)谔砑油闌LoadBalanced注解,即可實(shí)現(xiàn)負(fù)載均衡功能,現(xiàn)在一起探索一下負(fù)載均衡的原理(Ribbon),感興趣的朋友一起看看吧
    2024-03-03
  • 一篇文章帶你理解Java Spring三級(jí)緩存和循環(huán)依賴(lài)

    一篇文章帶你理解Java Spring三級(jí)緩存和循環(huán)依賴(lài)

    這篇文章主要介紹了淺談Spring 解決循環(huán)依賴(lài)必須要三級(jí)緩存嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • java?Spring?Boot的介紹與初體驗(yàn)

    java?Spring?Boot的介紹與初體驗(yàn)

    大家好,本篇文章主要講的是java?Spring?Boot的介紹與初體驗(yàn),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01
  • Spring AOP定義AfterReturning增加實(shí)例分析

    Spring AOP定義AfterReturning增加實(shí)例分析

    這篇文章主要介紹了Spring AOP定義AfterReturning增加,結(jié)合實(shí)例形式分析了Spring面相切面AOP定義AfterReturning增加相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • 詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階)

    本篇文章主要介紹了詳解SpringBoot 快速整合Mybatis(去XML化+注解進(jìn)階),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • java生成文件夾和文件的簡(jiǎn)單示例分享

    java生成文件夾和文件的簡(jiǎn)單示例分享

    這篇文章主要介紹了java生成文件夾和文件的簡(jiǎn)單示例,需要的朋友可以參考下
    2014-04-04
  • Java實(shí)現(xiàn)接月餅小游戲的示例代碼

    Java實(shí)現(xiàn)接月餅小游戲的示例代碼

    本文將用Java語(yǔ)言自制一個(gè)小游戲:《接月餅小游戲》,游戲規(guī)則為不要被月亮砸到,盡可能地多接月餅。文中的實(shí)現(xiàn)代碼講解清晰,感興趣的可以動(dòng)手試一試
    2022-02-02
  • Java中解密微信加密數(shù)據(jù)工具類(lèi)

    Java中解密微信加密數(shù)據(jù)工具類(lèi)

    最近小編一直在開(kāi)發(fā)微信公眾號(hào)、小程序項(xiàng)目,微信返回給我們的數(shù)據(jù)都是加密的,我們需要使用sessionkey配合解密,才能看到我們想要的數(shù)據(jù),基于代碼怎么實(shí)現(xiàn)呢,下面小編給大家?guī)?lái)了Java中解密微信加密數(shù)據(jù)工具類(lèi)的完整代碼,一起看看吧
    2021-06-06
  • java讀取圖片并轉(zhuǎn)化為二進(jìn)制字符串的實(shí)現(xiàn)方法

    java讀取圖片并轉(zhuǎn)化為二進(jìn)制字符串的實(shí)現(xiàn)方法

    這篇文章主要介紹了java讀取圖片并轉(zhuǎn)化為二進(jìn)制字符串的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09

最新評(píng)論