先交代一个背景:这个项目名我在好几个地方看到过,GitHub 上挂着"ai-engineering-from-scratch"这样的仓库,搜索热词里"ai-engineering"也一直没掉出过榜单。但说实话,大多数人是被名字吸引进来的,点进去之后反而不知道该怎么用——是照着目录刷一遍?还是把它当成课程大纲收藏吃灰?这正是我想写这篇文章的原因。我自己折腾了将近一年,从只会调 API 到能独立跑通模型训练、微调、部署的全流程,回头再看这类"从零开始"的项目,其实最大的价值不在项目本身,而在于它帮你把碎片化知识串成了一条可执行的路线。这篇文章我不打算复述任何现成仓库的目录,而是以"ai-engineering-from-scratch"这个命题为起点,拆解一条真正可落地的 AI 工程学习与实践路径,覆盖知识体系、工具链、端到端项目实操和排查经验。
1. AI工程到底在做什么?先搞清楚边界
1.1 AI工程和AI研究的本质区别
很多人一上来就啃 Transformer 论文、复现 Stable Diffusion,结果啃到一半发现既看不懂代码,也不知道自己学的这些东西能用在哪儿。这就是典型的没分清"AI 研究"和"AI 工程"。
AI 研究的目标是探索未知——新模型结构、新训练方法、新理论解释,它的产出是论文和实验结论。而 AI 工程的目标是把已知的模型、算法、技术栈组合成可用的系统和产品,它的产出是稳定运行的服务、可控的成本、可维护的代码。换句话说,研究员关心"这个模型能不能work",工程师关心"这个系统能不能一直work"。
我自己踩过的第一个坑就是:一开始沉迷于研究侧的内容,花了大量时间看模型架构演进,结果连一个简单的文本分类服务都部署不利索。后来才明白,ai-engineering 的核心其实是一个工程问题:如何在真实环境中让模型稳定、高效、可迭代地运行。这个认知上的转变,比多学十个模型都重要。
1.2 从零开始需要覆盖的核心能力维度
如果把 AI 工程拆成一个能力雷达图,至少包含六个维度:
- 数据处理能力:清洗、标注、增强、特征工程,这是最不起眼但最耗时间的部分。
- 模型能力:理解经典模型原理,能选型、能训练、能微调,不要求手写 Transformer,但至少要清楚它们怎么用。
- 工程化能力:版本管理、实验管理、模型部署、监控告警、CI/CD。
- 基础设施能力:GPU 环境、容器化、分布式训练的基本概念。
- 产品化能力:把模型包装成 API、设计交互逻辑、控制成本。
- 评估能力:离线指标、线上指标、A/B 测试、bad case 分析。
这六个维度不是线性学习的,而是互相交织的。比如你训练一个模型,既要懂模型结构,也要懂数据分布,还要能通过评估指标判断问题出在哪里。所以 from scratch 的学习路径不能是一条直线,而应该是一层层往上叠的螺旋结构——每一轮都同时接触这六个维度,只是深度不同。
1.3 为什么"系统性"比"碎片化"更重要
我见过很多自学 AI 的开发者,学习路径大概是这样的:先刷一遍 Python 语法,然后看吴恩达的机器学习课程,接着跟几个 PyTorch 教程,最后用 HuggingFace 跑几个模型,然后就卡住了。问他卡在哪,他说:会跑别人的代码,但自己从头写一个项目完全没有头绪。
这就是碎片化学习的典型症状。知识就像散落一地的零件,你都有,但拼不成一台机器。而 ai-engineering-from-scratch 这种项目的价值,恰恰在于提供了一个骨架——它告诉你这些零件应该装在什么位置。所以如果你手头已经有很多零散的知识,不要急着学新东西,先画一张自己的知识地图,把已经会的填进去,把空缺标出来,你会发现很多"学过的东西"其实根本没归位。
2. 知识体系的搭建顺序:别一上来就啃Transformer
2.1 第一层底子:Python、数据结构与批量数据处理
AI 工程的语言几乎是 Python 的一言堂,所以 Python 语法熟练度是硬门槛。但注意,这里的"熟练"不是指你会写函数和类,而是指你能流畅地做批量数据处理——用列表推导式处理序列、用字典和集合做去重和映射、用 pandas 做表格数据的筛选聚合、用 NumPy 做向量化计算。这些能力直接决定了你在数据清洗环节的效率。
一个判断标准:给你一份 10 万行的 CSV,里面有缺失值、重复值、异常格式,你需要把它清洗成可以训练的数据集,你能否在两小时内写出完整脚本?如果不行,先别碰深度学习,老老实实把数据处理这一关过了。
另外我强烈建议在这个阶段掌握两个工具:一是 Jupyter Notebook,它的交互式特性特别适合做数据探索;二是可视化库(matplotlib 或 plotly),因为看数据分布比看统计数字直观得多。我自己做项目时,90% 的数据问题都是靠画图发现的,而不是靠打印数值。
2.2 第二层核心:传统机器学习是绕不开的底座
很多新人觉得"深度学习时代了,谁还学 SVM、决策树?",然后直接跳进神经网络。这个想法在 ai-engineering 的实践中会被打脸。传统机器学习算法在表格数据、小样本场景、可解释性要求高的业务中依然有不可替代的地位,而且它们的概念——过拟合、正则化、交叉验证、偏差方差权衡——是理解深度学习一切问题的底层语言。
举个例子。你训练一个神经网络,发现训练集准确率 99%、验证集只有 85%,你当然知道这叫过拟合。但怎么解决?常用的手段无非是数据增强、Dropout、早停、降低模型容量,这些思路在传统机器学习里就有清晰的对应,理解了底层逻辑之后,你对深度学习的调参就不再是"试出来的",而是"推出来的"。
建议在这个阶段做两个小项目:一个用 scikit-learn 做分类任务(比如鸢尾花或者泰坦尼克号),另一个用 XGBoost 或 LightGBM 打一场 Kaggle 比赛。目标不是拿名次,而是把整个机器学习工作流——数据划分、模型训练、超参调优、评估——走通一遍。
2.3 第三层进阶:深度学习框架与神经网络直觉
进入深度学习阶段,最核心的不是会调 PyTorch 的 API,而是建立起三个直觉:张量怎么流动、梯度怎么传播、损失函数怎么引导模型更新。
我建议的学习路径是这样的:先手动实现一个最简单的全连接神经网络(不用框架,只用 NumPy),完成前向传播、反向传播、梯度更新的全过程。这个练习价值极大,因为做完之后你对"训练"这个词的理解会完全不同——它不是魔术,而是一个不断调整参数让损失下降的过程。
然后切换到 PyTorch,用它的自动求导重新实现一遍同样的问题,你会立刻体会到框架的意义。之后再学卷积神经网络、循环神经网络、Transformer 时,底层逻辑都是相通的。这里有个容易犯的错误:一上来就学 Transformer,然后试图通过读源码理解注意力机制。不是不行,而是效率极低。先动手做几个小网络,建立基础直觉,再看 Transformer 会轻松很多。
2.4 第四层现代应用:大语言模型与生成式AI工程
这是当前 ai-engineering 领域最热门的方向,也可能是信息噪音最大的方向。你需要掌握的内容包括:Transformer 的核心架构(至少要清楚自注意力、位置编码、KV Cache 这些概念)、预训练与微调的区别、提示工程、RAG(检索增强生成)、模型评估、以及成本控制。
但这里必须提醒的是:大模型应用开发和传统模型训练的工作方式截然不同。传统方式是"我训练好一个模型,然后部署服务";大模型应用更多是"我调用一个基座模型,然后通过提示词、上下文工程、工具调用来完成特定任务"。这意味着你需要花更多时间研究模型的行为边界,而不是模型内部的参数。
我的建议是先玩熟一两个模型 API,把"提示词设计→输出解析→结果评估"的闭环跑通,然后再考虑本地部署和微调。不要一上来就想去微调一个 7B 模型,因为那大概率只是把官方文档复读一遍,并没有真正解决问题。
3. 工具链选型:把"工程"二字落到实处
3.1 Python 环境与依赖管理
这是最基础但也最容易被忽视的环节。很多初学者在自己的电脑上装了一堆全局 Python 包,结果版本冲突、依赖地狱,最后整个环境都不能用。ai-engineering 项目涉及的依赖极其庞杂,PyTorch、Transformers、NumPy、pandas 各有各的版本要求,不好好管理环境,光环境问题就能劝退你。
我现在的标准做法是:Python 3.10 或 3.11(不要用最新的,生态兼容性不够),配合 venv 创建虚拟环境,每个项目一个环境,绝不共用。依赖管理工具我用过 conda、pip、poetry,现在主力是 uv,速度快而且配置简单。你可以根据自己的习惯选,但原则不变:环境隔离是底线,不是可选优化。
具体到命令行,一套最基础的开场操作是:
python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip pip install jupyter notebook matplotlib pandas numpy这套操作没有任何魔法,但它保证了后续所有依赖都安装在这个项目自己的环境里,不会污染系统。如果你连这一步都不做,后面训练时出现"ModuleNotFoundError"或者版本冲突,排查起来极其痛苦。
3.2 深度学习框架的取舍
这个话题在社区里已经被讨论烂了,但每次都有新人问:TensorFlow 还是 PyTorch?我的答案很简单:选 PyTorch。原因不是它比 TensorFlow 好用多少,而是整个 AI 工程生态已经围绕 PyTorch 建立起来了——HuggingFace 的 Transformers 首选 PyTorch,大多数论文开源代码用 PyTorch,部署框架对 PyTorch 的支持也最完整。你跟着生态走,遇到问题时能找到最多参考。
另外要提一下 JAX,它在某些研究场景下很有优势,但对工程落地来说,生态还不够成熟,现阶段不建议作为主要学习对象。框架选择一个就行,学精了再横向扩展,不要今天学 TensorFlow 明天换 PyTorch,永远在半吊子状态。
PyTorch 安装有个小心得:如果只是用 CPU 做学习和推理,pip install torch 就够了;如果需要 GPU 训练,一定要去官方网站按 CUDA 版本选择对应的安装命令,不要随手 pip install torch 然后发现 CUDA 不可用。
3.3 数据、实验与模型管理
工程化程度的高低,最直观的体现就是项目和实验管理是否规范。我早期做实验非常随意:训练完一个模型,保存一个名为"best_model_v3_final2.pth"的文件,过两天自己都记不清这个 v3 和 v2 有什么区别。后来我改用了一套简单的管理规范,效率提升非常明显:
- 数据目录统一放在 data/ 下,按 raw、processed、augmented 分目录,保留原始数据不动。
- 实验记录用 MLflow 或最简单的 CSV 表,记录每次实验的超参数、数据集版本、模型指标、代码 commit。
- 模型权重按"项目名-日期-版本"命名,同时保存一份训练日志和模型卡。
MLflow 是我比较推荐的实验管理工具,它提供了参数记录、指标可视化、模型注册三大功能,而且上手简单。不夸张地说,从随手乱扔文件到规范化管理,这个转变让我后续做任何项目都省掉了大量重复调试的时间。
3.4 大模型应用开发时代的工具链
如果你已经进入 LLM 应用开发阶段,那工具链会是另一套思路。除了 HuggingFace 的 Transformers 之外,你会接触到向量数据库(Milvus、Qdrant、FAISS)、应用开发框架(LangChain、LlamaIndex)、模型网关和部署方案(vLLM、Ollama、FastAPI 封装)。
这里有个常见的选型误区:看到热门的框架就往项目里塞。我建议反过来——先想清楚需求,再选工具。比如你要做一个简单的知识库问答,其实用不到 LangChain,直接把文档切块、向量化、存进 Qdrant,然后用模型 API 走一个检索-回答的流程即可。框架是帮助你抽象复杂逻辑的,不是给你炫技用的。
部署方面,如果你只是个人项目,一台 8G 显存的显卡可以跑 7B 甚至 13B 的量化模型,配合 vLLM 做推理加速。如果你用 API,就完全不用操心推理资源,但要注意成本和限流。两种方案没有绝对好坏,取决于你的使用场景。
4. 从零跑通一个端到端AI项目:完整实操记录
4.1 选题与数据准备
理论知识讲再多,不如完整做完一个项目。如果你还没有做过任何端到端项目,我强烈建议选一个"中等难度、数据公开、评价标准明确"的任务。我拿"电商评论情感分类"举例,因为这个任务数据好拿、模型简单、效果容易判断,而且能完整覆盖 AI 工程的主要环节。
第一步是获取数据。推荐优先看 HuggingFace Datasets 和 Kaggle,搜索类似 amazon_reviews 或中文电商评论数据集。下载之后先做一轮探索性数据分析:看文本长度分布、类别分布、有没有重复和空值。这个步骤很多人跳过,但恰恰是决定模型效果上限的关键——比如类别严重不均衡、或者文本特别长,都需要在设计方案时提前考虑。
数据准备阶段需要写几个脚本:一个做数据清洗(去重、去空、标准化处理),一个做数据划分(训练集、验证集、测试集按 8:1:1 划分),一个做统计分析(打印各类别的数量、文本长度分布)。把这三个脚本放在项目的 scripts/ 目录下,确保每次改动数据都有记录。
4.2 建立基线和训练流程
拿到干净数据后,不要立刻上大模型,先建立一个最简单的基线。这可能是很多新手最容易忽略的一点——他们总是想一开始就用最好的模型,但基线模型的价值在于给你一个参照系:后续所有改进都跟基线比,才能判断是否有效。
对于文本分类任务,一个有效的基线方案是:TF-IDF 特征 + Logistic Regression 或 LightGBM。这个方案训练快、可解释性强,通常能到 85% 左右的准确率,足以作为参照。这里贴上最核心的训练脚本结构,你可以直接参考:
# train_baseline.py from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.pipeline import Pipeline from sklearn.metrics import classification_report import joblib # 假设 X_train, y_train 已由数据处理脚本生成 model = Pipeline([ ("tfidf", TfidfVectorizer(max_features=50000, ngram_range=(1, 2))), ("clf", LogisticRegression(max_iter=1000)) ]) model.fit(X_train, y_train) preds = model.predict(X_valid) print(classification_report(y_valid, preds)) joblib.dump(model, "models/baseline_tfidf_lr.joblib")注意 TF-IDF 的 max_features 和 ngram_range 这两个参数,它们直接影响特征质量。max_features 设太大会引入噪音,太小会丢失信息,我自己通常从 50000 开始,再根据验证集表现调整。ngram_range 设为 (1, 2) 能抓住一些词组合的特征(比如"不好吃"和"不 好吃"的区别),对情感分类帮助很大。
基线跑通之后,再切换到深度模型。用预训练的文本向量模型(比如 sentence-transformers 里的基础模型或 BERT 类模型)做 embedding,然后接一个分类层微调。这一部分的训练代码会比基线复杂不少,但核心流程是一样的:加载模型、定义损失函数和优化器、循环迭代、验证。这里展示一个简化的 PyTorch 训练循环框架,我每次做新项目都是在这个框架上改的:
# train_classifier.py import torch from torch.utils.data import DataLoader, Dataset from transformers import AutoTokenizer, AutoModelForSequenceClassification model_name = "bert-base-chinese" # 中文评论场景 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2) class CommentDataset(Dataset): def __init__(self, texts, labels, tokenizer, max_len=128): self.texts = texts self.labels = labels self.tokenizer = tokenizer self.max_len = max_len def __len__(self): return len(self.texts) def __getitem__(self, idx): encoded = self.tokenizer( self.texts[idx], truncation=True, padding="max_length", max_length=self.max_len, return_tensors="pt" ) return { "input_ids": encoded["input_ids"].squeeze(0), "attention_mask": encoded["attention_mask"].squeeze(0), "labels": torch.tensor(self.labels[idx], dtype=torch.long) } train_loader = DataLoader( CommentDataset(X_train, y_train, tokenizer), batch_size=16, shuffle=True ) optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5) model.train() for epoch in range(3): for batch in train_loader: outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad()这段代码看起来简单,但里面有几个参数是经过实践验证的:batch_size 16 在 8G 显存上跑 BERT 刚好;学习率 2e-5 是微调预训练模型最常用也最稳的默认值;max_len 128 对大多数短评足够了,太长会增加显存开销,太短会截断关键信息。你可以在这些基础上做调整,但别一上来就搞激进的大 batch 或高学习率,先让流程跑通,再追求指标。
4.3 评估、调优与模型迭代
训练结束后,评估环节必须足够扎实。只看准确率是不够的,必须看混淆矩阵、precision、recall、F1,尤其对于类别不均衡的数据,准确率会骗人——比如 90% 是好评,模型全预测好评也能到 90% 准确率,但实际业务价值为零。
我常用的评估方式是三层递进。第一层看整体指标,用 classification_report 输出;第二层看 bad case,手动检查验证集里模型预测错的样本,找出错误模式,比如是不是把"便宜没好货"判成好评(因为看到"便宜");第三层针对 bad case 做针对性优化,比如加入额外的否定词特征、增加数据增强方式、或者调整阈值。
这个迭代过程会占掉整个项目 50% 以上的时间,而且效果提升通常是阶梯式的——前面几轮改动效果明显,接近瓶颈后可能怎么调都只涨零点几个点。这时候不要死磕,适可而止。一个可上线使用的模型,不需要做到论文级别的 SOTA,只要在验证集上稳定、在真实场景的抽样检查中没大问题,就可以考虑部署了。
部署方案我推荐用 FastAPI 把模型包装成一个简单的接口,再配合 Docker 做容器化。这不需要多高深的工程能力,但能让你的项目真正变成一个"可用的服务"而不是"能跑的脚本"。一个最简推理接口长这样:
# serve.py from fastapi import FastAPI from pydantic import BaseModel import joblib app = FastAPI() model = joblib.load("models/baseline_tfidf_lr.joblib") vectorizer = model.named_steps["tfidf"] class Item(BaseModel): text: str @app.post("/predict") def predict(item: Item): vec = vectorizer.transform([item.text]) prob = model.named_steps["clf"].predict_proba(vec)[0, 1] return {"negative_prob": prob, "is_negative": prob > 0.5}部署到 Docker 时把依赖写进 requirements.txt,镜像里不用装 CUDA(如果用 CPU 推理),镜像体积能控制在 1G 以内。这样整套流程走下来,你才算真正体会过 AI 工程的各个环节。
4.4 成本、资源与工程化折中
工程化实践里最现实的问题是:资源永远是不够的。你可能只有一张显卡,或者预算只够调用一段时间 API,这时候怎么折中?
我的经验是三条原则:第一,优先做小规模实验验证想法,再放大到全量数据;第二,能用量化模型就不要跑全精度,收益差距通常在 5% 以内,但资源消耗可以减半;第三,能复用已有模型就不要从头训练,在开源模型或 API 基础上做微调,成本远低于预训练。这条思路不仅适用于个人项目,团队里同样重要——AI 工程的本质是用最少资源创造最大价值,而不是刷出最好看的离线指标。
5. 从零搭建过程常见问题与排查技巧实录
5.1 问题速查表
我把从零开始做 AI 工程最常踩的坑整理成一张表,基本覆盖了新手阶段 90% 的问题:
| 症状 | 可能原因 | 排查思路 |
|---|---|---|
| 训练时显存不足 | batch_size 太大、序列过长、模型过大 | 先减 batch_size,再减 max_len,最后换量化模型 |
| 训练损失不降 | 学习率过高或过低、数据处理错误、标签泄漏 | 打乱数据、检查标签映射、尝试多个学习率(1e-3、1e-4、1e-5) |
| 验证效果好但线上效果差 | 数据分布不一致、评估指标不合适 | 增加线下验证集难度,对比训练集和线上数据分布 |
| 模型每次都复现不了 | 没固定随机种子、GPU 浮点运算差异 | 在脚本开头设 torch.manual_seed(42),记录环境版本 |
| 代码依赖冲突 | 全局环境中安装过多包 | 立刻切换到独立虚拟环境,从 requirements 重新安装 |
| API 调用成本失控 | 提示词太长、调用次数无缓存 | 设计 prompt 时精简,加缓存层,对输入长度做限制 |
| 向量化检索结果不准 | 切块过大/过小、embedding 模型选型不当 | 调整 chunk size,改用语义相关性更强的 embedding 模型 |
| 模型加载极慢 | 模型过大、未用缓存、设备不对 | 如果只用 CPU,转成 ONNX 或量化格式,推理速度能提升数倍 |
这张表里的每一项都是我在实操中真实遇到过的,其中"固定随机种子"这一点尤其容易忽略——很多人改了几次代码,发现结果忽好忽坏,第一反应是代码有 bug,但很可能只是随机性没控制住。
5.2 训练阶段最常见的坑:过拟合与数据泄漏
过拟合的典型特征是训练集表现极好、验证集表现明显变差。解决手段前面提过:数据增强、Dropout、早停、减小模型容量。但我想特别强调一个新手经常犯的错误:在划分训练验证集之前就做了全局的数据预处理,比如用全部数据的均值和标准差做归一化,或者对整个数据集做了清洗后才划分。这本质上是数据泄漏——验证集的信息在训练时就已经被看到了,导致验证指标虚高,上线后立刻现原形。
正确做法是先把数据划分成训练/验证/测试三份,然后只在训练集上做拟合统计类预处理(比如计算均值、训练 TF-IDF 词典),再把训练集上学到的变换应用到验证集和测试集。sklearn 的 Pipeline 天然支持这套逻辑,所以尽量把预处理步骤放进 Pipeline 里,不要手动在外面做。
5.3 部署阶段容易踩的雷:路径、依赖与状态管理
部署阶段的坑和训练阶段完全不一样。训练时主要和模型、数据打交道,部署时更多是工程问题。我遇到过最典型的三个问题:
第一个是路径硬编码。训练脚本里写了"data/train.csv"这种相对路径,部署时换了目录或者用 Docker 启动,文件找不到。解决方法是所有路径统一用 os.path 拼接或者用 pathlib,并且把项目根目录设成环境变量。
第二个是环境不一致。本地 Python 3.11 跑得好好的,Docker 镜像里是 Python 3.9,某些依赖版本不兼容直接崩。解决方案是把 requirements.txt 里的关键依赖锁版本,比如 torch==2.1.2 而不是 torch>=2.1.0。如果不确定版本,建议在本地环境跑一下 pip freeze,把实际版本记录下来。
第三个是模型状态管理。有些新手在服务里直接加载模型然后每来一个请求就重新 load 一次,延迟高得离谱。正确做法是在启动时一次性加载模型到内存,只把推理函数暴露给接口,这样单次请求延迟可以控制在几十毫秒级别。
5.4 几条真正值钱的避坑经验
除了上面这些具体问题,我还想分享几条通用经验,它们不是某个 bug 的解法,而是做事方式的调整。
第一,先追求"跑通"而不是"最优"。很多人在数据预处理上花费大量时间精雕细琢,结果模型还没跑过一次。正确策略是先用一小批数据、最简单的模型,把整个流程从头到尾走一遍,确认每个环节都能衔接,然后再逐步优化。流程没跑通之前,任何局部优化都是在空中盖楼。
第二,每次只改一个变量。如果你同时改了学习率、batch_size、模型结构、数据清洗方式,然后发现效果提升,你根本不知道是哪个改动起的作用。实验是控制变量的艺术,这条原则无论如何强调都不过分。
第三,日志和数据版本必须留。训练完一个模型,把超参数、数据文件 hash、训练时间、验证指标全部记录下来。三个月后你想回溯模型效果时,会感谢当初的自己。
第四,不要怕用"笨"方法。大模型时代很多人遇到问题就想着上 RAG、上微调,但有时候一个简单的基于关键词的规则或搜索就能解决 80% 的需求。AI 工程的目标是解决问题,不是炫技。
6. 学习资源搭配:如何让 from scratch 的路线更高效
6.1 资料不在多,而在"闭环"
AI 工程方向的学习资源已经泛滥了:B站教程、YouTube 实战、GitHub 项目、付费课程、公众号文章,每天都有大量信息涌入。但你真正需要的不是更多资料,而是能形成闭环的少数几个来源。
所谓闭环,就是"原理讲解—代码实现—问题排查"三个环节都能覆盖。我在实践里反复验证过的组合是:理论部分看《动手学深度学习》,代码部分以 PyTorch 官方教程和 HuggingFace 官方文档为主,实战部分用 Kaggle 比赛和 GitHub 开源项目练手,出现具体问题时再定向搜索和查阅社区讨论。这套组合不花一分钱,但覆盖面足够广。
6.2 如何利用开源项目而不被带偏
ai-engineering-from-scratch 这类开源项目目录结构清晰、任务明确,是比较好的学习素材。但使用它的正确方式不是"看完",而是"拆解并重建"。
具体方法是:先不着急看源码,看 README 了解项目要做什么;然后自己设计一个方案,尝试独立实现;实现到一半遇到卡点再去读作者的实现方式,对比差异。这个过程虽然慢,但每一步都是主动思考,而不是被动接收。如果你只是从头到尾把别人的代码读一遍,大脑的参与度很低,读完之后很快忘光。
6.3 什么时候算"出师"?
这是个很实际的问题。我给出的判断标准不是"学会了多少算法"或者"能用多少框架",而是三条能力:
- 能在没有教程指导的情况下,独立完成一个 AI 项目的端到端开发(从数据到部署)。
- 遇到线上问题,能通过日志、指标分析定位到原因,而不是只能靠搜索引擎找现成答案。
- 对不确定的技术选型,能给出自己的判断依据,并能承担选型带来的后续成本。
这三个标准里,前两个最硬核。做到第一条,你已经是一名合格的 AI 工程师;做到第二条,你已经具备独立解决问题的能力。第三条需要持续的经验积累,不着急。
最后分享一个我在实际踩坑中体会最深的事:AI 工程最大的门槛不是模型有多复杂,而是你是否有耐心把一个简单流程完完整整走通。很多人倒在了环境配置、数据清洗、版本冲突这些"脏活累活"面前,而那些真正能落地交付的项目,往往不是靠炫技完成的,靠的是扎实的工程习惯和死磕到底的耐心。你从零开始搭建的第一套流程,一定会漏洞百出,但把它修修补补用起来之后,你会发现后面的每个新项目都只是在这个基础上的变体——这就是 from scratch 带给你最扎实的回报。