DeepSeek多模态大模型实战:原理、API调用、微调与部署
搞了几年大模型最近圈子里最热闹的一件事就是DeepSeek全面转向多模态。老实说见惯了各种技术路线之争这次纯文本与多模态的争议终于可以画上句号了。不是谁打败了谁而是所有从业者都意识到让大模型只看文字就像让一个人闭着眼睛做判断虽然也能活但严重受限。多模态已经成了下一代大模型的标配能力。这篇文章不追热点只聊实操。我会从多模态模型的技术原理、DeepSeek这类开源模型的API调用、本地部署方案、微调实战和常见排查这几个维度把我验证过的方法和踩过的坑一并倒出来。适合正在做技术选型的大模型工程师、想给产品加视觉能力的产品经理还有准备在个人电脑或Jetson Orin上折腾本地部署的玩家。1. 多模态大模型为什么成了必然选择1.1 从纯文本到多模态大模型到底在补什么短板纯文本大模型处理的是字符序列输入只能是一段文字输出也是一段文字。这个设计在自然语言任务上非常高效但人类获取信息的方式远不止文字。一张产品实拍图、一段语音、一帧监控视频信息密度远高于几行描述。过去为了把图片塞给模型你只能先人工写整段文字描述或者用外部OCR转成文本再做推理。这个过程既费人力又会丢失细节。多模态模型把视觉、语音和文本放在同一个建模空间里模型可以直接“看”图、“听”声再结合文本上下文给出答案。比如DeepSeek这类转向多模态的模型可以同时接收图像和问题直接指出图片里的异常区域也可以根据商品图加一段文字描述自动生成结构化属性。这正是多模态统一处理的价值把原先割裂的感知与认知流程合并成一条链路。我用一个最直观的例子说明。之前我拿纯文本模型分析一张无人机拍摄的农田图像需要先用另一个模型生成一段冗长的描述再让文本模型判断有没有病虫害。一来一回误差叠加描述里漏掉的细节模型根本不知道。换多模态模型之后直接喂图加一句“这片田里哪里最可能发生虫害”模型自己会聚焦视觉区域效果立刻不一样。这个补短板的动作业内早就有共识DeepSeek只是把共识正式化。1.2 纯文本与多模态之争争的到底是什么很多人以为这场争论是技术路线对决其实表层之下是资源分配和产品取舍的问题。纯文本模型参数量相同的情况下训练和推理开销更小处理长文档、代码任务时更专注。多模态模型为了对齐图像区域与文本语义需要额外的视觉编码器、跨模态投影层显存占用直线上升。但要注意多模态并不是对纯文本的否定。我见过不少团队误以为拥抱多模态就必须抛弃文本能力结果模型在简单摘要任务上表现退化。实际上现代多模态大模型内部通常会保留完整的文本解码器图像信息只是额外插入输入序列或者通过视觉token与文本token一起参与注意力计算。DeepSeek的做法也是如此——底层语言能力不变外层接上视觉感知能力。换句话说纯文本作为基础盘依然重要多模态是在这个基础上长出来的新维度。这场争论真正的答案不是“二选一”而是“分层融合”。产品功能需要视觉、语音时优先多模态业务场景纯文本就保留轻量模型。创业公司和做垂直应用的朋友别急着把队伍全部押在最大规模的多模态模型上先在纯文本模型上跑通逻辑再考虑是否升级。2. 多模态模型背后的关键技术拆解2.1 视觉编码器把图像变成大模型能懂的Token序列多模态模型要“看懂”图首先要完成一个转换把像素矩阵变成一组语言模型可以处理的向量。这个转换通常由视觉编码器完成。业界最常用的是基于CLIP训练的ViTVisual Transformer把图片切分成16x16或14x14大小的Patch每个Patch经过Transformer编码成一个向量。CLIP标题里那个“clip 多模态模型”指的就是这种技术——它让图像向量和文本向量在同一个语义空间里距离最近这样模型后续才能把视觉信息挂在文本token后面。我在实践中的一个体会是视觉编码器的分辨率非常关键。很多开源多模态模型默认只处理224x224或336x336的图遇到密集文字截图或高清商品图会吃亏。DeepSeek这类新模型一般会支持更高分辨率但内部还是会把大图切块分别编码再合并成视觉token序列。你在用API时如果发现细节识别不准可以先检查图片是否被压缩过度或者尝试放大目标区域。图像转成token之后并不是直接拼接进文本token就完事。因为视觉特征的空间里和文本特征空间并不是天然对齐的需要一个投影层或者Q-Former结构把视觉向量映射到文本嵌入空间。这就是我下一节要说的跨模态对齐。你可以把视觉编码器理解成“眼睛”投影层理解成“视神经”语言模型本身是“大脑”。任何一个环节出了问题模型都会“视而不见”。2.2 跨模态对齐与多模态统一处理多模态模型设计里有两条经典路线早期融合和晚期融合。早期融合在输入层就把图像、文本特征拼在一起喂给Transformer晚期融合则让图像和文本各自编码等到高层再做交互。后者更灵活但往往需要额外的交叉注意力模块。实际落地中现在的主流方案已经趋向于多模态统一处理。所谓统一处理就是把图像token和文本token放进同一个序列用同一个Transformer做自回归预测。DeepSeek转向多模态时也选择了这条路线好处是架构简单训练和推理都可以复用纯文本模型的大量基建开源社区做微调也更方便。我记得读过一些多模态融合论文其中Q-Former方法比较实用用一组可学习的Query向量去“查询”视觉特征得到固定数量的视觉token再与文本token拼接。这样做的好处很明显——无论输入图片多大经过Q-Former之后视觉token数量是固定的对语言模型的输入长度非常友好。推荐算法、商品多模态支持这类场景喜欢用固定长度视觉token因为线上推理时shape不会变化吞吐更稳定。多模态统一处理还带来了一个红利你可以用同一套数据格式同时训练视觉问答、图文生成、纯文本对话。只要把“图文”的输入拼成一个序列输出仍然按文本处理训练起来非常简洁。这也是为什么DeepSeek这类模型可以在很短的时间内补齐多模态能力而没有重写整个模型结构。对想要微调的同学来说这个信息很重要——你不需要造一个花哨的网络只需要在现有模型上补数据。3. 从API调用到本地部署DeepSeek多模态模型的实操3.1 DeepSeek API调用入门鉴权、传参、多模态输入DeepSeek提供OpenAI兼容的API这意味着如果你用过其他大模型的SDK可以无缝切换。先设置base_url为https://api.deepseek.com再填入API key。调用前需要创建一个客户端Python里的写法大概是from openai import OpenAI client OpenAI( api_keysk-xxxxxxxxxxxx, base_urlhttps://api.deepseek.com ) response client.chat.completions.create( modeldeepseek-chat, messages[ {role: user, content: [ {type: text, text: 这张图片里有什么危险物品}, {type: image_url, image_url: {url: https://example.com/pic.jpg}} ]} ], max_tokens512, temperature0.3 ) print(response.choices[0].message.content)实测下来多模态输入时content字段要改成数组文本和图片分别用text和image_url类型声明。图片既可以是公网URL也可以是base64编码的字符串格式为data:image/jpeg;base64,....。这里有个容易踩的坑很多新手直接把本地图片路径填进去结果API返回400。本地图必须先在代码里转成base64或者上传到对象存储拿临时链接。参数调优上如果是做视觉问答、内容审核这类事实性任务我会把temperature调低到0.0~0.3避免输出发散如果做图文创意文案可以把温度提到0.8。max_tokens要根据输出长度来定别设太长浪费配额也别太短截断答案。DeepSeek API的价格在同级别模型里比较有竞争力适合做批量测试和预处理。3.2 本地部署OpenAI兼容服务的两种方式本地部署的好处是数据不出域适合涉及敏感业务或需要离线推理的场景。目前在个人电脑上最省事的是Ollama装完后直接拉取模型ollama run deepseek-vl它会自动下载相应的多模态权重并暴露一个本地端口。Ollama还内置了OpenAI兼容接口你可以在自己的代码里把base_url改成http://localhost:11434/v1然后正常调用。这个方案的优势是快、省心它对显存做了动态加载没推理时自动释放。劣势是并发能力弱QPS一高就容易排队。如果是正式服务我建议用vLLM来部署。vLLM支持PagedAttention显存利用率更高吞吐比原生transformers高一个数量级。启动命令大概是vllm serve deepseek-ai/deepseek-vl-7b-chat \ --dtype auto \ --quantization awq \ --max-model-len 4096 \ --gpu-memory-utilization 0.9 \ --port 8000启动后同样提供了/v1/chat/completions接口可以直接用OpenAI SDK调用。--gpu-memory-utilization不是越大越好要留给CUDA上下文和图片处理一定空间我一般设0.85到0.9。--quantization awq是在显存不够时用4bit量化效果有少量损失但能换回几乎一半显存。3.3 在Jetson Orin上的边缘部署优化嵌入式设备部署大模型是很多做巡检、安防、农业项目的人比较关心的方向。DeepSeek多模态模型是可以跑到Jetson Orin上的但直接加载fp16权重会爆显存。我的做法是先把模型转成TensorRT引擎配合INT8量化。JetPack自带trtexec工具可以为你指定的onnx模型生成TensorRT plan文件。这一步的关键是把视觉预处理算子一起编译进engine否则每次推理都要在CPU上切图缩放延迟会高得离谱。实测在Jetson Orin 64GB上把7B模型量化为INT8后单次多模态问答延迟可以压到2秒左右已经接近可用状态。功耗方面要记得开启nvpmodel -m 0切换到最大性能模式否则默认低功耗状态下速度会慢到不能忍。边缘部署的另一个细节是输入分辨率。工业质检图片动不动就是2000万像素直接喂给模型会卡死。我一般先用一个轻量目标检测算法裁剪出感兴趣区域再把裁剪图缩放到模型支持的尺寸。这个“前置裁剪”策略能减少大量无效计算比单纯调大分辨率参数效果更好。如果你在Jetson上跑过深度学习应用应该明白这种“先粗定位、后细识别”的模式有多实用。4. 大模型微调实战如何调出一个懂业务的多模态模型4.1 训练数据准备图文对的结构与清洗微调多模态模型最常见的数据格式是LLaVA风格每个样本是一个JSON对象包含image路径、conversations列表其中human和gpt轮流对话。图像可以直接存本地路径也可以存base64。我推荐训练时把图像路径映射成相对路径避免迁移训练机时路径失效。下面给一个最小示例方便你理解[ { image: train/0001.jpg, conversations: [ {role: user, content: 这个商品有什么吸引人的卖点}, {role: assistant, content: 主打轻量化便携设计外壳使用铝合金材质重量仅为420克适合户外场景。} ] }, { image: train/0002.jpg, conversations: [ {role: user, content: 图中有几个行人}, {role: assistant, content: 三个其中两人站在斑马线左侧一人正在过马路。} ] } ]数据清洗环节最容易被忽略也最影响微调效果。我踩过一次坑直接从电商平台抓商品图没有做去重和色偏统一训练出来的模型对白底图特别敏感换到实拍场景就崩。所以建议至少做三步清洗一是去除模糊、裁剪异常、大量遮挡的坏图二是统一图片分辨率不统一也要在数据加载时做resize三是检查图文是否对应尤其多轮对话中容易出现指代不一致比如用户问“这个多少钱”但图里根本没有价格标签模型学到的就是瞎猜。4.2 全量微调和LoRA怎么选全量微调是更新模型所有参数效果最好但显存占用和训练成本高。7B模型全量微调即便用bf16单卡A100也吃力更别提很多人手里只有一张消费级显卡。这时候LoRA是更务实的方案。LoRA的原理是冻结原始权重在注意力层的线性层旁边插入低秩分解矩阵只训练这两组小矩阵。LoRA的实际优势是参数占比极小通常只有原模型的1%~5%。还是以7B为例LoRA rank设64可训练参数可能不到300M一张24G显存的卡就能做。训练速度也比全量快很多而且推理时可以把LoRA权重合入原模型不增加额外延迟。至于rank选多少我的经验是如果业务数据和通用领域差异不大rank16足够如果数据很专项比如医学影像建议rank32或64起步效果提升会更明显。学习率方面多模态LoRA一般比纯文本微调更凶1e-4到2e-4之间调整。另外LoRA不只做文本部分视觉投影层也要加LoRA否则模型是“看懂了但说不准”。4.3 微调后的评估别只看Loss要构建真实任务集不少人微调后只看train loss和eval loss下降就宣布成功这是不严谨的。多模态模型在训练集上loss低很可能只是记住了图片的特征分布换到真实场景就穿帮。我用过的有效评估方案是构建一组业务闭环测试集包括视觉问答准确率让模型输出结构化JSON自动对比关键字段和真值图文检索相关性用CLIP score或BLIP score度量生成的描述与图片语义一致性端到端效果比如商品属性抽取后直接跑一遍下游推荐看点击率是否上涨还要测“泛化能力”也就是同类但不同来源的数据。我试过拿一个只在白底商品图微调过的模型去跑生活场景图结果属性准确率从90%掉到60%。这个信号提醒你训练数据多样性不够需要补充更多实际环境图片而不是一味堆同样的样本。5. 常见问题与排查技巧实录5.1 显存不足量化、切图与梯度累积训练或推理时显存不够是最常见的抱怨。先说训练侧除了降batch size我强烈建议开启梯度累积让优化器积累几个step再更新效果接近大batch。推理侧最直接的办法是启用AWQ或GPTQ量化。量化后模型精度损失通常能控制在可接受范围但推理速度和显存占用都会显著改善。一个容易被忽略的点是视觉token数量。很多多模态模型会把一张大图分成若干个tile每个tile都生成几十上百个token。如果输入图片分辨率太高视觉token可能占据序列长度的大半显存和计算开销随之暴涨。我踩过这个坑之后会在不影响关键信息的前提下把业务图片统一压到模型训练时的推荐分辨率。5.2 多模态输入报错base64与HTTP链接的坑调用API时最常见的是400错误按我的排查经验90%出在图片数据格式上。BASE64编码后的字符串很大有些SDK会自动处理有些则需要你手动拼成data:image/png;base64,...的形式。注意mime type必须和图片真实格式一致否则解析失败。还有部分网关会限制请求体大小base64图片一多就会超限优先用公网URL或对象存储短链。本地部署时OpenAI兼容接口一般也遵循同样的message结构但要注意不同框架对image_url的路径解析规则不同。Ollama接受path/to/image.jpgvLLM可能要求URL编码后的路径。你可以在推理前打印请求体逐项对照文档比盲猜快很多。5.3 多模态幻觉图表、数字和属性乱说多模态模型更容易产生幻觉因为它既要理解图像又要生成文本。尤其在图表理解场景模型会一本正经地输出不存在的数字。我处理这类问题的三板斧一是prompt中强制要求“只能回答图片中明确可见的信息”并在system信息里加上禁区列表二是对数值型输出开启JSON模式并校验类型三是增加few-shot例子让模型模仿严格的回答格式。如果幻觉还是压不住可能是微调数据的标注质量不高。检查一下训练数据里有没有“图里没有但标注里写着”的情况这种矛盾数据会让模型学会编造。数据质量永远比模型结构更值得优先排查。5.4 部署后响应变慢KV Cache与并发优化本地部署多模态模型后QPS上不去是常见痛点。vLLM里提高吞吐的关键是增大max_num_batched_tokens和gpu_memory_utilization同时开启continuous batching。如果还是慢尝试把视觉编码器单独抽出来用batch推理提前把图片转为视觉token存好推理时只走语言模型部分。这招在固定图片反复提问的场景特别管用。比如商品审核同一个图可能要问十几个问题每次重复做视觉编码纯属浪费。把视觉token缓存起来语言模型阶段的输入长度也会变短速度提升接近一倍。最后说点实在话这段时间折腾DeepSeek多模态模型我的体会是纯文本模型并没有死它依然是处理长文本和代码的最优解。但多模态给了大模型一双眼睛让系统能直接感知真实世界这个能力一旦具备就不再可逆。你在选型时最该做的不是纠结“能不能多模态”而是想清楚业务要处理的是哪一种信息结构。建议各位先跑一遍API花半天把图片输入、输出解析、错误处理摸熟。接着评估是否需要本地部署从Ollama开始再到vLLM最后考虑边缘设备。微调放到项目稳定之后再碰做之前先把数据自己看一遍。这条路不算短但每一步都能积累可复用的经验也欢迎你踩了不一样的坑后回来交流。

相关新闻

Node.js TCP服务公用模块设计:连接管理与优雅退出实践

Node.js TCP服务公用模块设计:连接管理与优雅退出实践

我从去年到现在,经手的Node.js后端项目里,有四个都需要对外提供TCP服务:两个是设备数据采集网关,一个是内部服务之间的命令传输通道,还有一个是跟外部系统做长连接消息交互。每个项目开工时,我都要把net.cr…

2026/10/3 21:15:26 阅读更多 →
ELF与地址空间:从程序头表到进程内存映射的完全解读

ELF与地址空间:从程序头表到进程内存映射的完全解读

我最早被ELF和地址空间这两个词整懵,是在刚接触Linux下程序链接和加载的时候。拿一个编译好的二进制,用readelf打开,里面一会儿是Section(节),一会儿是Segment(段),链接时…

2026/10/3 21:15:26 阅读更多 →
ReentrantReadWriteLock 实战:读锁写锁行为、锁降级与死锁避坑指南

ReentrantReadWriteLock 实战:读锁写锁行为、锁降级与死锁避坑指南

之前我有一个内部系统的配置中心,读请求每秒几千次,配置更新却好几分钟才一次。最初图省事,我直接在 get 方法上加了 synchronized,结果每次配置一更新,所有读请求全被堵在门外,高峰期接口响应时间直接飙到…

2026/10/3 21:15:26 阅读更多 →

最新新闻

使用python:循环发送测试报文

使用python:循环发送测试报文

情景:使用python:循环发送测试报文udp 单播 本机:192.9.2.77 接收端口: 6000 发送端口:6001对方 : 192.9.2.78 接收端口 :6000 发送端口:6001编写一个程序两个电脑运行:一个是本机,一个是对…

2026/10/3 21:54:49 阅读更多 →
AI工业控制系统搭建实战:从边缘计算到模型部署的完整指南

AI工业控制系统搭建实战:从边缘计算到模型部署的完整指南

1. 从零理解AI工业控制系统的真实边界1.1 这套系统到底解决什么问题先把概念说清楚。AI工业控制系统,不是把工厂里原来的PLC、DCS全部推倒重来,而是在已有的控制层之上,叠加一层“会判断、会预测、会自调”的智能决策层。传统工控系统干的是“…

2026/10/3 21:53:48 阅读更多 →
Paperclip架构:React+OpenClaw+Claude Code的轻量AI智能体实践

Paperclip架构:React+OpenClaw+Claude Code的轻量AI智能体实践

1. 项目概述:Paperclip 不是回形针,而是一个被严重误读的 AI 工具链代号 “Paperclip”这个词在当前中文技术社区里,正经历一场典型的语义漂移——它既不是 Office 文档里的那个金属小物件,也不是某款冷门开源库的官方名称&#x…

2026/10/3 21:52:47 阅读更多 →
人工智能训练师高级证书备考:AIGC核心考点与实操经验

人工智能训练师高级证书备考:AIGC核心考点与实操经验

人工智能训练师(高级)这个证书我今年刚考下来,注册、报名、刷题库,前后折腾了快三个月,橙点同学平台上的题我差不多过了三轮,最后理论和实操都是一次性通过。如果你正在准备这个考试,或者正想往…

2026/10/3 21:52:47 阅读更多 →
SpringBoot debug实战:从自动装配到最小链路跑通

SpringBoot debug实战:从自动装配到最小链路跑通

【SpringBoot香樟转转】debugDay01从零搭一个校园二手交易平台,第一天全在跟报错较劲。在做“香樟转转”这个 SpringBoot 项目之前,我其实有过心理准备,但真到了写代码调试的阶段,才发现问题的密度远超预期。这篇文章就把 Day01 这…

2026/10/3 21:50:45 阅读更多 →
AI编程Skills全攻略:从安装到自定义SOP

AI编程Skills全攻略:从安装到自定义SOP

先问自己一个直白的问题:同一个 AI 编程助手,为什么有人用着像带了十年默契的老搭档,有人却觉得它笨得只会空泛附和?差别通常不在模型本身,而在一个很容易被忽略的配置——Skills。 这正是 Claude Code、Codex、OpenC…

2026/10/3 21:50:45 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 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/2 10:36:31 阅读更多 →
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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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/3 9:42:36 阅读更多 →