
本文作者正是上述團隊中的一名軟體工程師,也是 Reworkd 的聯合創始人。Reworkd 是一家 YC S23 公司,從網路中提取結構化資料。他們還製作了智慧化分析問題的工具 AgentGPT。以下內容由 InfoQ 整理並翻譯。
作者宣告:首先強調一點,本文提及的作法問題很大,本可避免。但一切都是時間緊迫之下匆忙行動下的後果。請大家在閱讀時多多諒解,嘴下留情。

雖然系統仍在執行,但訂閱功能卻掛掉了……或者說是死而不僵……
去年 5 月,我們首次嘗試靠自己的初創業務賺錢。我們的期望不高,因此在釋出後不到一個小時就迎來第一位客戶時,我們感到萬分驚喜。那是個奇蹟般的時刻,我們向用戶表達了謝意。而且考慮到之前的準備工作花了整整兩個晚上,所以我們信心滿滿地上床休息了。
第二天早上醒來時,我們收到 40 多條使用者投訴的郵件通知。看似靠譜的系統似乎在一夜之間崩潰決堤,而問題只有一個——使用者無法訂閱。我們根本不知道是怎麼搞的。
先介紹一點業務背景。今年 5 月 YC 第 23 賽季正式啟動,我們也不太確定產品釋出之後該怎麼盈利。我們的 YC 團隊合夥人 Dalton 建議一切以付費使用者為中心,並提出應該將我們預先想好的月費數字翻個倍。最終(雖然很不情願),我們定下了每月 40 美元的價格。會議結束之後,我們立即著手設計商業模式。我們的專案最初採用全棧 NextJS,但後來打算將所有內容遷移至 Python/FastAPI。在 ChatGPT 的幫助下,我們順利完成了工作,實現了 stripe 的全面整合……問題爆發後,我們又衝刺了整整五天時間,那也是我們整個月內最夜不能寐的五個日夜。
在這五天裡,我們既難以入睡、又很害怕醒來——因為每天起床,我們都會收到好幾十封投訴郵件。哪怕如今事情過去,我也不禁會想這次的問題讓我們失去了多少客戶。
按照每天 50 封郵件、每週 5 天、每位訂戶 40 美元的數字來計算,意味著單是在願意表達意見的這部分使用者中就出現了 1 萬美元的銷售損失。而且請大家注意,願意發聲的永遠只是一小部分。我們每天都會準時回覆這些郵件。大家會抱怨點選訂閱時載入圖示沒完沒了地旋轉,而我們則會嘗試開設新賬戶來親自驗證。在我們這邊訂閱流程順利進行,於是一切在摸不著頭腦之下繼續保持原樣。我們用盡了種種辦法,但根本無法重現這個問題。更奇怪的是,在進入上班時間之後,幾乎就不再新增任何投訴了。
單從感受出發,從發現問題到真正解決問題的那段前列時光就像是過去了好幾個月。在這五天當中,我們收到了無數電子郵件、數百條監控日誌、跟 stripe 工程師們在 discord 上隨時交流。最終在花了幾個小時盯著 5 個關鍵檔案後,我們終於搞清了真相。線索就在以下截屏當中,感興趣的朋友可以先別急著下翻,試試能不能自行找到答案。

如果沒找到也不要緊,其中的罪魁禍首就是下面這行看似無辜的程式碼。這行程式碼也讓我們遭遇到人生中最折磨的一個禮拜,並讓我們確確實實損失掉了上萬美元。一起來看這第 56 行:

事情是這樣的:作為後端遷移的一部分,我們將資料庫模型從 Prisma/Typescript 轉換為 Python/SQLAlchemy。整個過程非常繁瑣,而我們發現 ChatGPT 在執行這類轉換時表現相當出色,於是我們在整個遷移過程中幾乎隨時都在使用它。
我們複製貼上了它生成的程式碼,發現一切執行良好;之後又在生產中進行測試,結果也同樣有效。於是我們興高采烈地推進,卻忘記了此時我們仍在使用 Next API 進行資料庫插入,且 Python 程式碼只負責從資料庫中讀取。我們第一次開始在 Python 中實際插入資料庫記錄是在訂閱功能的實現階段,雖然我們為此手動建立了全新的 SQLAlchemy 模型,但最終卻仍然照搬了 ChatGPT 為原有模型編寫的舊格式程式碼。當時的我們根本沒意識到,所有模型當中的 ID 生成方式都已經出了問題。
第 56 行中的問題在於,我們只是傳入了一條硬編碼的 ID 字串,而非使用函式或 lambda 來為我們的記錄生成 UUID。也就是說,對於我們後端中的任何給定例項,一旦單個新使用者訂閱並使用此 ID,其他使用者就無法再次執行訂閱流程,因為這會導致唯一 ID 衝突。但受我們後端設定的影響,這個問題被嚴嚴實實地隱蔽了起來。
我們在亞馬遜雲科技上執行有 8 項 ECS 任務,它們全都執行著我們後端的 5 個例項(這確實只能算過渡性方案,但我們手頭正好有不少亞馬遜積分,換作是各位肯定也會照此辦理)。也就是說任何單一使用者都面對著包含 40 個唯一 ID 的資源池,也是他們能夠成功訂閱的最高上限。

工作日期間之所以一切運轉良好,就是因為我們的日均提交次數大概在 10 到 20 次(當然是直接提交至主伺服器),進而觸發新的後端部署操作,從而為我們提供 40 個可供客戶使用的新 ID。然而到了晚間,當我們不再執行提交,這些伺服器上的可用 ID 就會被快速耗盡,並導致所有後續訂閱遭遇 ID 衝突。使用者雖然剛開始有 40 個伺服器訂閱 ID,但這個數字在漫漫長夜中很快歸零。在最終解決了這個問題後,我們感到如釋重負。
在發現問題並迅速提出修復方案之後,我們終於能夠踏踏實實睡覺、不用擔心第二天被使用者們罵醒了(也不盡然,期間我們還出過其他好幾次事故,但這就是另外的故事了)。
回想起來,無論那五天過得有多麼煎熬,都將成為我們永遠無法忘懷的一段創業經歷。如今的我們終於能以輕鬆的心態回顧那段日子,調侃說我們本該多做點測試、也不該貿然照搬 ChatGPT 生成的程式碼,更需要在提交之前多加考量。
但畢竟這就是人生,這就是從無到有的創業體驗。
參考連結:
https://web.archive.org/web/20240609213809/https://asim.bearblog.dev/how-a-single-chatgpt-mistake-cost-us-10000
內容推薦
大模型已經在各種領域有著廣泛的應用和實踐,如BI、企業生產、AIoT、程式設計、資料分析等場景。各個企業當前的探索為大家在落地時解決各種問題提供了重要參考。「AI前線」整理了AICon 北京 2024上大模型在不同領域的應用探索和 Agent 實踐相關PPT以及資料。關注「AI前線」,回覆關鍵詞「應用探索」即可免費獲取。

InfoQ 將於 8 月 18 日至 19 日在上海舉辦 AICon 全球人工智慧開發與應用大會,匯聚頂尖企業專家,深入端側AI、大模型訓練、安全實踐、RAG應用、多模態創新等前沿話題。現在大會已開始正式報名,6 月 30 日前可以享受 8 折優惠,單張門票節省 960 元(原價 4800 元),詳情可聯絡票務經理 13269078023 諮詢。

關鍵詞
大模型
程式碼
模型
問題
使用者