企業級 Agents 開發實戰營》重磅上線,10 周帶你進行工具、對話及多模態等不同類型 Agents 工程化開發實戰!
編者按:ChatGPT 在編程時的使用已經非常廣泛。近日,一支國外技術團隊在利用 ChatGPT 生成代碼進行開發時遇到了嚴重的問題,導致了他們的訂閱功能崩潰,并且給業務帶來了重大損失。盡管 ChatGPT 等 AI 工具在編程領域具有潛力,但它們并不總是能夠提供完美或適用于特定場景的解決方案。在這種情況下,如果技術團隊過于依賴這些工具,并在時間壓力下被迫做出決策,那最終的結果往往都是不樂觀的。
本文作者正是上述團隊中的一名軟件工程師,也是 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 生成方式都已經出了問題。
Bug 圍剿行動
第 56 行中的問題在于,我們只是傳入了一條硬編碼的 ID 字符串,而非使用函數或 lambda 來為我們的記錄生成 UUID。也就是說,對于我們后端中的任何給定實例,一旦單個新用戶訂閱并使用此 ID,其他用戶就無法再次執行訂閱流程,因為這會導致唯一 ID 沖突。但受我們后端設置的影響,這個問題被嚴嚴實實地隱蔽了起來。
我們在亞馬遜云科技上運行有 8 項 ECS 任務,它們全都運行著我們后端的 5 個實例(這確實只能算過渡性方案,但我們手頭正好有不少亞馬遜積分,換作是各位肯定也會照此辦理)。也就是說任何單一用戶都面對著包含 40 個唯一 ID 的資源池,也是他們能夠成功訂閱的最高上限。
