“ai-engineering-from-scratch”——从零开始做AI工程,这个标题我太熟悉了。不少朋友问过我同一个问题:想做AI应用开发,是不是先把《深度学习》啃完、把Python刷到精通才能动手?我直接说,不是。AI工程这条线和算法研究是两码事,前者更像是一套组合拳:数据、训练、评估、部署、监控、迭代,哪一环都在考验工程能力,模型反而是其中最“标准件”的部分。
这篇文章我想以“从零搭建一条AI工程链路”为主线,把我在实际项目里踩过的坑、验证过的做法完整摊开。从数学和编程需要学到什么程度,到环境如何选型,再到如何用一套真实可运行的最小项目把“训练-评估-部署-监控”全流程串起来,最后聊聊那些教科书里不写、但生产环境一定会遇到的工程细节。如果你正准备入行AI工程,或者已经在做但总感觉链路不完整,这篇内容应该能帮你省下不少弯路。
1. AI工程和算法研究不是一回事:先纠正入门的起点
很多人一说“从零开始学AI”,下意识就拿起线性代数、概率论、Python刷题,先猛学半年再说。这个方向其实有偏差。AI工程的核心不是发明新模型,而是围绕已有模型构建一套可运行、可维护、可迭代的系统。打个比方:算法研究员像厨师,研究一道新菜的配方和火候;AI工程师像餐饮连锁的标准化厨房,要保证任何一家门店都能按固定流程做出稳定味道的菜。
这个定位差异直接决定了你的起点和学习重点。AI工程至少要覆盖四个环节:
- 数据工程:数据从哪儿来、如何清洗、如何标注、如何划分训练/验证/测试集、如何保证分布一致性。
- 模型开发与训练:选型、训练脚本、超参数管理、训练过程监控、结果复现。
- 服务化与部署:把训练好的模型封装成接口,处理请求调度、并发、无状态化与版本管理。
- 监控与迭代:模型上线后效果是否衰减、数据分布是否漂移、线上反馈如何回流再训练。
所以“from scratch”在我看来有两层含义:一是从零开始建立上述工程能力的知识体系;二是真正从空目录开始一步步搭建一套AI应用。它不是“从零推导Transformer”,而是“从零搞定一个能用的AI服务”。
1.1 为什么“调库侠”和“AI工程师”之间隔着一条工程交付的鸿沟
我见过不少同学,能熟练调用sklearn和transformers跑通公开数据集,准确率刷得很高,但一让他把模型放进真实系统里就手足无措。原因很简单:训练环境只是AI工程的一小段,生产中真正花时间的地方反而是那些“模型之外”的事。
举个例子。你用train_test_split随机切分数据,训练集AUC 0.85,模型上线后效果暴跌——大概率不是模型问题,而是数据切分时没考虑时间维度,导致训练集和验证集之间有信息泄漏。这种问题,训练脚本里根本发现不了,需要你在构建数据管线时就带着工程思维去设计。
再比如,你在本地训练好了模型,保存成model.pkl,然后写接口调用它。结果线上环境没有sklearn对应版本,或者Python小版本不同导致joblib加载直接报错。这类问题在教程里很少提到,但它是每个AI工程人都会遇到的日常。
我的一个核心观点是:AI工程是“以模型为核心、以系统交付为目标”的工程学科。你的核心竞争力不取决于你懂多少种损失函数,而取决于你能否把模型稳定地嵌入业务链路,并让它持续产生价值。
1.2 从零开始的完整生态栈长什么样
把AI工程拆成技术栈来看,我的习惯是分五层,每一层都有独立的知识和工具选择。这张表是我在多个项目里实际用过的组合,写出来给你做个参考:
| 层级 | 职责 | 常用工具/框架 | 需要掌握的核心能力 |
|---|---|---|---|
| 数据层 | 采集、清洗、存储、版本管理 | Pandas、SQL、dvc、MinIO | 数据质量检查、特征工程、数据版本回滚 |
| 训练层 | 模型开发、超参调优、实验追踪 | PyTorch、scikit-learn、Optuna、MLflow | 训练脚本可复现、实验对比、资源调度 |
| 评估层 | 离线评估、线上A/B、指标监控 | Evidently、Prometheus、Grafana | 指标选型、阈值设定、异常感知 |
| 服务层 | 模型推理、接口封装、版本管理 | FastAPI、TorchServe、Kubernetes | 接口设计、并发控制、无缝发布策略 |
| 迭代层 | 数据回流、再训练、持续集成 | Airflow、Kubeflow、GitHub Actions | 流水线编排、触发策略、全链路自动化 |
这张表不是让你一次性全学会。它的意义在于让你看到AI工程的全貌,然后按项目需要逐层深入。绝大多数新手的问题是过早陷入训练层——整天调模型结构、调学习率,其他四层几乎空白。到了真实项目里,数据层就能把你卡死:没有规范的数据版本管理,你连“模型效果为啥变差”都没法排查。
我觉得在开始学任何一门具体技术之前,先把这个生态栈刻在脑子里,是“from scratch”最重要的一步。后面所有努力,都是在往这五个格子里填东西。
2. 知识准备的关键边界:数学和编程到底要学到什么程度
“从零开始”最怕的不是不学,而是不知道学到哪停。我见过把《统计学习方法》翻了三遍、仍然写不出一个端到端训练脚本的人,也见过Python没学完列表推导式、但已经能独立部署BERT服务的人。差距不在天赋,在于对“够用边界”的判断。
2.1 数学:训练用得上的其实只有四个概念
做AI工程不需要你从公理开始推推导,但至少要理解四个数学概念在模型训练中的角色。这里的理解指的是“直觉+会调参”,不是动手证明。
- 梯度与反向传播:你不需要手写反向传播,但你必须知道梯度是“损失函数对参数的寻优方向”,学习率就是沿着这个方向迈的步子。理解这个,才能在loss不降时想到调学习率或者换优化器。
- 矩阵与张量:训练数据是按batch组织的,所有的层都是矩阵乘法。你不需要会手算矩阵,但需要理解shape的含义,比如
(batch_size, seq_len, hidden_size)在注意力计算里为什么要做维度变换。 - 概率与分布:交叉熵为什么是分类的标准损失?本质是衡量预测分布和真实分布的差异。你不需要推导KL散度,但需要理解“分布匹配”这个直觉,才能看懂为什么样本不均衡会导致训练偏斜。
- 数理统计:置信区间、显著性检验在A/B测试里是天天要用的。模型A比模型B高0.5%,要不要上线?这个问题本质上不是模型问题,而是统计问题。
我觉得数学这块最忌讳“完美主义”。我当时花了很多时间啃矩阵的SVD分解,后来发现半年也用不上一次。真正高频的数学只有上面这四个点,先把它们吃透,工作中遇到其他问题再针对性补,效率高得多。
2.2 编程:不追求精通,追求“够用且稳”
AI工程对编程的要求可以概括为“三个必须会,一个可以不会”:
- 必须会写清晰可读的Python:尤其是类、函数、装饰器、生成器。训练脚本不是算法竞赛的代码,每行都要给别人看,写时要克制炫技的冲动。
- 必须会看日志和调错:学会读traceback、加
logging、用调试器断点。我见过太多新人在代码出错时靠print瞎猜,一个bug能调一天;而熟练的人看日志定位到哪一行、查上下文改动、再确认边界条件,半小时出结果。 - 必须会使用git和Linux基本命令:模型训练经常需要跑在远程服务器上,文件权限、进程管理、软链、环境变量这些是生存技能。
- 可以不会的是后端开发:你不需要会设计高并发微服务架构,但需要看得懂FastAPI的路由和请求模型,够写接口就行。
编程能力怎么练?我建议的方法是“以项目带学习”:不单独刷题刷语法,而是立刻上手做一个小项目,碰到不会的语法现场查、当场用。用进废退,你实际写过的代码比你看过的教程重要十倍。我自己的感觉是,写完第一个完整的训练+部署项目之后,Python的很多高级用法自然而然就掌握了。
2.3 最容易被高估的“前置条件”和真正要提前养成的习惯
再说几个容易被高估的前置条件。
- 高性能计算经验:不必精通CUDA编程,但需要会看
nvidia-smi、理解GPU显存占用与batch_size的关系。 - 算法研究能力:不需要会发明模型,但需要会读模型文档和论文中的关键公式,能看懂参数量、输入输出格式这些工程相关字段。
- 大数据框架:不需要精通Spark/Hadoop,但需要理解“数据量大了以后,单机Pandas跑不动”这个瓶颈在哪里,为后续选型留出窗口。
真正要提前养成的习惯是“版本意识”:不仅代码要进git,数据也要有版本,实验参数也要有记录。我见过最离谱的事是同事在本地跑出了一版好结果,但既没保存配置文件也没记录随机种子,事后怎么都复现不出来——这在我们这行是重大事故。这部分后面我会详细展开,因为它是“from scratch”里最容易被跳过的关键一环。
3. 工具链选型与搭建:从空目录到可运行的训练环境
知道了知识边界,接下来就是动手搭环境。这一步看起来简单,但坑很多。我在不同机器上搭过不下十次环境,总结出一套比较顺手且踩坑最少的流程。核心原则就两条:环境和项目解耦、依赖锁定到底。
3.1 Python环境管理:为什么我推荐Miniconda而不是系统Python
我见过很多新手直接在系统Python里pip install,过两个月环境就乱了——不是版本冲突就是权限问题。我个人的建议是:直接装Miniconda,用独立的conda环境管理每个项目的依赖。
原因有三点:
- 隔离性:每个项目有独立的site-packages,A项目需要pandas 1.3,B项目需要pandas 2.0,互不干扰。
- 可复现性:
conda env export > environment.yml能把环境锁到细粒度,换台机器用起来能快速重建。 - 对GPU框架友好:
conda install pytorch在多数情况下可以直接装好带CUDA的版本,省去手动对CUDA版本的痛苦。
搭建的具体步骤是这样的:
# 安装Miniconda后,为AI工程项目建一个独立环境 conda create -n ai-engineering python=3.10 conda activate ai-engineering # 安装基础依赖 pip install pandas numpy scikit-learn matplotlib jupyter pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install fastapi uvicorn joblib mlflow装完之后建议做一次“静态检查”:
conda list | grep torch python -c "import torch; print(torch.__version__, torch.cuda.is_available())"这一步能立刻确认CUDA版本是否可用。我见过不少人在环境上卡一整天,最后发现是PyTorch的CUDA版本和驱动不匹配,导致训练又慢又报错。
3.2 训练、部署与监控的选型逻辑:选熟的不选新的
工具选型上,我是“老干部”风格——选社区活跃、生态稳定、我至少见过三个项目在用的方案,而不是尝鲜GitHub上刚冒头的网红项目。具体组合如下:
- 训练框架:PyTorch是首选,生态最全,网上能搜到几乎所有问题的解决方案。
- 实验追踪:MLflow。原因很直接:它同时管理实验日志、模型产物和模型注册中心,一个工具覆盖三个需求,别折腾三四个平台来对接。
- 服务部署:FastAPI + Uvicorn。轻量、性能够用,文档清晰,新手友好。
- 监控:Evidently负责数据漂移检测,Prometheus + Grafana负责系统指标。前者管“模型效果是否还在线”,后者管“服务是否健康活着”。
- 数据版本管理:dvc。它不是万能的,但对小团队和小数据集来说,足以在低成本下管住数据版本。
这个组合的库都是很成熟的东西,网上文档多、踩坑案例也多,非常适合从零起步的阶段。
3.3 集成开发环境与远程训练的工作流建议
日常开发我建议用VS Code加Remote-SSH插件,直接编辑远程服务器上的代码,边写边看运行结果,体验比较接近本地开发。再加一个Jupyter Notebook用于快速验证想法,但正式训练脚本一定要写成.py文件,因为Notebook对版本管理很不友好。
一个比较顺的日常工作流是:
- 在Notebook里做数据探索和特征工程,验证思路。
- 把验证过的所有逻辑整理成
src/下的干净.py模块。 - 训练脚本用命令行参数控制超参,比如:
python train.py --model_type=bert --lr=2e-5 --batch_size=16 --epochs=3- 每次实验结束,把参数和指标记录下来(交给MLflow),而不是记在脑子或聊天记录里。
这套流程看似朴素,但能保证你在三个月后仍然能复现今天的实验结果。很多人觉得“反正模型能跑就行”,可一旦遇到“之前效果明明很好现在怎么不行了”的问题,这些基础设施就是你排查的底气。
4. 核心链路实战:构建一个能跑通全流程的最小AI项目
从零开始学AI工程,我最推荐的方法不是看课程,而是“立即选定一个小项目,把全链路走通”。项目不用宏大,甚至可以用经典数据集,重点是让训练、评估、部署、接口调用这几个环节都真实运转起来。
4.1 项目选题:为什么我选了“文本多分类”而不是“图像识别”
如果你想尽快感受全链路,文本多分类是个非常好的起点,原因有三:
- 数据获取容易:公开数据集很多,比如新闻分类、情感极性分析。
- 模型选型清晰:从词嵌入 + 逻辑回归起步,再到Fine-tune BERT,难度递进平滑。
- 接口可塑性强:文本分类天然适合POST请求传文本返回标签,部署理解成本低。
我建议你可以用IMDb影评情感分类(正面/负面二分类)作为第一个项目。它够简单、够经典,跑通后你可以把这个流程原封不动迁移到任何二分类/多分类任务上。
4.2 数据管线的“从零”写法:清洗、切分、避免泄漏
数据预处理这一步,新手最容易犯的错误是“来回手动操作”。正确做法是写一个可重复执行的脚本,让每次训练都吃同一套处理流程。
拿IMDb举个例子:
import pandas as pd from sklearn.model_selection import train_test_split # 读取原始数据 df = pd.read_csv("imdb_reviews.csv") # 清理:去空值、去重、统一文本格式 df.dropna(subset=["review", "sentiment"], inplace=True) df["review"] = df["review"].str.strip().str.lower() # 划分训练/验证/测试集——注意stratify以保持类别比例 train_df, temp_df = train_test_split( df, test_size=0.3, random_state=42, stratify=df["sentiment"] ) val_df, test_df = train_test_split( temp_df, test_size=0.5, random_state=42, stratify=temp_df["sentiment"] ) print(f"训练集: {len(train_df)}, 验证集: {len(val_df)}, 测试集: {len(test_df)}")这里有几个要点。第一,random_state=42锁死随机种子,保证每次运行切分结果一致,这是可复现性的底线。第二,stratify按标签比例分层采样,防止正负样本比例失衡。第三,切分必须在任何特征处理之前完成,否则你用全量数据算出来的统计量会被“泄漏”到验证集。
这类泄漏问题在真实业务里非常隐蔽。比如做时间序列预测,如果你随机切分而不是按时间切分,相当于让模型“偷看”了未来的数据,线上效果必然崩。在你从零搭建数据管线时,习惯性地就要先问自己一句:“这个切分方式是否模拟了线上真实预测场景?”
4.3 模型训练的标准骨架:记录、保存、早停
数据就位后,训练部分我用一个比较固定的骨架。以Fine-tune一个简单的DistilBERT为例,核心逻辑是:
训练循环的标准写法我整理成下面这个伪代码结构:
def train_one_epoch(model, dataloader, optimizer, device): model.train() total_loss = 0 for batch in dataloader: batch = {k: v.to(device) for k, v in batch.items()} outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() total_loss += loss.item() return total_loss / len(dataloader)当然,训练本身只是一部分,真正体现工程水平的是“训练外围那圈管理逻辑”。我的标准流程是:
- 记录实验配置:启动训练前,把模型类型、学习率、batch_size、epoch数、数据集版本全部写入MLflow。
- 周期评估:每个epoch在验证集上计算AUC或F1,而不是只看训练loss。
- 早停机制:连续N个epoch验证指标不升就停止,避免白白浪费算力。
- 模型保存:只保留验证指标最优的checkpoint,同时记录对应的超参和datasets版本。
我踩过最深的一个坑是“只保存了最后的模型”。有一次训练后期过拟合,验证F1已经开始掉,但我守着最后一个epoch的checkpoint,上线后效果明显不如上一版。后来我养成了条件保存的习惯:只有验证指标创新高才覆盖保存,其余时候宁可多存一份在路径上带上epoch标记。
4.4 从模型hub到接口:模型封装与FastAPI部署
先明确一点:模型训练完成不等于AI工程完成,封装成可调用的服务才是交付的开始。我推荐用FastAPI,把模型包装成标准的POST接口,整个过程很简单。
先把模型包装成一个独立的类,这样它的生命周期和HTTP进程的生命周期就能由FastAPI的lifespan来管理:
from transformers import pipeline classifier = pipeline( "sentiment-analysis", model="./models/distilbert-imdb", device=-1 # 用CPU,初始部署容易踩GPU内存管理坑 )然后再定义路由,注意一定要处理输入异常,不要让你的接口变成别人一传坏数据就崩溃的“玻璃系统”:
from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI(title="IMDb Sentiment API") class PredictRequest(BaseModel): text: str @app.post("/predict") def predict(req: PredictRequest): if not req.text.strip(): raise HTTPException(status_code=400, detail="text不能为空") result = classifier(req.text[:512]) # 截断上限,防止超长文本拖垮推理 return {"label": result[0]["label"], "score": result[0]["score"]}部署本身是一个常被新手忽视的环节。考虑到可移植性,可以将服务依赖打进容器镜像,但这里我也多说一句:你至少要用Uvicorn启动真实服务测一次,而不是在Notebook里调用一下就说“部署完成了”。
uvicorn main:app --host 0.0.0.0 --port 8000然后本地用curl验证:
curl -X POST http://localhost:8000/predict \ -H "Content-Type: application/json" \ -d '{"text": "This movie was fantastic, I loved every minute!"}'如果返回了{"label": "POSITIVE", "score": 0.99}这类结果,恭喜你,从零到接口的全链路已经通了。很多入行教程到这就算“项目完成”,但我认为后面那两公里才是AI工程真正显价值的地方。
5. 生产环境里的“隐形工作”:评估、监控、版本与迭代
模型在接口里跑通只是第一步。真实业务里模型要面对的是每天都在变的线上数据。我见过太多模型刚上线时效果不错,一个月后莫名其妙劣化——不是模型坏了,是没人盯着数据分布这回事。
5.1 离线评估的指标选型:不要只看准确率
做分类任务,很多人只盯着准确率,这很危险。在正负样本不均衡的业务里(比如欺诈检测,负样本可能只有1%),一个把所有样本都预测为“正常”的模型准确率能到99%,但它毫无价值。
所以评估指标必须结合业务场景选。我一般分三类:
| 业务场景 | 核心指标 | 理由 |
|---|---|---|
| 正负样本均衡 | Accuracy / LogLoss | 直观,且LogLoss能反映置信度 |
| 样本不均衡 | Precision / Recall / F1 / AUC | PR曲线比AUC更敏感于少数类变化 |
| 排序场景 | NDCG / MRR | 衡量预测顺序是否符合预期 |
建议你每次训练完,把这几类指标全部算一遍并存入MLflow,别嫌麻烦。因为上线后的模型监控就要用这些“离线基线”来做对比——没有基线,你就无法判断线上效果到底有没有劣化。
5.2 数据漂移与模型衰减:线上监控到底怎么落地
模型效果变差一般分两类原因:一是模型本身推理存活性问题(依赖升级、代码bug、硬件异常),二是数据分布变化了。后者更隐蔽,需要一个专门的监控模块来承接。
一个可落地的实现方案是这样的:
- 记录线上请求的输入特征:把每一条请求的文本长度、预测概率、置信度等落到日志文件。
- 周期统计特征分布:每天跑一个统计任务,算出当天请求文本的平均长度、模型预测概率的均值/方差。
- 与训练集分布对比:用Evidently这类工具计算分布距离(比如PSI)。
- 触发报警:当PSI超过阈值时告警,说明线上数据和训练数据已经“长得不一样了”,模型大概率在失效。
# 伪代码示例:传输数据漂移检测 from evidently.report import Report from evidently.metrics import DataDriftTable report = Report(metrics=[DataDriftTable()]) report.run(reference_data=train_df, current_data=recent_logs_df) report.save_html("drift_report.html")我踩过一次很深的坑:有个线上NLP模型一到周末效果就异常好,工作日恢复普通水平。后来一查发现是训练数据几乎全来自工作日,周末的文本风格和内容主题完全不同,分布差异直接反映在指标上。从那以后我就养成了“每次监控不光看指标波动,还要按时间维度做切片对比”的习惯。
监控报警这块也提醒新手:阈值别设太紧,否则告警群里全是噪音,大家会直接屏蔽。我通常的做法是“连续N个时间窗口超过阈值才告警”,先把误报率降下去,报警才有威慑力。
5.3 模型版本管理和再训练:从可复现到可追溯
最后谈谈迭代。模型上线只是生命周期的一半,之后还要面对定期再训练、评估新模型、灰度切流这些问题。
最基本的底线是可追溯:任何一版线上模型,你都要能回答“这个模型用的什么数据、什么代码、什么超参、在哪次实验跑出来的”。MLflow的Model Registry正好干这个事:把候选模型注册成Staging,等A/B测试跑完再转成Production。
再训练触发策略,我一向不建议“定时重训”一把梭。比较稳妥的是“监控驱动重训”:当数据漂移告警触发或效果指标连续下滑时,才拉取最新回流数据进行重训。原因很简单——重训也有成本,而且要重新走一遍评估流程,做得太频繁只会让团队疲惫,还可能导致模型效果震荡。
模型发布时也要注意灰度策略:不要直接一刀切切换线路,应该新老模型并行一小段时间,对比完线上A/B指标再做切换。这一步在业务里相当重要,因为离线评估再准,也和线上真实用户行为存在Gap。
6. 从零到一的路线图与学习资源建议
如果你看完前面这些,已经决定要走AI工程这条路,那我把整个过程再压缩成一份可执行的阶段路线图,顺便聊聊时间和精力的分配建议。别贪多嚼不烂,每一步踏稳再进下一步。
6.1 三个月入门路线:每阶段的核心任务与产出
我把从零到能独立交付一个AI小服务的路径划分为四个阶段,每阶段都有一份明确产出物,用产出倒逼输入:
| 阶段 | 时间 | 核心任务 | 阶段产出 |
|---|---|---|---|
| 基础补全 | 第1周 | 掌握Python基础 + Linux + Git | 能独立管理代码仓库 |
| 最小链路 | 第2-4周 | 跑通上面IMDb项目全流程 | 一个本地可调用的FastAPI服务 |
| 工程深化 | 第5-8周 | 接入MLflow、dvc、彻底梳理实验记录 | 一套可复现的训练项目仓库 |
| 可靠部署 | 第9-12周 | 容器化部署 + 基础监控告警 + 压力测试 | 一个具备部署文档和监控面板的服务 |
这个规划的关键是:每个阶段结束你都“看得见摸得着”一个东西。如果你只是看书看课,很容易在无限的学习中迷失方向,不妨以产出来检验是否学到东西。
第一阶段有个比较快的小窍门:直接用上一章那个IMDb项目当作练习场,遇到不会的语法边查边改,这样比啃语法书快得多。不要问“我基础还没打好,能不能先不做项目”——做了项目才知道基础缺在哪里,这条路更高效。
6.2 真正值得投入时间的资源:官方文档与开源代码
学习资源上,我的核心建议是“少看二手教程,多看一手资料”。有四个我亲自验证过性价比很高的方向:
- HF官方文档和课程:
Hugging Face的教程对NLP场景极其全面,从Tokenizer原理到Pipeline封装都有,比大多数博客写得透彻。 - FastAPI官方文档:讲清楚了解接口开发的写法和并发模型,零基础也能跟上。
- MLflow官方文档:实验追踪和模型管理的基本用法,官方示例几乎覆盖了主流场景。
- GitHub优质项目:找一个有完整训练脚本、配置文件和README的项目,老老实实读懂其目录结构,理解每个文件的职责。
我不太推荐一开始就看论文或大部头教材,因为从零阶段最大的障碍是“不知道知识在整个链路中处于什么位置”。有了前面项目的整体感知后,再看论文才能定位到具体环节,学习效率完全不一样。
6.3 我的三条心里话:预算、踩坑与耐心
最后分享三条个人经验,算是我做AI工程这段时间最想强调的心得。
第一,别在硬件上纠结。入门阶段CPU完全够用,跑DistilBERT这种小模型也没什么压力。不要一上来就想买一两万的GPU机器,先用免费的Colab或云GPU把全链路走通,再考虑投入硬件。
第二,每一个“奇怪问题”都是你的私房菜。环境冲突、依赖报错、显存溢出,这些问题在书和教程里根本不会出现,但恰恰是它们组成了你的真实竞争力。遇到问题别烦躁,解决问题的过程就是经验的累积。每解决一个怪问题,你在这个领域的护城河就深一点。
第三,保持跨度思维。AI工程演进节奏特别快,今天的新框架可能明年就被替代,但底层的那套工程方法论——数据质量、可复现性、监控闭环——是不变的。学东西时可以先问自己一句:“这个工具解决了什么本质问题?”抓住本质,工具怎么换你都不慌。
最后再分享一个实践技巧:在你独自走通一个最小项目后,可以找一个开源社区去提交PR或者参与issue讨论。你会发现,读代码和写代码是两种能力,快速理解和维护别人的代码,是AI工程日常工作中最稀松平常但也最考验功底的事。从零开始的意义,不是让你把所有的路都亲自踩一遍,而是让你有足够的认知去判断哪些路值得走——我的建议是,把上面这套最小闭环跑通一次,你的AI工程之旅才算真正开始了。