AI工程从零开始:构建可复现、可观测、可自动化闭环
“ai-engineering-from-scratch”这个名字第一次看到时我以为又是一个“三天教你训练大模型”的教程型仓库结果翻开目录才发现内容组织的思路完全不一样——它讲的是AI工程化落地而不仅仅是算法训练。这个词或者说这门学科这几年在圈子里越来越被重视但真正能把AI项目从实验室搬进生产环境、让模型稳定跑上几个月的人依然稀缺。这篇文章我想结合自己做AI工程这几年的经验聊聊从零开始接触AI工程时应该抓住哪些主线以及那些看起来很小、实际却决定成败的细节。先说一个很直接的结论AI工程不等于训练模型。训练模型只是整个链条里最“性感”的一环就像做一道菜模型是最后下锅的那一下真正决定味道的是前面买菜、洗菜、切菜、调料的准备。工程化解决的问题是如何让模型训练、评估、上线、监控、迭代这套流程变得可复现、可观测、可自动化。如果你正处于想入行AI工程、或者已经在小项目里摸爬滚打的阶段这套思路能让少走很多弯路。我尽量把每个环节的“为什么”讲清楚再给出可以直接照做的步骤和参数这样哪怕你不是科班出身也能跟着落地。1. 为什么“从零开始”才是最有效率的学AI工程的方式1.1 先认清工程和算法是两套思维很多新手最容易犯的错误是拿论文复现的心态做工程。看一篇模型论文复现出来效果不错然后呢怎么持续服务业务请求数据分布变了怎么办线上延迟和吞吐怎么权衡这些问题论文根本不会写。AI工程的思维核心是可持续运行而不是单次最优。我在带人的时候常说一个比喻写算法代码像写一篇散文追求表达优美、逻辑严密做AI工程像写一份操作手册追求任何一个人拿到都能稳定执行出同样结果。比如训练脚本里如果有个随机种子忘了固定别人复现你的实验结果时每次都不同这对工程来说是灾难但算法研究里这种差异有时候还能接受。这就是第一层思维转变。“从零开始”这个定位恰好绕开了“拿着别人的全家桶做黑盒使用”的陷阱。它逼着你一个组件一个组件地搭当你知道每个环节为什么存在的时候遇到问题才会有定位能力而不是对着报错日志发呆。1.2 AI工程的最小闭环模型我倾向于把AI工程压缩成四个环节组成的闭环数据、训练、评估、上线监控。数据环节解决的是“喂什么”训练环节解决的是“怎么学”评估环节解决的是“学得怎么样”上线监控解决的是“上线后还行不行”。这四个环节中间还有大量的基础设施比如实验追踪、模型仓库、自动化发布、告警系统但核心骨架就是这么四条。我见过不少团队模型训练得挺猛离线指标刷得很漂亮一上线立刻被打回原形。问题基本都出在数据和评估环节训练数据长什么样、线上实时数据长什么样两边分布不一致离线评估再高也白搭。所以工程化的第一步就是把这四个环节全部量化、可控任何一个环节都能随时回溯。1.3 这种路径为什么对新人友好一个典型的“从零开始”学习路径往往是这样的先搭出一个最简可行的训练流程跑通一个玩具模型再加数据版本管理让实验可复现再把模型封装成服务加推理接口最后加上监控指标形成循环。这个路径的好处是每一步都建立在前一步之上没有超出认知范围的跳跃。你不需要一开始就背Kubernetes的资源文件也不需要上来就搞Feature Store。先让一个模型真正跑起来、被调用、能被观测再逐步加复杂度。我见过很多半途放弃的人不是因为难度而是因为一次引入的概念太多大脑过载。从零开始恰恰能把认知负担降到一个能扛的层级。2. 从零构建时的核心基础设施选择2.1 环境与依赖容器化是第一步但不是全部如果你决定自己从零搭AI工程的环境我强烈建议尽早引入容器化。不是说你公司已经有平台组提供了现成的集群而是本地开发阶段就要用容器把Python环境、CUDA版本、系统依赖全部锁死。举个例子TensorFlow和PyTorch对CUDA的版本要求经常不完全一样如果你在裸机里反复切换虚拟环境迟早会被某个GLIBC版本错误折磨到心态崩溃。容器化之后每个项目一组固定的依赖镜像换机器、换人、换环境都只需要重新拉镜像。我自己的做法是在项目根目录放一个Dockerfile和docker-compose.yml开发、训练、推理各用一个基础镜像数据卷单独挂载。但容器化只是第一步。真正容易被忽略的是依赖锁定。pip install的时候记得用pip-tools或者poetry生成完整锁文件把传递依赖也钉死。我踩过一次坑某天重新构建镜像因为没有锁定传递依赖NumPy被自动升了一个小版本矩阵运算结果全部变化线上模型预测质量直接下滑。这个问题查了整整两天才定位到。2.2 数据管理版本、血缘与质检AI工程里最容易偷懒、后期代价最大的地方就是数据。很多人第一版代码里直接从数据库拉数据训练完了就扔等想复现实验结果时数据库里数据已经被清洗过好几轮了根本回不去。我推荐的落地方式是在一开始就引入数据版本管理工具比如DVC或者LakeFS。哪怕不用工具至少也要做到三件事数据快照、schema校验、数据血缘记录。每次训练前把数据集打成一个快照记录来源、清洗脚本版本、切分方式这样任何一次实验结果都能精确对应到数据状态。数据质检这块我建议在进入训练前加一道自动检查。不要只检查空值和缺值还要检查分布偏移。比如一个二分类特征的正负样本比例训练集里是80:20如果新一批数据变成了95:5你得在数据进入训练之前就报警而不是等模型训练完才发现跑偏了。最简单的方式是写一个分布统计脚本每次数据切分后自动输出每个特征的均值、方差、分位数和上一版本对比超过阈值就直接阻断。2.3 训练代码组织配置和实验追踪不分家训练代码的工程化程度决定了你后期调模型、调参数、定位问题时的效率。我见过最惨烈的场景是代码里写死了一堆超参数想换学习率得改源码跑完一轮实验后根本不知道历史最优配置是什么全靠记忆。标准的解法是训练脚本与配置分离。把模型结构、学习率、批大小、优化器设置、数据路径全部写进YAML配置文件训练代码只负责读取配置并执行。这样每次实验其实是一次配置的变更配合实验追踪工具比如MLflow、WB、或者TensorBoard的hparams功能你能看到每次实验的影响因素和结果而不是一堆无头苍蝇式的尝试。我自己还会在配置里加一个“实验描述”字段写下当次实验想验证的假设。这个习惯让我两个月后再回看实验记录时还能清楚知道当时调整某个参数的意图。工程里最贵的成本就是上下文丢失你不想让三天前的自己看起来像个陌生人。3. 实操从零搭一个AI服务的最小闭环3.1 模型封装序列化与推理接口分离当你训练好一个模型第一步不是写Web接口而是先做一个“模型封装层”。这个封装层负责把模型从框架里“解放”出来输入raw数据输出预测结果中间做特征预处理、缺失值填充、预测后处理。为什么要这么做因为训练时的数据管线往往很复杂有特征工程、有标准化但线上推理时必须用同一个管线去处理实时数据。如果这些逻辑散落在训练代码里线上服务就变成了一场灾难。封装层本质上是一个稳定的接口让训练代码和推理服务都依赖它而不是互相掺和。序列化这块需要特别留意。PyTorch用torch.save/torch.load保存模型权重TensorFlow的SavedModel格式适合服务化。不同格式对应不同的部署方式我建议哪怕是用Python写服务也导出成框架标准格式而不是直接pickle整个模型对象。pickle对外部依赖太敏感换一个Python小版本都可能加载失败这是我在生产环境里真正遇到过的惨痛教训。3.2 服务化的选型同步、批处理还是异步模型服务的形态取决于你的业务场景。如果请求量不高、单次推理结果可以接受几百毫秒延迟直接用Flask或FastAPI写个同步接口就够了这是成本最低的方案。如果并发高单模型推理速度又慢就要考虑批处理把多个请求攒在一起模型一次推理多挑样本吞吐量能提升好几倍。我建议不要一上来就上K8s和消息队列。很多内部工具链在吞吐量没有达到瓶颈之前引入这些复杂度只会让你排查问题变得异常困难。我的习惯是先按最朴素的同步接口上线记录延迟和吞吐数据当延迟开始飙高或掉队请求变多再去做批处理和异步化。工程上有个原则优化要基于数据而不是基于臆想。服务化还有一个容易被忽略的细节——超时和重试机制。线上模型推理偶尔会抖动比如某一次GPU驱动异常导致推理耗时超过几秒。如果接口不设超时调用方会一直傻等进而拖垮整个链路。我给每个接口设置动态超时在训练阶段就统计好P99延迟然后线上超时时间设定为P99的2~3倍重试次数最多1次并且做幂等处理。3.3 评估与回归上线前的最后一道闸门离线评估不能只看一个指标。分类任务不能只盯着Accuracy回归任务不能只盯着MSE。你要分群看不同性别、不同年龄、不同时段模型的误差有没有明显差异。我有一个习惯每次训练完不只是输出总体指标还会输出一张“指标分组表”把每个细分人群的指标单独列出来。上线前如果发现某个小群体的指标断崖式下滑即使总体指标看起来正常也要谨慎。更关键的是一套回归测试集。这个测试集不会像普通测试集那样每次更新而是沉淀下来的、覆盖关键场景的历史数据。模型每次迭代上线前都要在这套数据上跑一遍保证新模型不会在某个重要场景上出现退化。我把它类比成软件工程里的单元测试不是为了证明新功能有多好而是为了确保没有把之前修好的bug又带回来。4. 上线之后监控、预案与持续迭代4.1 线上监控漂移检测是AI工程特有的必修课软件工程的监控关心的是CPU、内存、错误率AI工程的监控必须再加一道数据漂移。线上输入数据的分布和训练集分布不一致的时候模型的准确率一定会下降。而你光看模型的错误率往往要等到用户反馈或业务指标掉下来才发现那时候已经晚了。漂移检测最简单的方式是特征分布对比。每天统计线上特征的基本统计量均值、方差、分位数跟训练集基线做比较计算PSI或KL散度。超过阈值就触发告警。这里有一个实操细节不要等到整个分布都变了才报警要分特征、分时段看。有些特征在周末和工作日的分布本来就不一样别把正常的周期性波动当成漂移。我通常会维护一个“允许波动清单”把已知的正常波动特征排除在告警规则之外。4.2 线上预测结果的监控除了输入分布输出分布同样要盯。线上预测结果的类别比例、置信度均值、最值置信度这些指标突然变化往往说明模型行为发生了异常。举例来说一个分类模型上线时正类占比10%某天突然变成30%就算输入特征看起来没漂移也很可能是某一类特征在某条数据链路里被改坏了。我建议为模型输出设置“双通道监控”实时通道只监控核心指标比如预测均值离线通道每天跑一次完整分布对比生成监控报表。这样既有实时告警也有每天的深度体检。4.3 版本迭代和回滚预案模型上线之后不是一劳永逸的。业务形态在变数据分布在变模型必须持续迭代。但AI模型的迭代比普通软件迭代更谨慎——你没法保证新模型在所有场景上都比旧模型更好。我在生产环境采用的策略是影子部署新模型和旧模型同时接收线上请求但只有旧模型的预测结果实际生效新模型的预测结果只用来对比。影子跑一段时间统计两边的业务效果差异确认新模型没有显著退化再切换流量。这种做法的好处是不会因为一次仓促上线而让全体用户为你的评估疏漏买单。影子部署要额外考虑的是成本双倍算力意味着双倍开销但对关键业务来说这笔钱花得很值。回滚预案也同样重要。任何时候上线都要确保旧模型权重和旧配置可以一键回退。不要等到新模型出错时才发现旧模型的文件被你覆盖掉了。模型仓库里保存历史版本每个版本带上训练时间、配置哈希、评估报告这样回滚才是有据可依的而不是靠运气。5. 常见问题与排查技巧实录5.1 环境依赖地狱最隐蔽的“不可能复现”AI工程里最让人崩溃的问题往往不是模型效果差而是“明明上次能跑今天再跑就报错”。排查这种问题我总结了一个固定流程先检查容器镜像有没有变化再检查锁文件有没有改动最后才检查代码有没有更新。80%的复现问题出在依赖更新而不是代码逻辑。为了防止这个问题我的项目里会保存完整的pip freeze输出并且把镜像tag锁定到具体commit。升级任何依赖都要单独开一个分支跑完完整回归测试才能合并。虽然这个过程有点繁琐但比起生产环境事故的代价这一点麻烦完全不值一提。5.2 数据泄漏离线指标虚高的元凶数据泄漏是AI工程里最高频的“隐形事故”。表现就是离线评估指标高得离谱线上效果却平平无奇。原因通常是特征里包含了未来信息或者训练集和验证集有重叠。排查数据泄漏我有个笨但有效的办法人工抽查一批训练数据和一批线上实时数据让业务同学帮忙判断特征是否合理。比如CTR预测模型里如果把“用户是否点击”作为一个特征放进训练样本那模型在离线评估时很容易学到这个泄漏特征线上时这个特征根本拿不到效果自然崩塌。工程规范上要严格要求特征只允许使用预测时刻之前能拿到的信息。5.3 推理性能排查从Python层到硬件层模型上线后如果推理延迟超标先别怀疑模型结构。我的排查顺序是第一看数据预处理耗时第二看模型推理耗时第三看后处理和网络序列化耗时。实际经验里数据预处理和后处理在Python里通常比模型推理本身还耗时最常见的是无意义的类型转换和循环。第二层看框架本身比如PyTorch可以开启torch.compile、使用半精度推理、关闭梯度计算TensorFlow可以开启XLA编译。第三层看硬件资源GPU利用率是否打满、显存分配是否有大量碎片、CPU与GPU之间数据传输是否频繁。我见过一个项目把数据从CPU复制到GPU再复制回来一次做一次推理总耗时翻了三倍。5.4 模型效果突然变差先查数据链路线上模型效果下滑第一个念头不要是“模型该重训了”先去查数据链路。我处理过的很多“模型变差”问题最终都定位到上游数据源格式变化、字段映射错误、或者某个特征在传输过程中被截断。模型本身没变喂给它的数据变了。所以我会在监控系统里专门记录“输入特征质量”指标每个特征的空值率、非法值比例、类型是否正常。这些指标变化在先预测效果变化在后。只要盯住数据链路质量绝大多数“模型变差”问题都能在用户感知之前发现和处理。6. 补充几条踩坑后总结的心得6.1 文档的价值被严重低估AI工程师普遍不喜欢写文档但我强烈建议至少维护三份实验记录文档、部署操作手册、故障处理手册。实验记录文档记录每次实验的目标、配置、结果和结论部署操作手册记录上线、回滚的标准步骤故障处理手册记录曾经遇到过的故障和排查过程。有了这三份文档团队里任何一个人都能在紧急情况下接手而不是只能靠某一个人的记忆。6.2 小事自动化大事才从容我学到的一个工程习惯是任何超过两次的重复操作都会尝试脚本化。比如清理旧模型版本、生成上线检查清单、每日巡检报告都写成脚本或工作流。一开始可能会觉得麻烦但这些自动化积累起来就在系统出大事时给你省出了最宝贵的排查时间。6.3 尊重业务指标而不是模型指标模型指标是工具业务指标才是目的。一个模型AUC提升0.01如果业务上完全没有感知这个提升的意义就要打个问号。反过来一个模型AUC略降但通过调整阈值让业务转化率明显提升那就是一次成功的迭代。我建议每个AI工程在立项时就定义清楚业务指标并建立模型指标到业务指标的映射关系。这样团队辛苦做的优化才能被业务方真正看到。根据我个人的体会从零开始走一遍AI工程全流程远比直接使用现成平台学到的东西多。那些平台帮你省掉的环节正是你理解AI系统运行规律的关键。自己搭一遍你才会知道为什么需要数据版本、为什么模型服务要设计超时、为什么上线前要准备回滚方案。这些经验是搜索引擎查不到了、培训班讲不透的只能靠一次一次踩坑换回来。如果你也想走这条路我的建议很简单选一个小而真实的业务场景从数据到监控完整走通一个闭环别嫌它“太小”或者“太简单”——把每一环做到有记录、可复现、能回溯你就算真正入门AI工程了。

相关新闻

企业文档管理系统设计与实现:基于Java SSM与Flask的权限、版本与安全实践

企业文档管理系统设计与实现:基于Java SSM与Flask的权限、版本与安全实践

去年做这套基于JavaSSMFlask的企业文档管理系统时,被问得最多的一句话是:这不就是个网盘吗?我一般不会急着反驳,而是让对方打开自己公司那个共享文件夹看一眼——里面多半是按“最终版”“最终版2”“最终版打死不改”这种命名堆起…

2026/10/3 14:52:10 阅读更多 →
MoveIt Task Constructor:机械臂任务逻辑的可编程重构

MoveIt Task Constructor:机械臂任务逻辑的可编程重构

1. 为什么MoveIt Task Constructor不是“另一个MoveIt插件”,而是机械臂任务逻辑的重构起点很多人第一次看到MoveIt Task Constructor(MTC)的名字,下意识会把它当成MoveIt 2里又一个可选的运动规划插件——就像ompl_planner或chom…

2026/10/3 14:52:10 阅读更多 →
SSM框架下的勤工助学管理系统:毕业设计选题与核心实现全解析

SSM框架下的勤工助学管理系统:毕业设计选题与核心实现全解析

如果你正准备碰2026年毕业设计,手里正翻着五花八门的题库,大概率会在目录里反复看到“勤工助学管理系统【源码论文】”这种条目。选这个题的逻辑并不难懂:业务场景贴近校园、角色分工明确、技术路线跨度适中,用SpringSpringMVCMyB…

2026/10/3 14:52:10 阅读更多 →

最新新闻

水稻病虫害识别系统源码实战:Python机器学习从训练到部署

水稻病虫害识别系统源码实战:Python机器学习从训练到部署

简介:这份资源是基于Python机器学习的水稻病虫害自动识别系统源码包,面向农学信息化方向的学生、课程设计开发者及希望入门图像分类实战的工程师,用于解决水稻病虫害人工识别效率低、经验依赖强的问题。压缩包共310个文件,约2.56M…

2026/10/3 15:26:08 阅读更多 →
QuickBlue AI应用底座:企业大模型落地与实战指南

QuickBlue AI应用底座:企业大模型落地与实战指南

1. QuickBlue 到底是什么先给结论:QuickBlue 不是一个具体的业务软件,也不是某个大模型的名字,而是一套专门给企业做 AI 应用落地用的“中间层平台”。你可以把它理解成企业 AI 时代的“水电煤接口”——它不直接生产水电煤,但它让…

2026/10/3 15:26:07 阅读更多 →
密度算符完全指南:从混合态到量子噪声与纠缠判定

密度算符完全指南:从混合态到量子噪声与纠缠判定

做量子计算方向的人,尤其是刚开始啃量子信息理论的同学,几乎都会在某个阶段撞上同一个坎:前面几章还在用波函数 |ψ⟩ 描述一切,到了讲量子噪声、开放系统、部分测量、纠缠判定的时候,所有公式突然都换成了 ρ&#xf…

2026/10/3 15:26:07 阅读更多 →
UE5、3A与开放世界:从刀光材质到网络同步的技术拆解

UE5、3A与开放世界:从刀光材质到网络同步的技术拆解

1. 从一场发布会聊起:UE5、3A、开放世界到底在说什么如果你最近刷到过腾讯游戏发布会的相关消息,大概率会被几个词反复轰炸:UE5、3A、开放世界。这三个词放在一起,基本就是当下游戏行业最顶配的“技术三件套”。但很多人看完发布会…

2026/10/3 15:26:07 阅读更多 →
Arch Linux双系统安装全指南:从分区到引导修复避坑实战

Arch Linux双系统安装全指南:从分区到引导修复避坑实战

看过太多新手在Arch Linux双系统上翻车,有的把Windows引导搞没了,有的分区时手一抖把整个盘抹了,还有的装完进不去桌面只能干瞪眼。这篇文章直接把我踩过的坑和验证过的流程全写出来,从Windows下分区、做启动盘、改BIOS&#xff0…

2026/10/3 15:26:06 阅读更多 →
TSMaster Python二次开发:CAN/CANFD总线采集与周期告警实战

TSMaster Python二次开发:CAN/CANFD总线采集与周期告警实战

上个月接了一台新能源样车的数据采集任务,甲方要求把整车上CAN和CANFD两条总线跑的关键报文实时抓下来,还要能看到发动机转速、车速、电池SOC,一旦发现某个报文周期异常就自动弹提示。如果用老办法一边开TSMaster界面一边盯监控窗口&#xff…

2026/10/3 15:25:06 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →