VLA模型安全对齐新思路:用约束学习让机器人守住安全红线
最近在跟进具身智能方向的工作连着读了好几篇VLA相关的论文真正让我停下来划重点的是这个标题Towards Safety Alignment of Vision-Language-Action Model via Constrained Learning。在RoboticsFoundation Model的圈子里VLA视觉-语言-动作模型已经不算新鲜概念了但绝大多数工作都在卷任务成功率和泛化性把safety当作加分项而不是必选项。这篇论文把安全对齐从LLM领域搬到了VLA上并且用的是凸优化里的经典思路——约束学习来解。如果你跟我一样既关心VLA能不能落地到物理世界又对RLHF那套“靠reward model打分”的软对齐方式抱有怀疑这篇文章值得认真读一遍。文章不是纯理论推演它给出了一个很实际的问题建模方式把安全要求写成约束项再用拉格朗日对偶去求解让策略在满足安全预算的前提下最大化任务性能。这个思路本身不新但放到VLA这种高维视觉语言动作联合策略上工程上和训练上的坑比想象中多。下面我把论文的动机、方法细节、实验设计以及我自己的一些延伸思考拆开说。1. VLA模型的安全问题为什么值得单独开一篇文章1.1 LLM对齐的惯性思维在VLA上行不通做大模型对齐的人对这套流程太熟悉了SFT之后接RLHF或DPO用人类偏好让模型学会“有礼貌地拒绝”、“不输出有害内容”。这套方法的核心是训练一个奖励模型再把偏好信号反馈给策略本质上是一种软约束——模型学到的是一种“倾向”而不是一条“红线”。文本模型说错一句话的代价是可逆的用户关掉对话窗口就结束了。但VLA输出的是连续动作序列作用对象是机械臂、移动底盘、人形机器人这些物理实体。一个不安全的动作意味着碰撞、夹伤、倾覆、关节超限代价直接体现在物理世界上。更要命的是VLA不能像LLM那样“拒绝执行”——用户下达“把杯子拿过来”模型必须给出一个动作哪怕它对场景没把握也不能静默。这种“必须行动”的属性让安全对齐从附加题变成了必答题。还有一个常被忽略的差异VLA的输入是多模态的视觉观测可以被光照、遮挡、对抗贴纸干扰语言指令可以被歧义或恶意引导。LLM的安全对齐主要防文本攻击VLA的安全对齐还要防视觉感知被欺骗后产生的错误动作。这已经不是“变得礼貌”能解决的问题了而是需要从动作生成机制上施加结构性保障。1.2 具身场景下“安全”的定义更硬我读这篇论文时最有感触的一个点它把安全描述成约束constraint而不是偏好preference。在RLHF里“安全”是reward的一个加分项模型可以在某些情况下为了更有用的回答牺牲一点安全性但在机器人场景里碰撞就是碰撞没有“在特定上下文中可以适度碰撞”这种说法。硬约束和软偏好之间差着一条物理定律。拿表格对比一下两类安全对齐的本质区别对比维度LLM安全对齐VLA安全对齐输出空间离散token序列连续动作/轨迹点失败后果有害文本、错误信息物理碰撞、设备损坏、人员受伤典型方法RLHF、DPO、RLAIF、拒绝采样CMDP、约束策略优化、安全滤波、控制屏障约束的松紧软偏好可权衡硬预算不可违反评估指标人工打分、攻击成功率碰撞率、约束违反率、任务成功率这组对比解释了为什么论文选择用Constrained Learning而不是简单地把安全词塞进reward。它的底层判断是在VLA这类高风险决策问题上安全不能用“期望最大化”来隐式保证而必须以约束的形式出现在优化问题中。2. 论文的核心设计把“安全”写进优化问题的约束里2.1 从奖励塑形到约束优化一个视角的切换如果沿用RLHF的思维想让VLA安全最直接的办法是给不安全的行为加负奖励也就是reward shaping。这个做法实现简单但有个致命问题负奖励的强度系数不好调。给轻了模型发现绕开惩罚比满足任务更划算于是学会“钻空子”给重了模型变得极度保守任务成功率断崖式下跌。更麻烦的是奖励信号和任务目标混在一起训练过程中很难解释模型到底在优化什么。这篇论文把问题重写成带约束的优化形式核心公式长这样[ \max_{\pi} \quad J_R(\pi) \mathbb{E}{\tau \sim \pi}\left[\sum{t0}^{T} \gamma^t R(s_t, a_t)\right] ] [ \text{s.t.} \quad J_C(\pi) \mathbb{E}{\tau \sim \pi}\left[\sum{t0}^{T} \gamma^t C(s_t, a_t)\right] \leq d ]这里的(R)是任务奖励(C)是安全成本函数(d)是用户预设的安全预算阈值。目标很明确在“累计安全成本不超过预算”的前提下最大化任务回报。这个建模方式把安全和性能分成两个维度做决策时不需要人为权衡而是交给优化器去找满足约束的最优策略。这个视角切换的价值在于它承认了安全不是任务性能的附属品而是一条需要被显式满足的约束。在控制领域这其实就是带约束马尔可夫决策过程的框架论文把它搬到了VLA策略上。2.2 安全成本函数模糊的“安全”如何变成数值任何一个约束优化问题第一步都是把约束写清楚。论文里提到的安全成本函数(C(s, a))设计思路可以拆成几类几何安全成本机械臂末端与障碍物的最小距离、底盘与行人的间距。低于阈值时成本快速上升。动力学安全成本关节力矩、速度、加速度是否超出硬件限制。超限即高成本。任务语义成本动作是否符合语言指令的意图比如指令是“递剪刀”而模型把手伸向刀刃。状态边界成本机械臂是否接近奇异构型、是否可能倾覆、物体是否即将滑落。这个函数的设计质量直接决定约束学习的成败。太稀疏会变成“要么不触发、一触发就出大事”的悬崖式信号模型很难从中学到平滑的安全边界太稠密又会让策略每步都如履薄冰丧失任务完成能力。论文的处理方式是把它设计成一种带缓冲区buffer zone的距离度量在安全区域内成本为0进入缓冲区域成本逐渐增大越过硬边界成本突增。这个思路很像自动驾驶里的安全距离场比二值碰撞检测信息量大得多。2.3 求解思路拉格朗日对偶与安全策略更新约束优化直接解起来很麻烦论文用的是经典拉格朗日松弛。把原始问题改写成[ \min_{\lambda \geq 0} \max_{\pi} \quad L(\pi, \lambda) J_R(\pi) - \lambda \left( J_C(\pi) - d \right) ]这里(\lambda)是拉格朗日乘子可以理解成一个“安全违规的单价”。内层最大化让策略在给定(\lambda)下提高任务回报同时因为减去(\lambda (J_C - d))策略会被反向推动去压低安全成本。外层最小化则不断调整(\lambda)如果当前策略的安全成本超过预算(\lambda)增大安全项权重变高如果成本远低于预算(\lambda)减小把更多优化空间让给任务性能。用深度学习实现这个交替优化时策略(\pi)通常用PPO或类似策略梯度方法更新(\lambda)则用简单的梯度上升或PID控制调整。我之前做过类似的带约束强化学习项目有一个很深的体会这个交替优化的稳定性很大程度上由(\lambda)的学习率决定。(\lambda)更新太快策略还没学会应对高压惩罚训练就崩了(\lambda)更新太慢安全约束形同虚设。3. 约束学习落到VLA参数上的关键步骤3.1 策略网络里哪一部分负责“安全”VLA的典型结构是视觉编码器ViT或SigLIP 语言编码器LLM 动作头MLP或diffusion decoder。论文提出的安全对齐方案不是从零训练一个VLA而是在预训练好的VLA之上进行安全微调这非常符合实际资源约束。这里有一个值得注意的设计取舍安全约束应该加在哪个模块上。如果只加在动作头上优化空间有限因为视觉和语言特征里可能已经包含了不安全的信息如果整个backbone都放开微调又存在灾难性遗忘风险VLA原本学到的语义理解能力会被破坏。论文的做法是在中间层和动作头之间引入一个安全对齐适配器safety alignment adapter冻结大参数只训练适配器和动作头。这个思路跟LoRA微调有异曲同工之处但约束信号是直接作用在动作分布上的。3.2 安全层显式投射到可行动作集除了在目标函数里加约束论文还采用了安全层做动作矫正。策略输出原始动作(a_{raw})之后安全层会判断这个动作是否满足当前状态的安全约束如果不满足则求解一个二次规划把动作投射到最近的安全动作上[ \min_{a \in \mathcal{S}(s)} \quad \frac{1}{2} | a - a_{raw} |^2 ]这个安全层本质上是一个在线安全过滤器保证任何时刻执行到环境里的动作都不会突破安全边界。它和控制领域的控制屏障函数CBF思想很接近但用在VLA上有两个额外好处一是训练初期策略还在探索时安全层能拦住大量危险动作避免训练过程产生灾难性数据二是安全层提供的“矫正后的动作”可以直接作为学习信号让策略逐渐学会自己在安全区域内输出动作从而减少对安全层的依赖。不过这里也有一个我不太放心的地方如果安全层介入过于频繁策略可能把安全层当作“点对点代驾”自己完全放弃学习安全动作模式。论文的实验数据显示配合约束学习后策略对安全层的依赖会逐步下降但单纯用安全层而不用约束学习的对照组里这一下降是非常缓慢的。这从侧面说明了约束信号对策略本体学习的重要性。3.3 训练流程与收敛判断整个训练流程可以概括成三步循环用当前策略在仿真环境中收集轨迹同时记录任务奖励(R)和安全成本(C)用策略梯度更新(\pi)优化拉格朗日目标(L(\pi, \lambda))根据当前累计安全成本(J_C(\pi))和预算(d)的差距更新(\lambda)。判断收敛不能只看任务奖励曲线还要看安全成本曲线是否收敛到阈值附近。我当时跑这类实验时有个习惯把(\lambda)的数值变化也打出来看。如果(\lambda)一直单调上涨说明策略始终学不会安全而且越往后越焦虑如果(\lambda)在高频振荡说明学习率太大或轨迹batch太小估计方差过高。论文里的收敛形态是(\lambda)先上升然后回落并稳定——上升阶段是策略在被“教育”回落阶段是策略已经把安全内化成自身行为不再需要高压惩罚来维持。4. 实验怎么验证“安全对齐”指标设计与任务设计4.1 仿真环境与长程任务设计评估安全对齐比评估任务性能难得多因为“安全”是一个负面事件论文的策略是设计几个高风险任务场景让负面事件有充分的发生机会。任务类型大致可以分成三种桌面抓取中避开易碎品、移动操作中规避动态障碍、长程任务中的工具传递与交接。在仿真环境选择上这类工作一般会用MetaWorld、Robosuite、RLBench这类支持碰撞检测和接触力计算的平台。论文的评估中有一个细节我很认同它没有只报告“平均成功率”而是把任务分成长程和短程。短程任务里VLA靠安全层硬拦也能保住安全长程任务才是真正考验约束学习的地方因为每一步的微小安全偏差会累积放大最终导致无法挽回的碰撞。4.2 安全指标不能只看碰撞率碰撞率是最直观的安全指标但它太稀疏了。一次轨迹中只要最后没撞中间过程拧巴成什么样都不影响碰撞率数字。论文额外报告了安全预算违反率constraint violation rate和安全成本累积曲线这些指标能看出策略在轨迹中间段是否持续保持安全行为。比较有意思的是“安全预算边界”的实验把约束阈值(d)分别设成紧、中、松三档观察任务成功率的变化。结果很符合约束优化的直觉——策略会在给定预算内尽量去“花”安全成本换取任务性能。紧预算下任务成功率明显下降但安全成本不会超过红线松预算下任务性能提升但安全成本也随之上升。这个权衡关系曲线比单一数值更能说明约束学习的特性。4.3 性能和安全不是非此即彼我本来预期约束学习会牺牲不少任务成功率来换取安全但论文的结果给出了一些反直觉信息在视觉干扰较大的测试条件下约束学习的任务成功率反而高于baseline。原因可能是安全约束强迫策略学了更稳健的视觉特征——一个会避开危险区域的策略天然对感知噪声更鲁棒因为它不会因为一个像素扰动就做出极端动作。这一点在真实项目中其实很关键。我们团队之前做过一个机械臂分拣项目发现模型在仿真里安全表现很好一换光照条件就出问题。后来排查发现是纯奖励塑形训练的策略把“安全”和特定视觉特征绑定了而不是学到“远离危险”这个抽象概念。论文中约束学习在视觉扰动下的稳定表现说明约束信号比奖励塑形更容易诱导出跨场景泛化的安全行为。5. 读完之后的三点思考与复现建议5.1 论文没有解决的开放问题第一安全成本函数(C(s,a))的手工设计仍然是瓶颈。论文的实验场景里安全边界是可以被明确描述的几何空间但真实世界大量安全规则是语义级的比如“不能把刀具递给小孩”这种指令没法简单用距离阈值表达。这个问题的终极解法可能需要VLA自身的世界模型来辅助判断那就变成另一个层次的问题了。第二Sim-to-Real迁移。仿真环境里的安全约束定义得再清楚迁移到真机上也要面临状态估计误差、动力学偏差和延迟问题。论文里的安全层在仿真里可以拿到精确状态真机上拿到的却是带噪声的估计值安全层的有效性会受到挑战。这个问题的解决可能需要把安全层设计成能够容忍状态不确定性的鲁棒形式比如鲁棒CBF或Tube MPC。第三时序约束和多智能体场景。单机器人任务的约束还好建模人机协作或两臂协同场景下“互相之间保持安全距离”这种约束会带来组合爆炸问题。论文的框架理论上可以扩展但实际求解难度会大幅上升。5.2 复现时可能踩的坑论文的方法听起来不复杂但真正复现时会遇到几个非常现实的工程问题。拉格朗日乘子的初始化与学习率如果(\lambda)初始值接近0策略前期基本无安全压力会疯狂踩红线如果初始化过大策略直接躺平不动。建议是先跑几步看安全成本的自然量级再反推(\lambda)的合理初始值。安全成本与任务奖励的量纲差任务奖励通常比较稀疏、量级小安全成本却可能因为距离函数被放得很大。两者直接相加会让优化被安全项支配。论文里应该对安全成本做过归一化或裁剪复现时这一步要特别小心。环境终止逻辑对成本统计的污染在仿真里发生碰撞时环境通常会提前终止episode这会造成安全成本被截断策略学到的往往不是“避免碰撞”而是“让episode尽快结束以规避后续累计成本”。一个实践经验是发生碰撞后不立刻终止而是继续运行几秒让策略感受到危险动作带来的持续高成本。5.3 把约束学习迁移到自己的项目里如果你不想完整复现论文也想借鉴它的思路我建议从最小的改动开始在现有VLA策略上外挂一个安全层再把安全层的触发频率作为一个观察指标跑起来。当你发现触发频率过高时用论文的约束目标做轻量微调而不是彻底重训模型。这个渐进路线对项目风险控制更友好。我们自己的一个任务就采用了类似的迁移路径先把安全成本定义成关节限位和末端距离的组合然后在模仿学习基础上加了一层安全约束微调。效果是任务成功率几乎不掉但碰撞率下降了百分之四十多。这说明约束并不必然牺牲任务表现关键是让模型在安全边界内自主优化任务目标。读这篇论文之前我对VLA的安全问题一直停留在“加规则、加惩罚”的层面。读完之后最大的启发是安全对齐应该是一个贯穿训练过程的约束问题而不是训练完成后的补救措施。把安全写进约束再通过拉格朗日对偶去求解虽然比reward shaping多了一些调参成本但得到的策略在安全边界上的行为要可解释得多。如果你也在做VLA相关的落地项目我建议尽早引入安全约束而不是等模型过拟合任务指标之后再做安全后处理。安全cost的定义一开始粗糙一点没关系关键是让约束信号参与训练模型才会真正把安全内化成动作习惯。后面迭代成本函数定义比在完全不管安全的策略上强行加安全层要有效得多。

