大模型微调实操指南:从数据准备到训练评估避坑

大模型微调这个话题,这两年都快被聊烂了,但每次看到有人说“简单得像打开浏览器”,我还是会忍不住想接一句:话是没错,但前提是你知道浏览器地址栏在哪、要输什么网址,以及打开之后点哪里。微调的门槛确实降了,降到了个人开发者也能跑通的程度,但“能跑通”和“跑得好”之间,隔着数据、参数、评估这一整套功课。

这篇文章就按我自己的实操习惯来聊聊大模型微调这件事。从要不要微调、怎么选工具、怎么准备数据,到最后跑完训练怎么评估效果、踩过哪些坑,全程按一个可以直接参考的流程来写。适合两类人看:一类是准备把大模型接到自己业务里、正在纠结“要不要微调”的开发者,另一类是已经试过但效果不理想、想搞清楚问题出在哪的实践者。

1. 先搞清楚:什么情况才需要微调,什么时候硬着头皮微调是在自找麻烦

1.1 微调到底做了什么,用一句话说清原理

微调的本质并不神秘。底座模型在预训练阶段学到的是一般化的语言能力和广谱知识,就像一个人接受了完整的通识教育,什么都懂一点,但没有专门研究过你的领域。微调就是在它已有的能力基础上,用你自己领域的“习题集”再做一轮有针对性的训练,让它在特定任务、特定语气、特定知识范围内表现得更准确。

用个生活化的类比:预训练模型像一件批量生产的成衣,版型好、面料也不错,但不是为你量身做的。微调就是裁缝根据你的身材在关键位置收了收腰、改了改袖长——注意,改的是关键位置的参数,不是把整件衣服拆了重做。这也是LoRA这类技术能流行的根本原因:它只调整模型中一小部分新增的“低秩矩阵”,却能起到近似全量微调的效果,代价是训练速度快、显存占用小。

大多数人需要的是这种“改关键部位”的微调,而不是“重做衣服”的全参数微调。明白了这一点,很多后面关于参数和成本的纠结都会迎刃而解。

1.2 微调、RAG、提示词工程,三者的边界在哪

很多人在做技术选型时,会把微调、RAG(检索增强生成)和提示词工程混在一起问“到底选哪个”。其实这三者解决的是不同层面的问题。

提示词工程是零成本的试探:你不动模型,只是通过设计指令的方式引导模型输出。适合需求简单、规则明确、分类任务或少量格式调整的场景。RAG是给模型外挂一个“参考书”:模型回答前先检索你的文档库,把相关内容塞进上下文再生成。适合知识时效性强、内容频繁更新、需要引用原文的场景。而微调是改变模型自身的“行为习惯”。如果模型对某个领域术语总是理解错、回答风格完全不符合你的要求、或者总是漏掉你反复强调的规则——这说明你的业务惯性已经超出提示词能约束的范围,这时候微调才真正上场。

从我的实践经验看,最优路径通常是:先用提示词工程把业务逻辑跑通,再用RAG解决实时知识问题,最后发现仍有稳定的偏差、格式问题或风格问题时,才启动微调。直接上来就微调,反而容易把一个通过简单规则就能解决的问题复杂化。

1.3 适合微调的三种典型场景,和一种不适合的场景

适合微调的,我总结下来主要三类:

第一类是格式与结构约束。比如要求模型稳定输出特定JSON结构、固定字段顺序、统一日期格式。这类场景靠提示词偶尔能命中,但命中率不稳定,微调之后能稳定到95%以上。第二类是领域术语与语义对齐。比如医疗、金融、法律、工业制造里的专业词汇,底座模型认识字但不认识语义,微调相当于给它补了一门专业课。第三类是语气与风格的迁移。比如客服语气、产品文案调性、拟人角色的说话方式,这些靠提示词很难精细调控,微调之后风格会非常统一。

不适合微调的典型场景是“模型不知道的知识更新”或者“需要引用最新资料”的场景。模型的知识边界截止在训练数据时代,微调训练一次、部署之后,知识就凝固了,之后你再更新内部知识只能重新训练。这种高频变化的知识,用RAG补充上下文才是正解。

2. 工具与运行环境:从零到能跑通一次微调,需要准备什么

