ChatGPT在3月20日發生故障,有機會讓用戶看到別人的對話標題,同時OpenAI系統還傳送訂閱確認電子郵件給錯誤的用戶,官方解釋,這些問題來自於Redis用戶端開源函式庫redis-py的臭蟲,目前所有相關錯誤都已修復。

在錯誤發生期間,部分用戶會看到另一個活躍用戶的對話紀錄標題,而當兩個用戶皆處在活躍狀態,則新對話的第一條訊息,也可能會出現在另一人的聊天記錄中。ChatGPT的故障不只如此,少數新訂閱者的付款資料和個資,也會意外地透過電子郵件洩漏,用戶可能收到另一個ChatGPT Plus訂戶的訂閱確認信件,內容包含姓名、電子郵件信箱、付款地址、信用卡號碼後4碼還有信用卡到期日期。

在OpenAI發現這個錯誤來自於Redis客戶端開源函式庫redis-py,便緊急連絡Redis維護者,還提供了修補程式碼,迅速解決這個問題。

ChatGPT使用Redis快取用戶的資訊,讓系統不需要為每一個請求都存取一次資料庫,OpenAI透過Redis Cluster將這項負載分散到Redis執行個體,在OpenAI的Python伺服器中,使用了redis-py函式庫操作Redis,而Python伺服器則是採用Asyncio非同步I/O框架,藉以提高Python伺服器在處理大量請求時的效能。

Redis-py函式庫在Python伺服器和Redis叢集間維護了一個共享連接池,會在完成請求之後回收連接,以用於處理下一個請求。而錯誤發生在於Asyncio、redis-py的請求與回應處理時,請求和回應分別存放於兩個佇列,呼叫者會將請求推送到傳入佇列(Incoming Queue)中,請求經過處理之後,輸出至傳出佇列(Outgoing Queue),回應由傳出佇列彈出,而連接被釋出回連接池。

不過,當請求被推送到傳入佇列,但是在回應從傳出佇列彈出之前就被取消的話,便會出現錯誤,因為連接被破壞,不相關的回應便接收了遺留在連接中的不相關的請求資料。但之所以之前這個臭蟲沒有被發現,是因為在大多數情況,這可能出現不可恢復的伺服器錯誤,因此用戶只好重新請求,而且在部分時候,壞掉的資料剛好跟使用者請求的資料類型相符,因此從快取回傳的資料也就看起來沒什麼問題,但其實該回應來自於另一個用戶。

OpenAI在3月20日的時候因為調整伺服器,意外的使Redis請求取消數暴增,使得每一個連接都有機會發生錯誤,所以也就讓Redis-py函式庫的臭蟲浮上臺面。這個錯誤僅發生在Redis Cluster的Asyncio redis-py客戶端,而目前這個問題已經修復。

測試修復程式碼經官方廣泛測試,確保問題不會再發生,OpenAI也添加額外的檢查,確保Redis快取回傳的資料與請求用戶相符,並且透過比對多重資料,找出受影響的用戶,提供必要的協助,OpenAI也擴大了Redis叢集規模以及強健性,減少在極端負載時出現錯誤連接的可能性。

熱門新聞

Advertisement