D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了
文章目录D37-全参微调 vs LoRA 选型什么时候该上全参什么时候 LoRA 就够了一、为什么会有全参 vs LoRA的选择难题1.1 30 秒速览全参 vs LoRA vs QLoRA二、全参微调深度解析2.1 什么是全参微调2.2 全参微调的硬件需求2.3 全参微调的 3 大优势2.4 全参微调的 3 大风险三、LoRA / QLoRA 回顾与深化3.1 核心原理一句话版3.2 LoRA 的 5 个变体3.3 LoRA 的 3 大局限四、5 维度深度对比4.1 维度 1参数量4.2 维度 2显存占用Qwen2.5-7B 实测4.3 维度 3训练时间Qwen2.5-7B, 1 万条数据, 3 epoch, A1004.4 维度 4效果同数据同评测集4.5 维度 5风险五、5 个选型决策树决策树 1你的数据量有多大决策树 2你的硬件预算决策树 3你的效果要求有多极致决策树 4你要学的是什么决策树 5你能承受的最大训练成本综合决策矩阵六、实战Qwen2.5-7B 全参微调6.1 硬件要求6.2 数据准备6.3 全参微调主脚本6.4 DeepSpeed 配置6.5 跑通这个项目需要什么七、常见决策踩坑7.1 误区 1LoRA 效果一定比全参差7.2 误区 2全参一定比 LoRA 慢7.3 误区 3全参就更专业7.4 误区 4合并后的 LoRA 全参八、从 Demo 到生产选型决策清单九、Key Takeaways十、思考题十一、下篇预告D37-全参微调 vs LoRA 选型什么时候该上全参什么时候 LoRA 就够了「60 天 AI 全栈转型」S3 模型训练与微调 · 第 2 篇 / 共 15 篇读者画像已掌握 LoRA 微调D36的开发者预计阅读30 分钟 · 实操60-90 分钟一、为什么会有全参 vs LoRA的选择难题D36 我们用 LoRA 微调了一个客服话术生成器效果不错。但很多读者在留言区问了同一个问题“我的项目是不是也该用 LoRA什么时候应该上全参微调”这其实是工程上最常见的纠结。我们用一张表先直观对比一下1.1 30 秒速览全参 vs LoRA vs QLoRA维度全参微调LoRAQLoRA更新参数100%0.1-5%0.1-5%显存Qwen2.5-7B~80 GB~20 GB~10 GB硬件门槛A100 80G × N4090/3090 24G4060Ti 16G训练时间7B, 3 epoch6-12 小时2-3 小时3-4 小时效果上限⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐适合数据量 10 万条100-1 万条 1 万条推理成本不变不变不变可合并性—✅✅核心结论80% 的场景LoRA / QLoRA 就够了。剩下 20% 才需要全参。但剩下 20%是什么D37 帮你看清楚。二、全参微调深度解析2.1 什么是全参微调全参微调 更新模型的所有参数。对 Qwen2.5-7B 来说模型维度 d 3584隐藏层数 L 28每层有 Q/K/V/O 4 个矩阵 MLP 矩阵总参数76 亿每个参数都需要存原始权重fp162 字节梯度fp162 字节Adam 优化器状态fp32 2 个动量 12 字节单参数总占用 2 2 12 16 字节全量训练 7.6B × 16 122 GB 显存理论值实际更复杂2.2 全参微调的硬件需求模型规模参数量显存理论推荐 GPUQwen2.5-0.5B0.5B~8 GBRTX 4090 24GQwen2.5-1.5B1.5B~24 GBA100 40G × 1Qwen2.5-7B7B~122 GBA100 80G × 2DeepSpeedQwen2.5-72B72B~1.2 TBH100 × 8关键瓶颈不是计算是显存。2.3 全参微调的 3 大优势优势 1效果上限最高全参微调理论上能达到损失最小化的全局最优。LoRA 因为只更新 0.1% 参数存在表达天花板——它无法学习需要重塑整个模型权重的复杂能力。优势 2适应大分布偏移场景医疗大模型微调 - 数据从通用对话 → 专业医疗问答 - 分布偏移极大 - 全参能学到医学推理模式 - LoRA只能学医学术语 表层风格优势 3可作为新基座全参微调后的模型是独立可发布的。LoRA 是补丁必须和基座一起部署。2.4 全参微调的 3 大风险风险 1硬件成本高一张 A100 80G 阿里云按量付费约 ¥30/小时。3 epoch 训练7B≈ 6 小时 ¥180 / 次。风险 2灾难性遗忘全参微调所有参数模型很容易忘记通用能力。表现为微调后医学问答专业但代码能力、对话能力大幅下降风险 3训练不稳定全参对学习率、warmup、数据顺序都很敏感。配错一个超参loss 直接飞掉。三、LoRA / QLoRA 回顾与深化3.1 核心原理一句话版LoRA 在原始权重旁边加两个小矩阵 B·A只训练 B 和 A原始权重冻结。D36 我们详细讲过这里不再重复。重点说 D36 没讲的3.2 LoRA 的 5 个变体变体原理显存效果LoRAB·A 加在 Q/K/V1×⭐⭐⭐⭐QLoRA4bit 基座 LoRA0.3×⭐⭐⭐AdaLoRA自适应秩分配1×⭐⭐⭐⭐LoRAB 和 A 用不同学习率1×⭐⭐⭐⭐⭐DoRA方向 幅度分解1×⭐⭐⭐⭐⭐实战推荐数据 1000 条QLoRA最省资源数据 1000-1 万条LoRA / LoRA平衡数据 10 万条LoRA AdaLoRA效果更好3.3 LoRA 的 3 大局限局限 1表达天花板LoRA 的秩 r 决定可表达的范围r8能学表层风格r64能学中等复杂度能力r128接近全参但失去 LoRA 优势局限 2不适合新增知识让模型知道一个新事实“我们公司 2026 年发布了产品 X”LoRA 效果差全参效果好。局限 3合并后失去模块化LoRA 合并成完整模型后再拆不出来。一个模型只能支持一种 LoRA。四、5 维度深度对比4.1 维度 1参数量全参微调 Qwen2.5-7B7,600,000,000 个参数更新 LoRA (r8) Qwen2.5-7B约 8,000,000 个参数更新 比例0.105%4.2 维度 2显存占用Qwen2.5-7B 实测全参 fp16 全参 ZeRO-3 LoRA QLoRA 基座模型 14 GB 14 GB分片 14 GB 4 GB 权重 梯度 28 GB 8 GB分片 60 MB 60 MB 优化器状态 84 GB 24 GB分片 240 MB 240 MB 激活 2-10 GB 2-10 GB 2-10 GB 2-10 GB ───────────────────── 总计 ~130 GB ~50 GB ~16 GB ~6 GB4.3 维度 3训练时间Qwen2.5-7B, 1 万条数据, 3 epoch, A100方法单卡 A1004 卡 A100全参12 小时3.5 小时LoRA3 小时1 小时QLoRA4 小时1.2 小时4.4 维度 4效果同数据同评测集行业 benchmarkOpenAssistant 1 万条定制数据方法评测得分基座不微调65.2QLoRA (r8)71.5LoRA (r16)73.8LoRA (r32)75.2全参微调76.4结论LoRA 接近全参差距 1.5 分但训练成本只有 1/4。4.5 维度 5风险风险全参LoRA灾难性遗忘⚠️ 高✅ 低OOM⚠️ 高✅ 低训练崩溃⚠️ 中✅ 低部署复杂度✅ 低⚠️ 中需合并或加载 adapter五、5 个选型决策树决策树 1你的数据量有多大数据量 ├─ 1,000 条 → QLoRA别想全参浪费钱 ├─ 1K - 10K → LoRA首选 ├─ 10K - 100K → LoRA / 全参都可 └─ 100K → 全参值得投入决策树 2你的硬件预算硬件 ├─ 无 GPU / Colab → QLoRA唯一选项 ├─ 16G 消费卡 → QLoRA ├─ 24G 消费卡 → LoRAfp16 ├─ 40G 单卡 → LoRA / 小全参 └─ 80G × N 多卡 → 全参可考虑决策树 3你的效果要求有多极致效果要求 ├─ 80% 准确率就够 → LoRA首选 ├─ 90% 准确率 → LoRA / DoRA ├─ 95% 准确率 → 全参 DeepSpeed └─ SOTA 级别 → 全参 数据增强 RLHF决策树 4你要学的是什么任务类型 ├─ 风格/口吻 → LoRA首选 ├─ 领域术语 → LoRA / QLoRA ├─ 新增知识 → 全参 / RAG ├─ 新增能力推理/编程→ 全参 └─ 跨域融合 → 全参决策树 5你能承受的最大训练成本训练成本预算 ├─ ¥0 - ¥50 → QLoRA Colab 免费 T4 ├─ ¥50 - ¥500 → LoRA 4090/云 GPU ├─ ¥500 - ¥3000 → LoRA / 全参单 A100 └─ ¥3000 → 全参 多卡 DeepSpeed综合决策矩阵数据硬件效果要求推荐 1K任意任意QLoRA1K-10K16G80%LoRA r81K-10K24G90%LoRA r1610K-100K24G90%LoRA r32或DoRA10K-100K80G95%全参 DeepSpeed 100K80GSOTA全参 数据增强 RLHF六、实战Qwen2.5-7B 全参微调6.1 硬件要求GPUA100 80G × 1最小/ A100 80G × 2-4推荐内存≥ 64 GB磁盘≥ 50 GB模型 数据 checkpoint6.2 数据准备D36 我们准备了 30 条客服话术。这次准备 5000 条覆盖 8 大场景每场景 600 条# 实战数据格式JSONL{instruction:...,output:...}6.3 全参微调主脚本# full_finetune.pyimporttorchfromdatasetsimportload_datasetfromtransformersimport(AutoModelForCausalLM,AutoTokenizer,TrainingArguments,Trainer,DataCollatorForLanguageModeling,)# 1. 配置 MODEL_NAMEQwen/Qwen2.5-7B-InstructDATA_PATH./data/customer_service_5k.jsonlOUTPUT_DIR./output/qwen2.5-7b-customer-service-full# 2. 加载 tokenizer tokenizerAutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_codeTrue)tokenizer.pad_tokentokenizer.eos_token tokenizer.padding_sideright# 3. 加载模型fp16print( 加载 Qwen2.5-7B...)modelAutoModelForCausalLM.from_pretrained(MODEL_NAME,torch_dtypetorch.float16,device_mapauto,# 自动多卡分布trust_remote_codeTrue,)# 4. 数据准备 datasetload_dataset(json,data_filesDATA_PATH,splittrain)system_prompt你是专业客服助手回复要亲切不卑微、专业不说教。defformat_sample(example):messages[{role:system,content:system_prompt},{role:user,content:example[instruction]},{role:assistant,content:example[output]},]texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptFalse)# Tokenizetokenstokenizer(text,truncationTrue,max_length2048,paddingFalse)tokens[labels]tokens[input_ids].copy()# 因果 LMreturntokens datasetdataset.map(format_sample,remove_columnsdataset.column_names)# 5. 训练配置DeepSpeed ZeRO-2training_argsTrainingArguments(output_dirOUTPUT_DIR,num_train_epochs2,per_device_train_batch_size2,# 7B 全参必须小 batchgradient_accumulation_steps8,# 等效 batch16learning_rate1e-5,# 全参学习率比 LoRA 小 20 倍warmup_ratio0.05,logging_steps10,save_strategyepoch,bf16True,# A100 支持 bf16fp16False,deepspeedds_config_zero2.json,# DeepSpeed 配置report_tonone,gradient_checkpointingTrue,# 省显存)# 6. 启动训练 print( 开始全参微调...)trainerTrainer(modelmodel,argstraining_args,train_datasetdataset,data_collatorDataCollatorForLanguageModeling(tokenizer,mlmFalse),)trainer.train()trainer.save_model(OUTPUT_DIR)tokenizer.save_pretrained(OUTPUT_DIR)print(f✅ 训练完成模型保存到{OUTPUT_DIR})6.4 DeepSpeed 配置# ds_config_zero2.json{bf16:{enabled:true},zero_optimization:{stage:2,offload_optimizer:{device:cpu,pin_memory:true},allgather_partitions:true,allgather_bucket_size:5e8,overlap_comm:true,reduce_scatter:true,reduce_bucket_size:5e8,contiguous_gradients:true},gradient_accumulation_steps:auto,train_batch_size:auto,train_micro_batch_size_per_gpu:auto}6.5 跑通这个项目需要什么资源最小推荐GPUA100 80G × 1A100 80G × 4训练时间~12 小时~3.5 小时成本按量付费¥360¥4204 卡更快磁盘50 GB100 GB没有 A100也可以用 RTX 4090 24G 跑Qwen2.5-1.5B 全参效果接近 7B QLoRA。七、常见决策踩坑7.1 误区 1“LoRA 效果一定比全参差”事实在大多数任务上风格/术语/中等复杂度LoRA 和全参差距 2%。什么时候全参才明显好数据量 10 万条任务需要重塑模型能力如新增推理模式数据分布和基座差距巨大7.2 误区 2“全参一定比 LoRA 慢”事实在多卡环境下全参 DeepSpeed 可以比 LoRA 单卡更快。8 × A100 全参 ZeRO-3: 1 小时 1 × A100 LoRA: 3 小时7.3 误区 3“全参就更专业”事实垃圾数据 全参 垃圾模型放大版。真相数据质量 微调方法 模型规模。7.4 误区 4“合并后的 LoRA 全参”事实合并后推理等价但无法恢复为 LoRA 适配器。如果你的场景需要基座 多个 LoRA 适配器切换不要合并。八、从 Demo 到生产选型决策清单用这个清单帮你做最终决策□ 我的数据量 1K → 用 QLoRA □ 我的硬件 ≤ 16G → 用 QLoRA □ 我的效果要求 ≤ 85% → 用 QLoRA / LoRA □ 我的数据 100K 80G → 考虑全参 □ 我的任务需要新增能力 → 考虑全参 □ 我能接受 ¥1000 训练费 → 考虑全参 □ 我需要频繁切换微调版本 → 用 LoRA不要合并 □ 我有 4 张 A100 → 全参 DeepSpeed ZeRO-3如果 6 个以上选 “是” → 全参如果 4-6 个选 “是” → LoRA如果 ≤ 3 个选 “是” → QLoRA。九、Key Takeaways80% 的场景 LoRA 就够了别盲目追求全参数据量决定方法 1K 用 QLoRA 100K 才考虑全参硬件决定可行性24G 以下基本只能 LoRA/QLoRA全参的优势是新增能力和上限不是小数据更准决策树比经验更可靠用 5 个维度对照自己的场景十、思考题场景题你的公司要做法律咨询模型有 5000 条真实律师对话数据硬件是 4 张 A100 80G你会选全参还是 LoRA为什么成本题用全参微调 Qwen2.5-7B DeepSpeed ZeRO-34 张 A100 跑 3 epoch估算总成本按阿里云按量付费。架构题你设计了一个基座 5 个 LoRA 适配器的多场景系统。什么时候你会选择把 LoRA 合并什么时候保留适配器十一、下篇预告D38训练数据准备与清洗——从原始数据到训练就绪的 7 步流程内容包括数据格式选型Alpaca / ShareGPT / 自定义7 步数据清洗流水线数据增强 5 个技巧回译 / 同义改写 / Self-Instruct / 质量过滤 / 去重配套代码code/D37/下包含 5 个 Python 脚本 单测 完整配套clone 后可直接运行。GitCode 仓库gitgitcode.com:road-emblem/60-days-ai-stack.git→S3/D37/作者刘一说haohaizi_liu· 「60 天 AI 全栈转型」专栏S3 模块 3「模型训练与微调」第 2 篇 / 共 15 篇下篇D38 训练数据准备与清洗

相关新闻

Embedding与向量数据库实战:从原理到RAG落地避坑指南

Embedding与向量数据库实战:从原理到RAG落地避坑指南

1. 先搞清楚:Embedding和向量数据库到底解决什么问题这两年大模型火得一塌糊涂,但真正落地的项目里,跑得通、用得稳的,十有八九都离不开Embedding和向量数据库这两个东西。我见过不少人一上来就问“怎么把我的文档喂给大模型”“怎…

2026/10/18 5:45:43 阅读更多 →
Java网络编程入门:TCP/UDP、B/S结构与BIO/NIO实战

Java网络编程入门:TCP/UDP、B/S结构与BIO/NIO实战

1. 从单机到联网:网络编程到底在解决什么问题很多学 Java 的朋友,把集合、IO、多线程啃完之后,一到网络编程就卡壳。原因很简单——前面那些东西都是在一台机器、一个进程里自娱自乐,而网络编程第一次把两个独立的程序放到了不同的…

2026/10/18 5:45:43 阅读更多 →
自建 GitLab 部署实战:资源规划、安装配置与性能调优

自建 GitLab 部署实战:资源规划、安装配置与性能调优

1. 为什么选择自建 GitLab 而不是直接用托管服务很多团队在起步阶段会直接使用公有托管平台来管理代码,省事、零维护,这没什么问题。但当团队规模超过十人、项目数量超过二十个之后,一系列现实问题就会浮出水面:CI/CD 的并发任务需…