2.1 那个“简单得像打开浏览器”的梗,背后靠的是一堆现成工具

有人觉得微调简单,是因为现在确实有非常成熟的工具链:底层有深度学习框架,往上是有现成的训练器封装,再往上还有一些带图形界面的微调平台。把模型数据准备好,填几个参数,点一下“开始训练”,就能看到loss在下降,听起来确实跟打开浏览器一样。

但我得诚实地说一句:工具确实是“浏览器”,但你的数据不是“网址”,而是你要发布的内容。浏览器解决的是“打开方式”,内容准备的质量仍然决定你网页有多好看。这也是为什么我接下来要把数据准备单独拎出来讲一整章——工具让人能跑通一件事,数据质量才决定人能不能跑好这件事。

2.2 底座模型、微调框架、硬件——三个层面的选型思路

底座模型的选择上,我觉得可以从“参数量”和“开放度”两个维度考虑。个人开发者和中小团队,建议优先选择参数量在70亿到140亿这个范围的开源底座模型,这类模型在消费级显卡上借助量化手段就能微调。底座模型的“开放度”也很重要——是否允许商用、社区生态是否活跃、是否有稳定的checkpoint发布,这些直接影响后续的部署和迭代。

微调框架方面,目前主流的路线是基于“参数高效微调”的思想:保持底座模型参数冻结,只训练新注入的低秩矩阵。这类方案在显存占用、训练速度、模型质量之间取得了很好的平衡,已经成了社区事实标准。我建议新手直接走这条路线,除非你是做研究需要极致效果,否则没有必要碰全参数微调。

硬件方面,我的经验是:显存是硬约束,算力是软约束。训练一个大模型,显存不够就根本跑不起来,算力不够充其量是慢一点。显存要求可以用一个粗算公式估:训练时的显存需求大约是“模型参数体积 \times 微调方式的系数”。同一底座模型,用LoRA方式微调,通常需要显存是模型量化后体积的4到6倍;全参数微调则会放大到10倍以上。所以之前那个“每一亿参数约需1GB显存”的说法只适合全精度推理,训练场景下要做好更充分的预算。

2.3 我推荐的最小可行工具链

我不想给出一大堆工具清单让你选择困难,直接给一套我踩过坑之后固定下来的组合:

  • 底座模型:一个70亿参数级别的开源对话底座,量化后体积在5GB左右,消费级24GB显存显卡可训;
  • 参数高效微调库:内置LoRA的适配层,负责注入低秩矩阵;
  • 基础框架:负责模型加载、批次处理、训练循环;
  • 数据处理:一个JSON格式的数据管理脚本,统一处理对话样本;
  • 推理验证:微调完成后,用框架自带的对话接口做效果验证;
  • 合并与导出:训练完成后,把低秩矩阵合并回底座模型,导出为部署格式。

这套组合的优势在于:每个环节都有大量社区资料,遇到问题能查到解决方案;组件之间兼容性好,不需要大量胶水代码;所有工序都可以用一条命令或者几行代码衔接起来,把“简单得像打开浏览器”从口号变成可复现的流程。

3. 数据准备:微调效果的上限在这里,模型只是把数据里的规律找出来

3.1 先理解数据组织方式:一条训练样本长什么样

微调数据不是随便堆一批问答就行。模型在训练中看到的每一条样本,都是“指令+上下文+期望输出”的结构——模型要能从你给的指令和上下文出发,预测出你期望的输出。数据格式不统一,模型学到的就是混乱的映射关系,效果自然一团糟。

以对话类底座模型为例,微调数据通常组织成对话列表的形式,每轮对话包含角色和内容。这里有一个容易踩的坑:不同底座模型的对话格式模板不一样,有的用“用户/助手”标记,有的用特殊分隔符。如果直接把网上随便下的数据集灌进去,模板不匹配会导致模型分不清哪句是用户说的、哪句是模型该回复的。所以数据格式这一步,第一步永远是先查清楚你的底座模型在训练时用的模板是什么,然后严格按模板组织数据。

3.2 数据规模与分布:多少条够用,怎么分配才不翻车

新手最容易问的问题是“微调到底要多少条数据”。我的经验是,在LoRA这类高效微调下,几百条高质量样本就能看到明显的行为改变,一千到三千条能覆盖一个比较规整的领域任务,几千条以上边际收益开始递减——除非你的任务本身就是想改变模型的通用能力。与其盲目堆量,不如先拿几百条跑一个“信号验证”实验,看看模型有没有朝你想的方向偏移,再决定是否加量。

数据分布上,有一条很重要:至少留出15%到20%的样本作为验证集,且验证集要和训练集同分布但不同内容。我习惯先生成全部样本,随机切分,训练过程中持续观察验证损失的下降情况。如果训练损失一直在降而验证损失不降甚至反弹,基本可以断定过拟合了——模型在背数据,不是在学规律。另外,同一类样本不要占比超过一半,否则微调之后模型会表现出“偏科”,其他任务能力会退化。

3.3 数据质量:清洗、去重与一致性检查

数据质量这个环节,看起来最不起眼,实际上决定了微调的成败。我见过太多人把精力花在调参上,结果损失一查是数据里有几百条空响应、错别字、或者答案互相矛盾,那再好的参数也救不回来。

清洗的时候我通常会做三件事。第一是去重:重复样本会让模型对重复数据过拟合,尤其是系统提示词相同的样本,看起来不同但内容高度相似,也要留意。第二是长度检查:超长样本会拖慢训练速度,过短样本信息量不足,检查后做截断或过滤。第三是答案一致性:同一问题下不能出现两种不同的正确答案,否则模型会学到“摇摆不定”。

最后一定要做一次“人工眼检”:随机抽几十条样本,像读对话记录一样通读一遍。这一步虽然不产生任何技术含量,但能发现格式脚本发现不了的问题——比如语气不对、上下文缺主语、回答不完整。数据这关过了,微调事实上已经成功了六成。

4. 实操过程:完整跑通一次微调,从命令到参数不走弯路

4.1 第一步:环境检查与数据落盘

在开始训练之前,先花十分钟把三件事确认好:显卡驱动和深度学习框架版本兼容、显存容量满足训练需求、数据文件格式正确加载。我习惯先把数据加载脚本单独跑一遍,打印出前两条样本看看结构对不对,不直接进入训练。

有一个细节,处理对话模板。不同底座模型对“系统提示词”和“对话轮次”的处理方式有细微差别。我一般会在预处理阶段写好一个与底座匹配的数据转换函数,把所有训练样本统一转换成该底座的数据格式。这一步如果错了,模型训练完就跟没训一样,甚至会更糟。

数据准备好之后,切分出训练集和验证集,落盘成训练接口能直接读取的格式。通常一个包含两千条样本的数据集,处理完也就是几十MB的量级,加载没有任何压力。

4.2 第二步:配置训练参数,理解每个数字背后的逻辑

训练参数的设置,与其抄别人的“标准答案”,不如理解每一个参数在控制什么。下面是我常用的一套初始参数,以及我调整它们的思路:

参数常用初值调整逻辑
LoRA秩8到16秩越大,可学习的参数量越多,表达能力越强,但过大会过拟合。先用8跑通,效果不够再加到16或32
学习率2e-4到1e-4微调的学习率一般高于预训练。学习率过大容易震荡,过小收敛极慢。我习惯从一个较小值开始,看训练损失是否平稳下降
批量大小4到8受显存约束。批量大,梯度估计更稳;批量小,更新频率高、震荡也大
训练轮数3高效微调通常这几年轮数就够了,超过5轮大概率过拟合
最大序列长度512到1024按你的数据长度上限设置,截断掉过长内容,控制显存开销

参数之间是联动的。比如数据量少,学习率可以适当调小一点,训练轮数也可以增加,但要随时用验证损失盯着。我通常先用一个很小的学习率跑两三步快速验证数据管线是否通畅,再启动正式训练,这样一个完整的训练任务不会因为低级错误白跑几个小时。

4.3 第三步:启动训练,观察监控信息

启动训练的命令本身不长,核心就是“加载底座模型、加载微调器配置、指定训练和验证数据、设置训练超参数、开始训练”。如果你用脚本的方式来组织,主要内容就是这一段逻辑:

