
在算法岗干了这么多年我一直有个执念把AI工程里那些玄学的部分彻底祛魅。市面上教程太多但绝大部分是教你怎么调包、怎么跑通一个demo真正从数据到部署、从指标到监控、能把整套链路从头到尾自己搭一遍的内容少得可怜。“ai-engineering-from-scratch”这个项目说白了就是逼自己回到原点不靠现成的AutoML平台、不靠大厂封装好的推理服务把AI工程的能力一层层手动搭起来。这篇文章我会把项目背后真正值得拆解的东西讲透包括为什么值得做、技术选型怎么定、核心环节怎么落地以及我踩过的那些坑。无论你是刚转行想做AI工程还是已经在跑模型但总觉得哪里不对的老手这篇都值得看完——因为很多内容是面试官不会问、文档里不会写、但实际干活时一定会遇到的。1. 项目定位为什么要把AI工程能力从头造一遍1.1 这个项目到底在解决什么问题先明确一件事“ai-engineering-from-scratch”不是一个产品也不是一个框架它是一整套从零构建AI工程能力的知识体系和实操路径。用大白话说就是别人用脚手架盖楼你用砖头水泥自己盖一遍把每一层结构都摸清楚。为什么要做这样的项目我见过太多团队模型调得溜、指标刷得高一上线就崩。有的是训练和推理的数据分布对不上有的是特征线上线下一致性没校验有的是监控只做了CPU和内存模型漂移了整整两周没人发现。这些问题的根源不是算法能力而是工程能力——你不是不会训练模型而是不知道模型之外那一大坨东西怎么搞。所以这个项目的核心目标有三层第一层把AI系统的完整生命周期拆开从数据采集到模型部署每个环节都手动实现一遍第二层在此基础上建立一套可复用的工程模板让以后做任何AI项目都能直接套用第三层通过踩坑和复盘积累那些书上不会写的实战经验。1.2 从零开始和直接调API的根本差异可能有人会问现在Hugging Face上什么模型都有云平台上一个接口就能调大模型我干嘛要自己从零搞这个问题我在项目中反复想过答案是直接调API解决的是能用的问题从零搭建解决的是可控和可优化的问题。如果你只是做一个demo调API完全够用但如果你要在一个垂直领域里做出有竞争力的AI系统比如医疗报告结构化、工业缺陷检测、法律文书分类你必须要能自己控制数据怎么清洗、特征怎么构造、模型怎么训练、阈值怎么调、线上效果怎么追踪。这些能力没有任何一个现成的API能给你。另外还有一个很现实的原因面试和职业发展。现在AI岗位的竞争早就不是谁会调参了而是谁能独立负责一个AI系统的端到端交付。从零搭建一个AI工程项目的经验是你技术深度最好的证明。我在项目里沉淀出来的这套东西后来成了团队内部新人培训的底稿也是我跳槽时和面试官聊得最深入的话题。2. 整体架构设计与技术选型2.1 四个必须打牢的地基AI工程从零开始我把它拆成了四个地基任何一个不牢上面盖的东西都得塌。第一个是数据工程。AI系统是喂数据长大的数据管道不健壮后面全部白搭。这块包括数据采集、清洗、标注、版本管理、特征工程五个子模块。我在项目里没有用现成的数据平台而是从写爬虫、写清洗脚本开始用DVC做数据版本管理用Feature Store的思路自己搭了一套轻量特征服务。这么做虽然慢但你能真正理解数据质量决定模型上限这句话的每个字是怎么来的。第二个是模型工程。这个反而是大多数人最熟悉的部分但也是翻车最多的地方。从线性回归、树模型到深度学习每一步我都要求自己能用原生框架手写核心逻辑而不是只调sklearn的包。手写过梯度下降你才知道学习率为什么重要手写过反向传播你才知道梯度消失是怎么发生的。这些底层理解在后期排查模型问题时救了我无数次。第三个是评估工程。太多项目倒在离线指标好看线上效果拉胯这个问题上。我在项目中搭建了一套完整的评估体系包括离线评估和线上评估两层。离线层面不只看准确率还看精确率、召回率、F1、AUC、KS等一堆指标在不同业务场景下的适用性线上层面搭了A/B测试框架把实验平台的逻辑也手动实现了一遍。第四个是部署与监控工程。模型只有跑在生产环境里才有价值。这块我用了Docker和Kubernetes把模型封装成微服务写了完整的Prometheus监控和Grafana看板。很多人觉得部署是运维的事但AI工程师不懂部署就等于把命脉交给别人——线上模型出问题时你要等别人告诉你吗2.2 技术栈选择背后的逻辑技术选型是项目里最纠结的部分。我的核心原则是覆盖率优先于先进性——宁可用老牌工具把所有环节打通也不用花哨的新技术把自己卡在半路上。数据层我选了PostgreSQL加Redis的组合。PostgreSQL存结构化数据和标注结果Redis做缓存和消息队列。为什么不用MongoDB因为在这个项目里没有海量非结构化存储需求PostgreSQL的JSONB足够用了而且事务支持更成熟。计算层主要用Python的科学计算生态。NumPy、Pandas、Scikit-learn是基础深度学习用PyTorch。选PyTorch而不是TensorFlow理由很简单调试体验更好动态图机制对新手友好度高而且现在学术圈和工业界的主流模型基本都是PyTorch生态。部署层用Docker加Kubernetes。我知道很多人觉得K8s太重了但既然项目叫from-scratch就应该把业界的主流方案过一遍。实际跑下来K8s的学习曲线确实陡但一旦理解了Pod、Service、Deployment这几个核心概念后面做任何系统的部署架构都举一反三。提示自己做技术选型时不要被框架的新旧迷惑。衡量标准只有两个——这个技术能不能帮你解决问题社区够不够活跃保证你踩坑时能搜到答案。3. 核心环节拆解与实操路径3.1 数据工程从采集到特征工程数据这一步我花了整整个月。因为AI工程里数据工程绝对不只是准备数据这么简单。先说采集。我的项目选了一个电商评论情感分析作为贯穿始终的业务场景。爬虫部分自己写用requests加BeautifulSoup动态页面用Selenium。这里有个关键决策采集不是越多越好而是越有代表性越好。我最初爬了一堆商品评论结果发现数据严重偏向于某个品类导致后面模型泛化能力差。后来加了品类维度抽样每个品类都控制一个比例区间情况才好转。清洗环节我总结了一套五步走流程去重、去噪、纠错、归一化、脱敏。去重用SimHash算法对长文本的近似重复判断特别有效去噪是去掉无意义字符和广告内容这里注意不要过度清洗比如电商评论里的质量很好推荐这种短文本如果清洗得太狠会丢掉情感表达的关键词。标注环节是最耗人力也最影响效果的。我没有用现成的标注平台而是自己写了一个简单的标注工具三个人背靠背标注用Kappa系数做一致性检验。Kappa值低于0.6的样本全部打回重标。这个习惯让我后面模型的上限有了保障——因为训练数据的质量决定了模型能学到的天花板。特征工程是整个数据工程里最能体现功力的部分。文本类特征我用TF-IDF和Word2Vec做了两组基线然后加了评论长度、标点符号数量、表情符号等人工特征。数字类特征做了标准化和分箱。这里有一个特别重要的原则特征必须可解释。你构造的每个特征都要能回答它为什么对预测有帮助这个问题否则就是在给模型喂噪声。最后是数据版本管理。用DVC对数据文件、特征工程代码和模型文件做统一版本管理每个版本的训练数据都可以溯源。这一步在项目后期帮我省了无数时间——当线上效果下降时我能迅速定位是哪一批数据引入的问题。3.2 模型训练从线性模型到深度网络的递进路线模型训练这块我给自己定了一个铁律先把传统机器学习做到极致再上深度学习。这个顺序不是保守而是让你建立先基线、后优化的工程思维。第一步逻辑回归作为最简基线。为什么因为逻辑回归的可解释性最好你能清晰地看到每个特征的权重。我做了L1和L2正则化的对比实验。L1正则化把特征稀疏化筛掉了一批无关特征L2正则化保留了全部特征但压缩了系数。实测下来L1在特征量大的场景下表现更好而且顺带完成了特征选择。第二步树模型。XGBoost和LightGBM是工业界的标配。这里要重点讲的是调参的思路不是盲目网格搜索。我先固定学习率再逐步调节树的数量然后调树的深度和叶子节点数。用早停机制early stopping防止过拟合。LightGBM相对于XGBoost最大的优势是训练速度快尤其是在特征维度高、数据量大的场景下能快一个数量级。第三步深度学习。用PyTorch搭了一个TextCNN加BiLSTM的混合模型。TextCNN擅长捕捉局部特征BiLSTM擅长捕捉上下文依赖concat之后再过一个全连接层输出二分类结果。Embedding层用了在训练集上自己训练的Word2Vec做初始化而不是随机初始化——这个操作让模型收敛速度明显加快准确率也提升了大概两个百分点。整个训练过程我坚持记录实验日志用MLflow统一管理。每次实验记录的内容包括数据版本、特征版本、代码版本、超参数、训练时长、评估指标。没有这些记录你做的实验再多也没法沉淀成经验靠记忆做AI最后一定是重复踩坑。注意不要在一开始就追求最先进的模型。先把最简单的模型调到一个稳定的基线再逐步替换更强的模型。这样你能清晰地区分——效果提升到底是模型的功劳还是数据的功劳还是特征的功劳。3.3 评估体系怎么判断模型真的能用评估是整个AI工程里最容易被低估的环节。很多人跑完测试集上的准确率就宣布大功告成这个做法在工业场景下是非常危险的。先讲离线评估。我在项目中设计了一套多维度的评估矩阵。分类问题不能只看准确率因为样本不均衡时准确率会骗人。比如这个电商评论场景好评样本占80%你全预测成好评也有80%准确率看起来不错但坏评一个都没抓到这个系统没有任何实际价值。所以我同时看精确率和召回率以及两者的调和均值F1最终以F1作为模型选型的主要依据。另外还画了ROC曲线和PR曲线在线下就判断清楚模型在不同阈值下的表现。关于阈值设定我做了一个详细的分析。模型输出的概率值通常不会恰好落在0和1你需要选一个阈值来决定分界线。很多人的习惯是直接取0.5但最优阈值往往不是0.5。我用验证集做阈值扫描画出F1随阈值变化的曲线取F1最大的点作为最终阈值。这个操作简单但极其有效立竿见影地提升了模型的实际效果。然后是线上评估。我把模型的预测结果保存下来和用户的后续行为做关联分析。比如评论情感分析模型我不仅看模型判断的准确度还看判断结果和商品销量的相关性——如果模型预测某条评论为强烈负面而这个商品的销量数据确实在下降那说明模型的判断有业务含义。这种业务维度的校验是纯技术指标之外非常关键的补充。最后我还实现了一个简单的模型漂移检测机制。线上模型每预测一批样本我都会统计预测分布的统计量比如正向评论比例、概率均值一旦这些统计量与训练集上的分布偏差超过预设阈值就触发告警。不要等到用户投诉了才发现模型已经悄悄失效。3.4 部署与监控让模型真正跑起来部署这一步是我认为整个项目中工程含量最高的环节也是从算法工程师向AI工程师转变的分水岭。我选择用Docker封装模型服务。Dockerfile里做了分层缓存优化先拷贝依赖文件安装Python包再拷贝代码。这样每次改代码重新构建镜像时依赖层可以走缓存构建时间从五分钟缩短到三十秒。这个细节在大规模项目中非常实用。模型服务本身用FastAPI编写。为什么选FastAPI而不是Flask因为FastAPI原生支持异步和高性能自带API文档而且基于Pydantic做请求参数校验对类型安全的支持更完善。模型加载做成了单例模式进程启动时加载一次之后所有请求都复用同一个模型实例避免了每次请求都重新加载模型的巨大开销。Kubernetes的部分我搭建了一套基础架构Deployment管理模型服务的副本数Service做服务发现和负载均衡HorizontalPodAutoscaler根据CPU利用率和自定义指标做自动伸缩。这里有一个我在实操中总结的关键经验模型服务的自动伸缩不能只盯着CPU还要监控推理延迟。如果延迟在上涨但CPU看起来还正常很可能是GPU推理任务积压这时候需要扩的是GPU实例而不是CPU实例。监控体系用的是Prometheus加Grafana。我在模型服务里埋了四类指标推理延迟、QPS、预测概率分布、异常输入数量。前两种是常规的稳定性指标后两种是模型特有的业务指标。Grafana看板把这些指标可视化之后每天扫一眼就能知道系统的健康状况这和传统后端开发里看监控的习惯完全不同——模型监控不是只看服务挂没挂还要看模型的行为有没有变化。4. 踩坑记录与排查思路实录4.1 数据泄漏最隐蔽也最致命的问题数据泄漏是AI项目中最隐蔽的错误它在训练阶段无声无息却在线上爆发时造成灾难。我在项目中就栽过一次。因为要做特征工程我在完整数据集上计算了TF-IDF的词汇表然后做训练集和测试集的切分。表面上看没有错误但仔细一想就明白了——词汇表是从整个数据集上拟合的这等于测试集的信息已经泄露到了训练阶段。我在测试集上的指标好看得可疑整个系统上线后效果却差得离谱。后来把词汇表改成只用训练集拟合再对测试集做变换情况才恢复正常。这个问题值得单拎出来强调任何特征变换只要涉及统计量均值、标准差、词汇表、归一化参数都必须只用训练集数据计算然后应用到测试集和线上数据。我第一次意识到这个问题的时候感觉非常惭愧——教科书上写得清清楚楚的东西实际动手时还是会犯。所以动手做一遍和看书看懂了之间隔着巨大的鸿沟。4.2 过拟合的十八种面孔不止是loss曲线的问题过拟合是另一个让我印象深刻的坑。刚开始训练深度学习模型时我盯着训练集的loss一路下降验证集loss却止步不前这就是教科书式的过拟合信号。但实践中远不止这一种表现形式。有一个案例很典型我在验证集上做了大量的超参数调优每天都跑几十组实验选表现最好的那组。结果模型上线的效果远不如验证集预期的那么理想。后来我才想明白——验证集被我碰了太多次。每次根据验证集调整超参数实际上都是在把验证集的信息记住到模型配置里。这本质上是另一种过拟合只是对象不是训练集而是验证集。解决办法是保留一个从未参与任何调试的测试集只有在全部调优结束后才拿出来做最终评估。面对过拟合我总结了一套组合拳第一增加训练数据包括数据增强手段第二降低模型复杂度比如减少网络层数和神经元数量第三加正则化L2权重衰减和Dropout并用第四早停基于验证集指标决定是否停止训练而不是傻跑固定epoch数。这四招按顺序使用绝大多数过拟合问题都能解决。4.3 评估指标失真的真实原因与修正方法评估指标失真这个坑让我明白数字的可靠程度取决于你怎么算它。第一类失真来源于切分方式。一开始我用随机切分把数据集按比例随机分成训练集和测试集。模型指标看起来不错但在实际应用中效果差强人意。后来检查发现这个电商评论数据集有很强的时间属性——后半年的评论包含了很多新出现的网络用语和产品型号这些在训练数据里完全没见过。随机切分把新旧数据混在一起模型偷看了未来。改成按时间切分后指标下降了不少但这才是真实水平。在工业场景中按时间切分往往比随机切分更有参考价值。第二类失真来源于样本权重。如果某些用户在评论中反复出现模型就会偏向这类样本的特征。我做了分层抽样确保每个用户只出现在训练集或测试集中避免同一用户的相似评论在训练集和测试集之间造成信息泄漏。第三类是类别不均衡。前面提到好评占80%直接用准确率评估会失真。我做了重采样处理对少数类样本做SMOTE过采样对多数类做下采样同时调整损失函数中的类别权重。调整之后F1指标对少数类的捕捉能力明显增强。5. 从0到1的三个月实操路线图5.1 分阶段的落地计划如果你也想走一遍ai-engineering-from-scratch这条路我用自己的经验整理了一个三个月的路线图按阶段推进每一步都有明确的产出物。第一个月打地基核心任务是数据工程和基线模型。第一周定业务场景哪怕是一个玩具级别的场景也行关键是全链路能闭环。第二周完成数据采集和清洗每天记录清洗规则。第三周做标注和一致性校验背靠背标注并计算Kappa系数。第四周跑通第一个基线模型不追求效果只追求流程完整。第二个月做提升核心任务是特征工程和模型优化。第一周构造特征做特征重要性分析淘汰无用特征。第二周横向对比不同模型把逻辑回归、树模型、深度学习都跑一遍记录各自的表现。第三周专注于调参和过拟合控制把早停、正则化、交叉验证都用上。第四周建立完整的评估体系包括离线指标矩阵和阈值选择。第三个月上生产核心任务是部署、监控和复盘。第一周封装Docker镜像写模型服务API。第二周把服务部署到Kubernetes配置健康检查和自动伸缩。第三周搭好Prometheus监控和Grafana看板建立告警规则。第四周做一次完整的A/B测试实验检验新旧模型的线上效果差异然后写项目复盘文档。这个路线图有三个原则一是每个阶段都必须有一个可演示的产出物避免学了一堆概念但什么都没做出来二是每个阶段都要写技术文档不仅是给自己看也是为了让这个项目成为可以展示的作品三是遇到难题不要卡太久先绕过去全链路跑通后再回头优化。5.2 需要建立的工程习惯技术之外我想强调几个工程习惯它们看似无关紧要实际决定了你能在这条路上走多远。第一写实验记录。每个实验都要记录改了什么、为什么改、结果如何。用MLflow也好用Excel也好甚至用一个文本文件也行但一定要记。我见过太多人做了一百次实验问起其中任何一次都说不清当时的参数配置和数据版本——那这些实验和没做有什么两样第二写代码要像写论文一样规范。变量命名清晰函数职责单一模块之间尽量减少耦合。AI工程的代码比普通开发更容易变成一团乱麻因为模型调优过程本身就是探索性的代码天然就有写得随意的倾向。但越是这样越要有意识地维护代码整洁度否则项目进行到一半你就看不懂自己的代码了。第三所有操作都要可复现。这句话在学术圈很常见在工程实践中一样重要。拉了一个数据集某个特征做过一次小众的清洗操作——你要保证一个月后还能完全复现当时的处理流程。做到这一点的方法就是版本管理数据用DVC代码用Git模型用MLflow三者联动缺一不可。6. 工具链清单与资源选择建议6.1 我实际用下来最顺手的工具组合工具的选择直接决定你的效率和幸福感。我按照项目不同阶段列一份亲测过、且会反复重用的工具清单。数据处理方面Pandas和NumPy是基础不用多说。数据版本管理我用DVC刚开始觉得多此一举直到有一次回退模型版本时发现连训练数据都能一键还原才意识到它的价值。特征工程我用了自定义代码加Scikit-learn的Pipeline组件把所有预处理步骤封装在一起保证了训练和推理阶段特征处理逻辑一致。模型训练用的是PyTorch配合MLflow做实验跟踪。LightGBM在结构化数据上依然是我的首选树模型因为它训练快、效果好、内存消耗低。数据标注环节我自研了一个小工具但如果你不想自己写开源的Label Studio也完全可以替代。部署层面Docker Kubernetes的组合是业界主流推理服务用FastAPI实现。如果不想维护K8s集群可以直接用Docker Compose做单机部署适合项目初期的轻量场景。监控告警用Prometheus Grafana这套组合在可观测性领域几乎是标配教程多、方案成熟、遇到问题容易搜到答案。6.2 学习资源的分层推荐关于学习资源我按三个阶段分层推荐避免一上来就被大部头的经典教材劝退。入门阶段先看吴恩达的《Machine Learning》课程虽然部分内容年代久远但对核心概念的解释至今无人能出其右。然后配合《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》这本书边看边写代码把书里的例子全部在本地跑通不跳过一个练习。进阶阶段我推荐《Deep Learning》花书重点看前几章理解神经网络的基础数学原理然后看《Designing Machine Learning Systems》这本书它对整个ML系统的工程化生命周期讲得非常清楚从数据到部署是一条完整线索。工程实战阶段直接看官方文档。PyTorch官方教程质量极高Kubernetes官方的交互式教程也值得完整过一遍。遇到具体问题优先搜索Stack Overflow和各类技术博客但注意核对发布时间三年前的解决方案很可能已经过时。提示学习资料不在多在精。贪多嚼不烂是这个领域最常见的误区——与其同时打开十个教程不如把一个教程的代码全部手敲一遍。7. 项目经验的迁移价值与后续扩展方向7.1 这套能力可以迁移到哪些场景ai-engineering-from-scratch做完之后最大的收获是你不会再被任何AI项目吓住。因为AI工程的底层逻辑是相通的定义问题、准备数据、建立基线、优化模型、评估验证、部署上线、监控迭代。这套方法论可以直接迁移到各种场景。比如风控领域的欺诈检测换掉数据源和特征内容训练和部署的链路完全不变推荐系统的排序阶段把二分类目标改成多分类或者回归评估指标换成GAUC或者NDCG整体框架照搬自然语言处理领域的文本分类、实体识别、情感分析更是直接复用这套流程。我带过团队之后对这一点的感受更深AI工程师的核心竞争力不在于你背过多少种模型结构而在于你能不能快速把一个新业务问题映射到一套成熟的工程路径上。这个映射能力只有通过完整的从零实操才能真正建立。7.2 我后续打算做的几个扩展这个项目目前覆盖了传统机器学习 基础深度学习的完整工程链路但AI技术演进太快我明确知道自己下一步该做什么。第一是扩展到大语言模型应用。不是微调LLM那么简单而是研究RAG架构的工程化实现——知识库怎么切片、向量检索怎么召回、重排序怎么做、幻觉问题怎么缓解。这些都是LLM应用落地过程中的真实工程问题。第二是把特征平台做厚。现有轻量特征服务只能支撑单机场景后续准备研究Feast这类开源特征平台把特征存储、特征上线、特征监控这些能力补全。第三是完善MLOps的自动化水平。模型训练、评估、部署现在还大量依赖手动操作后续目标是搭建CI/CD流水线把代码提交、模型训练、自动评估、灰度发布这些环节串联起来做到一键发布新模型。这些扩展方向不是我拍脑袋想的全部来自项目实操中暴露出来的真实痛点手动部署容易出错、特征版本管理混乱、LLM应用缺少可靠的中控方案。有了这一轮从零搭建的经验下一步的迭代就有了明确的靶子。最后说点个人的体会。做ai-engineering-from-scratch这个过程最折磨人的不是技术难度而是漫长的、没有即时正反馈的积累期。你要忍受连续几周都在写数据清洗脚本、调参调到头秃、部署踩坑踩到怀疑人生。但熬过来之后你对AI工程的理解会发生质变——从用过一些框架变成真正掌控了系统。这份掌控感是所有速成教程都给不了你的。如果你也在考虑做类似的事情我的建议很朴素别想太多从一个最小的完整闭环开始先跑通再优化最后你会发现最难的不是技术而是迈出第一步的行动力。