相关新闻

Kylin快速入门:海量数据下的秒级OLAP查询实战

Kylin快速入门:海量数据下的秒级OLAP查询实战

1. 为什么需要Kylin——海量数据下的OLAP困境先来聊点实际的。做数据平台、BI报表、数据仓库的同行应该都有这种体会:业务方最常问的不是“数据准不准”,而是“能不能再快点”。明细数据动辄几亿、几十亿行,用Hive跑一个多维汇总查询&#xf…

2026/10/16 18:57:50 阅读更多 →
Claude Code Windows 安装与 nvm 环境变量报错排查实战

Claude Code Windows 安装与 nvm 环境变量报错排查实战

先说个结论:Claude Code 这套命令行工具最大的门槛不在使用,而在安装。尤其是 Windows 上配合 nvm 管理 Node 版本的朋友,大概率都会撞上“无法将 claude.exe 识别为 cmdlet”“claude 不是内部或外部命令”这种错。这个报错看起来是环境变量…

2026/10/16 18:56:50 阅读更多 →
C#图像处理实战:ImageSharp批量处理、并行优化与避坑指南

C#图像处理实战:ImageSharp批量处理、并行优化与避坑指南

我用C#做图像处理差不多三年了,从最初的System.Drawing到后来的ImageSharp,中间踩过的坑不比我写过的业务代码少。最近刚好把一套图片批量处理工具做了重构,从单线程串行改成并行流水线,吞吐量提升了快4倍,过程中也把一…

2026/10/16 18:56:50 阅读更多 →

最新新闻

RectTransform底层原理与UI适配:锚点、Pivot、Offset全面解析

RectTransform底层原理与UI适配:锚点、Pivot、Offset全面解析

做Unity客户端的同学,绕不开RectTransform。做UI适配的时候锚点设错、代码里初始化之后位置数值怎么都看不懂、换一个分辨率控件就飞了,这些场景,刚从传统3D逻辑转到UGUI的人几乎全中过一遍。RectTransform和普通Transform最本质的区别&#…

2026/10/17 21:47:50 阅读更多 →
Vue 3 组件测试实战:Vitest 与 Vue Test Utils 的稳定编码方式

Vue 3 组件测试实战:Vitest 与 Vue Test Utils 的稳定编码方式

最近给一个维护了大半年的中后台系统补单元测试,我发现在团队里搜“Vit常见编码方式”,翻出来的测试代码至少有四五种风格:有人mount一把梭,有人万事shallowMount,有人测异步靠sleep(2000),还有人把组件内部…

2026/10/17 21:47:50 阅读更多 →
SQL Server Always On集群添加只读副本:从WSFC到只读路由全解析

SQL Server Always On集群添加只读副本:从WSFC到只读路由全解析

简介:针对在 SQL Server 2016 Always On 集群中新增数据库节点的需求,这份由亲测实践整理而成的操作文档,可供数据库管理员和运维人员直接参考。资源为单个 docx 文件,压缩包约 1.92MB,内含大量界面截图、逐步操作说明…

