世界模型创建流程实操:从数据采集到策略训练闭环
最近“世界模型world model”这个词在AI圈里被反复提起从自动驾驶到游戏智能体到处都在讨论让机器学会“脑内模拟”。但真正上手搭过的人并不多很多初学者拿到一堆论文和开源代码反而不知道该从哪一步下手。我自己前前后后折腾过几个版本踩过不少坑也有了一些比较顺手的套路所以这篇就基于个人经验把world model的主体创建流程整理成一份能直接照做的实操记录。这篇内容主要解决三个问题世界模型到底在做什么从零开始需要一个什么样的整体流程每一步里的核心细节和参数选择为什么这样做。适合想动手实现一个最小可运行版本的人参考。如果你对深度学习模型训练的常规操作已经有一定了解读起来会更顺如果只是刚入门我也会把必要的背景概念用比较直白的方式讲清楚。1. 世界模型概述与整体流程设计1.1 世界模型本质上是让机器学会“脑内推演”我先说一个自己的理解世界模型不是简单的视频预测也不是普通的强化学习环境模拟器。它的核心目标是让智能体在内部建立一个关于环境的压缩表示然后基于这个内部表示去想象“如果我做了某个动作下一步会发生什么”。有了这种想象能力智能体就能在没有真实环境反馈的情况下做规划、做决策甚至提前规避风险。类比一下就像人类开车的时候不需要真的把车开上马路才能判断“前面有人横穿我应该减速”。大脑里有一个对交通场景的模拟器我们随时可以在脑内跑偏场景。世界模型就是为了给AI补上这个“脑内模拟器”。一个最小可用的世界模型通常由三个核心模块组成感知模块、动力学模块和策略模块或者决策/解码模块。感知模块负责把原始的像素或传感器数据压缩成低维的隐状态动力学模块负责在隐状态空间里预测未来的演化策略模块则根据当前隐状态输出动作或者重建出对未来的预测。1.2 整体创建流程分四个阶段我自己在实现时一般把流程分成四段每一段都有明确的输入输出这样调试起来不会乱数据准备收集和整理环境交互数据处理成模型可读取的统一格式。感知模块训练让模型学会从高维观测中提取有用特征压缩成隐变量。动力学模块训练在隐空间学习状态转移规律让模型能预测多步未来。策略训练与部署基于前面学到的表示训练策略网络然后将整个系统闭环跑起来。每个阶段之间是有依赖关系的尤其是前两步基础不牢后面训练策略基本是空中楼阁。所以我在下文会把前两个阶段的细节写得比较细因为这是整个流程的根基。1.3 为什么优先选择隐空间建模而不是直接预测原始像素有一个很常见的诱惑是直接用生成模型预测下一帧图像这样做不是不行但效率和泛化能力都差一些。原始图像维度很高一帧可能几万到几百万像素直接在这种空间做动力学建模计算量巨大而且很多像素信息比如背景静止区域对决策毫无帮助。所以主流做法是先把高维观测压缩到一个较小的隐向量空间比如几十维到几百维然后在隐空间里建模转移。这样做有三个直接好处大幅降低计算开销过滤掉无关细节让模型专注在前因后果上为策略训练提供一个更稳定的特征输入。我在实现时感知模块就用一个自编码器AE或者变分自编码器VAE这一步是整个流程成败的关键前置环节。2. 数据采集与环境准备2.1 选择交互环境并确认数据维度数据不是凭空来的世界模型要学的是“状态–动作–下一状态”这样的因果链条所以你需要一个能返回原始观测和当前状态分数的环境。我的建议是先选一个不太复杂但又不那么“玩具”的环境比如一些常见的二维控制场景连续控制赛道上的一些基础任务或者简单走迷宫类。环境选定之后第一件事是确认观测数据的具体形态。如果是png图像那就不用动如果是连续数值就需要做归一化。我常用 Gymnasium 接口来统一获取观测值比如环境每次step之后会返回一个像素数组我自己定义成一个形状为 (通道, 高度, 宽度) 的Tensor再跟动作一起打包存下来。2.2 数据采集策略和样本量预估数据的多样性直接影响模型对环境的理解深度。如果只用随机策略跑去采集数据出来的样本可能大部分是无效动作对应的结果模型很难学到有意义的因果联系。比较稳妥的做法是训练数据来源混合一部分是随机动作产生用于覆盖状态空间的“边界”一部分来自一个简单专家策略或手动控制用于提供质量更高的轨迹。样本量方面我自己的经验是对于小规模二维环境几万到十几万帧就能训练出一个还能用的感知模块如果环境复杂度更高比如带部分遮挡或需要长程记忆那千万级别也不奇怪。有一个实用的检查标准训练完之后你把重构图和前几帧输入放在一起拼图看如果重建结果依然模糊通常意味着数据量不够或者网络容量太小。2.3 数据缓存与批次组织在采集过程中我会将每个step的观测、动作、奖励、终止标志都保存成一个字典结构。为了训练效率全部放在一个HDF5或NPZ文件里然后做随机采样。批次大小我一般选64或128视显卡显存大小而定。有一点需要特别提醒世界模型的训练通常是一次性离线完成的很多算法从头到尾并不依赖在线实时交互所以你可以一次性把所有轨迹准备好后面所有训练都用同一个数据集。在训练采样阶段要保证一批样本中既有随机时间步的单步样本也有连续多步的片段样本。单步样本用来训练感知模块连续多步的片段用来训练动力学模块让模型学会在时间维度上推理。3. 感知模块的实现与训练3.1 自编码器结构与隐空间维度选择自编码器是感知模块里最常见的架构。它由编码器把高维观测压成隐状态再由解码器从隐状态重构出观测。我优化时的出发点很简单压缩后还能还原说明信息损失不大。编码器我用卷积层堆叠卷积核尺寸从4到5步长2逐层把空间分辨率降下来最后接两层全连接映射到隐状态。解码器则反过来先用全连接映射成与编码器对称的多维特征图再通过转置卷积上采样回原尺寸。整体算下来参数量控制在几百K在小型GPU上用几分钟到半小时可以完成训练。隐维度是一个需要权衡的参数。如果太小压缩太狠细节丢失如果太大模型容易直接记住每个样本。我自己常试的起点是32或64维跑完先看重构效果再决定要不要升高或降低。3.2 损失函数与KL散度处理自编码器最朴素的损失是重构误差但纯自编码器压缩出来的隐空间没有分布约束后续动力学建模容易不稳。因此我倾向使用VAE的变体损失函数里加上一个KL散度项让隐变量靠近标准正态分布。最终损失公式就是重构项常用均方误差或二元交叉熵加上一个小的KL项。KL的权重即beta不要设太大否则模型会为了满足分布约束而放弃重构精度。我一般从0.001开始调效果不佳时增加一个量级直到重构误差回到可接受范围。3.3 训练细节与常见卡点训练VAE时我习惯用Adam优化器学习率0.0001到0.0002batch size 64epochs大约50到100轮。监视重构损失是否持续下降并且要在验证集上检查防止过拟合。一个比较容易碰到的问题就是重构出来的图像颜色偏灰或者边缘模糊。这种情况多数是因为偶合层分辨率太低或是隐维度限制得太死。我处理过类似问题通常做法是把最后一个卷积层的输出特征图扩大一倍或者直接把隐维度从32提到64效果往往立竿见影。还有一个细节是数据归一化。图像像素要rescale到0到1之间并使用sigmoid作为输出层的激活函数这样重构损失用二元交叉熵才比较自然。如果用MSE那么像素值就需要先标准化成零均值单位方差这两套方案二选一不要混用。4. 动力学模块设计与训练4.1 从感知输出构建有序训练序列动力学模块的输入是隐状态序列和对应的动作序列。在准备数据时我把每条完整轨迹切成长度介于5到10步的小窗口这样可以增加样本数量同时保留足够的时间上下文。每个窗口内第一步的隐状态是通过编码器得到的后面几步的隐状态也都是通过编码器得到的而不是用动力学模型自己预测出来的这一步很关键训练时我们使用的是真实编码结果这叫 teacher forcing可以加速收敛。推理时模型才用自己的预测结果作为下一步输入这样反复迭代去想象未来。4.2 核心网络结构循环网络与状态更新动力学模块的主体我采用GRU单元因为比LSTM参数少在数据量不算特别大的情况下表现反而更稳。在每个时间步输入是当前隐状态向量和动作向量GRU输出一个更新后的隐状态然后接一个小型全连接网络预测下一时刻的隐状态。我再强调一下输出不是原始像素的预测而是隐空间里下一帧的表示。这样整个模型的计算量被控制得很低同时也强迫GRU学到环境的抽象变化规律。有时为了捕捉混合动态我还会把GRU替换为小型Transformer块特别是当环境包含较长的依赖关系时。Transformer更擅长捕获长程依赖但它需要更多的数据和更仔细的位置编码设计所以初期我建议还是先上GRU跑通全流程再考虑升级。4.3 损失函数的设计与多步预测训练动力学模型的训练目标是让预测出来的隐状态与时刻t1真实编码得到的隐状态尽可能接近。损失函数直接用均方误差即可。如果希望模型在多步预测上也稳定我会在损失里加上一个多步展开项让模型连续预测两步或三步同样与真实编码结果对比。这个做法在实践里很管用比只做一步预测模型整体稳定性明显提升。代价是训练时间大概增加20%到30%但换来的收益值得花这个成本。我曾经为了省事只做一步预测结果在策略训练时出现预测偏移一旦进入自举模式就崩掉。一个实用的技术细节在做多步展开时把未来的隐状态预测值作为输入给下一层同时可以加一个小的正则化项比如对隐状态的噪声扰动来增强鲁棒性。这个技巧有点像训练生成对抗网络时加噪声的做法能让模型更平滑。4.4 动力学模型训练关键参数推荐我常用的一组基础参数是GRU隐藏层大小与隐状态维度一致或者略大一些比如隐状态64维GRU隐藏层128维。动作向量用one-hot或连续向量直接拼接学习率保持在0.0001reads训练轮数大约80到120轮一样用Adam。每隔一定训练步数就把验证集上的一批真实轨迹拿出来让模型从某一步开始自回归展开50步看看预测的隐状态是否还稳定或者直接解码出来看图像是否会发生扭曲。5. 策略训练与闭环部署5.1 利用世界模型做仿真采样有了感知模块和动力学模块你现在拥有一个可以在隐空间里对任意输入动作序列进行推演的世界模型。接下来要做的就是在这个模型里训练一个策略。核心收益在于传统强化学习需要去真实环境里采样每分钟可能只有几十帧而世界模型训练好之后你可以在隐空间中快速跑大量动作序列相当于把环境模拟加速了几十倍甚至几百倍。我一般会让策略在隐状态空间里只依赖当前隐状态输出动作用简单的策略梯度方法即可。5.2 策略网络结构与奖励信号设计策略网络可以设计成一个小型MLP输入是隐状态输出是动作概率分布离散动作或动作的高斯分布参数连续动作。奖励信号在理想情况下可以直接来自真实环境的反馈但在纯想象训练时你需要一个奖励预测模块或者一个用真实轨迹标定的奖励函数来指导更新。我的简化做法是先花几千步真实采样建立一个小型的奖励预测器然后让策略在单独依靠世界模型做模拟的过程中也返回一个估计奖励。混合使用一部分真实奖励和一部分模型预测奖励稳定性会好很多。5.3 闭环部署时如何协调真实环境与模型当策略在想象环境中训练好以后还需要回到真实环境里验证。这时候最典型的坑是感知模块和动力学模块对真实输入的误差在闭环中被放大。怎么办我通常采用做法是“干预式推理”在真实环境里每一步把真实观测编码为隐状态并混合一部分预测出的隐状态作为输入可以有效缓解模型漂移。同时我会保留一个简单的异常检测器如果真实观测在较长时间内连续无法被重建就切换回纯真实观测模式避免策略在错误的状态上继续盲目行动。这种把关方式听起来简单但在各种复杂环境都能明显降低失败率。5.4 训练闭环的监控指标在整个闭环训练过程中我最关注的指标不是平均回合奖励而是“自回归预测误差”ER。我可以定时从同一批真实轨迹中随机挑出一段让模型在隐空间内推演然后解码回像素空间跟真实未来帧对比计算平均绝对误差。只要这个误差在训练中不降反升说明模型过拟合了这段轨迹必须回头调动力学模块的随机项或多步训练强度。实践中我把这类指标存档做成一张实时图表一旦指标异常我就能立刻停住进程而不是等到训练结束才发现模型坏了。这个习惯帮我省下了大量无效训练时间。6. 常见问题与排查技巧实录6.1 感知模块重建正常但动力学预测崩坏这种情况最常出现在刚跑完流程的第一版。表现出来是直接看重建静态帧很清晰但让模型自回归向后推演几步画面就开始扭曲或者闪烁。原因通常有两个方向一是隐状态维度太低导致感知模块丢掉了时序相关的关键信息而静态重建恰恰对这类信息不敏感二是多步展开训练不足模型只学会一步预测多步时误差逐帧累积。我自己的排查顺序是先提高隐维度到128同时加长多步展开的步数到4到5步再看自回归效果是否改善。如果依然不行就回到数据端检查训练窗口是否太短。6.2 强化学习训练在想象环境中几乎不收敛如果你已经把动力学模型做得不错但策略训练效果上不去我建议检查一下想象环境的“动态范围”是否和真实环境一致。比如真实环境的观测在某个通道上的变化范围是-1到1但隐空间里的分布经过归一化后可能太窄导致策略无法产生足够大的动作差异。一个比较简单的修复方式是在隐状态后面加一个LayerNorm层或者把隐状态的白化统计量直接传给策略网络帮助策略更快适应分布。这算是我踩过最深的坑之一因为问题不在策略算法本身而在表示空间的尺度一致性。6.3 数据需求量大增时如何加速当从二维环境往三维或更复杂的可视环境推广时数据需求会暴涨。我自己在过渡期采用过一个比较“取巧”的做法先用少量真实数据训练感知模块然后用训练好的感知模块对大量随机网络参数生成的“伪数据”做预训练等真实数据积累到一定量之后再微调。这个方法虽然听着不太“正统”但在我实际项目中确实能把整个训练时间缩短近一半。当然伪数据训练阶段必须严格标记防止模型天然地把伪数据当成真实世界的统计特征。6.4 调试世界模型时三个最有价值的自检手段我每个阶段几乎都会重复做这几件事你可以直接抄可视化隐状态把隐状态向量做一次PCA降维到3个分量不同颜色标记不同动作类型时间上把同一条轨迹的点连成线。如果每个动作对应一段清晰的不同走向说明动力学有效区分动作效果。用固定随机动作跑自回归不引入策略随机动作序列跑50步解码出连续帧做成动画。如果画面能保真说明动力学模块足够稳定。故意给模型错误输入调试把一个明显不该存在的状态输入编码器观察模型下一步的反应。如果它能在1到2步内被拉回到合理范围内说明环境动态约束力比单纯压缩表示更强。7. 一些额外的经验之谈在我接触过的各类序列决策任务里世界模型的潜力确实很大但它不是一个能即插即用的黑盒。创建流程中最容易被低估的是感知模块和动力学模块之间的接口设计很多人把精力全部放在策略算法上结果模型表现不佳却不知道问题出在表示空间安排不合理。我的一次“大改”经历就是把感知模块从普通AE换成VAE同时把隐空间维度从128降到64结果同一套策略损失函数竟然少了一半收敛时间。这说明有时候减少信息量反而更有利于后续决策因为真正要紧的特征被抓了出来其余细节被主动丢弃了。之后再遇到新任务我会老老实实按“数据准备、感知训练、动力学训练、策略闭环”的顺序走每一步都留下可视化证据再进入下一步。这个习惯强烈推荐给你它能让你少走很多弯路。最后想说如果你只是想要一个能跑的demo照着上面这套流程整体代码量其实不大核心模型部分几百行就够。难的是联调和指标设计这些只能靠一次次试错堆积出经验。慢慢来把每一步都搞清楚世界模型并不是一个离我们很遥远的技术。

相关新闻

AI检测率过高?9个降AI率工具原理与实操全解析

AI检测率过高?9个降AI率工具原理与实操全解析

1. 先说清楚:AI检测到底在查什么,你的文章为什么“命中”最近被问得最多的一个问题就是:“我写的东西被AI检测查出来AI率70%,到底怎么回事?”很多专科的同学也在问,说自己的课程论文、期末报告、毕业设计准…

2026/10/17 14:18:06 阅读更多 →
AI辅助专著写作实战:从大纲拆解到统稿润色的全流程指南

AI辅助专著写作实战:从大纲拆解到统稿润色的全流程指南

1. 从“对着白纸发呆”到“批量产出初稿”:AI专著写作到底改变了什么这两年我身边想写书的人越来越多。有的是从业多年的工程师,想把项目经验沉淀成一本行业手册;有的是高校老师,想把课程讲义系统化整理成公开出版物;还…

2026/10/17 14:18:06 阅读更多 →
SAP WebService接口配置:入站出站全流程指南

SAP WebService接口配置:入站出站全流程指南

很多做SAP集成的人,第一次接触WebService时都有点懵。SAP的接口体系非常庞杂,IDOC、RFC、BAPI用得最多,但遇到外部系统只肯给SOAP接口时,一下子就不知道从哪里下手了。尤其当你同时要处理“SAP发布接口给别人调”和“SAP去调别人的…

2026/10/17 14:18:06 阅读更多 →

最新新闻

Vim+GCC+库文件:打通Linux开发工具链的完整闭环

Vim+GCC+库文件:打通Linux开发工具链的完整闭环

我见过太多刚切到 Linux 的开发者,第一周就被劝退。倒不是 C 语言难,而是卡在了工作流上:在终端里不知道怎么快速改代码,写完程序不知道怎么编译,编译完了遇到各种链接报错又一头雾水。说白了,就是 Vim 操作…

2026/10/17 16:14:27 阅读更多 →
大漠插件7.2213 + Python:DmHelper注册调用与桌面自动化避坑指南

大漠插件7.2213 + Python:DmHelper注册调用与桌面自动化避坑指南

简介:面向大漠插件7.2213的Python注册示例包,内含作者自制的DmHelper脚本,用于演示如何通过Python语言调用大漠插件接口,完成注册、激活以及基本功能调用。大漠插件在界面自动化、软件测试、网页数据抓取等日常开发场景中应用广泛…

2026/10/17 16:14:27 阅读更多 →
5 分钟上手 North-Micro-Vision-Instruct-bf16:在 Apple Silicon 上本地跑通图像描述的完整指南

5 分钟上手 North-Micro-Vision-Instruct-bf16:在 Apple Silicon 上本地跑通图像描述的完整指南

【免费下载链接】North-Micro-Vision-Instruct-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/North-Micro-Vision-Instruct-bf16 点击查看 免费下载 North-Micro-Vision-Instruct-bf16 是一个专为 Apple Silicon(M 系列芯片&#x…

2026/10/17 16:14:27 阅读更多 →
鸿蒙下Flutter测试框架反射装载适配与规模化分发

鸿蒙下Flutter测试框架反射装载适配与规模化分发

test_reflective_loader 这个名字,很多 Flutter 开发者可能只在跑测试时瞥见过一眼,但真正能说清它底层在干嘛的人不多。这次我们团队在把一套针对鸿蒙 HarmonyOS 的 Flutter 测试基建落地时,在这个组件上扎扎实实折腾了几周,踩了…

2026/10/17 16:14:27 阅读更多 →
XERJ零配置自动索引教程:一条命令让PDF、CSV、SQLite和日志全部可搜索

XERJ零配置自动索引教程:一条命令让PDF、CSV、SQLite和日志全部可搜索

XERJ零配置自动索引教程:一条命令让PDF、CSV、SQLite和日志全部可搜索 【免费下载链接】xerj XERJ is the new way for AI to search data. Its autoindex capability activates agents to know your data without the token waste of grep and sed. One command in…

2026/10/17 16:14:27 阅读更多 →
Qt飞机大战飞机类设计:QGraphicsScene、状态机与碰撞检测

Qt飞机大战飞机类设计:QGraphicsScene、状态机与碰撞检测

1. 飞机类挂在 QGraphics 场景里,是我试出来的最优解1.1 一开始我也用过 QWidget 硬拼飞机大战在 Qt 里算一个很经典的练手项目,但大多数教程会把重点放在"怎么把窗口搭出来""怎么加背景图",真到自己动手写飞机类的时候&…

2026/10/17 16:13:26 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →