我為 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 。
發現並不是我想要的樣子,終究還是錯付了。