2026/10/18 5:44:43 阅读更多 →

最新新闻

TensorFlow Lite端侧推理集成指南:模型转换、性能优化与避坑实践

TensorFlow Lite端侧推理集成指南:模型转换、性能优化与避坑实践

做端侧AI这么久,TensorFlow Lite集成这个坑,我前后踩了大半年才彻底理顺。去年接手一个离线质检项目,现场环境没有稳定网络,只能在某个嵌入式设备上跑一个图像分类模型。模型在训练环境里精度很正常,一到端侧不是转不动…

2026/10/18 17:43:44 阅读更多 →
Matlab小波周期分析实操指南:解决水文气候序列节律失稳问题

Matlab小波周期分析实操指南:解决水文气候序列节律失稳问题

简介:本资源是一套面向水文、气象与地理领域科研人员及高校师生的Matlab小波周期分析实操工具包,聚焦Morlet小波时频分析方法在真实时间序列中的落地应用,解决多尺度周期识别、主振荡周期提取与结果可视化等核心问题。压缩包共20个文件&#…

2026/10/18 17:43:44 阅读更多 →
TensorFlow Lite端侧AI集成实战:从模型量化到性能调优

TensorFlow Lite端侧AI集成实战:从模型量化到性能调优

很多端侧AI功能,做出来跟跑通是两回事。模型在服务器上精度再高,到了用户手机上一跑就卡、一跑就崩,体验直接归零。我自己在集成TensorFlow Lite这件事上,前前后后折腾过不少轮,踩过的坑比文档里写的多得多。这篇就当作…

