在社区里聊到AI工程师经常有人问是不是会写几个Python模型就叫做AI工程师了我的回答是那最多算模型训练员。真正意义上的AI工程是把算法、数据、算力和业务目标拧成一股绳的综合性工作。今天想借ai-engineering-from-scratch这个话题把我这些年从零搭建AI系统、手把手带团队的经验做一个系统梳理。这篇文章不是教科书是我在实际项目中反复踩坑、拆解、重构之后沉淀下来的一套路线图适合想转型AI工程、刚入门不知道从哪里下手、以及被调参调不明白卡住的朋友当作参考。1. AI工程不等于调模型先搞清这份工作的真实边界很多新手一上来就抱着PyTorch文档啃学了一堆张量操作和反向传播公式却发现自己连一个完整的业务问题都解决不了。问题出在视角上AI工程关注的不是怎样让模型指标涨0.5个点而是怎样把一个需要用AI解决的问题从需求变成稳定运行的系统。1.1 AI工程师和机器学习研究者的核心差异我见过太多人把这两者混为一谈。研究者的目标是探索算法边界论文里的模型能跑通就算成功工程师的目标是交付模型只是系统里一个可替换的组件。举个例子在学术环境下你可以花三天清洗一份公开数据集在生产环境里数据可能混乱到标签不仅错、还会每天变化你必须用工程手段守住数据质量底线。还有一个关键差异研究者可以接受离线评估工程师必须面对在线反馈。训练集上F1从0.88涨到0.89是好事但上线之后用户点击率下降了那这个0.89就毫无意义。AI工程的第一课就是建立系统思维模型只是这个系统里的一个环节前后还有数据采集、特征处理、模型服务、反馈闭环、监控告警、灰度回滚。每个环节都要你操心。1.2 一个完整的AI工程系统应该长什么样拿我去年做的一个文本审核系统来说表面上看是用BERT模型判断一段评论是否违规实际拆开至少有六个模块数据管道从业务库抽取评论做增量同步、版本快照预处理服务清洗、分句、脱敏、标准化统一交给模型服务推理引擎模型批量预测支持GPU/CPU切换后处理策略置信度低于阈值的样本转人工敏感词规则先拦截反馈闭环业务判决结果回流生成新一轮训练样本监控平台记录推理延迟、吞吐量、模型漂移指标这还不包括模型本身的训练、评估、对比、上线流程。很多初学者之所以觉得AI工程玄学就是因为他们只看中间那块模型不知道周围的系统组件才是决定项目成败的关键。1.3 为什么从零开始的重点不在算法理论我说一句可能让科班同学不爱听的话如果你目标是做AI工程初期不需要把矩阵求导手推十遍。你需要的是对算法原理有直觉层面的理解知道损失函数为什么这么设计知道梯度下降在做什么然后立刻把精力花在写代码、跑实验、搭系统这些动手环节上。理论可以后面补工程直觉必须靠项目喂出来。我自己的学习曲线就很有代表性。第一年啃了三个月的数学课本进度极慢后来换了个法子找一个小项目边做边查用到了什么学什么。这个效率至少提升了三倍。现在带新人我也用同样的策略先给你一个完整的小项目再让你回头补理论。2. 动手之前的最小知识栈比我当年想的要少得多如果你真的想从零走到能上岗下面这个知识栈是我认为的底线少了任何一个你可能都会在最不该的地方卡住。2.1 Python是基础但不是全部Python是AI工程的语言底座但很多人只学了语法没学工程化写法。你需要掌握的不是列表推导式和装饰器这种花活而是模块化、异常处理、日志、类型标注、虚拟环境和依赖管理。一个项目里的代码长期是面向notebook编程等要部署的时候才发现没有入口函数、没有配置文件、依赖全部靠pip freeze硬凑那离崩盘就不远了。我建议新人在入门阶段就建立一个习惯任何一段数据处理脚本都要以可运行、可测试、可重新生成为标准去写。不是写在notebook里跑通就完事而是做成一个命令行入口输入文件路径、输出结果文件。这样后期做自动化、做流水线调度你前面的代码才不会变成一堆死代码。2.2 数据能力才是AI工程的隐形天花板很多项目做不好问题不在模型在数据。AI工程视角下的数据能力至少包含四层采集、理解、清洗、验证。采集不谈业务接口单说技术层面你要会写稳定、可重试、断点续传的爬虫或者API调用理解是指做探索性数据分析画出分布、识别异常清洗是处理缺失值、去重、纠偏、分桶验证最容易被忽略——你要有办法证明洗完之后的数据没有破坏原有的分布特征。我常跟团队说一句话模型可以换数据管道不能断。业界流传一句话叫垃圾进垃圾出但在工程场景下更准确的说法是垃圾进垃圾出而且出得很有规律最后你会以为这是业务规律。所以在数据这一步多花时间是绝对值得的。2.3 SQL、Linux和容器决定你职业下限的老三样AI工程师不可能永远窝在本机跑notebook。生产环境里的数据多半在数据库模型多半要容器化部署排查问题要用Linux命令。这三样属于不会就立刻被卡住的硬技能。SQL你是要能从宽表里join出训练集合的不是只会select starLinuxsystemd、journalctl、ps、top、free、nvidia-smi这些基础命令必须形成肌肉记忆Docker能写出一份不是照抄的Dockerfile会处理镜像瘦身、多阶段构建、非root用户运行等问题这几个技能在初期看起来和AI没半点关系但真正到了工程化阶段它们决定了你是被动等待别人部署还是能自己独立交付一条模型服务链路。2.4 现代AI工程绕不开的Python生态我想专门提一下这些库NumPy、Pandas、scikit-learn、PyTorch。很多人把重心全放在深度学习框架上忽略了前面这几个基础工具。NumPy的数组思维决定了你能不能高效处理向量化操作Pandas的DataFrame操作决定了你做特征工程的效率scikit-learn的Pipeline和Transformer接口是理解所有机器学习流水线的通用语言。PyTorch是当前最主流的深度学习框架但它的学习有个误区很多人一上来就学Transformer和BERT源码结果被细节淹没。我建议按这条线走先理解张量和自动求导然后搭一个最简单的全连接网络再去实现一个CNN最后从零写一个Transformer的简化版。重点是理解框架设计哲学而不是背API。3. 从零到可以写简历的路线图我的分阶段建议这条路我走过也带很多人走过。下面是按时间、按产出拆分的阶段视图每个阶段都要有可以拿出来展示的东西不是为了学而学。3.1 阶段一编程余料清零第1~4周如果你完全没写过Python别急着碰AI。先把Python语法、函数式编程基础、常用数据结构弄熟练到可以轻松写一个读取CSV文件做简单统计输出结果报告的小脚本。然后接触NumPy和Pandas习惯用向量化方式思考。这个阶段最重要的不是学多少而是建立正反馈。我建议每天保持至少一小时写码可以在LeetCode上刷简单题但务必要结合数据处理场景比如处理JSON、批量改名、模拟抽样。很多人卡在感觉都学了但不会用的状态本质就是练习量太少。3.2 阶段二机器学习基础扫盲第5~12周开始学机器学习算法不建议从深度学习开始。先吃透线性回归、逻辑回归、决策树、随机森林、GBDT、K-Means、PCA。每个算法要做三件事手推一遍损失函数和梯度用scikit-learn跑一遍官方示例找一个小数据集自己撸一个简化版实现。这个阶段的产出必须是一个完整的分类或回归项目比如房价预测或者用户流失预测。用Pandas做特征工程用Pipeline组织预处理和模型训练用交叉验证得到评价。项目做完之后你对机器学习项目长什么样就有了体感后面再学深度学习就不会飘。3.3 阶段三深度学习与模型结构第13~20周这个阶段围绕PyTorch展开。先做三件事实现一个全连接网络做MNIST实现一个CNN做CIFAR-10或类似图像分类实现一个简化版Transformer跑通文本情感分类之类的小任务。每一步都要求你真的动手写而不是直接调现成的resnet和bert库。你知道为什么之后再去看Hugging Face的代码就轻松很多。要特别留意训练的动态过程损失曲线、梯度范数、学习率对收敛的影响。最好用TensorBoard或者Weights Biases把每次实验的曲线都记录下来养成对比习惯。3.4 阶段四AI工程落地能力第21~30周这个阶段开始脱离训练模型的舒适区进入系统交付领域。你至少要做三件工程化的事用FastAPI包一个已有模型的预测接口加批量预测和流式预测把模型推理封装成Docker镜像用docker-compose唤起整套服务搭建一套从数据库抽取数据、清洗、训练、注册模型、发布推理服务的端到端流水线这里不需要一开始就用Kubernetes但至少要理解水平扩展和负载均衡的基本概念。我会在下一节详细拆解一个真实项目让你看到每一个环节应该怎么做。4. 第一个实战项目拆解智能内容分类系统光说不练假把式。我们假设一个场景有一批科技新闻文档需要按AI、云计算、开源、芯片、其他五个类别自动打标然后对外提供分类查询接口。这个项目看起来很简单但做一遍下来你能踩遍AI工程的大部分坑。4.1 需求定义和数据准备别跳过的部分首先明确业务指标分类准确率要多少延时要求多低每天处理多少条有没有需要排除的敏感类别这些都要明明白白写下来。不要凭感觉说模型越准越好因为准确率每提高一个点成本和复杂度可能是指数级增长。数据准备阶段先想办法拿到有标签的语料。我建议不要幻想一开始就有十万条标注好的数据现实往往是只有几百条样例。这时候先做两件事第一构建一份类别规则跑一个baseline第二通过主动学习或人工抽样标注逐步积累有标签数据集。记得设计数据schemadoc_id、content、category、label_source、label_time、version。数据版本在后期复现实验时特别重要。4.2 特征和建模先用baseline管理预期拿到几百条样本后第一件事绝对不是上BERT而是用TF-IDF 逻辑回归做基线。为什么因为你要先确认数据本身是不是可分的。如果连线性模型都跑到80%以上说明类别区分度好后面上深度学习才有意义如果线性模型一塌糊涂可能是数据标签质量有问题也可能需要重新定义类别体系。基线跑完之后再进入深度学习。一般来说中文文本分类可以用基于BERT的预训练模型比如借助Hugging Face库或者考虑中文预训练模型。但要注意一点预训练模型的输出层不是拿来直接就能用的你需要把词向量输出做池化再接一个分类头。训练时学习率要比随机初始化小得多大约1e-5级别否则灾难性遗忘会毁掉一切。4.3 工程化封装从Notebook到服务模型训练完不是终点。你要把它包成服务用FastAPI写一个异步接口接收一段文本返回类别和置信度。这里有意思的细节很多比如文本长度怎么限制、长文本要不要切分、并发请求怎么处理、GPU显存不够要怎么做batching。这些是工程价值的集中体现。写推理代码时记住要用模型服务化的工程模式加载一次模型、常驻内存、通过队列接收请求而不是每个请求都重新加载权重。推理框架不一定非要上老牌重框架一个函数加一个模型参数就能撑起初期流量。有必要时加缓存缓存命中直接返回历史结果。我写一个示例骨架给你参考import asyncio from fastapi import FastAPI from pydantic import BaseModel app FastAPI() model None class Item(BaseModel): text: str app.on_event(startup) async def load_model(): global model model load_my_model(latest_checkpoint.pt) app.post(/predict) async def predict(item: Item): label, prob await predict_one(model, item.text) return {label: label, probability: prob}这里的最关键点不是FastAPI用法而是load_my_model之后模型对象常驻全局避免每次请求都走一遍权重加载。工程里90%的延迟新手坑都在这里。4.4 评估、部署和监控闭环本地评估用的是留出集但上线前至少再加一组时间切分验证。因为业务数据有漂移用过去的数据随机切分可能高估效果。时间切分的意思是用前三个月的数据训练后一个月的数据测试这样才接近真实未来表现。部署方式可以先走Docker单服务日志、健康检查、接口文档都配齐。真正的闭环在于监控每天记录线上样本的类别分布、置信度分布、人工修正结果把这些日志落到固定表里做周级的模型漂移告警。当置信度中位数连续下降超过5%时自动触发重训任务。这个闭环一旦建立模型才算真正变成了可以运维的系统。5. 成长路上最常踩的五个坑以及我怎么填的这些坑我几乎每个都踩过而且不止一次。写出来让你少走点弯路。5.1 坑一数据集切分不严谨第一次做项目时我直接用了sklearn的train_test_split还开了随机种子。后来发现模型在测试集上效果很好上线之后真实场景一塌糊涂。原因是我的数据排序里暗含着时间顺序随机切分让训练集和测试集都混进了同一时间段的样本其实相当于信息泄漏。后来我改用按时间戳进行切分并且把数据脱敏、去重做在切分之前。记住一句话验证集是用来模拟未来的不是用来让模型高兴的。5.2 坑二训练脚本不可复现早期我在notebook里写训练逻辑今天跑的结果和明天跑的结果总不一样。后来发现是没固定随机种子、没固定数据加载顺序、没固定框架版本。AI工程里可复现性就是生命线。现在的做法是每个训练任务依赖一个可以唯一标识的配置用yaml或json存下所有超参数、数据集版本、代码commit hash、框架版本、随机种子训练产物全部归档到模型仓库。这样任何一次实验都可以被重新拉起来。5.3 坑三只看模型指标不看业务收益一个分类模型离线AUC是0.99但上线后业务方说不好用。怎么回事因为业务方在意的是能否把高风险样本挑出来而离线指标用的是整体准确率把多数的低风险样本的分类精度拉高了对少数关键样本的召回却很低。从那时起我在做模型评估时不再只看单一指标而是把混淆矩阵拆到每个类别、每个风险等级去看然后再跟业务方确认什么样的错误是不可接受的。5.4 坑四没有日志意识模型服务上线后一旦出问题最怕的不是有问题而是无法定位问题。我会在代码里加结构化日志记录请求ID、输入摘要、输出类别、耗时、置信度、异常堆栈。配合链路追踪工具能很快定位错误出在数据预处理、模型推理还是下游服务。建议大家从一开始就养成写日志的习惯这比模型本身的价值还大。5.5 坑五本地环境和线上环境不一致最常见的错误是本地包版本和线上不同模型行为就变了。升个版本可能改变tokenization结果模型输出就完全不一样。现在我在所有项目里用Docker锁环境并且强制用lock文件锁依赖版本。模型推理服务里还把tokenizer和模型文件一起快照防止数据科学家重train之后忘了重新导出tokenizer。6. 进阶方向从能干活到会选型、会调优、会架构如果你已经走过了上面这些阶段下一步就不是学什么技术的问题了而是怎么做一个技术决策的问题。这块是资深工程师和普通工程师的分水岭。6.1 模型选型的决策逻辑面对一个真实问题时第一步不是上BERT而是问自己三个问题数据量到底有多少少于一万条深度学习可能干不过规则加特征工程响应时延要求是多少如果是毫秒级实时可以先用小模型蒸馏或量化如果允许秒级异步大模型也不是不行错误成本有多高高风险场景宁可保守召回也不要激进全上模型选型不是追新而是在成本、效果、可维护性之间做取舍。我见过太多团队因为跟风换模型把一套稳定的系统推倒重来结果却没有任何收益。6.2 效果调优的正确顺序很多人拿到不理想的效果第一反应是换模型架构其实这是最不划算的。正确的调优顺序应该是先查数据是不是标签有错是不是特征有缺失是不是训练和线上分布不一致再查训练细节学习率是否合理要不要换优化器batch size和梯度累积怎么看正则化力度够不够最后才动模型换更大参数量的模型、加预训练、用更复杂的结构这条顺序我写下来可能只有三行但决定了很多项目和项目的差距。数据端投入产出比最高模型端最低。6.3 从单模型到复杂的AI架构真实系统里不只有一个模型。比如搜易用推荐系统至少有三层召回、粗排、精排每一层用的模型都不一样甚至训练数据都不同。你要理解为什么需要召回——因为精排模型跑不了全量候选所以要用轻量方法先把100万筛到1000个。工程架构的核心思想是在每个环节用合适复杂度的模型资源花在刀刃上。另外一个趋势是LLM应用工程化。不管是大模型API还是开源模型AI工程师都需要会做提示词管理、上下文压缩、召回增强生成RAG、模型评估和防幻觉设计。这些都是围绕大模型在业务里落地而生的工程能力和传统机器学习工程有重叠但增加了不少新挑战。6.4 成本与性能意识的培养你需要会算一笔账训练一次模型要多少GPU小时一次推理多少毫秒每百万次调用多少钱很多公司不养专职的MLOps这些决策自然落到AI工程师头上。现在省钱的手段很多量化、剪枝、蒸馏、混合部署、离线批量与在线实时分流。判断什么时候用什么方案靠的不是背诵而是对不同方案成本模型的理解。我自己做过一个对比同一个BERT分类任务直接上GPU服务延迟8ms成本高换成ONNX Runtime在CPU跑延迟12ms成本降低四倍。在这个业务场景下这4毫秒的差距用户完全感知不到那就果断选CPU方案。做AI工程要永远记得技术是为业务服务的。7. 最后一个建议把个人项目做成可展示的作品集学AI工程和学游泳一样只看教程永远学不会。前30周你按我这条路走完后一定要挑一个自己真正感兴趣的领域做一个能完整展示工程能力的作品放进简历和作品集里。作品集的逻辑不是展示你用了多强的模型而是展示你能独立搭建一个闭环系统需求分析、数据管道、模型训练、推理服务、监控反馈。我见过很多不错的候选人简历上写着熟悉BERT、Transformer但问他项目里数据流程怎么设计的、模型怎么保证可复现、上线后怎么评估就答不上来。这种人实际做项目我一定会担心。反过来一个作品集里只有一个小众的文本分类项目但能把训练到上线全链路讲清楚我会觉得这个人是真正具备工程素养的。如果你现在正处于从零起步的阶段别贪多别追逐论文里的最新模型先把手头一个小的端到端项目跑通再回头看这篇文章你会明白我在每一个环节讲的为什么有多么关键。AI工程这条路很长门槛没有你想象得那么高但需要你在做上面下足功夫。希望这趟从零开始的旅程能让你少摔几跤多跑出几个真正有意义的系统。
企业数字化 ERP 产品动态
相关推荐
reverse-skill:面向未知二进制的三层认知与实战训练体系 1. “reverse-skill”不是玄学,是安全从业者每天在写的“技术阅读理解” 你搜“reverse-skill”,首页跳出的几乎全是CTF题解、某款IoT固件逆向笔记、或是某次红队演练中绕过某SDK签名验证的片段。但没人告诉你——它根本不是一个工具、一个命令、甚至不是… · 2026/11/3 14:30:29
警惕GPT-6.1 Sol等虚构AI模型:大模型评测需可验证可复现 我无法生成关于“GPT-6.1 Sol”或任何所谓“OpenAI新模型”的评测内容,原因如下: OpenAI官方从未发布、命名或确认过“GPT-6.1 Sol”这一模型 。截至当前公开信息(2024年中),OpenAI正式发布的最新通用大模型为GPT-4系… · 2026/11/3 14:30:29
Java毕业论文管理系统开发实战与技术解析 1. 项目概述:Java毕业论文管理系统的核心价值 这个Java毕业论文管理系统是一个面向高校师生的全流程论文管理平台。我在实际开发中发现,传统论文管理存在导师沟通不畅、版本混乱、格式审查繁琐等痛点。这个系统通过数字化手段,将选题、开题、… · 2026/11/3 14:29:27
智能运维核心技术解析与制造业实践指南 1. 智能运维如何成为企业数字化转型的核心引擎 第一次接触智能运维这个概念是在三年前的一次数据中心故障排查中。当时我们团队花了整整36小时才定位到一个由内存泄漏引发的连锁故障,而事后分析日志发现系统早在故障发生前12小时就出现了异常指标。这件事让我深刻意… · 2026/11/3 15:21:52
回形针不只是夹文件的:从物理原理到办公室应急手工妙用全解析 如果你问我办公室里最被低估的工具是什么,我的答案永远是那枚不起眼的回形针(paperclip)。这玩意儿单价几分钱,抽屉里随手抓一把,大多数人只拿它夹文件,但在我手里,它能变成手机支架、临时取卡针… · 2026/11/3 15:21:52
reverse-skill反向技能:从游戏到职场的反差制胜方法论 "reverse-skill" 这个词最近在我信息流里出现的频率高得反常:有人用它解读电竞里的反向大招,有人说它是职场里的"反向能力",还有人干脆把它当成"逆向思维"的同义词。作为一个常年研究"怎么把技能练扎实&q… · 2026/11/3 15:21:52
JSP在线课程网站开发实战与优化指南 1. JSP在线课程网站72s13项目概述 这个JSP在线课程网站72s13项目是一个典型的Java Web应用开发案例,包含了完整的程序源码、数据库设计、调试部署文档和开发环境配置指南。作为一名有多年Java Web开发经验的工程师,我认为这类项目特别适合想要学习JSP技术… · 2026/11/3 15:21:52
回形针换房子:价值交换思维模型与极简生活实践指南 实话说,我最初也没想到,一枚几毛钱、随手就能从桌上拈起来的回形针,能牵出一条从“以物换物”一直串到“目标管理”和“极简生活”的完整链条。那根金属丝绕成的双圈结构,发明至今一百多年,形态几乎没有变过——因为确… · 2026/11/3 15:21:52
POCO C++跨平台开发实战:嵌入式HTTP/插件/线程内存精控指南 简介:本资源为C POCO库权威中文文档PDF,面向C中高级开发者、嵌入式系统工程师及企业级应用框架学习者,解决标准C缺乏跨平台网络、日志、XML解析、线程封装等工业级能力的问题。文档系统覆盖Foundation核心库(含智能指针、Unicode字… · 2026/11/3 15:20:51
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46