2026/10/17 21:47:50 阅读更多 →
C语言编程题汇编刷题避坑指南:从索引表到回归测试的完整实践

C语言编程题汇编刷题避坑指南:从索引表到回归测试的完整实践

简介:这是一份《乐学C语言编程汇编》的完整Word整理版,源自北京理工大学程序设计基础教学场景,主要面向正在系统学习C语言的高校学生,以及需要备考计算机等级考试或校内上机测试的读者,旨在通过大量分阶练习提升编程逻…

2026/10/17 21:47:50 阅读更多 →
华为eNSP模拟器STP生成树协议实战:从根桥选举到MSTP负载分担配置详解

华为eNSP模拟器STP生成树协议实战:从根桥选举到MSTP负载分担配置详解

1. 为什么要在模拟器里折腾生成树协议很多人第一次接触交换机配置,都是从划分VLAN开始的。把不同端口塞进不同VLAN,广播域隔离开,网络看起来就"通"了。但只要你在拓扑里多接一根网线,形成一个物理环路,整个网…

2026/10/17 21:47:50 阅读更多 →
递归下降分析器的本质:LL(1)预测表的硬编码实现

递归下降分析器的本质:LL(1)预测表的硬编码实现

简介:本资源是面向计算机专业本科生与编译原理初学者的实验教学材料,聚焦自上而下的语法分析核心实践——递归下降分析器的设计与实现。内容涵盖LL(1)文法改造(含左递归消除)、FIRST/FOLLOW集手工推导与验证、词法分析器扩展&…

2026/10/17 21:46:49 阅读更多 →

日新闻

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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →