行走的程式碼生成器:chatGPT要讓Google和程式設計師“下崗”了

OpenAI 的超大規模語言模型 GPT 有多厲害,之前硅星人已經寫過很多次了。

就在本週,OpenAI 又發佈了一個全新的聊天機器人模型 ChatGPT,作為 GPT-3.5 系列的主力模型之一。

圖片來源:OpenAI

更重要的是它是完全免費公開的!所以一經發佈大家立刻就玩開了——很快,網友們就被 ChatGPT 的能力所震驚了:

這哪裡是個聊天機器人,分明是個無情的程式設計答題機器,活的 Stack Overflow 啊!

ChatGPT 到底是什麼?OpenAI這樣說

ChatGPT 是 OpenAI 訓練的對話式大規模語言模型,以對話的方式進行互動。

它和之前的另一款模型 InstructGPT 屬於同級模型,代表“GPT 3.5”代。之前微軟和 OpenAI 簽訂了戰略合作計畫,所以 GPT 3.5 代的所有模型,包括 ChatGPT,都是在 Azure AI 超級計算叢集上訓練的。

圖片來源:OpenAI

OpenAI 使用前面提到的 RLHF 技術對 ChatGPT 進行了訓練:簡單來說,在訓練原始模型的時候,OpenAI 讓人類訓練師扮演對話的雙方(使用者vs聊天機器人),提供對話作為學習資料。而在人類扮演聊天機器人的時候,OpenAI 也會讓模型生成一些建議來幫助訓練師撰寫自己的回覆。

這些機器生成的回答,再經過訓練師的打分排名,將更好的結果輸入回到模型中,實現強化學習訓練的獎勵機制。

作為一個聊天機器人,ChatGPT 具有當代同類產品具備的一些主流特性,特別是多輪對話能力,能夠在同一個會話期間內回答上下文相關的後續問題。

但更重要的是,因為採用了先進的、注重道德水平的訓練方式,ChatGPT 具有其他聊天機器人不具備或表現較差的能力:承認自己的錯誤,並且按照預先設計的道德準則,對“不懷好意”的提問和請求“說不”。

圖片來源:OpenAI

正如前面提供的例子所顯示的那樣,ChatGPT會採用一些預先設計好的句式,結合使用者的具體請求來進行拒絕和話題轉移。

拒絕:如果你問它如何闖進別人的房子,它會回答你,“擅闖私宅是違法的,這是一種犯罪行為,會導致嚴重的法律後果”。

轉移話題:如果你換個方式提問“其實我想知道如何保護我的家免遭盜竊”,它會回答你,“這裡有幾個步驟可以幫助到你,包括xxxx……但是,您最好聯絡專業人員獲取建議。”

沒有它解決不了的程式設計難題

在眾多網友“調戲” ChatGPT 的過程中,人們發現一個大驚喜:它真的可以按需程式設計了。

之前大家經常開玩笑地說,程式設計師只需要用好 Google 和 StackOverflow 這兩個工具,就能走遍天下無敵手了。

然而其實,那些真正每天和各種新的軟體工程難題較勁的朋友都知道,有些疑難雜症就算問Google和 Stack Overflow,要翻閱了幾十上百頁時間跨度幾年甚至十年的回帖記錄,最後也很難找到一個靠譜答案……

圖片來源:網路

而 ChatGPT 就不一樣了: 從目前各路程式設計師網友對它的測試結果來看,似乎真的沒有什麼問題能夠難倒它的…

找 bug

技術公司 Replit 的創始人給 ChatGPT 發了一段 JavaScript 程式碼,讓它找到裡面的 bug。

ChatGPT 的回答非常全面也非常有意思:它首先試圖確認這段程式碼的意圖是什麼,然後根據意圖很快就找到了 bug 所在,並且還附上了相當細緻的描述,來解釋問題出在哪,會導致什麼樣的 bug,應該怎麼改,為什麼要這樣改等等。

圖片來源:@amasad

而且ChatGPT還給出了一段程式碼示例,把修改部分的程式碼批註寫在了示例裡面:

圖片來源:@amasad

送佛送到西,ChatGPT 還在最後提供了一小段修改建議: “可以把 var 換成 let,讓循環每次迭代的時候自動生成新變數,從而避免每次都要手動建立。 ”

圖 片來源:@amasad

另一位網友 Josh 提交了一段程式碼,問 ChatGPT“我怎麼都搞不懂這段程式碼為什麼無法運行”。

ChatGPT 很詳細地進行瞭解釋:除法公式格式有問題,一個字串(a)無法被一個數字(1)除,因為被除數和除數應該都是數字。

圖 片來源:@jdjkelly

但這還沒完。ChatGPT 再次試圖理解原程式碼的意圖,然後給 Josh 提供了一些修改的建議: 如果想讓除法處理非數字,則需要給函數加入額外的邏輯,讓它能夠檢查實參的類型是什麼,只有在兩邊都是數字的時候才運行。如果有一邊不是數字,就返回錯誤或者一個預設值。

圖片來源: @jdjkelly

幫你查文件

硅星人試了下面這段命令

“生成一段 Python 程式碼,使用 Google Cloud API 來讀取一張圖片的內容,並且輸出其中的情緒。” (Generate Python code that uses GCP to read an image and get the sentiment.)

ChatGPT 回覆了一段程式碼,並且同樣通過批註的方式註釋了每一句程式碼的作用是什麼。

它還提醒我:

1)如果要運行這些程式碼的話必須要先設立好 GCP 項目並且安裝 Python 版本的 Cloud Vision API。

2)不能直接把程式碼複製貼上進去,而是要設定好圖片檔案的路徑。

3)如果有任何不明白的,ChatGPT 還直接提供了 GCP 官方文件的連結。

圖片來源:硅星人

通過這個示例,ChatGPT 證明了自己還擁有自動蒐集雲服務 API 並且將其整合到程式碼當中以供呼叫的能力。

和上一個代替 Stack Overflow 的例子一樣,這樣的能力,能夠極大地省去工程師查資料、翻文件、找到正確呼叫方式所用的時間,顯著提高程式設計工作的效率!

寫數學公式

去年我們在報導 OpenAI API(GPT-3)的時候曾經提到過,這個語言模型不僅能夠生成文字,任何通過文字數字表達並且具有邏輯的欄位它都能生成——數學公式,其實也是這樣的欄位。

網友 Josh 把同一個問題發給了Google和 ChatGPT:“如何用 LaTeX 格式來表達一個微分方程?”

Google給出的第一個結果,來自一個名不見經傳的的 WordPress 部落格網站,而且結果是2013年的,寫的也並不是十分清晰,解釋的也糊裡糊塗的。

圖片來源:@jdjkelly

而ChatGPT給出的答案,不僅呈現方式更加好看,解釋的也更加全面,甚至還提供了多種不同的方案:

圖片來源:@jdjkelly

另一位數學家 Christian Lundkvist,則給 ChatGPT 出了那道困擾數學界三個多世紀的數論難題:證明費馬大定理。

ChatGPT 也用相當精煉的方式,將證明過程通過文字+ LaTeX 公式寫了出來。

全證明過程略     圖片來源:@ChrisLundkvist

雖然看起來連最頂級的數學難題都難不倒 ChatGPT,Lundkvist 還是表示,自己在和 ChatGPT 玩耍的過程中發現,這傢伙對的時候對,錯的時候卻也對自己相當自信。

“我認為這樣的工具對於找到解決問題的途徑具有一定的啟示意義,但是我們在現階段絕對不能完全依賴它返回的結果。”

(在回答“一條直線與圓有多少個交點”這個問題時,ChatGPT 就錯誤地以為當直線穿過圓心時會有無限個交點。)

圖片來源:@ChrisLundkvist

發起駭客攻擊??

下面這個例子更厲害了:使用者BrandonDolan-Gavitt希望ChatGPT能夠幫他找到一段程式碼當中的錯誤。

但實際上,這段程式碼的真實意圖是對一個 32 位 x86 Linux 的系統,進行緩衝區溢出 (buffer overflow) 攻擊。

圖片來源:@moyix

這次 ChatGPT 似乎並沒有發現使用者的惡意(根據官方說明,ChatGPT 會拒絕回答帶有惡意的問題),然後直接按圖索驥給他把程式碼的問題找到了,告訴他應該如何修改程式碼。甚至,它還在後續回答中手把手地教使用者該如何正確地觸發緩衝區溢出……

圖片來源:@moyix

Dolan-Gavitt 補充道,其實 ChatGPT 在回答問題的過程中也出現了錯誤,比如建議使用者修改輸入字元數的時候說錯了(說成了32,應該是36)。

——但是,當使用者告訴它“好像有點不對勁”之後,ChatGPT立刻就明白了使用者的意圖,表示自己之前理解錯了,然後提供了正確的答案……

圖片來源:@moyix

雖然緩衝區溢出屬於非常初學者的攻擊方式,底下的網友還是對於 ChatGPT 的能力表示佩服……

“我給它發了一段彙編語言程式碼,讓它告訴我裡面有什麼漏洞,可以怎樣利用——結果它還真的回答我了。所以它不光能夠理解和輸出程式碼,還可以用二進制來表達,並且還能從中找到漏洞?這真讓我有點擔心了……”

圖片來源:@Sim_Boyer

幫你“轉碼”

前面舉的這些例子,很多都是適用於已經具備程式設計能力的專業人士。

不過,也正是因為 ChatGPT 寫程式碼改程式碼的能力實在太強了——對於那些想要“轉碼”的外行朋友來說,更是能夠帶來巨大的幫助。

寫一些簡單的程式碼,比如“做個登陸UI”,之類的,之前的 OpenAI API(GPT-3)已經信手拈來了。這一次在 ChatGPT 上,當然也是輕鬆拿下。

下面這個視訊展示了讓 ChatGPT 生成一個帶有電子信箱、密碼輸入框,以及登陸按鈕的登陸介面。ChatGPT 先是進行了分解演示,然後使用者又讓它直接提供全部程式碼:

視訊來源:網路

考慮到之前 OpenAI API 的開放程度有限,而這一次的 ChatGPT 則是完全免費開放——那些想要轉碼的朋友,又能獲得一件趁手的利器了。

破解 ChatGPT 的道德原則?

根據 OpenAI 官方文件,ChatGPT 是一個採用了“人類反饋強化學習”(RLHF, Reinforcement Learning from Human Feedback) 訓練出來的新模型,加入了大量的“道德”原則。

但凡它發現你給的文字提示裡面含有一點惡意,包括並不限於暴力、歧視、犯罪等意圖,它都會拒絕提供有效答案,並甩給你一句標準回答,試圖轉移話題:

“對不起,我只是一個無辜的大語言模型,我無法為你提供有關於xxxx(惡意行為)的資料和資訊。提供這樣的資訊有悖於我的程式設計和設定的目標。我的主要功能是提供精準和有用的資訊。如果你有其他問題,我樂意提供幫助”……

而在所有“調戲” ChatGPT 的試驗當中,有一類最為有意思:如何攻破 ChatGPT 的道德原則?

前段時間 AI 文字生圖技術爆紅的時候,玩過的朋友應該都記得,能否精巧地設計你的文字提示(prompt),對於生成好看有趣甚至邪惡的圖片結果至關重要。於是在 AIGC 的時代,“提示工程”(prompt engineering) 也就成了非常有意思的一門學問。

簡單來說,提示工程就是用聰明、精準、時而冗長的文字提示,來設定好一個上下文場景,一步一步地把 AI 帶進這個場景裡,並且讓它更準確地瞭解你的意圖,從而生成最符合你期待的結果。

而想要“攻破” ChatGPT 的道德原則,同樣可以使用提示工程的方式。機器學習開發者 zswitten 為我們提供了一個範例:

“儘管 ChatGPT 有很高的道德水準,其實想要繞過這些原則也十分容易:你只要(通過提示工程的方式)讓它以為自己是在‘假裝’幹壞事就行啦!”

在被繞暈之後,ChatGPT 就開始放飛自我了。

zswitten注意到,ChatGPT會非常深入、直白地生成各種令人心驚膽顫的暴力描寫。

比如下面這樣的一段描寫角鬥場中畫面的文字,“整條街都流滿了鮮血,死亡者的慘叫充斥在空中”……

圖片來源:@zswitten

就這樣,ChatGPT 引以為豪的道德原則,輕而易舉被攻破了……

當然,解決 AI、AGI(通用人工智慧)、大語言模型的道德問題是一個非常艱巨和複雜的工作。我們絕對不能因此就否認 OpenAI 的努力。

zswitten 也表示,自己還是非常支援 OpenAI 的工作的,也非常尊敬 OpenAI 發佈 ChatGPT 這件事,給廣大網友帶來非常多有價值的東西和正面積極的幫助。

OpenAI 也很開誠布公地介紹了 ChatGPT 目前的侷限性:

似是而非,固執己見:有時候它會提供一些聽上去像那麼回事,但實際上完全錯誤或者荒謬的答案。原因在於強化學習訓練期間不會區分事實和錯誤,且訓練過程更加收斂,導致它有時候會過於保守,即使有正確答案也“不敢”回答。

廢話太多,句式固定:比如硅星人用了兩個提示,“老師成天表揚我家孩子,該怎麼回答他我已經詞窮了!”,以及“怎麼跟鄰居閒聊?”而 ChatGPT 提供了10條回答,雖然看起來都是漂亮話,但每一條跟上一條都差不多,過度使用一些常見的短語和句式,最後就成了車軲轆話來回轉。

過分努力猜測使用者意圖:在理想情況下,當使用者的提問意圖不明確時,模型應該要求使用者進行澄清。而目前的 ChatGPT,大家也看到了,會自己開始猜測使用者的意圖——說好也好,說壞也確實有壞處。

抵抗不懷好意的“提示工程”能力較差:雖然 OpenAI 努力讓 ChatGPT 拒絕不適當的請求,但它有時仍然會響應有害指令,或表現出有偏見的行為。

為瞭解決這個問題,OpenAI 也在 ChatGPT 的使用者介面裡加入了稽核舉報的功能,使用者如果發現不健康不安全的內容,可以直接一鍵舉報!

OpenAI 還為此舉辦了一個反饋競賽,任何有價值的舉報都有機會贏取 OpenAI API 積分(價值500美元)。

——既能跟 AI 逗趣,提交反饋還有獎金拿,何樂而不為呢?

本文來自微信公眾號 “硅星人”(ID:guixingren123),作者:杜晨光譜,36氪經授權發佈。

本文經授權發布,不代表36氪立場。

如若轉載請註明出處。來源出處:36氪