从模型到系统
多年来,数据科学家的形象非常容易识别。
一台笔记本电脑。 一个 Jupyter notebook。 一个大型数据集。 一些 Python。 几个图表。 也许中间有一个随机森林、XGBoost 模型或神经网络。
训练模型。检查指标。展示结果。
完成。
除了……并非如此。
因为迟早有人会问一个非常危险的问题:
"酷。我们可以把它投入生产吗?"
突然之间,准确率、F1 分数和 RMSE 不再是唯一重要的事情。
有人需要通过 API 暴露模型。 有人需要对代码进行版本控制。 有人需要打包依赖项。 有人需要部署它。 有人需要确保两个更改同一代码库的开发人员不会破坏一切。 有人需要监控它。 有人需要在凌晨 2 点发现它何时中断。 最终有人需要在不关闭整个应用程序的情况下更新它。
在那个时候,有些事情变得清楚:
我们不再构建模型了。我们正在构建系统。
而系统需要软件工程。
1、Notebook 从来不是最终目的地
Notebook 没有什么问题。
它们是出色的工具。
我使用它们。你可能也使用它们。几乎每个处理数据的人都使用它们。
它们非常适合探索、实验、可视化和快速测试想法。
典型的工作流程可能如下所示:
数据
↓
探索
↓
特征工程
↓
模型
↓
评估
↓
漂亮的图表
如果准确率看起来不错,每个人都很高兴。
但生产引入了一个完全不同的世界。
想象一下,你创建了一个预测客户是否会取消订阅的模型。
在你的 notebook 中,这可能出奇地简单:
model.fit(X_train, y_train)
predictions = model.predict(X_test)
accuracy_score(y_test, predictions)
也许你会得到:
准确率:92%
很好。
现在想象你的公司希望每次客户打开移动应用程序时都使用此预测。
突然之间,你的模型需要成为这样的东西的一部分:
客户
↓
移动应用
↓
后端 API
↓
特征服务
↓
ML 模型
↓
数据库
↓
业务规则
↓
客户收到优惠
而在所有这些周围:
┌──────────────────────┐
│ 监控 │
│ 日志 • 指标 │
│ 跟踪 • 告警 │
└──────────────────────┘
↑
│
应用 → API → 服务 → 模型 → 数据库
│
↓
┌──────────────────────┐
│ 安全 • CI/CD │
│ 测试 • 版本控制 │
└──────────────────────┘
模型不一定变得更复杂。
模型周围的系统变得更复杂了。
这种差异是理解现代数据和 AI 工作最重要的事情之一。
2、你的模型只是一个组件
通过现代 AI 应用程序,这一点变得更加清晰。
考虑一个由大型语言模型驱动的聊天机器人。
从外部看,它可能看起来很简单:
用户 → LLM → 答案
但真实的系统很少看起来像那样。
它们看起来更像:
┌──────────────┐
│ 向量数据库 │
└──────▲───────┘
│
用户 → 前端 → API → AI 代理 → LLM
│ │
│ ├── 外部 API
│ │
│ ├── 数据库
│ │
│ └── 工具
│
▼
日志 / 跟踪 / 指标
现在想象这个代理可以搜索文档、调用 API、访问数据库和执行工具。
有趣的 ML 问题可能是:
我们应该使用哪个模型?
但工程问题很快变得更大:
当外部 API 失败时会发生什么? 当 LLM 需要 30 秒来回答时会发生什么? 如果模型产生无效的 JSON 会怎样? 我们如何重试失败的请求? 我们如何防止同一个工具被调用 100 次? 我们如何控制对敏感数据的访问? 我们如何知道哪个步骤导致了错误的答案? 我们如何部署新版本? 我们如何回滚它? 我们如何测试部分概率性的东西?
这些主要是机器学习问题。
它们是软件工程问题。
3、角色开始重叠
这种转变正在多个职业中发生。
数据科学家
传统上专注于:
- 统计学;
- 实验;
- 建模;
- 特征工程;
- 可视化。
但越来越期望理解:
- Git;
- API;
- 测试;
- 打包;
- 云环境;
- 部署基础知识。
数据工程师
他们已经更接近软件工程了。
现代数据平台涉及分布式系统、编排、API、基础设施、测试和可靠性。
数据管道是软件。
而每天处理数十亿条记录的管道绝对不仅仅是"SQL"。
机器学习工程师
这个角色一直存在于 ML 和软件工程之间。
ML 工程师必须理解模型,但也要理解如何将这些模型转化为可靠的服务。
在许多组织中,工作本质上是:
机器学习
+
软件工程
+
基础设施
AI 工程师
生成式 AI 使这种重叠更加强烈。
现代 AI 应用程序涉及:
- LLM API;
- 代理;
- RAG;
- 向量数据库;
- 队列;
- 缓存;
- 身份验证;
- 工具执行;
- 提示管理;
- 可观察性;
- 评估框架。
AI 模型可能是最复杂的组件。
但它仍然只是一个组件。
4、那么……每个人都需要成为软件工程师吗?
不。
这种区别很重要。
数据科学家不需要知道高级后端工程师所知道的一切。
ML 工程师不一定需要成为前端开发专家。
数据工程师不需要花六个月时间研究编译器设计。
重点不同。
数据和 AI 专业人员越来越需要软件工程素养。
把它想象成一种通用的工程语言。
你应该理解足够多的内容,以便参与关于系统如何构建的对话。
至少我认为,现代数据和 AI 专业人员从理解以下领域受益匪浅:
你不需要在所有领域都有专家级的知识。
但不知道它们是什么正变得越来越昂贵。
5、从"它能工作"到"它能持续工作"
软件工程引入了一种重要的思维方式转变。
在数据科学中,我们经常庆祝这个:
它能工作。
在软件工程中,问题变成了:
它能持续工作吗?
听起来很相似。
但并非如此。
想象一下,你训练了一个欺诈检测模型。
它表现得很出色。
然后你部署了它。
一周后:
- 输入模式发生变化;
- 一个上游服务开始发送空值;
- 请求翻倍;
- 响应延迟增加;
- 依赖项被更新;
- 内存使用量增长;
- 模型端点开始返回错误。
模型本身可能仍然完全正常。
系统失败了。
这就是为什么可靠性、可观察性、测试和容错等概念很重要。
生产系统必须经受住现实的考验。
而现实是混乱的。
6、一个简单的例子:notebook 与生产
假设我构建了一个推荐模型。
实验版本可能需要:
1 个 notebook
1 个数据集
1 个模型
生产版本可能需要:
Git 仓库
↓
数据管道
↓
特征处理
↓
模型训练
↓
模型注册表
↓
API 服务
↓
Docker 容器
↓
云基础设施
↓
CI/CD 管道
↓
监控
↓
告警
相同的模型。
完全不同的工程问题。
这就是为什么组织有时会发现一些令人惊讶的事情:
构建模型是容易的部分。
运营它是困难的部分。
7、另一个算法可能不是你最大的职业升级
这有点令人不舒服。
数据专业人员喜欢学习模型。
我们学习线性回归。
然后是逻辑回归。
决策树。
随机森林。
XGBoost。
SVM。
神经网络。
Transformer。
然后是上周二 arXiv 上出现的任何东西。
学习算法很重要。
但在某个时候,学习再多一个算法的边际价值可能小于学习如何:
- 编写干净的 Python 模块;
- 构建 API;
- 创建自动化测试;
- 使用 Docker;
- 配置 CI 管道;
- 部署服务;
- 监控应用程序。
对于许多数据科学家来说,下一个主要的职业升级可能不是另一个机器学习课程。
它可能是学习软件工程。
不是因为机器学习不那么重要。
而是因为当你能把它变成人们实际使用的东西时,机器学习变得更加有价值。
8、AI 让编码变得更容易——但工程更重要
这里有一个有趣的悖论。
生成式 AI 大大降低了编写软件的门槛。
今天我可以问一个 LLM:
"为此模型创建一个 FastAPI 端点。"
几秒钟后,我就有了代码。
我可以问:
"编写单元测试。"
完成。
"创建一个 Dockerfile。"
完成。
"生成一个 GitHub Actions 管道。"
完成。
很容易得出结论,软件工程知识因此变得不那么重要。
我认为相反的情况可能正在发生。
AI 让代码生成变得更容易。
但生成代码和工程系统是非常不同的活动。
仍然需要有人决定:
架构应该是什么样子? 状态应该在哪里? 哪个组件负责哪个职责? 当某事失败时会发生什么? 服务应该如何通信? 我们应该监控什么? 我们应该测试什么? 我们应该如何保护系统? 何时应该使用队列而不是同步 API 调用? 如果流量增加 100 倍会怎样?
AI 助手可以生成 Kubernetes 清单。
这并不自动意味着你知道 Kubernetes 是否合适。
它可以生成十个微服务。
这并不意味着你的应用程序需要十个微服务。
它可以极快地生成代码。
而这实际上可能使工程判断更有价值,而不是更少。
这里有一个有用的区别:
AI 可以帮助你编写代码。你仍然需要理解系统。
9、T 型数据和 AI 专业人员的崛起
我认为未来越来越属于通常所说的 T 型专业人员。
T 的水平部分代表广泛的工程知识:
Git | API | 测试 | 云 | Docker | CI/CD | 数据库 | 可观察性
──────────────────────────────────────────────────────────────────────────
│
│
│
▼
深度专业化
而垂直部分代表你的专业。
对于一个人:
统计学
机器学习
实验
对于另一个人:
数据平台
分布式处理
数据架构
对于另一个人:
LLM
代理
RAG
AI 系统
你不放弃专业化。
你用足够的工程知识围绕它,使专业化在更大的系统中有用。
这是一个重要的区别。
10、模型存在于系统中
也许总结一切最简单的方法是:
模型不是孤立存在的。
它消费另一个系统产生的数据。
它在另一个系统维护的基础设施上运行。
它通过另一个系统暴露预测。
它的输出影响另一个系统。
它生成另一个系统消费的日志。
它被另一个系统监控。
它通过另一个系统更新。
一旦你通过这个镜头看待机器学习和 AI,软件工程看起来就不再像一个可选的相邻学科。
它成为基础的一部分。
11、从模型到系统的转变
未来几年最有价值的数据和 AI 专业人员可能不是那些知道每个算法的人。
也不会每个人都突然成为传统的软件工程师。
相反,最强的专业人员可能是那些能够轻松地说两种语言的人:
数据和模型的语言
以及
软件和系统的语言。
他们可以在 notebook 中进行实验。
但他们也理解 notebook 之后必须发生的事情。
他们可以评估 ML 模型。
但他们也可以讨论 API、部署、可观察性和可靠性。
他们理解概率。
但他们也理解生产。
因为真正的挑战不再仅仅是:
我们能构建一个好的模型吗?
越来越多的是:
我们能围绕它构建一个可靠的系统吗?
这就是从模型到系统的旅程。
我怀疑这将在未来几年定义数据和 AI 工作的很大一部分。
汇智网翻译整理,转载请标明出处