从人类操作视频到自我进化:GUI智能体训练与医疗场景实践

发布时间:2026/10/20 17:41:13

从人类操作视频到自我进化:GUI智能体训练与医疗场景实践 1. 项目整体拆解三件事串起一条线看到“3.28-1”这个版本号时我第一反应是这大概率是一个把数据集、训练范式和应用场景捏在一起的阶段性交付。标题里三块内容——大规模人类标注的计算机使用视频数据、从失败经验中学习的自我进化GUI智能体训练、医疗软件长视野GUI操作——刚好把当前GUI智能体GUI Agent方向上最要命的三个问题一次性摆了上台面数据从哪来、模型怎么越训越强、以及最难啃的落地场景能不能真的跑通。GUI智能体这两年很热各家都在做大模型直接看懂屏幕、代替人点鼠标敲键盘的方案。但真正做过的人都知道让它完成三步以内的操作不难难的是几十步的长流程不出错。这个项目给我的整体感觉就是想用真实的人类操作视频去打底用失败信号去驱动模型迭代再拿医疗软件这种高复杂度场景来验真。写这篇复盘是想把从这个项目里拆出来的设计思路、数据构建方法、训练机制和落地细节原原本本讲清楚。适合正在搭GUI智能体数据集的同学、在研究交互式智能体训练方法的开发者以及要给医疗、政务这类专业软件做自动化助手的人参考。1.1 三个关键词背后的真实需求先说数据。目前公开的GUI智能体数据大多集中在网页环境比如网购、订票、填表单。但真实业务系统——尤其是医疗、金融、企业内部的客户端软件——和网页是两码事。它们往往渲染复杂、窗口嵌套深、组件不是标准HTML拿网页数据训出来的模型一换环境就懵。所以需要“大规模人类标注的计算机使用视频数据”让人真坐在电脑前完成真实任务录下屏幕记下操作再把意图标出来。这是整个项目的地基。然后是训练方法论。“从失败经验中学习”对应一个很尴尬的事实监督学习只能学人怎么做对模型自己跑的时候照样会犯错。与其假装错误不存在不如把失败也变成训练信号。再加上GUI智能体的奖励信号天然稀疏一整条轨迹只有最后成功或失败一个结果中间每一步很难评价而失败轨迹恰恰能暴露出最早出错的位置帮模型建立“哪里开始不对”的感知。最后是“医疗软件长视野GUI操作”。长视野的意思是任务动辄几十步跨多个弹窗、多个页面、甚至多个子系统。医疗软件的步骤密集、校验严格、点错代价高正好逼着模型拥有规划和纠错能力。这个场景能跑通意味着这套数据路线和训练框架对其他专业软件同样适用。1.2 为什么把这三件事放在一起这个项目最聪明的地方是没有把三者当成孤立的子课题而是构成一条完整的迭代闭环。数据负责让模型“见过人类怎么做”失败学习负责让模型“知道自己哪里会错”医疗软件负责提供一个足够苛刻的考场。模型在考场上失败失败信号又反过来变成下一轮训练的数据形成自我进化。换句话说数据不只是起点也是训练过程中持续产生的副产品。我在自己的实践里也验证过这个逻辑只堆人工高质量示范数据模型会在训练集分布内表现不错但一到开放环境就迅速退化。反而是那些“试错—采集失败—再训练”的循环哪怕初始示范集不算大也能越跑越稳。所以这个项目给我的启示是别把数据采集和模型训练当成两个阶段而要把它们设计成一个闭环互相喂食。2. 大规模人类标注的计算机使用视频数据地基工程2.1 数据采集方案怎么定采集的常见做法是同时开两路记录一路用录屏工具抓屏幕视频另一路通过系统事件钩子记录鼠标键盘动作流。两者双管齐下各有不可替代的作用。视频给模型看“屏幕长什么样、界面状态怎么变化”事件流则给模型精确的动作坐标、按键内容、滚动距离。如果只录视频标注动作坐标会很痛苦如果只记事件流一旦界面布局变化就不知道上下文是什么。具体参数方面我建议视频帧率不要贪高8到10帧每秒足够。GUI界面变化本身是离散的鼠标滑过不会产生有意义的视觉信息高帧率只会让数据膨胀、训练变慢。事件流则要按毫秒级时间戳记录因为很多操作是快速连点时间戳精度不够会对齐不上视频。坐标建议同时记录屏幕分辨率和归一化坐标方便后续在不同分辨率下使用。覆盖面的设计比大家想象得更重要。如果只采集单一软件的操作模型学到的其实是对这个软件的记忆而不是通用的GUI操作能力。合理的做法是至少覆盖六到八类场景办公文档、浏览器操作、设计工具、数据录入系统、即时通讯客户端、以及面向特定行业的业务软件比如医疗信息系统。每类场景还要拆成多个任务模板控制任务复杂度从三步以内到三十步以上都有分布。参与采集的人也要分层次。一类是普通使用者他们的操作路径发散、会犹豫、会误点但正因如此才能覆盖到各种异常状态另一类是专家用户他们操作路径短、效率高、步骤标准是训练“高效策略”的标杆。两边数据大概七三开比较合适普通用户为主专家用户保证质量。2.2 标注体系与层级设计有了原始录像和事件流接下来要做的就是把它们变成模型能学的监督信号。我的经验是标注体系分三层任务级一次完整的会话要达成的目标比如“在放射科工作站里录入一名新患者的CT检查申请”。步骤级当前这一步动作是什么比如单击、双击、输入文本、滚动、拖拽。元素级动作作用在哪个界面组件上包含组件类型按钮、输入框、下拉菜单、列表项、屏幕坐标、可见文本。动作类型建议固定成一个封闭集合不要随意扩展。常见的就七种左键单击、双击、右键单击、文本输入、滚动、拖拽、键盘快捷键。动作集合越精简模型的输出空间越好约束误操作率会明显下降。元素文本的提取很关键。录制视频是一个像素矩阵标注者需要把“这个位置是‘确认’按钮”这件事写下来。实际操作中我们大量借助OCR预标注先自动跑一遍文字识别标注者只需要校验和修正。文本信息越准确训练出来的模型就越能理解“我现在处理的组件是什么”。还有一个容易被忽略的标注字段叫“操作意图”。同样是一次单击意图可能是“打开下拉菜单”“确认弹窗”“选中表格行”甚至可能是“误点之后取消”。意图标注对后续的错误分析特别有用没有这个字段你很难量化模型在哪个环节出现了偏差。2.3 数据质检的几点心得数据质量决定了整个项目上限但质检不是说抽检几个样本看看就完事。我踩过不少坑总结下来有三个点必须盯紧。第一是视频和事件流的对齐。录屏软件启动有延迟错误码多的时候还会丢帧时间戳一对不上后续所有标注全废。建议在采集端做一个统一心跳每30秒在屏幕角落显示一个动态标记同时在事件流里打一个同步点质检阶段按同步点校验偏移量是否在可接受范围内。第二是隐私脱敏这个最容易出事故。用户录屏过程中聊天窗口弹出、邮箱收到敏感邮件、甚至账户密码出现在输入框都是常见情况。项目里的处理方式是采集端自动检测高风险区域并模糊化人工复核时再做二次清理。相关数据一旦流出后果会很严重所以脱敏流程必须前置而不是事后补救。第三是“操作停顿”不能简单裁掉。很多人为了省标注成本会把用户思考时的长停顿当作无效区间删掉我认为这是错误的。停顿前后往往对应“观察屏幕—决定下一步”的过程是理解任务状态转换的黄金线索。正确的做法是把停顿标注为“观察/决策”类事件让模型知道有些时刻不需要操作只需要感知和等待。3. 从失败经验中学习GUI智能体的自我进化机制3.1 失败数据为什么要单独拎出来纯行为克隆BC的问题在于模型只会模仿人类示范的分布一旦进入训练样本里没见过的状态它给出的动作就开始随机飘。为什么会飘因为BC的损失函数只鼓励“在某个状态输出示范动作”却完全不告诉模型“如果输出另一个动作会怎样”。换句话说模型对动作的后果毫无概念。失败轨迹恰好能补充这层认知。一条失败轨迹记录了“从哪个状态开始、做了哪些动作、在哪个动作之后局势不可挽回、最终以失败结束”。这本质上是对状态价值的负向估计凡是失败路径上的状态价值都偏低凡是让成功轨迹回到正轨的动作价值都偏高。有了这个信号模型才能学会避开“看起来无害但实则致命”的动作。我们在实践中发现一个比较反直觉的现象刻意混入一定比例失败轨迹比只喂完美示范的训练收敛更快最终准确率也更高。原因不难理解失败样本往往落在决策边界附近能更有效地约束模型的动作概率分布。这跟我以前带实习生时讲的道理一模一样——只让他看标准答案不如让他把错题本也研究透。3.2 偏好优化与强化学习的两条路用失败信号训练目前主流路线有两条。第一条是偏好优化。把同一条任务的“成功轨迹”和“失败轨迹”配成一对用类似DPODirect Preference Optimization的思路让模型学习“输出成功行为”的概率高于“输出失败行为”。这种方法的优点是不需要设计逐步奖励只需要轨迹级的结果判断实现简单训练稳定。但它的局限在于一对比数据里的成功与失败往往差异很大比如成功轨迹60步、失败轨迹40步但中间某个关键步骤不同模型不容易学到细粒度的“在哪个节点做选择”的能力。第二条是基于结果奖励的强化学习。给完整轨迹一个最终分数成功1失败0用策略梯度方法去优化。这条路理论上更优雅因为模型每一次动作都会因为最终结果的好坏而调整概率——虽然不是每一步都精确但能通过大量采样逼近。问题在于GUI环境不像游戏那样可以随便重来在真实软件上跑强化学习风险极高。所以通常需要先做一个可回放、可重置的模拟沙箱把模型丢进去试错。实际项目普遍采用混合方案先用BC做预热再用偏好优化做对齐最后在沙箱里用强化学习做收敛。每个阶段解决的痛点不同BC保证基础能力偏好优化让模型学会选更优路径RL阶段再帮它探索出超越人类示范的操作习惯。3.3 自我进化的迭代循环怎么搭“自我进化”在工程上不是一个玄学概念核心就是下面这条闭环用现有策略在测试任务或沙箱环境里自主执行。自动判断每条轨迹的成败只看最终目标有没有达成不需要人工标注。把成功轨迹和失败轨迹按任务配成偏好对。混合原始人类示范数据做一轮策略更新。回到第1步重复。这里的关键在于第2步的成败判断必须完全自动化否则谈不上“自我进化”。好在GUI任务天然适合自动判成败最终界面状态是否包含目标元素、字段是否填写完整、提交动作是否返回成功标志都可以用脚本检查。我见过一个更聪明的做法是让模型自己也作为评估器看最终截图判断“这个任务完成了吗”再跟脚本结果做一致性校验。还需要警惕灾难性遗忘。自进化的每一轮数据都来自模型自身采样分布会逐渐偏离初始人类示范模型可能在新的测试集上变强却在老任务上退化。解决办法是每一轮训练都固定掺入10%到20%的原始人工标注数据相当于给模型定期回放“人类当初是怎么做的”。这个细节不加的话迭代到第三轮你就能明显感受到退化。4. 医疗软件长视野GUI操作硬骨头怎么啃4.1 医疗软件的屏幕特点与交互习惯医疗软件是GUI智能体的极端压力测试。先说屏幕特点信息密度极高一个患者列表页面上同时有几十个字段、状态标记和按钮窗口层级极深经常是主窗口弹子窗口、子窗口又弹确认框老旧的子系统居多界面控件不是标准组件有的甚至是以图像方式绘制的按钮OCR识别都容易断行。交互习惯上医疗软件对操作严谨性要求极高很多输入框有格式校验日期必须精确到秒用药剂量不能跨字段复制同时页面刷新频繁填完一个表单后系统自动刷新列表界面状态完全重排。这意味着模型必须持续跟踪状态而不是简单地“看到按钮就点”。还有一个经常被低估的点医疗软件的多窗口联动。录入医嘱时可能同时开着患者主诉、检查报告、药库信息三个窗口信息需要交叉引用。模型如果只看当前激活窗口的截图会漏掉关键上下文。所以处理这类场景时输入设计最好同时提供“主操作窗口截图当前任务相关的辅助信息摘要”而不是单一截图。4.2 长视野任务的规划与回溯长视野GUI操作的核心难点有两个误差累积和状态漂移。误差累积很好理解。每一步动作都有小概率出错三十步下来成功率就是每一步成功率的乘积。假设单步准确率95%三十步之后只剩21%。所以长任务光靠“每一步都尽量准”是不够的必须允许中间出错并且能自己修复。状态漂移更隐蔽。模型在任务进行中会逐渐忘记自己已经填了哪些字段、哪些校验还没通过于是出现重复填写、漏填、甚至把A患者的信息填到B患者名下的严重错误。解决思路是引入显式的工作记忆模块记录“当前阶段目标、已完成步骤、待确认项”让模型每一步操作前都先读一遍记忆摘要。这个做法我们在类似项目里试过能把长任务的完成率提升接近一倍。规划方面推荐做层级化拆解。把“完成一份CT检查申请”拆成“新建申请单—填写患者信息—选择检查项目—补充临床信息—提交审核”五个阶段每个阶段内部再生成具体动作。好处是模型在一个阶段内只需要关心局部目标大大压缩决策空间。阶段与阶段之间用状态确认作为闸门——上一个阶段没确认完成不允许进入下一个阶段。纠错机制同样要显式建模。我在设计这个环节时会在动作空间里专门留出“返回上一层级”“关闭当前弹窗”“取消本次输入”这几个动作并在训练数据里保证这些动作有足够多的正样本。为什么要刻意留着因为模型如果缺乏纠错动作遇到弹窗提示错误时就会死循环反复点击同一按钮试图绕过校验。医疗软件的校验无法绕过越早返回修正任务成功率越高。4.3 安全兜底与人工审核边界医疗场景落地最忌讳的就是全自动无人监督。自动化助手可以执行任务但删除记录、提交诊断信息、修改检查参数这类高危动作必须有额外的安全阀。第一层安全阀是优先级控制。模型对动作输出一个置信度高危动作只有当置信度超过高阈值比如0.95时才允许自动执行否则转为“人工确认模式”把动作建议和当前界面截图推送给操作员由人点击确认。第二层安全阀是操作留痕。每一次自动操作都保存前后截图、动作类型、模型推理摘要构成完整审计链路。这样不仅便于事后的错误追溯而且有助于积累真实运行时的失败样本——这些样本继续回流到训练里形成“部署—收集问题—迭代模型—再部署”的正循环。第三层安全阀是部署范围限定。不要一开始就在全院所有工作站上跑选一个特定的科室或一条特定的业务线做试点等完成率、安全指标都稳定了再逐步扩展。医疗软件的环境版本五花八门试点的核心目标其实是摸清版本兼容性和用户的真实使用习惯这些光靠Offline评测是测不出来的。5. 实操复盘从数据到模型到场景的落地要点5.1 一个参考性的数据规模与训练配置我这里给出一套来自常见实践的组合参考不是绝对标准但按这个量级起步大概率能出效果。首先是数据规模原始录屏大约1200小时经过筛选后有效数据800小时左右覆盖六类软件环境任务模板不少于50个。操作级标注大约800万条任务级标注约2万条会话。如果预算紧张可以砍到一半量级效果会打折扣但整体路线仍然可行。模型结构上推荐以视觉-语言模型为主干输入由“最近一帧或三帧的屏幕截图编码 当前任务描述 工作记忆状态”组成输出是动作类别、动作坐标和相关参数比如输入文本、滚动距离。训练时建议分三阶段进行学习率逐步调低阶段训练数据目标学习率参考阶段一 行为克隆人类标注轨迹学会基础操作映射1e-5阶段二 偏好优化成功/失败轨迹对学会选更优路径5e-6阶段三 沙箱强化学习自主采样轨迹探索超越示范1e-65.2 评估体系别只看完成率很多项目汇报的时候只讲“任务完成率提高了多少”我觉得这远远不够。两个模型可能完成率一样但一个平均40步完成、一个平均70步完成一个出错后能自己在五步内恢复、一个错一次就得靠人工介入。这些差异直接决定产品能不能真正落地。我自己习惯从五个维度评估任务完成率最终目标达成的比例这是底线指标。操作效率模型平均操作步数与人类平均操作步数的比值衡量是否“比人更啰嗦”。单步动作合法率动作是否落在可操作组件上、坐标是否在屏幕有效区域衡量低级错误的频率。无效循环率模型是否在同一个状态下反复输出相同动作这是长任务最常见的死法。错误恢复时间从第一个错误动作出现到模型回到正常流程的间隔衡量纠错能力。5.3 部署时要盯住的细节模型做完不是终点部署环节有一堆“只在生产环境才会暴露”的问题。第一个是推理速度。视觉编码是计算大头为了省时间可以把关键帧的视觉特征做缓存只要界面状态没有显著变化就不重新编码。同时给模型加一个动作草稿机制先输出候选动作再决定执行能明显降低延迟感。第二个是环境的版本兼容性。同一个医疗软件在不同机器上因为屏幕分辨率、DPI缩放、浏览器版本不同界面坐标会发生偏移。保险的做法是坐标一律记录归一化值执行时再按当前屏幕参数换算而不是直接用训练时的绝对像素值。第三个是模型回滚机制。新版本可能在长视野任务上表现更好但某些短任务反而退化。所以上线时保留上一版推理服务用A/B流量比例控制灰度发布一旦某类任务的成功率下跌超过阈值立刻回滚。没有这一步你在医疗科室现场调试的时候会非常狼狈。6. 踩坑清单一页纸避坑实战记录6.1 数据采集与标注环节的坑录屏文件帧率贪高是第一个坑30fps的录屏文件一周就能塞满几个T的存储标注还慢。归一化到10fps足够GUI动作本身离散连续帧之间像素变化往往只有一小块区域。第二坑是事件流和视频时间戳不齐。有些录屏软件在系统负载高的时候会丢帧但事件流不会丢。建议采集时做软同步标记每30秒在屏幕角落绘制一个动态块同时在事件流里插入标记事件质检阶段按标记校验误差。第三坑是隐私数据混入。用户录屏时登了自己的邮箱或社交软件聊天内容全被录进去。不能指望事后发现再处理采集端就应该做敏感区域模糊并且对采集设备做统一安全配置。6.2 训练与迭代环节的坑偏好对里成功和失败轨迹差距过大模型学不到细粒度纠错。比如成功轨迹“点击A→点击B→提交→成功”失败轨迹“点击A→点击C→弹窗→死循环”模型只知道C这个动作不好但对“B和C之间的细微区别”没有感知。改进办法是在构造偏好对时尽量让成功和失败轨迹的前几步相同只在某一步分叉这样学习信号更精准。自进化循环里模型在沙箱中原地打转也是常见问题。模型可能会发现某个动作组合不会导致终止于是反复循环消耗算力。必须给轨迹设最大步数上限超过就自动判负同时对连续重复动作做惩罚从根上杜绝“复读机行为”。训练中的灾难性遗忘建议每轮掺入原始人类数据。没有这个操作的话第三轮更新后模型在最初测试集上的表现通常会掉十个百分点以上我观察到的项目里几乎无一幸免。6.3 医疗场景落地的坑医疗软件界面里的文字经常是图片渲染出来的用OCR提取时容易断行、错字导致元素识别失败。处理办法是把OCR文本与界面坐标绑定构建一个“先识别文本框—再验证文本内容—最后匹配操作区域”的三段式管线在每一步都做校验。长列表滚动滚过头也是高频问题。医疗系统的患者列表动辄上千行模型在对列表进行滚动操作时往往会因为惯性或坐标偏差直接越过目标行。解决方式是把滚动动作从“按像素滚动”改成“按目标元素滚动”——先在当前屏幕里识别目标元素识别不到就翻页/滚动一屏然后再识别而不是盲目滚动一段距离。还有一类问题是环境弹窗的干扰。系统升级提示、会话超时弹窗、新消息通知都会在任务中途打断流程。模型需要学会先判断“当前出现的弹窗是不是任务相关的”无关弹窗直接关闭而不是因为屏幕变化就停滞。这个能力必须在训练数据里显式加入否则上线后遇到第一个系统升级弹窗就会卡死。最后说一个我体会最深的经验这种大型GUI智能体项目最容易翻车的往往不是模型算法而是数据管线和评估标准。数据不够干净再好的训练技巧也白搭评估维度单一模型再怎么调优都可能偏科。如果你也想复现这个方向我的建议是先花一半精力把数据采集、脱敏、标注质检这套基础设施做扎实再花另一半精力设计一套能暴露具体病灶的评估集。模型进化的大门其实是由失败信号推动的而失败信号的质量取决于你有多精确地定义并记录“哪里错了”。
延伸阅读

更多相关文章

2026/10/20 17:41:13

物理规律导向视频生成:技术原理、验证方法与工程落地实践

1. 物理规律导向到底在解决什么痛点 第一次看到"物理规律导向视频模型"这个说法,很多人会下意识觉得又是营销包装。但如果你真正动手做过视频生成,就会明白"物理规律"这四个字背后藏着多少血泪。过去两年我陆续试过七八个主流视频生…

2026/10/20 17:36:12

AI气象模型精度对比与业务选型指南

AI 气象预报这几年火得不是一星半点。一说起“数据驱动预报”,大家讨论的不再是理论可行性,而是哪家模型跑得更准、更稳、更适合自家业务。我在实际项目里陆续接触过多款主流AI气象模型,也做过不少横向验证,感触最深的是&#xff…

2026/10/20 18:26:50

大模型程序员转型指南:应用开发、微调训练与推理部署全解析

记得去年这个时候,圈子里聊的还是“要不要学大模型”,今年再聊,已经变成“怎么学、从哪儿切入”了。程序员群体对大模型的焦虑,说实话比一般行业更早也更真实——不是因为怕被替代,而是因为我们的工具箱正在被重构&…

2026/10/20 18:26:50

多智能体辩论与红蓝对抗:Agent决策质控的工程实践

我们内部开始认真研究多智能体辩论机制,是因为在模拟项目X里碰到了一次很典型的失败。当时产品负责人提了个需求:把客服售后判责流程交给 Agent 来做。我给一个争议样本跑了一遍,单 Agent 很快给出"不符合换新条件"的结论&#xff…

2026/10/20 18:26:50

C++相场模型模拟金属凝固枝晶生长:方程离散、并行加速与可视化

枝晶这个字,只要搞过材料成型或凝固模拟的工科生都绕不开。焊池冷却、铸锭结晶、增材制造的熔池里,金属从液态到固态那短短一瞬间,微观尺度上会长出一种像蕨类植物一样的树枝状组织——这就是枝晶。很多团队做工艺优化时都想把这玩意算出来&a…

2026/10/20 18:26:50

AI重塑内容生产:从视频号切片到GPT-4商业化的底层逻辑

这两天圈子里最热闹的信息,基本被三件事包了:视频号被曝出在内测一个和内容变现有关的功能,外围讨论直接把它定性为重磅;TikTok那边则悄悄在开发AI头像;微软交出了接入GPT-4之后的首份成绩单。单拎任何一条都能写一篇分…

2026/10/20 18:21:49

Rust供应链攻击的五种隐蔽路径:从名字仿冒到build.rs投毒

先讲一件我最近处理的小事故。某公司一位开发者往内部工具链里加了一个解析JSON的小库,只因为把包名里的连字符写成了下划线,CI里的构建过程就开始向一个从未见过的域名发起外连。幸好该环境配了网络白名单,编译直接失败,才没让那…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

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

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

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

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