写点什么

联创用 ChatGPT 写的一行代码让公司损失上万美元!网友:老板自己写的,找不到人背锅了

Asim Shrestha

  • 2024-06-19
    北京
  • 本文字数:2388 字

    阅读完需:约 8 分钟

大小:1.14M时长:06:37
联创用ChatGPT写的一行代码让公司损失上万美元!网友:老板自己写的,找不到人背锅了

编者按: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 的资源池,也是他们能够成功订阅的最高上限。

 


工作日期间之所以一切运转良好,就是因为我们的日均提交次数大概在 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/

2024-06-19 11:459131
用户头像
李冬梅 加V:busulishang4668

发布了 1002 篇内容, 共 613.7 次阅读, 收获喜欢 1177 次。

关注

评论 3 条评论

发布
用户头像
很多python模块的默认值设计都是这样的模式,如果是callable则视为工厂,否则视为字面值。或许让LLM在生成代码的同时也生成对应的单元测试用例能缓解这样的问题。
2024-06-24 09:35 · 福建
回复
用户头像
前端生成UUID? 666
2024-06-23 10:46 · 浙江
回复
用户头像
翻译的很艰涩,怀疑也是GPT翻译的。
2024-06-21 19:22 · 陕西
回复
没有更多了
发现更多内容

分库分表的 9种分布式主键ID 生成方案,挺全乎的

程序员小富

分库分表 Java 分布式

go-zero如何追踪你的请求链路

万俊峰Kevin

Trace microservice Go 语言

解决大中型浏览器(Chrome)插件开发痛点:自定义热更新方案——2.基于双缓存更新功能模块

梁龙先森

Java chrome 大前端 浏览器 技术方案

帮助企业摆脱困境,名企归乡工程师:能成功全靠有它!

Philips

敏捷开发

移动安全加固助力 App 实现全面、有效的安全防护

蚂蚁集团移动开发平台 mPaaS

安全攻防 App风险 mPaaS

每周一看:16份文档资料,程序员软硬实力全概览,总有一个适合你

小Q

Java 学习 程序员 架构 面试

LeetCode题解:77. 组合,递归回溯,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

mongodb 源码实现系列 - 网络传输层模块实现三

杨亚洲(专注MongoDB及高性能中间件)

MySQL mongodb 分布式 高性能 分布式数据库mongodb

浅谈API网关(API Gateway)如何承载API经济生态链

华为云开发者联盟

API 网关

《Python:Python编程简介:计算机编程和机器学习入门指南》

计算机与AI

Python

会展云技术解读 | 面对突发事故,APP如何做好崩溃分析与性能监控?

京东科技开发者

云计算 云服务

Apache DolphinScheduler 是如何走进Apache的

代立冬

大数据 数据湖调度 DolphinScheduler Apache DolphinScheduler

【运维思考】如何做好云上运维服务?

嘉为蓝鲸

云计算 运维 数字化转型 数据中心 云服务

阿里云官方推出操作系统“等保合规”镜像 -- Alibaba Cloud Linux 等保2.0三级版

阿里云基础软件团队

内核

技术分享:WebAssembly能否重新定义前端开发模式?

葡萄城技术团队

webassembly

DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座

华章IT

数据库 postgresql

医疗界“最强大脑”落户杭州!阿里巴巴联合浙大一院共同打造

互联网

揭秘在召唤师峡谷中移动路径选择逻辑?

华为云开发者联盟

算法 地图 最短路径

简析低代码开发与传统开发的区别与优势

Marilyn

敏捷开发 低代码

【云小课】版本管理发展史之Git+——代码托管

华为云开发者联盟

git 代码管理 托管

谈谈敏捷开发概念和迭代开发方案

Learun

敏捷开发

“开源软件供应链点亮计划-暑期2020”公布结果 基于ChubaoFS开发的项目获得最佳质量奖

京东科技开发者

大数据 开源 云原生

天啦撸!打印日志竟然只晓得 Log4j?

沉默王二

Java 日志 log4j

嗯,查询滑动窗口最大值的这4种方法不错...

王磊

Java 数据结构和算法

重磅解读:K8s Cluster Autoscaler模块及对应华为云插件Deep Dive

华为云开发者联盟

容器 k8s 服务

接口测试如何在post请求中传递文件

测试人生路

接口测试

【涂鸦物联网足迹】API及SDK介绍

IoT云工坊

软件开发 物联网 API sdk 云平台

终于啃完了这份Java核心原理+框架“面试圣经”,成功五面上岸美团

Java架构追梦

Java 架构 面试 微服务 框架开发

如何实现后台管理系统的权限路由和权限菜单

徐小夕

Java 大前端 编辑器 H5 数据可视化

架构师训练营 - 第 7 周课后作业(1 期)

Pudding

架构训练营 - 第7周课后作业 - 学习总结

Pudding

联创用ChatGPT写的一行代码让公司损失上万美元!网友:老板自己写的,找不到人背锅了_生成式 AI_InfoQ精选文章