1. 程式人生 > 其它 >我為 OpenAI ChatGPT 生態處理一個致命 BUG 的經過

我為 OpenAI ChatGPT 生態處理一個致命 BUG 的經過

最近的 ChatGPT 應該不用我多說了,不過避免有朋友還沒收到相關推送,我還是簡單介紹兩句:

瞭解 ChatGPT

ChatGPT 是 OpenAI 的一個產物,是繼GPT-3.5 系列的主力模型之一,這一模型可以與人類進行談話般的互動,可以回答追問,連續性的問題,承認其回答中的錯誤,指出人類提問時的不正確前提,拒絕回答不適當的問題。
進行了簡單測試,包裹但不限於以下事情他都可以做:

  • 讓他給你寫程式碼,甚至是 sql,甚至是設計架構
  • 讓他給你寫文章,或者概括文章
  • 讓他給你寫的程式碼生成 commit 訊息,也就是你只管寫程式碼他來描述你做的工作
  • 讓他給你重構程式碼
  • 讓他為你講解程式碼
  • 你可以隨便使用中文或英文或其他語言和他對話,他能使用相當的語言回答你
  • 各種問答,基本沒有顯得刻意,十分流暢…
    以下簡單出幾張圖:
    問遊戲

    身份轉換

    解釋程式碼

    給你的程式碼查 bug

    各種技能就不一一羅列了,當然,我走過最深的路,就是你的套路 這句話充分說明了要是真玩起來,人都玩不過人,所以我們不要指望機器是先知,是上帝,回答有點不如意就認為他不過如此。

進入正題

ChatGPT 確實強大,那如何讓他為我們服務呢?比如簡單的程式設計問題或常見的資料處理函式就不用谷歌了,直接問他就行,他能直接給你可執行的程式碼以及實現思路。
但是,他目前 不對該地區開放 ,並且註冊有一些門檻,例如國內手機號是不支援的,國內網路是不能訪問的。爭對這個問題,國內就出現了很多方案,例如代理、vscode外掛、映象、國內版、共享KEY……
好啦,既然有方法可以使用,但如何優雅的使用就是個需要思考的問題了:

  • 官方頁面 https://chat.openaI.com/chat 有一些痛點

    • 不支援儲存聊天記錄
    • 不方便二開
    • 要使用總得開啟瀏覽器
  • 那就先去 GITHUB 看看

    • chat-gpt-google-extension 在谷歌搜尋時也顯示 ChatGPT 的搜尋結果
    • chatgpt-api 一個 nodejs chatgpt api
    • chatgpt-mac 在 mac 的選單欄中直接使用 chatgpt
    • chatgpt-vscode 在 vscode 中使用 chatgpt
    • ai-cli 在 命令列中與 chatgpt 進行互動

      ai-cli


      根據 readme 和 star 來看,很酷很專業的樣式,來,就你了。
      命令列方式,即可方便使用,也可方便整合到其他程式,還是 js 的,那就說明假設有定製化的需求也不怕掉頭髮
      啦。
      # 安裝
      npm i @abhagsain/ai-cli -g
      # 使用
      ai ask 來一段express示例
      
      執行結果

就是這麼絲滑!然而並沒有。

問題出現

萬丈高樓平地起,蚱蜢先從 hello world 開始~ 然而他這連 hello 都不行!
執行 ai 時需要先使用 ai auth 新增一個 key,這步沒什麼問題。
根據官網的示例:

ai ask "Check process running on port"

好像這串洋文有點複雜,蚱蜢先來個簡單的:

> ai ask 你好
... !
    Error: Request failed with status code 400

這是認真的?我給 AI 說 你好,然後 AI 甩我一臉 Error,難道是 AI 不屑與我這個的垃圾溝通?我開始有點懷疑自己……
但我假裝淡定,不,一定不是!肯定是其他原因,再給他一次機會!

> ai ask 你好
... !
    Error: Request failed with status code 400

我的目光開始閃爍,笑容逐漸消失。

我再次把我的目光注視著他,ai-cli,看到他的 readme,圖文並茂,看到他的 star,700+(當前舍入法),看到他的最後一次更新就在昨天,看到他的 issues 全都關閉了。看他的每一眼裡,無不透露著他的自信、他的傲慢,無不處處似乎寫著,是我自己的問題,是我不配。
忽然我靈光一閃,難道是語言歧視?
然後我小心翼翼的向他說出,hello。一字一頓,生怕自己有半點差錯。

>ai ask hello
... !
    Error: Request failed with status code 400

