1. 重新定义"从零":AI工程不是算法竞赛,是系统工程
前阵子有朋友问我,想做ai-engineering该从哪里起步,是不是得先把机器学习数学啃完,或者从零手写一个Transformer。我听完第一反应是:又有人把"从零开始"理解成"从头推导一切"了。以我这些年做AI工程项目的经验,from scratch真正指的是从零搭建一套能解决问题、能上线、能维护的工程体系,而不是从零复刻论文里的每个公式。
很多新手被"AI工程师"这个头衔吓住,以为门槛在于数学和算法,实际上日常80%的时间花在数据清洗、脚本调试、版本管理、推理服务这些听起来不那么"性感"的事情上。算法反而不是天天都在创新。我做过一个情绪分析系统,整个模型选型只用了一天,剩下两周全在跟脏数据、标注不一致、接口延迟死磕。这才是AI工程的真实面貌。
"从零"的路径应该这么理解:你不必从数学推导开始,但你要理解模型输入输出和训练流程的逻辑;你不必从训练大模型开始,但你要会跑通一个小模型并部署它;你不必从框架源码开始,但你要知道报错信息在提示什么。这个定位一旦摆正,学习路线会清晰很多。
1.1 "从零"到底指什么:三个常见误读
我见过太多人卡在起步阶段,本质上是把"从零"理解成了"从头造轮子"。这里集中说三个最常见的误读,希望你能绕开。
误读一:从数学公式开始。线性代数、概率论当然重要,但不需要先修完三门数学课再动手写代码。我的做法是按需补数学:用交叉熵时搞懂信息量概念,出现梯度问题时补反向传播直觉,其余的先跑代码再回来看公式。
误读二:从自己训练大模型开始。很多人一上来就想去微调一个几十亿参数的大模型,机器不够就焦虑。实际上AI工程的入门项目用几百MB的模型完全够用,你在本地CPU上都能跑通分类、抽取、检索这些任务。先把小模型的完整生命周期走一遍,再谈大模型的分布式训练。
误读三:从框架源码开始。PyTorch源码确实值得读,但不是起点。初学者应该先学会用transformers库加载模型、微调、推理,等遇到性能瓶颈或自定义需求时,再深入去看底层实现。源码阅读是进阶手段,不是入门门槛。
1.2 AI工程、AI研究、算法调包:三条路别走岔
我经常用一句话区分这三个角色:算法工程师关心模型能不能更准,AI工程师关心系统能不能一直稳,研究员关心方法能不能更新。它们在目标、产出和评价标准上差异很大。
| 维度 | AI工程 | AI研究 | 算法调包 |
|---|---|---|---|
| 核心目标 | 稳定交付可用系统 | 提出新方法或新理论 | 快速拿到结果 |
| 典型产出 | 上线服务、监控体系、数据流水线 | 论文、开源算法、实验报告 | 基线模型、评测数据 |
| 关键技能 | 工程架构、部署运维、数据管道 | 数学推导、实验设计、论文写作 | 框架API使用、调参技巧 |
| 评价标准 | 可用性、延迟、成本、可维护性 | 创新性、实验完备性 | 指标分数、速度 |
做AI工程最容易踩的坑是用做研究的心态做工程:追求指标提升,忽略稳定性和可维护性。我见过一个项目,模型AUC从0.90调到0.92,结果推理耗时翻了一倍,单次调用成本涨了五倍,业务方根本没法接受。所以想走ai-engineering这条路,要尽早建立工程思维:所有改动都要问一句,它在生产环境里值不值。
2. 六边形能力骨架:AI工程师真正要练哪几块肌肉
聊完定位,说能力。我总结AI工程师需要六块核心能力,缺一块都会在某个阶段卡住。这六块不是什么理论模型,是我在真实项目里反复吃亏之后提炼出来的。
2.1 底座:Python工程能力与数据处理
第一块是Python工程能力。注意我说的是"工程能力",不是"会写Python"。具体来说包括:项目目录怎么组织、虚拟环境怎么管理、依赖如何锁定、代码怎么写才能让别人(和三个月后的自己)看懂、异常怎么处理、日志怎么打。这些看似基础的技能,决定了你能否在一个持续迭代的项目里长期工作。
我见过不少算法很强的人,代码全在一个final_v2.py里,没有函数拆分,没有参数配置化,跑一次实验改一堆硬编码。这种代码根本谈不上工程化。建议尽早建立规范:脚本放在src目录,配置放在config目录,数据读写统一封装,模型训练和评估分成独立模块。
第二块是数据处理。AI工程里最常说的就是"Garbage in, garbage out"。你需要熟练使用Pandas或Polars做表格数据处理,会写SQL做数据探查,能处理缺失值、重复样本、标签噪声,还会做数据划分——这里的水很深,后面专门讲。数据处理花的时间往往比你想象的多,但这部分是AI工程师的基本功。
2.2 模型层:从调用到微调的完整梯度
这块能力不是一步到位,而是梯度递进。第一阶段是能调用:用transformers加载开箱即用的pipeline,完成文本分类、命名实体识别、文本生成等任务。第二阶段是会微调:用少量标注数据在预训练模型上做fine-tune,掌握训练参数(学习率、batch size、epoch数量)的基本调整方法。第三阶段是会优化:做模型压缩、量化、蒸馏,把模型跑在有限资源上。
这里我想强调的是,不要觉得"调用别人模型"很low。现代AI工程本来就是站在巨人肩膀上,能用好预训练模型本身就是核心能力。你需要知道每个模型的输入输出格式、适用场景和显存占用,而不是重新发明一个。微调也不是上来就用全参数,目前主流的LoRA等参数高效微调方法值得优先掌握。
2.3 工程化能力:训练、部署、监控三件套
模型训练出来只是起点。工程化能力是指:训练脚本可复现(固定随机种子、记录实验配置)、模型可部署(封装成API服务或导出为推理引擎格式)、运行时可监控(延迟、吞吐、异常率、数据漂移指标)。
部署这关卡住了很多人。最常见的问题是:训练用的是GPU和PyTorch,部署环境却只有CPU,或者内存只有几百MB。这时候就需要导出ONNX格式、做int8量化,设计合理的批处理策略。这些都是AI工程特有的能力,算法研究里很少涉及。
2.4 软技能:需求拆解与成本意识
最后这块经常被忽略:需求拆解能力和成本意识。业务方说"帮我们做一个智能客服助手",你要能把它转化成"输入用户问题,输出标准答复,正确率不低于85%,响应时间小于2秒,支持每天10万次调用"。这个翻译过程非常关键。
成本意识更是AI工程和纯算法竞赛的分水岭。GPU按小时计费,推理服务每增加1毫秒延迟都影响用户体验。我一般会先算一笔账:标注数据多少钱、训练机器多少钱、上线后每次推理多少钱,然后决定模型规模和技术方案。很多项目的死法不是模型不准,而是成本超出预期。
3. 技术栈选型思路:不要被框架绑架,先理解运行逻辑
技术栈是每个新手都会焦虑的问题:这么多框架和工具,我到底该学哪个?我提供一个务实的选型思路:先锁定一套能跑通端到端项目的最小技术栈,跑通之后再按需扩展。
3.1 我的最小技术栈清单
这是我推荐给从零起步者的技术栈,都是生态成熟、资料丰富、踩坑能找到答案的工具。
| 层次 | 工具 | 用途 |
|---|---|---|
| 语言 | Python 3.10+ | AI工程的事实标准 |
| 交互环境 | Jupyter Notebook / VS Code | 探索式开发和脚本编写 |
| 环境管理 | conda 或 uv | 隔离Python环境、锁定依赖版本 |
| 数据工具 | Pandas / Polars | 表格数据清洗与分析 |
| 模型库 | Hugging Facetransformers | 预训练模型加载、微调、推理 |
| 训练引擎 | PyTorch | 深度学习模型的训练与推理 |
| 推理服务 | FastAPI + ONNX Runtime | 把模型封装为HTTP接口 |
| 容器化 | Docker | 统一开发与部署环境 |
| 实验追踪 | MLflow | 记录实验参数、指标和模型产物 |
这套组合覆盖了从数据处理到模型上线的完整闭环,而且每个环节都有官方文档和社区案例。等你有经验了,再根据项目需求替换组件不迟。
3.2 框架选型背后的三个权衡
我见过有人反复比较PyTorch和TensorFlow,结果两个月过去了还在选型。选型不是选"最好的",而是选"最合适的",关键看三个权衡。
一是生态权衡。PyTorch在学术界和工业界目前占据明显优势,几乎所有新模型都优先支持它,transformers生态也是基于PyTorch最顺手。除非你维护的是历史遗留的TensorFlow项目,否则我建议优先PyTorch。
二是灵活性权衡。有些项目需要自定义训练逻辑,有些项目只需要快速调用。我的建议是一致的:先用最高效的方式做出一个能跑的原型,再根据性能需求逐步替换组件。比如第一版直接调用pipeline,第二版改成微调,第三版再上ONNX推理。千万别一上来就搭Kubernetes平台。
三是部署形态权衡。如果你只是做实验,怎么方便怎么来;如果要上线服务,就要考虑推理框架的吞吐和资源占用。ONNX Runtime的生态比较成熟,支持CPU优化和量化,很适合中小型项目的部署场景。从PyTorch导出ONNX时经常遇到算子兼容问题,建议尽早熟悉导出流程。
3.3 环境与依赖管理:最容易翻车的起步环节
我遇到的AI工程新手问得最多的问题之一,就是"为什么我跑别人的代码一堆报错"。八成原因是环境问题:Python版本不对、依赖冲突、GPU版本和CUDA不匹配。
我最推荐的组合是conda创建环境 +requirements.txt清晰锁定版本。具体操作大概是:用conda create -n aienv python=3.10创建虚拟环境,然后在项目里维护一个requirements.txt,记录运行所需的核心依赖。上线部署时再用Docker把环境整层固化,这样本地跑和服务器跑用的是同一套依赖,基本能避免"在我机器上是好的"这种悲剧。
这里有个特别容易忽略的细节:GPU相关依赖必须单独处理。PyTorch的CUDA版本和显卡驱动版本要匹配,云端环境还要看预装的是CUDA 11.8还是12.1。每次新建环境时,先运行一个最小推理脚本(比如加载BERT做一次前向)验证GPU可用,再继续往下走,能省很多排查时间。
4. 从第一个端到端项目开始:一条可复现的路径
理论说再多,不如动手做一个项目。下面我分享一条完整的实操路径,每一步都能复现。这个项目的选择很关键:它要足够小,能在一台普通电脑上跑完;又要足够完整,覆盖数据、训练、评估、部署整个链路。
4.1 选题原则:用一个任务串起所有核心环节
很多人的第一个项目是MNIST手写数字识别,但这个任务太"干净"了,没有真实数据的坑。我更推荐做文本多分类,比如新闻标题分类、客服工单打标、评论情感判断。为什么选文本分类?因为数据容易获取、标签含义清晰、模型训练快、且方便部署演示。
以"新闻标题分类"为例:给定标题,判断属于科技、体育、财经、娱乐还是健康。这个任务几乎串联了所有AI工程核心环节:数据搜集与清洗、探索性分析、标签分布检查、模型微调、评估指标计算、API封装。做完这一个项目,你对AI工程的全局就有感觉了。
4.2 数据这一关:清洗、切分、标签校验怎么做
我用一个简化版流程描述数据处理的关键步骤。第一步是格式统一:把所有数据整理成一个DataFrame,格式类似DataFrame[["text", "label"]],去掉多余字段。第二步是去重去空:剔除空文本、重复样本,统一文本大小写和标点。第三步是标签归类:把非预期标签整合为other,并检查每个类别的样本数量,防止类别极度不均衡。
数据切分很容易犯错,我说一个核心原则:划分训练/验证/测试集时,必须保证没有重叠样本。文本数据里经常出现大量重复或近似重复的样本,如果不去重直接切分,同一个样本可能同时出现在训练集和验证集,评估指标虚高,上线后被打回原形。
还需要按时间字段切分的情况:如果用历史数据训练、预测未来数据,必须按时间划分而非随机划分,否则会造成信息泄漏。这个点新手经常忽略,但真实项目里非常关键。
4.3 训练与评估:指标别只看准确率
模型训练环节,我建议使用Hugging Face的TrainerAPI,它把数据加载、batch处理、梯度更新、进度显示都封装好了,适合从零入门。以下是一个微调文本分类模型的简化示例:
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=5) def tokenize_function(examples): return tokenizer(examples["text"], truncation=True, max_length=128) train_dataset = train_df.map(tokenize_function, batched=True) val_dataset = val_df.map(tokenize_function, batched=True) training_args = TrainingArguments( output_dir="./results", learning_rate=2e-5, per_device_train_batch_size=16, num_train_epochs=3, eval_strategy="epoch", logging_dir="./logs", ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, ) trainer.train()这段代码里最值得关注的是几个核心参数:learning_rate在微调场景通常用2e-5到5e-5,这个量级非常重要——预训练模型已经收敛得不错,学习率太大会破坏原有特征;num_train_epochs从3个epoch开始比较稳妥;eval_strategy="epoch"表示每个epoch结束都做一次评估,方便观察过拟合趋势。
评估指标不能只看准确率。类别不均衡时,准确率会被多数类主导,比如95%样本是体育类、5%是其他类,模型全猜体育也有95%准确率。这时候要看宏观F1(macro F1),也就是每个类别的F1先算出来再取平均。最好再打印一个混淆矩阵,能直观看到模型到底在哪些类别上混淆。
4.4 部署:把模型变成可调用的API
模型训练完,下一步是让用户能调用它。最省事的部署方式是用FastAPI封装一个HTTP接口。这里我强烈建议把模型导出为ONNX格式再部署,尤其是目标环境没有GPU的时候。ONNX Runtime在CPU上的推理速度通常比PyTorch快不少,还能做int8量化减小体积。
以下是部署服务的骨架代码:
from fastapi import FastAPI from pydantic import BaseModel from onnxruntime import InferenceSession from transformers import AutoTokenizer import numpy as np app = FastAPI() tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") session = InferenceSession("model.onnx") class InputText(BaseModel): text: str @app.post("/predict") def predict(data: InputText): inputs = tokenizer(data.text, truncation=True, max_length=128, return_tensors="np") onnx_inputs = { "input_ids": inputs["input_ids"], "attention_mask": inputs["attention_mask"], } logits = session.run(None, onnx_inputs)[0] pred_id = np.argmax(logits, axis=-1)[0] return {"label": id2label[pred_id]}部署时要注意几个点:一是启动前做一次热身调用,让模型和tokenizer加载完成,避免第一个请求延迟过高;二是添加一个/health健康检查接口,方便监控系统探测服务状态;三是设置合理的超时时间,防止请求堆积。把这些细节处理好,才算一个真正可用的服务。
5. 实战中的熵增:数据、模型、部署三大暗坑
做AI工程时间越长,我越觉得项目崩塌很少是因为某个环节特别难,而是熵增——各种小问题不断累积,最后系统变得不可维护。下面我集中说三个最典型的暗坑,以及完整的排查思路。
5.1 数据泄漏:指标虚高的最大元凶
有一段时间我发现模型在验证集上F1达到0.95,但上线后效果远不如预期。后来排查了半天,发现是数据划分出了问题:原始数据里同一个事件的新闻被重复抓取,内容高度相似,随机切分后相似样本同时进入了训练集和验证集。模型等于"开卷考试",验证集上自然表现得很好,一到真实场景就现出原形。
解决数据泄漏的办法主要有几招:先做文本级去重(用哈希或simhash做近似去重);然后按来源或时间划分数据;最后要养成习惯,上线前的评估不止看整体指标,还要把业务方提供的留出集拿出来测,留出集尽量靠近真实用户数据分布。
排查时要养成一个意识:模型好得不寻常,先怀疑数据有问题,而不是自己的算法多厉害。我见过太多人把偶尔的高分当作模型有效的证据,结果上线就翻车。数据泄漏是AI工程里最隐蔽也最致命的问题之一。
5.2 训练过程的神秘波动:从现象到根因
训练曲线波动是让新手最头疼的问题。我遇到过的情况包括:loss在某个step突然飙升到NaN、验证集准确率忽高忽低、不同epoch的模型效果差异巨大。这些问题通常不是"调参能糊弄过去"的,需要系统性排查。
排查顺序我建议这样走:第一步检查学习率是否过大或是否出现梯度爆炸,scheduler设置是否正确;第二步检查数据标签是否有NaN或异常值,一处脏数据就可能导致loss异常;第三步检查随机种子,确定是代码逻辑问题还是随机问题;第四步检查模型结构,比如分类头输出维度是否和标签类别数一致。
实践中的一个小技巧是固定随机种子并做多次重复实验。如果同一个实验在不同随机种子下指标差异巨大,说明模型对数据分布特别敏感,这时候要查数据的标注质量和划分方式,而不是反复改学习率。训练过程本身需要"体检",可视化loss曲线和梯度范数能帮你快速发现问题所在。
5.3 部署环境的隐形炸弹:一次本地部署的生产事故
我印象最深的一次事故是:本地运行一切正常,部署到服务器后所有请求都报错。开始以为是依赖问题,重新安装了一轮还是不行。最后发现是服务器CPU不支持某个指令集,依赖库在运行时崩溃。这种环境差异导致的坑,没有经验时很难快速定位。
后来我养成了固定的排查链路。首先看日志,是不是依赖导入或算子加载阶段报错;其次在目标机器上跑最小复现脚本,比如单独加载ONNX模型做一次推理;再次对比本地和部署环境的Python版本、系统架构、依赖版本;最后检查模型文件是否完整上传,路径是否正确。在目标环境里跑最小复现脚本,通常能帮你从"全链路排查"降维成"局部问题定位"。
这类环境问题,最彻底的解决办法是Docker容器化:把训练和部署的依赖完整装进镜像,部署时直接用镜像启动服务,环境差异就基本消除了。
5.4 从现象到根因:一个可复用的排查链路
上面几个坑其实反映了一套通用的排查方法论。我总结为四步链路:
- 定义现象:明确"出现什么异常",比如网页返回500、模型全部预测为同一类别、指标骤降。
- 划定范围:把问题缩小到数据、训练、部署、监控四个环节之一,去掉不可能的变量。
- 二分定位:在链路中间打个日志或检查点,确认前半段正常还是后半段正常,逐步缩小范围。
- 最小复现:用最小代码块和最小数据在本地或测试环境复现问题,确认根因后再修复。
这套方法论不仅适用于AI工程,几乎覆盖所有软件系统的排查场景。我强烈建议你从一开始就建立"排查链路"的思维习惯,不要看到报错就全凭直觉乱试,那样只会越试越乱。
6. 让项目真正可维护:版本化、评估、监控与回归
很多人做一个AI项目,跑出结果就完事了。但"做完"和"可用"之间隔着一道墙,这道墙就是可维护性。一个不可维护的AI项目,三个月后连它的作者都无法继续扩展,更别说团队协作。
6.1 实验追踪:从目录命名到MLflow
AI实验最怕"埃博拉版本"——final_v2_真正最终版.py这种文件。我早期也是这么干的,直到有一次需要对比模型效果,却想不起来是哪个代码跑出来的结果。痛定思痛,我开始用三个层级的实验追踪。
第一层是代码层面:每个实验对应一个Git commit,代码里不写死关键参数,而是用yaml或命令行参数配置;第二层是记录层面:用MLflow记录每次实验的metrics、参数、模型产物和日志路径;第三层是产物层面:每个模型至少记录训练数据集版本、评估结果、ONNX导出文件和部署方式。做到这三层,基本就不会出现"不知道哪个模型效果最好"的局面。
实验追踪看似增加工作量,实际是省时间。它的核心价值在于可回溯:任何一次结果都能追溯到数据、代码、参数和模型产物,这才是AI工程和一次性脚本的分水岭。
6.2 离线评估和在线监控:两套不同的眼睛
离线评估是训练阶段的任务:用测试集算指标,判断模型够不够好。但模型上线之后,真实世界的数据分布是会变的,市场热点来了,新闻标题的风向就变了,模型效果自然跟着掉。所以在线监控是AI工程不可省略的一环。
在线监控至少包含四个核心指标:接口的延迟与吞吐、请求的成功率和异常量、模型预测结果分布的漂移、以及人工抽检的准确率。最简单的方式是给推理服务打结构化日志,记录每次请求的输入文本、预测标签、置信度、耗时,汇总后绘制趋势图。一旦发现某个指标突然异常,就要考虑是否需要重新训练或回滚到旧版本。
另一个常被忽视的点是预测置信度。很多模型输出低置信度的预测时,其实已经不可信了。你可以设置一个置信度阈值,当预测低于阈值时走人工兜底流程,而不是直接返回结果给用户。这套机制能大幅降低模型出错带来的业务影响。
6.3 模型回归测试:保护系统的护城河
模型迭代最怕的是什么?是优化了一个场景,搞砸了十个场景。比如你在新闻分类模型上加了新类别"科技",结果把原本正确的"财经"标题分到了科技类,这种特定输入的回归事故是上线事故的高发源。
我的解决办法是维护一个golden test集:从真实历史数据里挑出几百条覆盖高频场景的样本,把每次训练出的模型拿来做全量回归测试,对比新模型和当前线上版本在每个场景上的预测结果。只有所有回归用例都通过,或者有明确理由说明某些变化可接受时,新模型才能上线。
不要小看这个步骤。它相当于给模型迭代过程装上"护栏",防止盲人摸象式的优化。我在团队里要求每个模型提交都必须附带回归测试报告,这能拦住大量潜在的生产事故。
7. 三个月入门到一年进阶:一份务实的路线图
最后聊大家最关心的:具体怎么排时间、怎么学、怎么一步步走过来。我会给出一份可落地的分阶段路线图,它基于我自己的实践,也综合了身边同事的经验。
7.1 阶段一:跑通与复现(第1到4周)
第一个月的目标不是搞懂所有概念,而是跑通一个端到端项目。具体任务包括:安装好Python和PyTorch环境,跑通transformers的一个文本分类示例,能把官方数据集下载下来训练一个模型,然后写一个最简单的FastAPI接口。不要贪多,哪怕任务很小,也要把"数据-->训练-->评估-->部署"整条链路走一遍。
这个阶段的重点不是理解每个细节,而是建立端到端的直觉:知道一份数据如何变成用户可以调用的服务。遇到报错很正常,关键在于学会看报错信息的关键词、使用搜索引擎和官方文档去定位问题,而不是陷入"看不懂就从头再来"的循环。
7.2 阶段二:独立实现一个完整项目(第5到12周)
第二到第三个月,你要独立做一个自己的项目。选题建议是文本分类、情感分析或信息抽取,数据可以来自公开数据集,也可以自己爬取整理。这个项目要有明确的目标:比如"构建一个客服工单分级系统,准确率达到80%以上"。
在这个阶段,你必须刻意练习几件事:一是数据清洗,把最真实、最脏的数据处理干净;二是实验对比,至少跑三个不同的模型或微调方案,记录它们的指标和训练成本;三是部署打磨,把模型部署成稳定的服务,并做简单的压力测试。完成这些,你会形成自己的AI工程"手感"。
7.3 阶段三:在真实场景中打磨(第3到12个月)
从第三个月开始,如果条件允许,尽量参与一个真实的业务场景或开源项目。你可能会发现自己辛辛苦苦训练出的模型,在真实流量下效果一路下滑,或者算法的准确率达标了,但延迟和成本超标。这些问题的解决过程,才是AI工程的核心价值所在。
这个阶段要关注的不再是单一模型本身,而是整个系统的迭代闭环:数据怎么持续更新、模型多久重新训练一次、如何自动化地评估和发布新版本、线上问题怎么快速回滚。你可以独立设计一个简单的监控dashboard,把延迟、调用量、预测分布和人工抽检结果都放上去,让模型的行为透明可见。能把"训练-->评估-->上线-->监控-->再训练"的闭环跑起来,你就真正跨越了从零到一的门槛。
7.4 学习资源与检索策略:怎么学最高效
我不建议囤一堆课程,而是按需检索、以项目带学习。遇到问题搜索时,优先看官方文档,比如Hugging Face的教程、PyTorch的文档、FastAPI的文档,这类权威资料会给你最准确的API用法。其次看GitHub上高质量的示例仓库,完整的项目代码比零散博客更有参考价值。最后才是一些社区问答和讨论帖,用来查具体的报错和处理经验。
我还想特别强调写技术笔记的价值。每做完一个项目,把过程中的schema、决策理由和踩坑记录写成文档。这不仅是给自己积累,也是在培养工程师最重要的书面表达能力。你会发现一年之后,这份笔记册比任何课程都值钱。
我自己的体悟是,AI工程这条路没有终点,from scratch也不是一次性动作,而是你每一次面对新场景、新问题,都愿意重新审视和搭建解决方案的习惯。最难的从来不是某个模型算法,而是在漫长迭代里保持系统清晰、成本可控、质量稳定。把工程思维刻进日常,你走的路就会越走越宽。