# 核心逻辑示意:加载模型、注入LoRA、配置训练参数、启动训练 base_model_path = "./base_model" data_path = "./data/train.jsonl" val_data_path = "./data/val.jsonl" model = load_base_model(base_model_path) model = inject_lora_adapter(model, r=8) trainer = create_trainer( model=model, train_data=data_path, val_data=val_data_path, learning_rate=2e-4, batch_size=4, epochs=3, max_seq_len=1024, save_dir="./checkpoints", ) trainer.train()

训练启动后,日志里你会看到两类关键信息:训练损失和验证损失。我的判断方法是:训练损失持续下降说明模型在学,验证损失也在同步下降说明学的是可泛化的规律;如果训练损失降到很低但验证损失不降或反升,说明开始过拟合了。观察几个轮次后,如果趋势健康,可以放它跑完;如果趋势不对,随时中断调整。

4.4 第四步:模型合并、导出与推理验证

训练完成之后,LoRA适配器文件已经保存下来。但部署时你多半希望把它合并回底座模型,导出成一个独立的模型目录,这样推理速度更快、调用更方便。合并过程基本就是加载底座模型、加载适配器权重、合并、保存。

导出之后别急着接业务,先做一轮“烟囱测试”:用几个训练时见过的样本检查模型能否稳定复现格式化输出;再用几个没见过的同分布样本检查泛化能力;再用几个普通闲聊样本检查基础能力有没有被破坏。我踩过一次教训:有一轮微调完,模型的业务回答能力提升很明显,但一聊到日常话题就变得生硬呆板,甚至有点“答非所问”——这就是过拟合导致的通用能力衰退。好在后来做了混合训练数据修正了这个问题。

5. 常见问题与排查技巧实录,按真实踩坑频率排序

5.1 显存不足、训练中断、loss震荡,怎么判断是哪里的问题

“CUDA out of memory”是微调新手遇到最多的报错。基本原因就两个方向:批量大小或最大序列长度设置过大,导致单次前向和反向传播占满显存。解法也很直接:批量大小调到2甚至1,最大序列长度截到512以内,如果还是不够,再考虑更小规模的底座模型或更激进的原生量化。

训练中途崩溃的另一个常见原因是学习率设置不合理。loss出现巨大波动或直接变成NaN,通常就是学习率太高导致的梯度爆炸。如果确认数据没有问题,先把学习率降一个数量级再试。经验数据是:当学习率从2e-4降到1e-5后,这种震荡问题基本消失。

5.2 微调之后模型“变笨”了,这是最隐蔽也最伤的一个坑

“训练完业务能力有了,但通用能力退化了”这种情况,叫灾难性遗忘。原因在于微调数据分布太单一,模型只顾着拟合你的领域数据,把之前学到的广泛知识覆盖了。

我的修复方案有两个方向。第一是在训练数据里混合一部分通用对话数据,比例大概10%到20%,让模型在学业务的同时“复习”一般能力。第二是降低训练轮数和学习率——有时候不是数据不够,而是训练太用力,稍微收敛一点,通用能力就能保住。

5.3 踩坑速查表:从数据到训练到部署的高频问题

现象主要原因排查方向
训练完成但结果和底座模型一样对话模板不匹配、LoRA未正确注入检查数据格式和模型配置
loss正常下降但推理效果差验证集分布与训练不一致/过拟合打乱数据重新切分,检查验证集样本
训练到一半显存爆掉批量大小/序列长度过大调小批量、截断长度
训练早期就loss为NaN学习率过高降低学习率一个数量级
模型回答变短、呆板过拟合/数据长度偏短增加长样本、混合通用数据
特定指令下一律输出相同内容数据里同一指令样本过少丰富指令表述,避免模式单一

最后分享一个我一直在用的习惯:每次微调跑完,除了业务样本的测试,我必测几个完全无关的通用问题——比如常识、数学、逻辑推理,甚至闲聊。别小看这几个问题,模型是否“活下来”,跑几条就知道。微调之后模型应该变得更专业,而不是变得更机械。这也是我判断一次微调是否成功的最后一道门槛。

相关新闻

联辉科 LTK8319直流电机驱动芯片:12V/2.5A,覆盖小家电、玩具、电子锁、机器人四大应用场景