果然還是錯付了。這一次,我低下了頭,猛然發現!!!難道是我太小了?難道是我不夠大?格局!格局!格局!
然後這些年的回憶湧上心頭,浮現在腦海。

  • 400?
  • 400?
  • 400?
    終究是記憶中的傷痕發出一絲隱隱作痛,讓我似乎又找到一絲可以讓他回眸的勇氣。
    這些年來做前端的回憶,400 這個狀態碼讓我意識到,可能是資料傳錯了。
    但我就傳了個 hello,也是按 readme 的格式傳的。 ChatGPT 這麼多人都在使用,應該問題不是出在那邊,出應該也是 500。
    大概率是 ai-cli 出現了問題,向 ChatGPT 傳錯了引數什麼的。

    提出問題

    這一次我終於勇敢的抬起頭,跑過去拉住他的手問他,這是我的問題嗎?
    嗯對,我提了一個 issues。
    提 issues 之前先看看他有沒有什麼要求(issues 模板),
    如果沒有,那至少把系統(win10x64),宿主(nodejs 14.5.5),
    版本(ai-cli 1.2.2),以及重現步驟給寫上。
    
    最好再加上一些分析、結論、建議啥的,但目前比較忙,就不先寫分析這些了。
    所以有以下截圖:

    丟給他一個問題,我轉身頭也不會的走了。這次沒有再奢求他會答覆我什麼。
    (寫其他程式碼去了。)

    討論問題

    過大約一小時,收到了一封郵件,可能是廣告但還是開啟看了一下,沒想到是他的訊息。我忍住不表現出自己的欣喜拆開它。
    看起來他讓我選檢查當前 a-cli 的配置檔案,然後又嘗試選擇一個 model。

    然而,我其實並不知道他在說些什麼。
    只有這樣,才能勉強大概可能知道他在說什麼的樣子,我好可憐……

    為了避免自己不理解他的意圖而給到他錯誤甚至是尷尬的回答,所以我乾脆 都給你,請自取

    由於我使用的是 window,我使用 type 命令來向他展示配置檔案的完整路徑,以及配置檔案中的內容。然後再重新執行一遍 ai ask hello 來展示錯誤,這是為了向他表示,配置檔案是沒問題的,但程式還是錯誤。

可是緊接著他的回答,讓我漸漸明白,他就是個渣男!渣男!總是試圖從我這邊找問題。你看他說的,你們來評評理:

Oh, You need to pass the question in a string (double quotes) like this ai ask “Check running containers”. As I can see in the screenshot you’re passing without it.
他似乎在說,我出現這個問題是因為 ai ask hello 這條命令中的 hello 沒有新增雙引號。
還好我是上過小學的人,不然就被他 PUA 了!終於看清了他的面目,於是我不再懦弱,不再退讓,我現在要義正言辭的告訴他:
我知道引號一般都是在引數含有空格或特殊字元時才需要新增的,你不要忽悠我,並且我也是測試過的,我證明給你看,我要讓你無話可說,渣男!

他無話可說,他開始自我懷疑 奇怪,但是他還在試圖掙扎,他給了我一條 curl 命令,讓我新增引數看一下是不是 OpenAI 的問題還是他的 ai-cli 的問題。

新增自己的 key 執行 curl?當然沒有問題。但他又說要確保有 OpenAI 的使用權?這可唬到我了,不過不怕,我一併接招:
直接告訴他,我的賬號在網頁平臺上使用是沒有問題的,以下所給 curl 請求的報文,請檢查錯誤。

注:在執行別人給的命令時,
請確保知道命令做的是什麼事。
如果在溝通過程中有敏感資訊(例如 curl 報文中的 key),
請做脫敏處理。


但是,總感覺這樣的溝通不知何時是頭,雖然他是渣男,但我們的共同目標都是解決問題,我決定伸出援手,向他提供更多更有價值的分析和參考問題都這麼明顯!你!你!你!

好傢伙,這下終於承認了程式碼錯誤了吧~

解決問題

其實在為他提供資訊的過程中,我已經基本找到問題的原因了。理論上,以 github 上的交流情懷而言,我應該主動修改程式碼解決問題,並向他提出申請把程式碼合併。
提(PR)還是不提,這是個問題。因為他現在已經知道錯誤在程式碼中,並正在排查錯誤位置。
雖然我已經從除錯過程中知道了錯誤位置,但如果我要提 PR ,應使用完整的流程已避免一些問題顯得蚱蜢是個正經人,例如 Fork 程式碼到自己的名下,並 Clone 到本地,然後從他的主分支新建一個分支,命名比較簡潔並且能表示此分支專用於修復當前討論的 issues 。
切換到新分支之後,應從原始碼修改,而不是從 build 後的檔案中修改。在修改時,應注意使用 最少修改最少影響範圍符合原始碼格式規範等規則,修改之要查詢倉庫中有沒有測試用例,如果有,應該先把測試用例跑通,避免對之前的功能造成問題。

提(PR)還是不提,這是個問題。因為我要提這個 PR,要處理的步驟還是蠻多的,如果我剛好提了 PR,他又剛好推送了修改,修改的地方又不相同時,這時候是要我的呢?他豈不是很沒面子?要他的呢我豈不是沒面子。

說著說著我已經 Clone 了程式碼並修改完了,當我嘗試編譯的時候:

先發制人

我已經很難了,為什麼還要這麼難!
算了,直接告訴他應該在哪改吧。

後來

後來,我總算學會了如何去愛,可惜你早已遠去,消失在人海……

不好意思剛走錯片場了,後來在他修復的過程中,我使用本地已解決問題的版本成功使用了他這個 ai-cli 。

發現並不是我想要的樣子,終究還是錯付了。