Stripe 的 100 毫秒
你网购时点下「购买」按钮,到支付成功——大概 100 毫秒。
在这 100 毫秒里,Stripe 的系统会评估你超过 1000 个特征:卡片历史、IP 地址、设备指纹、购物习惯。然后决定你是好人还是坏人。
100 毫秒。做一次审判。错判率 0.1%。
读 Stripe 工程师写的 Radar 技术博客时,最先震到我的不是这些数字,是另一件事:
他们花了七年,推翻了自己三次,才做到这 100 毫秒。
好系统都是”自毁”出来的
Section titled “好系统都是”自毁”出来的”Radar 最初用的是逻辑回归——最简单的 ML 模型。后来升级到 XGBoost + 深度神经网络的组合,效果不错,已经是行业顶配了。
但他们拆掉了 XGBoost,换成纯深度学习。
原因是 XGBoost 拖住了他们——迁移学习、embedding、长时间训练,这些新玩法和它不兼容。而且 XGBoost 无法并行训练,工程师们每天只能跑一轮实验。
代价是准确率掉了 1.5%。
上线的系统本来就好用,为了一个不确定的未来主动牺牲 1.5% 的准确率。正常公司会犹豫。
他们的解法是用多分支 DNN 架构,灵感来自 ResNeXt。把计算拆成多个「小网络」,各自学不同层次的特征,然后汇总。

训练时间缩短了 85%,从通宵跑到白天跑几轮。
1.5% 的准确率换 85% 的训练速度。这笔账划得来。
我看完就在想一个简单的问题:如果你现在从零开始,你会怎么做?大多数人不会问。我们习惯了「够用就好」,但「够用」是陷阱——它让你停在局部最优,以为那就是终点。
数据量不是加法,是乘法
Section titled “数据量不是加法,是乘法”第二个震到我的点,是他们对「数据越多越好」这件事的实践。
XGBoost 时代,增加训练数据的效果很快饱和。这几乎是 ML 界的共识:数据不是万能药。
但换了纯 DNN 之后,情况完全不同了——训练数据翻 10 倍,模型性能还在涨。

大多数人直觉是数据多了边际递减。Stripe 的发现反过来了——架构对了,数据是乘法。
XGBoost 做不到,纯 DNN 做到了。归根结底还是第一个教训:架构先对,数据才会给你惊喜。
检测出结果不难,难的是告诉用户”为什么”
Section titled “检测出结果不难,难的是告诉用户”为什么””第三个教训,也是我觉得最被低估的:解释和检测一样重要。
你是一个电商老板,Stripe 告诉你「这笔交易是欺诈,我帮你拒了」。你第一反应是什么?
「凭什么?」
不给理由,用户不会感激你,只会怀疑。更糟的是误杀了真实客户——虽然只有 0.1% 的概率——你得让人知道为什么,下次才能避免。
所以他们做了 Risk Insights:每一笔交易被拒,告诉用户具体原因。卡主姓名和邮箱匹不匹配?这个 IP 关联过多少张卡?有没有异常交易模式?

用户能看到具体的欺诈信号,就能反过来改进数据质量、定制规则、减少误杀。
一个黑盒再准,也不如透明的盒子让人信。
做 ML 产品的人都该记住这一点。
100 毫秒的背后是七年
Section titled “100 毫秒的背后是七年”Radar 的 100 毫秒是技术成就,也是一种工作方式的产物。
不满足于「已经够好」。主动拆掉好用的旧架构。在没人要求的地方做可解释性。在数据上死磕。
七年。三个教训。100 毫秒。
对我而言,不管是不是做技术,这件事只有一个启示:
真正的高手,不是找到一个好方法然后守住它。而是不断地毁掉自己的好方法,去找更好的那个。
你在工作里有没有过「主动拆掉好用的东西」的经历?结果怎么样?
Ryan Drapeau. How we built it: Stripe Radar. Stripe.dev Blog. https://stripe.dev/blog/how-we-built-it-stripe-radar