如何把 AI 原型做成可用于生产的应用
把 AI 原型推向生产,就是弥合“我试的时候它能用”和“很多人用的时候它依然能用”之间的差距。具体来说包括五件事:每次修改后都测试主要流程,严格控制谁能看到和修改什么,确保在用户告诉你之前就能及时发现错误,备份数据并证明自己能够恢复,以及让应用在手机上依然足够流畅。这些都不需要重写,它是一份检查清单,你可以和当初搭建原型的那个 AI 一起逐项完成。
原型与生产:究竟改变了什么
原型只有一个小心翼翼的用户:你自己。你知道该点哪些按钮,输入的内容也合理,出了问题你耸耸肩,然后让 AI 去修。生产环境则有许多粗心的用户、一些好奇的用户,偶尔还会有一个怀有恶意的用户。代码并不需要变得“企业级”,它只需要能应对原型从未遇到过的各种情况。
| 方面 | 原型 | 生产 |
|---|---|---|
| 数据 | 样例数据,随时可以重置 | 真实的客户数据,一条都不能丢 |
| 用户 | 只有你,以管理员身份登录 | 许多账户,权限各不相同 |
| 输入 | 你自己输入的内容 | 空字段、超大文件、奇怪的字符、脚本 |
| 错误 | 你在预览中就能看到 | 可能在你睡觉时发生 |
| 修改 | 修改后看看效果 | 修改时不能破坏用户依赖的功能 |
| 密钥 | 测试密钥随便用 | 泄露后会产生费用的正式密钥 |
本指南的其余部分会逐一讲解表中的每一项。
第一步:冻结范围,写下主要流程
在加固任何东西之前,先确定第一版要做什么。列出三到六个最重要的流程,例如“注册、创建项目、邀请团队成员、付款”。这些将成为你的测试脚本、监控对象,以及每次修改之后需要检查的内容。
清单之外的功能要么砍掉,要么明确标注为测试版。把四个流程做得稳定,远比做十四个容易得多。
第二步:像陌生人一样测试,然后让测试可重复
AI 搭建工具很擅长生成“顺利路径”上能跑通的代码。生产问题恰恰潜伏在“不顺利的路径”上。请针对每个主要流程,用以下方式测试:
- 错误的输入:必填字段为空,输入 5000 个字符的名字,邮箱里没有 @,数量为负数,日期设在过去。
- 刷新和后退按钮:在结账途中刷新页面;提交表单后按后退键。会不会重复创建数据?
- 两个标签页,两个用户:用两个不同账户登录,尝试通过修改网址中的 ID 打开对方的页面。
- 慢速和小屏幕:用手机尺寸的屏幕,并模拟较慢的网络(浏览器开发者工具可以模拟)。
- 空状态:全新的账户,没有任何数据。原型通常基于样例数据构建,没有数据时就会显得坏掉。
然后让检查变得可重复。最低要求是保留一份书面清单,并在每次发布前运行。更好的做法是请 AI 为最重要的流程编写自动化测试:
为以下流程添加自动化端到端测试:用邮箱注册、创建项目、邀请第二个用户,并在 Stripe 测试模式下完成结账。另外添加测试,确认用户无法通过修改网址查看或编辑其他用户的项目。
证明用户“不能”做某件事的测试,恰恰是原型最常缺少的。
第三步:原型常常忽略的基础安全措施
AI 搭建的应用,大多数安全问题并不神秘,只是缺少检查。请逐项核对以下清单,更完整的内容参见AI 搭建应用安全检查清单:
- 服务器端的授权。 隐藏按钮并不等于安全。每一个读取或修改数据的请求,都必须在服务器上检查登录用户是否有权限。如果你的应用使用带行级规则的数据库,请确认规则已开启并经过测试。
- 密钥不要放在浏览器里。 支付、邮件或 AI 服务的 API 密钥,应存放在服务器端的环境变量中,绝不能出现在前端代码里。如果你不确定这意味着什么,请阅读什么是环境变量和密钥。
- 服务器端校验。 浏览器端的检查可以被绕过,因此所有重要的校验都要在服务器上再做一遍。
- 正确地处理登录。 使用经过充分测试的认证库或服务,而不是自己手写密码存储。我们关于为应用添加登录功能的指南介绍了各种选择。
- 频率限制:用于登录、注册、重置密码,以及任何会发送邮件或调用付费 API 的功能。
- 友好的错误提示。 用户只应看到“出错了”之类的提示,详细信息应记录在日志中,而不是显示在屏幕上。
- 轮换已泄露的密钥。 如果正式密钥曾被粘贴到聊天、代码提交或截图中,请立即在服务商处更换。
一个可以一次覆盖大量内容的提示词:
检查这个应用是否具备生产级安全性。确认每个 API 路由都会验证登录用户是否拥有其读取或修改的记录,确认没有任何密钥被发送到浏览器,确认输入在服务器端经过校验,并确认登录和重置密码功能有频率限制。在修改任何内容之前,先列出你发现的问题。
先要求列出问题清单,你就能看清问题并决定处理顺序,而不是一下子收到一个巨大的改动。
第四步:及时发现问题:日志与监控
在预览中,你能看到错误发生的过程。在生产环境中,则需要应用主动告诉你。可以分为三层,从最便宜到最有用:
- 服务器日志。 确保错误被记录,并附带足够的上下文以便复现:哪个路由、哪个用户 ID(绝不记录密码或银行卡信息)、输入的结构。如果应用只是把信息打印到控制台,可以请 AI 添加结构化日志。
- 错误追踪。 Sentry 或类似的服务可以捕获前端和后端的异常,进行分组,并向你发送邮件。对于小型应用,这些服务的免费套餐通常已经够用;具体限额请查看各服务商的官网。
- 正常运行时间检查。 由外部服务每隔几分钟访问一次你的首页和一个关键 API 路由,失败时通知你。这能发现那些让应用甚至无法记录日志的问题。
再养成一个习惯:每次发布之后,在真实的线上网址(而不只是预览)上打开应用,并运行一遍主要流程清单。
第五步:备份与回滚方案
有两类不同的东西需要保护,它们很容易被混淆。
- 代码。 把项目放在版本控制中,这样任何修改都可以撤销。许多 AI 搭建工具会为你的文件保存检查点;同步到 Git 仓库,还能在搭建工具之外保留一份副本。
- 数据。 回滚代码并不会回滚数据库。一次有问题的数据迁移或一个有缺陷的删除按钮,可能会删除任何代码检查点都无法找回的数据。
对于数据,请设置定期备份,并存放在应用托管平台之外的地方。对于 Postgres 数据库,常见做法是定时运行 pg_dump 并保存到独立的存储中;许多托管数据库服务商也提供自动备份或时间点恢复功能。然后做大多数人会跳过的一步:把备份恢复到一个临时数据库中,检查数据是否完整。
另外,请 AI 让破坏性操作更安全:删除前增加确认步骤;对于用户可能想找回的内容,采用“软删除”(只把记录标记为已删除,而不是真正移除)。
第六步:在手机上也经得起考验的性能
原型之所以运行流畅,是因为只有你一个用户,数据量也很小。上线前请注意:
- 用真实规模的数据测试。 请 AI 生成几千条数据,看看哪些页面会变慢。列表通常需要分页,而数据库通常需要为你筛选和排序所用的列建立索引。
- 压缩图片。 图片过大是页面加载缓慢最常见的原因。请 AI 帮你调整尺寸、压缩图片,并对首屏以下的图片启用懒加载。
- 实际测量。 在 Chrome 开发者工具中,以移动端模式对线上网址运行 Lighthouse。Google 的 Core Web Vitals 是一个合理的目标:最大内容绘制(LCP)在 2.5 秒以内,交互到下一次绘制(INP)为 200 毫秒或更短,累积布局偏移(CLS)为 0.1 或更低。
- 留意“唤醒”延迟。 闲置时会休眠的托管服务可以节省费用,但长时间无人访问后的第一次打开会更慢。对于新应用,这通常是可以接受的取舍,但要知道它的存在。
当数据达到 5000 行时,项目列表页面会变慢。请添加服务器端分页(每页 25 条),为我们筛选和排序所用的列添加数据库索引,并在加载下一页时显示加载状态。
第七步:运营基础
有几件小事能把一个业余应用和一个值得用户信赖的应用区分开来:
- 自定义域名并启用 HTTPS。参见如何连接自定义域名。
- 来自已验证域名的事务性邮件,用于注册确认和重置密码。详见如何从应用发送邮件。
- 隐私政策和服务条款,描述你实际收集的信息。不要复制你并未真正做到的合规承诺。
- 用户支持渠道,哪怕只是一个有人会查看的邮箱地址。
- 测试密钥和正式密钥分开,支付和邮件服务都是如此,并清楚记录哪个环境使用哪个密钥。
第八步:规范的交接
迟早会有其他人接手这个应用:自由职业者、新的联合创始人,或者六个月后的你自己。让交接变得容易:
- 一份 README,说明如何运行、需要哪些环境变量(只写名称,绝不写值),以及如何部署。
- 主要流程检查清单和自动化测试。
- 简短的架构说明:前端、后端、数据库、第三方服务,以及每一项部署在哪里。
- 权限清单:谁拥有域名、托管、数据库、支付和邮件账户的管理员权限。这些账户应使用企业邮箱注册,而不是个人邮箱。
- 代码放在 Git 中,最好同步到你自己拥有的代码仓库。如果以后可能更换托管平台,请阅读如何导出并自托管 AI 搭建的应用。
AI 可以帮你起草大部分内容:
为一位从未见过这个项目的开发者编写 README:应用做什么、技术栈、如何在本地运行、它读取的每个环境变量(只写名称和用途)、数据库结构如何组织,以及如何部署。
生产就绪检查清单
- 主要流程已写下并经过测试,包括“无法访问他人的数据”
- 每个数据路由都在服务器端做了授权和校验
- 前端代码中没有密钥;已泄露的密钥已轮换
- 对登录和任何会产生费用的功能设置了频率限制
- 错误追踪和正常运行时间告警指向一个你会查看的收件箱
- 数据库备份存放在应用托管平台之外,并成功测试过一次恢复
- 已用真实规模的数据检查分页和索引
- 自定义域名、已验证的发信域名、隐私政策
- 为接手的人准备了 README 和权限清单
在 Mythex 中完成这些工作
如果你的原型是在 Mythex 中搭建的,那么这些步骤中的大多数,都可以在同一个项目中通过提示词完成。输入 /test,Mythex 会像用户一样在实时预览中点击操作,并报告出错的流程,参见应用测试。密钥应放入项目机密设置,而不是聊天框中;每次智能体成功完成一轮操作,都会为你的文件保存一个检查点,你可以随时回退。发布后会获得一个线上网址,托管和数据库的费用从同一个积分余额中扣除(托管限制说明了应用和数据库如何休眠与唤醒)。检查点只保存文件,不保存数据库中的记录,因此仍需规划数据备份。Pro 套餐下,你可以连接自定义域名,并导出代码或同步到自己的 GitHub 仓库,方便交接。
常见问题
原型和生产级应用有什么区别?
原型证明创意是可行的,前提是使用者小心操作。生产级应用则要在陌生人随意使用时依然正常运行:保护他们的数据,能应对错误的输入,出问题时及时告诉你,并且在发生故障时可以恢复。
AI 搭建的应用能用于生产环境吗?
可以,只要你像检查任何应用那样检查它。AI 写出来的代码就是普通代码;它常常会忽略、除非你特别要求才会做的,是那些不起眼却必不可少的工作:访问权限检查、输入校验、错误处理、日志记录和备份。
上线前需要自动化测试吗?
每次发布之前,至少需要对主要流程做一遍可重复的检查。对于小型应用,可以是一份书面的点击步骤清单;随着应用变大,可以请 AI 为那些直接影响收入的流程添加自动化测试。
如何备份应用的数据库?
定期导出数据库(对于 Postgres,可以使用 pg_dump),并把备份存放在应用托管平台之外的地方。然后至少测试一次恢复,因为没有经过测试的备份只是一种希望。