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

Python3.10接入ChatGPT實(shí)現(xiàn)逐句回答流式返回

 更新時(shí)間:2023年03月22日 16:32:18   作者:劉悅的技術(shù)博客  
這篇文章主為大家要介紹了Python3.10接入ChatGPT實(shí)現(xiàn)逐句回答流式返回示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

善于觀察的朋友一定會(huì)敏銳地發(fā)現(xiàn)ChatGPT網(wǎng)頁(yè)端是逐句給出問(wèn)題答案的,同樣,ChatGPT后臺(tái)Api接口請(qǐng)求中,如果將Stream參數(shù)設(shè)置為T(mén)rue后,Api接口也可以實(shí)現(xiàn)和ChatGPT網(wǎng)頁(yè)端一樣的流式返回,進(jìn)而更快地給到前端用戶反饋,同時(shí)也可以緩解連接超時(shí)的問(wèn)題。

Server-sent events(SSE)是一種用于實(shí)現(xiàn)服務(wù)器到客戶端的單向通信的協(xié)議。使用SSE,服務(wù)器可以向客戶端推送實(shí)時(shí)數(shù)據(jù),而無(wú)需客戶端發(fā)出請(qǐng)求。

SSE建立在HTTP協(xié)議上,使用基于文本的數(shù)據(jù)格式(通常是JSON)進(jìn)行通信??蛻舳送ㄟ^(guò)創(chuàng)建一個(gè)EventSource對(duì)象來(lái)與服務(wù)器建立連接,然后可以監(jiān)聽(tīng)服務(wù)器發(fā)送的事件。服務(wù)器端可以隨時(shí)將事件推送給客戶端,客戶端通過(guò)監(jiān)聽(tīng)事件來(lái)接收這些數(shù)據(jù)。

ChatGPT的Server-sent events應(yīng)用

首先打開(kāi)ChatGPT網(wǎng)頁(yè)端,隨便問(wèn)一個(gè)問(wèn)題,然后進(jìn)入網(wǎng)絡(luò)選單,清空歷史請(qǐng)求記錄后,進(jìn)行網(wǎng)絡(luò)抓包監(jiān)聽(tīng):

可以看到,在觸發(fā)了回答按鈕之后,頁(yè)面會(huì)往后端的backend-api/conversation對(duì)話接口發(fā)起請(qǐng)求,但這個(gè)接口的通信方式并非傳統(tǒng)的http接口或者Websocket持久化鏈接協(xié)議,而是基于EventSteam的事件流一段一段地返回ChatGPT后端模型的返回?cái)?shù)據(jù)。

為什么ChatGPT會(huì)選擇這種方式和后端Server進(jìn)行通信?ChatGPT網(wǎng)頁(yè)端使用Server-sent events通信是因?yàn)檫@種通信方式可以實(shí)現(xiàn)服務(wù)器向客戶端推送數(shù)據(jù),而無(wú)需客戶端不斷地向服務(wù)器發(fā)送請(qǐng)求。這種推送模式可以提高應(yīng)用程序的性能和響應(yīng)速度,減少了不必要的網(wǎng)絡(luò)流量。

與其他實(shí)時(shí)通信協(xié)議(如WebSocket)相比,Server-sent events通信是一種輕量級(jí)協(xié)議,易于實(shí)現(xiàn)和部署。此外,它也具有廣泛的瀏覽器兼容性,并且可以在不需要特殊網(wǎng)絡(luò)配置的情況下使用。

在ChatGPT中,服務(wù)器會(huì)將新的聊天消息推送到網(wǎng)頁(yè)端,以便實(shí)時(shí)顯示新的聊天內(nèi)容。使用Server-sent events通信,可以輕松地實(shí)現(xiàn)這種實(shí)時(shí)更新功能,并確保網(wǎng)頁(yè)端與服務(wù)器之間的通信效率和穩(wěn)定性。

說(shuō)白了,降低成本,提高效率,ChatGPT是一個(gè)基于深度學(xué)習(xí)的大型語(yǔ)言模型,處理自然語(yǔ)言文本需要大量的計(jì)算資源和時(shí)間。因此,返回響應(yīng)的速度肯定比普通的讀數(shù)據(jù)庫(kù)要慢的多,Http接口顯然并不合適,因?yàn)镠ttp是一次性返回,等待時(shí)間過(guò)長(zhǎng),而Websocket又過(guò)重,因?yàn)槿p工通信并不適合這種單項(xiàng)對(duì)話場(chǎng)景,所謂單項(xiàng)對(duì)話場(chǎng)景,就是對(duì)話雙方并不會(huì)并發(fā)對(duì)話,而是串行的一問(wèn)一答邏輯,同時(shí)持久化鏈接也會(huì)占用服務(wù)器資源,要知道ChatGPT幾乎可以算是日均活躍用戶數(shù)全球最高的Web應(yīng)用了。

效率層面,大型語(yǔ)言模型沒(méi)辦法一下子返回所有計(jì)算數(shù)據(jù),但是可以通過(guò)Server-sent events將前面計(jì)算出的數(shù)據(jù)先“推送”到前端,這樣用戶也不會(huì)因?yàn)榈却龝r(shí)間過(guò)長(zhǎng)而關(guān)閉頁(yè)面,所以ChatGPT的前端觀感就是像打字機(jī)一樣,一段一段的返回答案,這種“邊計(jì)算邊返回”的生成器模式也提高了ChatGPT的回答效率。

Python3.10實(shí)現(xiàn)Server-sent events應(yīng)用

這里我們使用基于Python3.10的Tornado異步非阻塞框架來(lái)實(shí)現(xiàn)Server-sent events通信。

首先安裝Tornado框架

pip3 install tornado==6.1

隨后編寫(xiě)sse_server.py:

import tornado.ioloop  
import tornado.web  
push_flag = True  
from asyncio import sleep  
class ServerSentEvent(tornado.web.RequestHandler):  
    def __init__(self, *args, **kwargs):  
        super(ServerSentEvent, self).__init__(*args, **kwargs)  
        self.set_header('Content-Type', 'text/event-stream')  
        self.set_header('Access-Control-Allow-Origin', "*")  
        self.set_header("Access-Control-Allow-Headers","*")  
        # 請(qǐng)求方式  
        self.set_header("Access-Control-Allow-Methods","*")  
    # 斷開(kāi)連接  
    def on_finish(self):  
        print("斷開(kāi)連接")  
        return super().on_finish()  
    async def get(self):  
        print("建立鏈接")  
        while True:  
            if push_flag:  
                print("開(kāi)始")  
                self.write("event: message\n");  
                self.write("data:" + "push data" + "\n\n");  
                self.flush()  
                await sleep(2)

建立好推送路由類ServerSentEvent,它繼承Tornado內(nèi)置的視圖類tornado.web.RequestHandler,首先利用super方法調(diào)用父類的初始化方法,設(shè)置跨域,如果不使用super,會(huì)將父類同名方法重寫(xiě),隨后建立異步的get方法用來(lái)鏈接和推送消息,這里使用Python原生異步的寫(xiě)法,每隔兩秒往前端推送一個(gè)事件message,內(nèi)容為push data。

注意,這里只是簡(jiǎn)單的推送演示,真實(shí)場(chǎng)景下如果涉及IO操作,比如數(shù)據(jù)庫(kù)讀寫(xiě)或者網(wǎng)絡(luò)請(qǐng)求之類,還需要單獨(dú)封裝異步方法。

另外這里假定前端onmessage處理程序的事件名稱為message。如果想使用其他事件名稱,可以使用前端addEventListener來(lái)訂閱事件,最后消息后必須以兩個(gè)換行為結(jié)尾。

隨后編寫(xiě)路由和服務(wù)實(shí)例:

def make_app():  
    return tornado.web.Application([  
        (r"/sse/data/", ServerSentEvent),  
    ])  
if __name__ == "__main__":  
    app = make_app()  
    app.listen(8000)  
    print("sse服務(wù)啟動(dòng)")  
    tornado.ioloop.IOLoop.current().start()

隨后在后臺(tái)運(yùn)行命令:

python3 sse_server.py

程序返回:

PS C:\Users\liuyue\www\videosite> python .\sse_server.py  
sse服務(wù)啟動(dòng)

至此,基于Tornado的Server-sent events服務(wù)就搭建好了。

前端Vue.js3鏈接Server-sent events服務(wù)

客戶端我們使用目前最流行的Vue.js3框架:

sse_init:function(){  
          var push_data = new EventSource("http://localhost:8000/sse/data/")  
        push_data.onopen = function (event) {  
            // open事件  
            console.log("EventSource連接成功");  
        };  
        push_data.onmessage = function (event) {  
    try {  
        console.log(event);  
    } catch (error) {  
        console.log('EventSource結(jié)束消息異常', error);  
    }  
};  
       push_data.onerror = function (error) {  
    console.log('EventSource連接異常', error);  
};  
      }

這里在前端的初始化方法內(nèi)建立EventSource實(shí)例,通過(guò)onmessage方法來(lái)監(jiān)聽(tīng)后端的主動(dòng)推送:

可以看到,每隔兩秒鐘就可以訂閱到后端的message事件推送的消息,同時(shí),SSE默認(rèn)支持?jǐn)嗑€重連,而全雙工的WebSocket協(xié)議則需要自己在前端實(shí)現(xiàn),高下立判。

結(jié)語(yǔ)

不僅僅可以實(shí)現(xiàn)ChatGPT的流式返回功能,SSE在Web應(yīng)用程序中的使用場(chǎng)景非常廣泛,例如實(shí)時(shí)的新聞推送、實(shí)時(shí)股票報(bào)價(jià)、在線游戲等等,比起輪詢和長(zhǎng)輪詢,SSE更加高效,因?yàn)橹挥性谟行聰?shù)據(jù)到達(dá)時(shí)才會(huì)發(fā)送;同時(shí)SSE支持自定義事件和數(shù)據(jù),具有更高的靈活性和復(fù)用性,為流式數(shù)據(jù)返回保駕護(hù)航,ChatGPT的最愛(ài),誰(shuí)不愛(ài)?

最后奉上項(xiàng)目地址 與眾鄉(xiāng)親同饗:https://github.com/zcxey2911/sse_tornado6_vuejs3

以上就是Python3.10接入ChatGPT實(shí)現(xiàn)逐句回答流式返回的詳細(xì)內(nèi)容,更多關(guān)于Python ChatGPT回答返回的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 淺談Django學(xué)習(xí)migrate和makemigrations的差別

    淺談Django學(xué)習(xí)migrate和makemigrations的差別

    這篇文章主要介紹了淺談Django學(xué)習(xí)migrate和makemigrations的差別,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python定時(shí)發(fā)送天氣預(yù)報(bào)郵件代碼實(shí)例

    Python定時(shí)發(fā)送天氣預(yù)報(bào)郵件代碼實(shí)例

    這篇文章主要介紹了Python定時(shí)發(fā)送天氣預(yù)報(bào)郵件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法

    使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法

    今天小編就為大家分享一篇使用python實(shí)現(xiàn)語(yǔ)音文件的特征提取方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python實(shí)現(xiàn)粒子群算法詳解

    Python實(shí)現(xiàn)粒子群算法詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)粒子群算法詳解,粒子群算法,縮寫(xiě)為PSO(Particle Swarm Optimization),是一種非線性尋優(yōu)算法,其特點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單、收斂速度快,對(duì)多元函數(shù)的局部最優(yōu)有較好的克服能力,需要的朋友可以參考下
    2023-07-07
  • python判斷列表的連續(xù)數(shù)字范圍并分塊的方法

    python判斷列表的連續(xù)數(shù)字范圍并分塊的方法

    今天小編就為大家分享一篇python判斷列表的連續(xù)數(shù)字范圍并分塊的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Python數(shù)據(jù)分析pandas之布爾索引使用詳解

    Python數(shù)據(jù)分析pandas之布爾索引使用詳解

    這篇文章主要為大家介紹了Python數(shù)據(jù)分析pandas之布爾索引使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • python中模塊導(dǎo)入模式詳解

    python中模塊導(dǎo)入模式詳解

    這篇文章主要為大家介紹了python中模塊導(dǎo)入的模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí)

    Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí)

    這篇文章主要為大家詳細(xì)介紹了Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • python Tornado框架詳解

    python Tornado框架詳解

    Tornado是一個(gè) Python Web框架,用于開(kāi)發(fā)高性能網(wǎng)絡(luò)應(yīng)用程序,本文給大家詳細(xì)介紹python Tornado框架的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2024-03-03
  • python中的socket實(shí)現(xiàn)ftp客戶端和服務(wù)器收發(fā)文件及md5加密文件

    python中的socket實(shí)現(xiàn)ftp客戶端和服務(wù)器收發(fā)文件及md5加密文件

    這篇文章主要介紹了python中的socket實(shí)現(xiàn)ftp客戶端和服務(wù)器收發(fā)文件及md5加密文件的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

东乌珠穆沁旗| 德化县| 文水县| 甘德县| 福清市| 白河县| 军事| 宜兰市| 安福县| 五原县| 昔阳县| 固安县| 囊谦县| 汉寿县| 讷河市| 楚雄市| 青神县| 宜黄县| 石嘴山市| 古交市| 沙湾县| 子洲县| 宝兴县| 泗阳县| 石屏县| 嘉鱼县| 婺源县| 喀什市| 上杭县| 高阳县| 新蔡县| 宣城市| 英吉沙县| 安阳县| 饶河县| 巴南区| 肇源县| 武陟县| 阜平县| 进贤县| 罗定市|