简介《ChatGPT调研报告》由哈尔滨工业大学自然语言处理研究所组织多位师生编撰面向自然语言处理学习者、AI产品与技术从业者以及需要系统了解大模型技术脉络的读者。报告共94页、分七章从ChatGPT的背景与意义切入梳理大规模预训练语言模型的发展历程并围绕Transformer预训练语言模型、提示学习与指令精调、思维链、基于人类反馈的强化学习等核心算法展开讲解同时覆盖大模型训练与部署、相关数据集、客服与智能搜索等应用场景、优势与局限、未来技术方向及隐私、偏见、就业等风险议题。资源包为1个PDF文件约3.54MB章节结构完整便于按主题检索和通读。已有1512人学习适合作为课程汇报、技术调研、入门备课或团队分享的参考资料。1. 三次知识调用方式的切换ChatGPT 原理的起点不在模型结构ChatGPT 原理常被简化成「参数大、数据多」这个解释经不起推敲参数量在同一量级的模型并不少效果差距却很大。把视角从模型内部挪到人机之间会看到另一条线索——知识在计算机里的存储形态换过三次。早期是关系型数据库人得先学会 SQL 才能取数互联网时代是网页文本人用关键词去检索2018 年之后知识被压进模型参数调用方式变成自然语言。前两次切换都催生了巨头级产品第三次切换的难点在于自然语言既是输入也是输出歧义、抽象、近乎无穷的语义组合全都压在同一层接口上。这份 94 页的调研材料值得逐页读的地方就在于它没停在产品体验层而是把五次范式迁移、三条预训练路线、RLHF 的三段式训练以及部署压缩那笔工程账一起摊开算。2. Transformer 与三条预训练路线底座为什么最后落在 Decoder-only理解一个对话模型容易从「它答得好不好」倒推能力但工程上真正决定天花板的是底座选了什么架构、用什么目标训练。2018 年之后预训练语言模型分出了三条岔路三条岔路在结构上只差一个掩码矩阵在能力边界上却差得很远。2.1 自注意力到底在算什么一次矩阵乘法里的「谁该看谁」抛开所有术语注意力机制只回答一个问题当前位置在编码自己时该从序列的其他位置取多少信息。做法是把每个位置的向量投影成三份——查询 Q、键 K、值 V。用当前位置的 Q 去和所有位置的 K 做内积得到一组相似度分数归一化成权重再对所有 V 加权求和。整个过程的计算复杂度是序列长度的平方这就是上下文窗口一长就吃显存、就变慢的根源。把这段逻辑写成 numpy比看任何示意图都直观import numpy as np def self_attention(X, Wq, Wk, Wv, causalTrue): X: (seq_len, d_model) 当前层输入 Wq/Wk/Wv: (d_model, d_head) 三组投影矩阵 返回: (seq_len, d_head) 输出表示, 注意力权重 Q, K, V X Wq, X Wk, X Wv # 除以 sqrt(d_head)d_head 越大内积方差越大不缩放会让 softmax 提前饱和成 one-hot scores Q K.T / np.sqrt(Q.shape[-1]) if causal: # 上三角置为极小值第 t 个位置只能看见 t 的位置这就是「单向」 mask np.triu(np.ones_like(scores, dtypebool), k1) scores np.where(mask, -1e9, scores) weights np.exp(scores - scores.max(axis-1, keepdimsTrue)) # 减最大值防上溢 weights weights / weights.sum(axis-1, keepdimsTrue) return weights V, weights代码里最关键的不是矩阵乘法而是causal那三行。去掉掩码模型在训练时就能看见后面的词预测下一个词变成抄答案保留掩码训练目标和推理过程严格一致——每次只能根据已生成的内容推出下一个 token。多头注意力则是把d_model切成若干份d_head并行跑上面这段再拼接投影让不同头分别盯语法、指代、位置等不同关系。真实实现里还有两处绕不开的工程细节。一是位置信息不能靠掩码提供早期用正弦位置编码后来普遍换成旋转位置编码把位置写进 Q、K 的相位里好处是能比训练长度外推出更长的上下文。二是推理阶段会把历史 token 的 K、V 缓存下来每步只算新 token 的 Q这就是 KV cache——它把生成长文本的复杂度从「重算全序列」降到「增量算一个位置」代价是显存随对话轮次线性增长。提示显存吃紧时先看 KV cache 占用再看参数量。长上下文场景下 KV cache 往往比权重本身更占地方。2.2 三条路线的分叉Encoder-only、Decoder-only、Encoder-Decoder同一个 Transformer 骨架掩码方式和训练目标一改就长出了三种模型路线可见范围典型训练目标擅长短板Encoder-only双向全可见随机遮盖一部分 token 让模型还原分类、抽取、句子匹配不能直接生成连贯长文Decoder-only单向因果可见预测下一个 token开放式生成、对话、代码双向语境利用弱需要靠规模补Encoder-Decoder编码端双向、解码端单向序列到序列翻译、摘要等输入输出分离的任务结构重长文生成时两套缓存2020 年之前双向编码路线在各类理解型榜单上占优声量更大。但对话式生成要的是「一个字一个字往下写」单向路线天然对得上训练时预测下一词推理时也是预测下一词不存在训练与推理的目标错位KV cache 只维护一份工程链路短指令微调和强化学习接在同一个自回归接口上改造量最小。这也是为什么最后走到对话产品这一步的底座是 Decoder-only 而不是当年榜单更漂亮的双向模型。代价同样明确。单向模型看不见后文做序列标注、实体抽取这类需要全局语境的任务天生不如双向模型划算上下文里的信息只能通过前向累积传下来长文里前提出现在后文之前模型就容易丢。所以调研材料在讨论「什么任务不该上大模型」时态度很清楚有充足标注数据的传统自然语言理解任务微调小模型在准确率和成本上依然是更优解。2.3 参数曲线与「涌现」1.2 亿到 1750 亿之间发生了什么一份 2023 年初的调研绕不开这条参数增长曲线2018 年 6 月第一代生成式预训练模型 1.2 亿参数2019 年 2 月第二代 15 亿2020 年 5 月第三代 1750 亿。两年时间涨了三个数量级伴随的是训练语料从亿级 token 涨到数千亿 token。这条曲线背后有个不太被强调的事实能力不是线性长出来的。小模型阶段增大规模只是让困惑度平滑下降到了千亿量级某些能力突然出现——多步算术、按格式输出、看到一两个示例就能照做。业界把这种现象叫涌现。它的机制解释至今没有共识但一个被广泛接受的猜测是许多任务需要模型在内部同时维持多个中间状态参数量不够时这些状态互相挤占表示空间只能退化成「记住高频模式」规模过线之后表示空间足以容纳任务的结构能力才显现出来。这也解释了为什么「小模型 精巧微调」在开放任务上很难追上大模型微调改变的是输出分布改变不了内部表示容量。反过来规模上去之后如果没有合适的调用方式模型依然只会续写——第三代模型提出提示语概念本质是在不动的权重外面加了一层任务描述接口。下一章要讲的就是这层接口怎么从「会续写」变成「会听话」。3. 从续写到听指令提示学习、指令微调与思维链预训练结束时的模型本质上是个超大规模的下词接龙器。它知道「这句话的情感是」后面大概率跟「褒义」还是「贬义」但它不知道用户是在下命令还是在闲聊。中间这段距离靠三件事填提示、指令微调、思维链。3.1 提示与语境学习不改一个参数怎么完成任务最早被验证有效的办法是构造提示。给一句「我太喜欢这个模型了这句话的情感是 __」模型在填空位置上输出的最高概率词往往就是正确标签。不加任何训练只靠预训练阶段积累的语言规律就能完成分类。更进一步在提示里塞一两个示例——输入输出成对摆好再给出待测输入——效果会明显提升这种不改参数、只靠上下文示例激活任务能力的方式叫语境学习。工程上提示构造是可以模板化的def build_prompt(task_desc, demos, query): task_desc: 一句话任务说明决定模型进入哪种「角色」 demos: [(输入, 输出), ...] 少样本示例通常 1~8 条 query: 待处理的输入 blocks [task_desc] for x, y in demos: blocks.append(f输入{x}\n输出{y}) blocks.append(f输入{query}\n输出) # 以「输出」结尾等于把模型推到生成位 return \n\n.join(blocks)这段模板里三个参数各有讲究。task_desc决定任务框架写得含糊模型就自由发挥demos的条数受上下文窗口限制且示例的顺序会显著影响结果同一批示例换个排列准确率能差出好几个点这是典型的「玄学」现象根因是模型对位置和近邻示例更敏感结尾的「输出」是触发器缺了它模型可能接着补一段解释而不是给答案。提示路线的天花板也很清楚它激活的是预训练里已经存在的能力激活不出来的怎么写提示都没用。而且模型对措辞极其敏感——同一个问题换个说法一次答不出、一次答得对这种不稳定性在产品里是致命的。3.2 指令微调把任务重写成对话泛化从哪来指令微调做的事很朴素收集大量「指令 期望回复」的配对数据用监督学习的方式继续训练让模型学会把输入理解成任务而不是待续写的文本。数据形式上几乎所有任务都被重写成对话——翻译是「把下面这句译成某语言」摘要是「用三句话概括」写代码是「实现某个函数」。这里最反直觉的结论是泛化来源。调研材料提到一个细节指令集里 96% 以上是英语只覆盖二十来种语言但拿一种指令集中完全没出现过的语言去做翻译模型依然能给出正确结果。这个现象说明指令微调学到的不是「任务清单」而是「按指令执行」这个元技能——它把预训练阶段学到的多语言对应关系和一个统一的执行框架接上了。微调小模型的范式做不到这点因为每个任务都要独立标注、独立训练没见过的任务就是没学过。指令数据的构建有几个容易踩的坑调研材料在数据集章节专门列了指令要多样只堆单一任务会让模型退化成模板回复回复长度要控制标注者天然偏好长答案因为看起来更全面这个偏好会被模型学走最终表现就是啰嗦、反复重申身份还要掺入一定比例的开放域对话否则模型会变成只会答题不会聊天。3.3 思维链代码预训练为什么能换来分步推理思维链的做法是让模型在给答案之前先输出推理步骤。表面看只是输出格式变了实际效果是准确率的大幅提升——因为自回归生成把中间步骤写进了上下文后续每一步都能「看见」前面算过的结果相当于把一次性的隐式计算摊开成多步显式计算。更值得追问的是这个能力从哪来。调研材料给了一条很具体的线索基础模型在文本预训练之后用 159G 的代码数据做了继续预训练。代码有几个文本没有的性质——严格的分步执行、模块化的函数调用、明确的中间变量。模型在学代码的过程中被迫学会了「把一个问题拆成有序子步骤每步的输出喂给下一步」。这种结构一旦形成迁移到自然语言推理上就表现为逐步推理而不是直接猜答案。这条线索还带出一个更大胆的说法代码继续预训练之后模型表现不再是随规模平滑增长出现了陡增被认为打破了原先的规模缩放规律。这个结论在学术上有争议但工程含义是明确的——数据配比不是越小越干净越好代码、数学这类结构化语料对推理能力的贡献远超其 token 占比。4. RLHF人类打分如何变成一个可优化的标量指令微调解决的是「听懂」解决不了「说得让人满意」。同一个问题有无数种正确答法有的啰嗦、有的带偏见、有的答得对但语气冒犯。监督学习只能告诉模型「这个答案是对的」没法告诉它「这个答案比那个更好」。基于人类反馈的强化学习补的就是这一块。4.1 三阶段的数据流从示范到排序再到策略更新整条链路分三段每段的输入输出都不一样第一段是有监督精调。标注人员写出高质量的示范回复模型用标准的下一词预测去拟合。产出是一个「会按人类风格说话」的初始策略。第二段是奖励建模。同一个提示让模型生成多个候选回复标注人员不做绝对打分只做相对排序——哪个更好。用这些成对比较训练一个打分模型输入是「提示 回复」输出是一个标量分数。用相对排序而不是绝对打分是因为人对「哪个更好」的判断比对「打几分」的判断稳定得多。第三段是强化学习微调。把奖励模型当作环境的一部分策略模型生成回复奖励模型打分用近端策略优化更新策略参数同时对偏离初始策略太远的行为加惩罚。4.2 奖励模型的损失与 PPO 的目标函数奖励模型的训练目标可以写得很紧凑核心是让被偏好的回复得分高于被拒绝的回复import torch, torch.nn.functional as F def reward_loss(chosen_scores, rejected_scores): chosen_scores / rejected_scores: 同一提示下两条回复的奖励输出, 形状 (batch,) 采用 pairwise ranking 目标: 拉大偏好回复与拒绝回复的分差 return -F.logsigmoid(chosen_scores - rejected_scores).mean() def ppo_loss(logp_new, logp_old, advantage, kl_per_token, clip0.2, beta0.02): logp_new/logp_old: 新旧策略下每个 token 的对数概率, (batch, seq) advantage: 奖励模型打分减去基线后的优势值 kl_per_token: 与参考策略的逐 token KL 散度 clip / beta: 裁剪幅度与 KL 惩罚系数 ratio torch.exp(logp_new - logp_old) # 重要性采样比 clipped torch.clamp(ratio, 1 - clip, 1 clip) policy_term -torch.min(ratio * advantage, clipped * advantage).mean() return policy_term beta * kl_per_token.mean() # KL 项防止策略漂移过远两个函数对应链路的两段。reward_loss里的logsigmoid保证分差越大损失越小训练稳定实践中还会在排序损失里加一个小的平方项把分数锚定在零附近否则奖励模型的输出尺度会漂移后面 PPO 的优势值就失去了意义。ppo_loss里三个超参各有职责。clip限制单次更新的策略变化幅度避免一步更新把策略带崩beta是 KL 惩罚权重它约束新策略不能离参考策略通常是 SFT 后的模型太远advantage由奖励分数减去基线得到基线常用同一批次分数的均值作用是降方差。4.3 KL 约束在防什么奖励黑客与语言退化在没有 KL 约束的情况下强化学习会做一件必然的事找到奖励模型的漏洞并疯狂利用。奖励模型是从有限的人类比较数据里学出来的近似函数它对某些模式有系统性高估——比如更长的回答、更肯定的语气、更多分点符号。策略模型一旦发现「堆长度就能涨分」就会输出又长又空的文本语言风格迅速退化这就是奖励黑客。KL 项的作用是把策略拴在初始策略附近让模型只能在「原本会说的话」里做偏好调整而不是重新发明一套语言。这也是为什么 RLHF 前后的模型差异往往体现在语气、拒答、结构上而不是知识量——知识在预训练阶段就冻结了。调研材料还记了一条更细的观察这套机制的副作用之一是模型的偏好某种程度上就是标注人员的偏好。标注群体分布不均就会引入新的偏见标注者偏好长答案模型就学会了冗长。这不是模型的问题是数据管线的结构性缺陷。4.4 从 TAMER 到模型代替人类反馈信号的成本账人类反馈这套思路不是 2022 年才有的。2008 年就有工作提出在强化学习框架里引入人类评价作为额外奖励动机很务实——加快收敛、降低训练成本、修正优化方向。之后深度强化学习兴起把人工反馈信号接进优势函数、和深度网络结合的方案陆续出现但那些年主要用在游戏、机器人这类模拟或现实环境里没人拿它训语言模型。转折发生在 2019 年前后人工反馈信号被用于几个具体自然语言任务的微调并取得效果随后这条路线被扩展到了摘要、网页导航、开放域问答、对话等场景。到 2022 年两段技术积累——海量数据与千亿参数训练经验、以及强化学习在文本生成上的调参经验——合到一起才有了对话产品的效果。这条路径的成本瓶颈非常直白人工排序是整条链路里最贵也最慢的一环。于是有了用模型替代人类标注的方向——先训一个模型学习人类对无害性的打分模式再让它代替人对候选回复排序。这条路把标注成本从「人时」压到「卡时」代价是反馈信号里混入了模型自身的偏差属于典型的用可控偏差换规模。调研材料把它列为未来方向之一判断是准确的。5. 避坑与排查复现这条链路时最常翻车的五处纸面上的流程看起来线性实际动手时绝大多数失败不是出在算法上而是出在数据管线和评估口径上。下面五条是这类项目里反复出现的坑按「现象 → 原因 → 解决」记录。5.1 数据与标注侧坑一模型答得越来越啰嗦且爱反复声明身份。现象是所有回答都比预期长结尾常附一句自我说明。原因在标注环节标注人员潜意识里认为长答案更完整排序时系统性偏好长回复奖励模型把这个偏好学成了主信号策略模型于是往「堆长度」的方向优化。解决办法是在奖励建模前对长度做归一化或在排序任务里显式加入「同样好但更短」的对照样本把长度从偏好信号里剥离出去。坑二指令微调后模型在没见过的任务上直接摆烂。现象是训练集内任务表现正常换一个新任务就输出模板化拒答。原因通常是指令数据太单一任务类型集中模型学到的是「匹配到某类模板就套用」而不是执行指令这个元技能。解决办法是提高指令多样性混入开放域对话和格式转换类任务并且刻意保留一部分低频、长尾指令——它们对泛化能力的贡献远大于同质化的高频指令。5.2 训练与评估侧坑三奖励分数一路涨人工看输出却越来越差。现象是训练日志漂亮评估崩盘。原因几乎可以确定是奖励黑客策略找到了奖励模型的系统性高估模式。排查顺序是先看输出长度分布有没有异常膨胀再看 KL 散度是否长期贴着上界最后检查奖励模型在留出的人工标注集上是否还保持排序一致性。解决手段是加大 KL 惩罚系数、降低学习率或者干脆回滚到更早的检查点重新训练奖励模型。坑四同一个问题换个说法结果从错变对。现象是输入措辞微调后准确率剧烈波动。这是自回归生成的固有性质——每次输出是采样或束搜索的产物本身带随机性同时模型对提示的表面形式高度敏感。排查时先固定随机种子看波动是否消失若消失则属采样噪声若仍在则是指令格式问题需要把提示模板标准化并在评估集里加入同义改写样本用一组改写后的平均分代替单次结果。坑五评估指标全面向好上线后用户不买账。现象是自动指标困惑度、BLEU 类重合度提升人工体验下降。原因是自动指标衡量的是与参考文本的表面相似度而对话质量的核心维度——事实准确性、不确定性表达是否恰当、是否含有攻击性或毒害性内容、对不同群体的表述是否公平、对扰动输入是否鲁棒——这些都没有被覆盖。可行的做法是建立分层评估自动指标只做回归监控人工评价按准确性、有害性、公平性、鲁棒性分维度打分两者背离时以人工为准。注意评估集的构造比评估指标的选择更重要。评估集里如果没有长尾输入和对抗性改写任何指标都会给出过于乐观的结论。6. 并行、部署与压缩一笔必须提前算的取舍账千亿参数的模型单卡放不下、单机跑不动训练端的第一道题是切分。数据并行把不同批次的样本分到各卡梯度汇总后同步模型并行把同一层的矩阵切开卡间需要频繁通信流水线并行把不同层段分到不同设备靠微批次填充减少空转。三者通常组合使用切分维度的选择取决于卡间带宽——带宽紧张时优先流水线带宽充裕时数据并行效率最高。推理端是另一套账。部署的困难不在算力总量而在延迟和并发请求是稀疏到达的而模型加载是常驻的。常见的优化手段包括把请求攒批、把 KV cache 分页管理、把权重用低精度加载。调研材料把压缩方案归了四类方案手段收益代价量化参数精度从 FP32 降到 FP16 或 INT8显存和带宽直接按比例下降落地最快极低比特时精度损失明显需要校准集剪枝从单个权重到权重矩阵、通道逐级删除稀疏后理论算力需求下降非结构化稀疏在通用硬件上难以兑现加速蒸馏小模型学大模型的输出分布推理成本数量级下降需要重训能力上限受学生模型容量限制稀疏化去除冗余变量保留关键信息兼顾压缩率与结构训练流程改造大调参成本高这四类没有普适最优解取舍取决于约束条件显存受限优先量化延迟受限优先蒸馏算力受限且硬件支持稀疏算子才考虑剪枝。我一般的判断顺序是先把量化做到位——它改动最小、回滚最容易再评估蒸馏是否值得投入重训成本。血泪经验是压缩方案一定要在真实流量分布上验证用公开评测集调出来的压缩配置上线后经常在长尾输入上翻车而这类问题在离线指标里完全看不出来。从那以后我每次评估一个模型的落地可行性都会强制走一遍「训练切分 → 推理延迟 → 压缩后长尾回归」这三段宁可前期多花两天也不要在上线后靠回滚找后悔药。这份材料把算法、数据、训练、部署、评估、风险放在同一份文档里逐层拆开价值正在于它让你提前看见这些账之间的关系而不是只看见一个惊艳的对话框。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
遗传算法优化RBF神经网络在工业预测中的应用 1. 遗传算法优化RBF神经网络的核心价值在工业预测和复杂系统建模领域,多变量输入单输出的预测问题一直是个经典挑战。传统RBF(径向基函数)神经网络虽然具有结构简单、收敛速度快的特点,但其中心点选择和参数优化往往依赖经验&… · 2026/11/3 3:42:36
Linux常用命令系统梳理:五层分类与高频易错点 简介:这是一份面向Linux初学者与日常运维人员的常用命令速查手册,以PDF形式系统梳理目录操作、文件管理、内容查看、软链接、压缩解压、权限管理、Docker容器、yum与内核优化等十余个模块,帮助读者摆脱零散搜索,快速建立命令体系并… · 2026/11/3 3:42:36
Rollup打包TypeScript库:双格式输出与类型声明生成实战 1. 为什么一个TS库的打包值得单独拎出来说如果你写过几个工具函数,或者维护过一个内部组件库,大概率经历过这样的阶段:代码在项目里跑得好好的,一旦要发布成独立的包给别人用,问题就全冒出来了。要么是产出的js文件在别… · 2026/11/3 3:42:36
无人机操作员认证培训全解析:市场需求与课程设计 1. 无人机操作员认证培训的市场需求分析最近两年,无人机应用场景呈现爆发式增长态势。根据行业调研数据显示,2023年国内商用无人机市场规模已突破500亿元,年增长率保持在30%以上。这种快速增长直接催生了对专业无人机操作员的海量需求&#x… · 2026/11/3 4:11:44
零基础PCB设计入门:从建库、原理图到DRC打样避坑 简介:这份PDF教程面向PCB设计零基础学习者,围绕嘉立创EDA的使用流程整理自学思路,适合希望建立规范工具习惯、系统补齐入门短板的学生、硬件爱好者与转岗人员,也可用于课程设计、电子制作前期准备等场景。内容按创建项目与元件库、… · 2026/11/3 4:11:44
Reverse-Skill:面向生产压力的技能健康度评估方法 1. 项目概述:这不是“逆向工程”的代名词,而是技能反向生长的系统方法论“reverse-skill”这个词乍看像技术黑话——有人第一反应是“逆向工程(Reverse Engineering)”,有人联想到渗透测试里的漏洞回溯,还有… · 2026/11/3 4:11:44
Python爬虫+MongoDB+Word导出政务数据完整链路 简介:本资源是一份面向Python初学者与Web数据采集实践者的完整技术文档,聚焦于网页爬虫开发与非关系型数据库存储的工程化落地。内容系统讲解如何使用requests库发起HTTP请求、BeautifulSoup或lxml解析HTML、正则表达式提取关键字段,并将结构… · 2026/11/3 4:11:44
Python打砖块实战:物理碰撞、子步长与实时循环调优 1. 为什么老游戏是练手的最佳题材某套入门课程讲到第 95 课的时候,突然插了一段几十年前的旧事:有个年轻人揣着一份简历去一家做街机的小公司应聘,人家问他会什么,他说“什么都会”,于是被留了下来,后来还真… · 2026/11/3 4:11:44
代码注释规范:避免多语言陷阱的技术实践 1. 项目背景与核心问题那天下午的代码评审会,整个技术部门都记得清清楚楚。新来的技术总监王总正对着投影屏幕皱眉,突然整个人僵在了那里——他面前的IDE里,密密麻麻全是西夏文注释的Java代码。会议室里鸦雀无声,只听见空调出风口… · 2026/11/3 4:10:43
双极步进电机控制实战: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/2 4:42:45
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/2 5:17:18
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/2 4:42:45
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/2 5:17:18