ChatGPT的原理與前端領域實踐 | 京東雲技術團隊

一、ChatGPT 簡介

ChatGPT的火爆

ChatGPT作爲一個web應用,自22年12月發佈,僅僅不到3個月的時間,月活用戶就累積到1億。在此之前,最快記錄的保持者也需要9個月才達到月活1億。

ChatGPT的反爬

https://chat.openai.com 因爲各種政策&傾向性問題,ChatGPT目前在中國無法訪問。而它又是如此火爆,所以就有大量用戶通過代理、爬蟲等形式來體驗ChatGPT。

OpenAI不是專業做網絡服務的公司,因此把反爬交給第三方公司CloudFlare去做。

CloudFlare目前全球最大CDN服務商,佔比16%;而OpenAI的流量在CloudFlare中佔比已經佔據前二。

ChatGPT的打字效果

可以看到ChatGPT的輸出是逐字輸出的打字效果,這裏應用到了SSE(SeverSideEvent)服務端推送的技術。一個SSE服務的Chrome開發工具化network截圖 :

SSE對比常見Websocket如下:

那麼這種打字效果它是故意的還是不小心的?

二、ChatGPT核心原理

ChatGPT我們可以拆解成 Chat、G、P、T 這四個部分講述。在後續內容前,我們先補充幾個機器學習容易理解的概念:

1.模型:所謂模型,本質上就是一個程序(函數),類似 y=ax+bx^2,這裏的a和b就是參數,比如GPT3的參數量就是175B說的就是1750億參數的程序,ChatGLM-6B的參數量是60億。

2.機器學習:我們平時寫的函數,是人來控制的邏輯和參數,而機器學習指的是機器通過某種方式(訓練)來確認參數。這個找特定參數的函數的過程,一般分別爲3步:

  • 確定函數集合:儘可能窮盡所有參數的可能,比如文章中常見的CNN、RNN、Transform等就是函數集合;
  • 數據:通過數據集,得到評價函數好壞的方式;
  • 執行過程的參數:比如每批次對每個函數執行多少次,最大執行多少次等,這些參數一般稱爲“超參”,區別於函數內的參數(算法工程師一般自嘲的調參工程師,指的是這個“超參”)

Generative 文字接龍

ChatGPT本質上是個不斷遞歸執行的生成式的函數,下面我們來看2個例子:

Case1:蘿蔔青菜

當你看到蘿蔔青菜這4個字的時候,腦海中想的是什麼?

我想大概率是各有所愛。

給到GPT的時候,GPT根據這4個字和逗號,推測出下個字的大概率是各

然後GPT會再次將蘿蔔青菜,各輸入給自己,推測出下個字的大概率是有

這就是ChatGPT在輸出文字時是逐字輸出的原因,這種形式最符合LLM運行的底層原理,在用戶體驗上也能讓用戶更快看到第一個字,體驗上接近聊天而不是閱讀。它是故意的。這裏我們得到第一個結論:

ChatGPT(模型 / Fn)的運行原理是每次輸入文本(包含上次返回的內容),預測輸出後續1個字詞。

Case2:書呆子

舉個【原創】前端技術十年回顧 文章中的例子:

在這個例子中,爲什麼輸出是“欺負一樣”?

從全文中看,這裏的主體應該是前端技術,單純考慮前端技術和就像在小學被,我們可以想出“推廣”、“普及。即使不考慮“前端技術”,單純從就像在小學被,還有可能推測出後文是“教育”、“表揚”。都很難聯想到“欺負”。

這裏出現“欺負”,很大原因是在前文中欺負(就像,這幾個關鍵字的影響遠大於前端技術。所以我們得到第二個結論:

在生成式語言模型中,上文單詞離得越遠,對生成結果的影響就越小

文字接龍VS完形填空

這裏補充下GPT類似的BERT,他們都是基於後面提到的Transform結構,他們的對比如下,總的來說,文字接龍更服務人類大部分情況下的語言模式,因此像馬斯克也更青睞於這種第一性原理的東西。

Transform 注意力機制

Case3:綠洲

在這個Case中,綠洲的出現,反而不是因爲最近的尋找新的,而是3句話之前的沙漠和駱駝。這裏就不得不提到大名鼎鼎的Transform結構,這是Google在2017年在一篇論文 《Attention is all you need》首次提出的一種類神經網絡結構,它和核心是自注意力機制,用來解決長距離文本的權重問題。

作者不是機器學習專業,就不展開說了,建議看相關論文和講解的文章。

Pretrained 預訓練

通過前面的文字接龍模式,用大量數據喂出來的預訓練模型,使其具備通用的語言能力,這裏的預訓練有2層含義:

  • 能完成各種通用NLP任務(分類、排序、歸納等等)
  • 稍加微調訓練,能完成特定領域的語言任務(不必從頭開始)

Chat 對話(通過Finetuning實現)

因爲預訓練是無人類的監督,因此通用模型不一定按照聊天形式返回文本,因爲它的訓練素材包羅萬象,比如我說今天天氣差,它根據歷史的經驗:今天天氣差的表述方式有下面幾種,就會輸出這句話的不同的表述,而不是像聊天一樣跟我一起吐槽 。下面的OpenAI的GPT3模型對今天天氣差的輸出:

要讓GPT3像聊天一樣輸出,就需要有針對性的對它就行微調(fine-tuning)訓練,例如通過特定的問答結構的語料訓練:

能聊天之後,想要上線,就必須給模型上枷鎖,不能回答和人類價值觀不符的內容,否則資本主義的鐵拳也會降臨

OpenAI通過人工標註和強化訓練的方式提升ChatGPT回答質量並校正它的價值觀傾向,想要更多瞭解這塊內容,可以瞭解下ChatGPT背後的算法模型。

三、ChatGPT的應用

OpenAI官方給到了49個常見的ChatGPT應用場景:
https://openai.com/blog/chatgpt

總的來說可以分爲:

  • 文案創作
  • 提煉總結
  • 代碼編寫
  • 語言美化/跨語言轉換
  • 角色扮演

對於前端開發同學來說,最關注它的代碼能力。正好在一個小程序轉taro重構的項目中體驗了ChatGPT的能力:

1. 能理解小程序模板語法,並轉換出ts的taro組件

2. 理解小程序頁面邏輯,並修正props

小程序的頁面邏輯page.js是獨立於index.wxml的,在得到純wxml生成的taro組件後,把page.js的代碼合併進去

3. 可以補充知識,教它舉一反三特有的語法

HiBox融合ChatGPT

這麼好的能力,應該如何沉澱呢?

我們首先想到了VSCode插件,剛好HiBox本身有登錄態、自定義Webview、遠程配置化的能力,那就將ChatGPT集成到HiBox中(太酷啦),Node端接入ChatGPT的接口,通過Webview前端實現一個聊天窗,再通過配置系統集成常用的Prompt,這樣前端開發就能通過VSCode方便地用到ChatGPT的能力。整體結構如下:

數據源方面,也從爬蟲版本ChatGPT,逐步切換到API代理服務中,代理服務接入GPT3.5的模型能力,整體體驗非常接近ChatGPT。代理服務文檔:
https://joyspace.jd.com/pages/yLnDY3B5UJ1rXP8UYrN6

HiBox的ChatGPT目前僅需erp登錄即可免費使用,更多使用方式和安裝方式:HiBox快速開始

私域數據集成

在使用ChatGPT的過程中,也注意到2個問題:

  • 公司敏感的代碼和信息不能傳給ChatGPT
  • 特定領域的非敏感知識,比如水滴模板,ChatGPT沒學習過

首先想到的是,採用微調(fine-tuning)的方式,將私域數據數據集成到大語言模型(LLM)中,然後私有化部署在公司的服務器上,這樣任意代碼和文檔都可以發送給它,我們嘗試了下面2種方式:

GPT3 fine-tuning

一是通過OpenAI官網提到的GPT3的fine-tuning接口,將私域數據傳給OpenAI,OpenAI在他們的服務器裏微調訓練,然後部署在OpenAI的服務器中,整個過程是黑盒。

ChatGLM-6B fine-tuning

二是用清華開源的ChatGLM-6B作爲基礎模型,在公司的九數平臺上申請GPU機器,將私域數據通過LORA的方式微調得到LORA權重,然後自己部署,整個過程完全私有化。

GPT3.5 langChain

上面的兩種方式總的來說,部署後的推理效果都很難達到GPT3.5-API的效果,因此我們最後嘗試了embedding外掛知識庫的方式。使用開源的langchain處理文檔切割、向量化存儲、向量化匹配等。數據還是會暴露給OpenAI。

四、LLM現狀和展望

LLM大爆發

其實在20年GPT3出來之後,機器學習的大部分頭部都意識到了這條路線的可行性,積極地在跟進了:

這裏專門講下百度,據公開可靠的文檔,百度早在2019年就推出了Ernie(對標谷歌Bard,Ernie和bard在動畫Muppet中是1對兄弟),確實是國內最早接入LLM的玩家。百度走的和谷歌一樣,是BERT的完形填空的路線,因爲在2018~2019年的時間點,GPT一代剛剛問世,第一代的GPT對比各方面都不如BERT,再加上百度和谷歌一樣在搜索引擎方面沉澱較多,因此選擇的路線是BERT。

近期羊駝系列和國內大語言模型也在大爆發:

LLM應用現狀&趨勢

平臺化

LLM的角色扮演能力可能是下個人機交互變革的關鍵點,OpenAI也推出了Plugin模型,通過插件,用戶可以通過一句自然語言聊天就買一張機票,搜索想看的文章。有人說這是類似AppStore發佈的IPhone時刻:

自驅動、能力集成

類似Auto-GPT,langchain等,通過約定特性的模板,可以讓ChatGPT返回執行特定命令的文本,例如和ChatGPT約定如果要搜索的時候,返回[search: 搜索內容],然後在客戶端通過正則匹配 /[search:(.*?)]/,拿到對應的內容執行搜索,再將結果返回給ChatGPT整理最終答案。

虛擬一個例子:

1. user: 深圳明天的天氣怎麼樣?
2. chatgpt(觸發知識限制2021年,返回約定的搜索格式):[search:2023年4月27日的深圳天氣]
3. user接收到正則匹配觸發搜索,打開無頭瀏覽器搜索百度並取第1條結果:2023年4月27日星期四深圳天氣:多雲,北風,風向角度:0°風力1-2級,風速:3km/h,全天氣溫22℃~27℃,氣壓值:1006,降雨量:0.0mm,相對溼度:84%,能見度:25km,紫外線指數:4, 日照...
4. user(將搜索的內容連帶問題第二次發給ChatGPT): 深圳明天的天氣怎麼樣?可參考的數據:2023年4月27日星期四深圳天氣:多雲,北風,風向角度:0°風力1-2級,風速:3km/h,全天氣溫22℃~27℃,氣壓值:1006,降雨量:0.0mm,相對溼度:84%,能見度:25km,紫外線指數:4, 日照...
5. chatgpt(根據問題和上下文,輸出人類語言的表達): 深圳明天的天氣還可以,整體多雲爲主,氣溫22℃~27℃

多模態

4月份發佈的GPT4已經具備圖像識別的能力,下面的Case是主持人用一致設計稿草圖生成前端頁面的過程。經典“前端已死”時刻:

LLM的侷限

雖然我們看到ChatGPT的技術強大,但是也要審慎看待它的侷限,它本質上是個基於歷史數據的經驗主義的模仿人類的文字輸出函數。

例如,ChatGPT完全做不了4位數的乘法運算,它大概率會根據6乘和7等於這2塊關鍵信息,得到答案是以2結尾,根據4和乘以3這2塊關鍵信息,得到答案是以1開頭,而中間的隨機性完全收斂不到正確的答案,不管是ChatGPT和GPT4都是一樣的情況:

再比如問它特別小衆、普通人也容易錯的專業領域知識,它也會根據大部分普通人的錯誤答案輸出錯誤答案:

比如在V8 Promise源碼全面解讀,其實你對Promise一無所知文章中一個很奇葩的題目,下面的代碼會打印什麼?

Promise.resolve().then(() => {
    console.log(0);
    return Promise.resolve(4)
}).then(res => {
    console.log(res);
})

Promise.resolve().then(() => {
    console.log(1);
}).then(() => {
    console.log(2);
}).then(() => {
    console.log(3);
}).then(() => {
    console.log(5);
}).then(() => {
    console.log(6);
})

大部分人都會回答:0、1、4、2、3、5、6
GPT3.5的回答:0、1、4、2、3、5、6
GPT4的回答:0、1、2、3、4、5、6

只有GPT-4的回答正確,但是即使它的回答正確,它的具體分析也是錯誤,因爲它可能在某個場景學習過類似答案,但是它並不“理解”,後面的分析內容也是大部分人容易錯的分析

結尾

最後用流浪地球2中周喆直的臺詞做個結尾。

對於AI的到來,我們戰略上不要高估它,AI本身有它的侷限性,保持樂觀,前端沒那麼容易死;戰術重視和關注它的發展,嘗試在我們的工作生活中應用,技術變革的浪潮不會隨個人的意志變化。

通宵趕稿,碼字不易,看到這裏同學幫忙點個贊吧 Thanks♪(・ω・)ノ

作者:京東零售 陳隆德

內容來源:京東雲開發者社區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章