2026/10/18 17:43:44 阅读更多 →
487万条结构化图书数据集:开箱即用的推荐与NLP工程基底

487万条结构化图书数据集:开箱即用的推荐与NLP工程基底

简介:这是一份面向文本挖掘、自然语言处理与机器学习初学者及研究者的轻量级书籍数据集资源,聚焦于中文文本分析基础任务的训练与验证需求。压缩包共3个文件(1.59MB),含CSV格式的结构化书籍元数据(标题、作…

2026/10/18 17:43:44 阅读更多 →
从题目到终稿:用AI辅助工具高效完成毕业设计论文与实践报告

从题目到终稿:用AI辅助工具高效完成毕业设计论文与实践报告

毕设这东西,绝大多数人第一次接触时根本不知道从哪下手。我自己当年也是,题目定下来之后整整两周没动笔,打开文档半小时,写了删、删了写,最后屏幕上就剩个标题。后来陪好几届同学把整套流程完整跑下来,才想…

2026/10/18 17:43:44 阅读更多 →
Window 显示鼠标的坐标:用 GetCursorPos 与 SetCursorPos 做实时坐标面板

Window 显示鼠标的坐标:用 GetCursorPos 与 SetCursorPos 做实时坐标面板

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

2026/10/18 17:42:44 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/18 12:16:16 阅读更多 →