联辉科 LTK8319直流电机驱动芯片:12V/2.5A,覆盖小家电、玩具、电子锁、机器人四大应用场景

在12V及以下电池供电的运动控制产品中,电机驱动芯片的电流能力往往决定了整个系统的性能上限。当负载从1.8A攀升至2.5A,从3.0A峰值攀升至3.9A峰值时,芯片的导通电阻、封装散热和限流保护都必须同步升级,才能确保电机在启动、堵转和…

2026/10/21 5:45:17 阅读更多 →
Folia 全屏歌词播放器上手教程:14 种歌词动画,10 分钟点亮整块屏幕

Folia 全屏歌词播放器上手教程:14 种歌词动画,10 分钟点亮整块屏幕

Folia 全屏歌词播放器上手教程:14 种歌词动画,10 分钟点亮整块屏幕 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Fol…

2026/10/21 5:44:16 阅读更多 →
目标分解:Agentic AI应用成功的关键保障

目标分解:Agentic AI应用成功的关键保障

团队里一个做Agentic AI项目的同事上周跟我抱怨,说他们那个智能体任务一复杂就“翻车”——要么中途跑偏,要么卡在一个子任务里出不来,要么把资源全浪费在无关紧要的环节上。我问他怎么给智能体下发任务的,他给我看了一段提示词&a…

2026/10/21 5:44:16 阅读更多 →

最新新闻

WebDAV Android客户端开发:Kotlin协程实现协议级兼容

WebDAV Android客户端开发:Kotlin协程实现协议级兼容

简介:WebDAVClient是一款基于Kotlin开发的轻量级Android端WebDAV协议客户端,面向Android开发者及需要在移动设备上管理远程WebDAV服务器文件的技术人员,解决跨平台文件同步、远程编辑与协作访问等实际需求。资源包共149个文件,涵盖…

2026/10/21 6:26:35 阅读更多 →
Agentory:面向AI Native时代的工作操作系统

Agentory:面向AI Native时代的工作操作系统

1. 项目概述:这不是又一个“AI工具集合”,而是一套可生长的工作操作系统“Agentory:个人与团队的AI Native工作台”——光看这个名字,很多人第一反应是:“哦,又一个把ChatGPT、Claude、Perplexity打包进网页…

2026/10/21 6:26:35 阅读更多 →
SwiftUI Agent-Skill架构:从零搭建模块化App骨架

SwiftUI Agent-Skill架构:从零搭建模块化App骨架

很多人拿到新项目标题的第一反应是上网搜教程、看别人的轮子,但我习惯先拆名字。SwiftUI-Agent-Skill 这三个词放在一起,其实已经把一套 App 的核心架构讲完了:SwiftUI 管界面层,Agent 管决策和调度,Skill 是一堆可以被…

2026/10/21 6:26:35 阅读更多 →
gcc离线安装完整指南:从RPM收集到本地yum源批量部署

gcc离线安装完整指南:从RPM收集到本地yum源批量部署

简介:在无法连接互联网的服务器、学校机房或边缘设备中,搭建编译器工具链常因缺少依赖而失败。这份面向红帽系列Linux 6系统的GCC离线安装包共包含十二个文件:十一份软件安装包与一份安装脚本。其中十一份安装包覆盖基础编译器、C编译器、预处…

2026/10/21 6:26:35 阅读更多 →
2026年09月总结及随笔之十一年

2026年09月总结及随笔之十一年

1. 回头看日更坚持了1369天。读《数据可视化》更新完成读《数据架构知识体系指南》开更并持续更新中2023年至2025年12月底累计码字3054280字,累计日均码字2786字。2023年至2026年09月底累计码字3916512字,累计日均码字2860字。2026年09月码字90370字&…

2026/10/21 6:26:35 阅读更多 →
分布式电源选址定容的多目标优化:从帕累托前沿到最优折中解

分布式电源选址定容的多目标优化:从帕累托前沿到最优折中解

在分布式能源(分布式光伏、小型风机、储能、燃气轮机等)接入配电网的项目里,说白了大家最关心的就两件事:在哪建、建多大。也就是选址和定容。这两个问题一旦定下来,直接决定了电网改造投资、运行损耗、电压质量和供电…

2026/10/21 6:25:34 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →