<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近指導群裡小兄弟技術問題,發現一個讓我也棘手的難題。於是激發了我潛意識精神力-幹到底。 由於最近沉浸在chatgpt中,很久不用google和百度搜尋東西了,正如我所料一般,他們也沒有這方面的解決方案。於是,記錄一下探索研究的過程,給各位水友一個分享擴充套件。
模擬ChatGPT的效果,實現流式傳輸,通過處理流資料,實現打字機的效果。
在解決問題之前,我們需要了解什麼是流式傳輸。流式傳輸指的是將資料分成多個資料流,通過網路傳輸,以減少網路延遲和提高效能。在某些情況下,流式傳輸也可以用於將視訊流和音訊流傳輸到使用者端。流式傳輸是一種高效的資料傳輸方式,常用於大檔案下載和線上視訊播放等場景。
儘管流式傳輸在某些情況下非常有用,但小程式目前不支援流式傳輸。主要原因是小程式的架構和限制。
小程式的開發框架提供了一個小程式的開發和偵錯環境。在這個環境中,小程式的程式碼和資源都是打包在一個檔案中的。這意味著小程式依賴此框架的環境,無法呼叫瀏覽器標準的API,需要框架的整體升級和支援。
此外,小程式對網路請求的限制也是一個因素。小程式中的網路請求必須使用微信提供的API,這些API通常只支援完整的請求和響應。這就使得小程式無法使用流式傳輸。
但這些都是常規方案,實現也比較麻煩,把正常的請求複雜化了。拋棄~
基礎html模式就不列舉了,axios更便捷,我很自信這個方案可行性。
重點:
request({ url: '/api/prompt', //請求頭需要改為stream模式 headers: { Accept: 'text/event-stream', }, //響應型別設定stream responseType: 'stream', method: 'POST', data: { prompt: prompt, }, }).then(res => { console.log(res) }).catch(err => { console.log(err) })
他們又問我要打字機效果,我的方案:接收到ArrayBuffer
以後解碼資料。
.then((res) => { const arrayBuffer = res.data; const uint8Array = new Uint8Array(arrayBuffer); const textDecoder = new TextDecoder('utf-8'); const text = textDecoder.decode(uint8Array); for (let i = 0; i < text.length; i++) { setTimeout(() => { resultText += text[i]; console.log(resultText); }, i * 100); } })
ok,瀏覽器沒問題,小程式偵錯工具沒問題,我依舊自信我的方案
但是,小程式報錯了,無法列印流資料,無法支援TextDecoder
方法。完犢子,顧問成瞎指揮了。
微信官方檔案中提到, wx.request
中支援onChunkReceived
分段式傳輸
重點:
wx.request
中開啟 enableChunked
; text或streamstream
;TextDecoder
const requestTask = wx.request({ url: '/api/prompt', //請求頭需要改為stream模式 header: { "Transfer-Encoding": 'chunked' }, timeout: 15000, responseType: 'text', method: 'POST', enableChunked: true, data: { prompt: prompt, }, }).then(res => { console.log(res) }).catch(err => { console.log(err) })
這樣,我們就發起了流式傳輸請求,當然後端也要支援的,後面我會舉例子。
當他們執行時,又出問題了,搞不定TextDecoder
替代方案。我查了一下,好像有個方案,小不自信了。 使用"TextDecoder"替代庫,然後給出建議:
import {TextEncoder, TextDecoder} from "fastestsmallesttextencoderdecoder"; const encode = (new TextEncoder).encode; const decode = (new TextDecoder).decode;
等了一天沒找我,哼哼,小菜一碟,完工。
這邊又來了,大佬你的方法不好使,引入執行又又報錯了。
穩住別慌... 試試手寫ArrayBuffer轉string方案:text-encoding 然後親自測試,搞不定就把chatgpt-plus關掉。
最終版:
let buffer='' requestTask.onChunkReceived(function (response) { const arrayBuffer = response.data; const uint8Array = new Uint8Array(arrayBuffer); let text = String.fromCharCode.apply(null, uint8Array); buffer += text; full_command.value = buffer })
其實,第二個方案是可行的,只是我也沒時間具體看報了什麼錯誤。最終使用了fromCharCode的方法,恰好可以處理,當然還一些過濾和解碼,根據業務需要寫了。
後端設定教學比較多,主要是新增請求頭,支援分段傳輸的方式。
public static function prompt($message) { $openAi = self::getOpenAI(); header('Access-Control-Allow-Credentials: true'); // 設定響應頭資訊 header('Transfer-Encoding: chunked'); header('Content-Type: text/plain'); header('Cache-Control: no-cache'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type'); header('Connection: keep-alive'); $msg = ""; $openAi->prompt([ 'messages' => $message, 'model' => 'gpt-3.5-turbo', "stream" => true, ], function ($curl_info, $response) { //閉包函數處理流 $data = []; $lines = explode("n", $response); foreach ($lines as $line) { if (!str_contains($line, ':')) { continue; } [$name, $value] = explode(':', $line, 2); if ($name == 'data') { $data[] = trim($value); } } foreach ($data as $message) { if ('[DONE]' === $message) { echo "0rnrn"; } else { $message = json_decode($message, true); $input = $message['choices'][0]['delta']['content'] ?? ''; $msg .= $input; echo dechex(strlen($msg)) . "rn" . $msg . "rn"; } } ob_flush(); flush(); return strlen($response); }); }
至此,整個瀏覽已完成,相信有技術嗅覺的小夥伴一定會大有所用。目前,還沒有看到太多小程式支援流的平替方案,至少md格式,程式碼高亮,打字效果處理成和官網一樣的互動,還是比較棘手的。不過可以試試這個,我用著還挺好,起碼互動上。後面還會發一個整合所有平替的分享,大家可以嫖到老。
以上就是詳解小程式如何實現類似ChatGPT的流式傳輸的詳細內容,更多關於小程式ChatGPT流式傳輸的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45