news 2026/9/6 12:04:52

大模型GPU集群网络:从NVLink到RDMA,揭秘算力背后的隐形瓶颈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型GPU集群网络:从NVLink到RDMA,揭秘算力背后的隐形瓶颈

大模型这几年火得不行,但大多数人聊的都是“参数规模”“训练数据”“推理速度”,很少有人认真讲一件事:这么多 GPU 卡是怎么连成一片干活的?你本地跑个 Ollama 和公司里跑个千卡集群,背后差的到底是什么?

答案就是网络基础设施。我之前带团队做模型服务化的时候,第一次排障查了整整一个下午,最后发现瓶颈不在 GPU,不在显存,也不在调度器,而是两台机器之间的网卡协商带宽掉了一半。那一刻我才意识到,所谓的大模型能力,其实是算力、显存、存储、网络四张网织出来的,网络这条线往往是最隐蔽、也最容易被忽视的短板。

这篇文章专门写给零基础的读者。我会用大白话把这些概念讲清楚,不求让你马上能搭一个万卡集群,但至少看完之后,你能看懂厂商发布的“XX PFLOPS 算力集群”到底牛在哪儿,也能搞明白为什么本地部署大模型时 Ollama 电脑和公司服务器的路径选择完全不一样。

1. 先搞懂大模型为什么“吞网络”

很多新手有个误区,觉得大模型就是一块大硬盘,装一个文件就能跑。实际上,大模型不是一个文件,而是成千上万个 GPU 卡并行协作的结果。以训练为例,一张 H100 的显存是 80GB,但像 GPT-4 级别的模型,参数已经超过万亿,根本放不进单张卡。这时就得把模型切碎,分到几百几千张卡上。

这里有个关键概念叫张量并行。简单说,同一个计算矩阵被切成多块,分别放卡上,每算一步都要同步一次数据。同步就得靠网络传数据。如果你用千兆网卡,训练过程中大部分时间都在等网络,GPU 空转,电费照烧,进度条不动。

我做个生活化的类比。假设你要把一本 1000 页的书抄成 10 份,如果 10 个人各自独立抄,最后只有一本原书能分着看,其他 9 个人只能等。如果 10 个人分工,每人抄 100 页,但每抄完一页都要互相核对一次,那么核对的速度就决定了整个抄书的速度。这个“核对”的过程,在大模型里就是网络通信。

所以你看,大模型对网络的需求,本质上是对高带宽、低延迟、低丢包的极端追求。训练时每秒钟得传几十 GB 的数据,延迟多一个毫秒都可能让 GPU 老大哥们“排队等饭吃”。

推理阶段也一样。你问大模型一个问题,请求先到达 API 网关,再转发到推理服务器,如果模型太大单机放不下,还得通过网络分发到多个节点,最后结果再汇总回来。整个过程如果不顺畅,最直观的体感就是“打字回复特别慢,一个字一个字往外蹦”。

在了解具体设备之前,先记住一组结论,哪怕你还不知道 GPU、NVLink 是什么,也能建立正确的直觉框架:

  • 单机内部的卡与卡通信,靠的是 PCIe 总线和 NVLink,速度快但距离短。
  • 多机之间的通信,靠的是网卡(NIC)和交换机,速度取决于端口速率和网络拓扑。
  • 你访问云上的大模型 API,走的是公网 Internet,延迟受物理距离和运营商线路影响。
  • 本地部署大模型(比如 Ollama),网络要求其实不高,瓶颈在内存带宽和显存容量,而不是网卡。

这套框架能帮你判断很多问题。比如有人问“为什么大模型部署要用 A100 而不是普通游戏显卡”,答案一半在算力,另一半就在显存带宽和 NVLink 这类通信能力上。

2. 一张图看懂大模型网络的分层架构

要理解网络基础设施,最忌讳一上来就看一堆术语。我先给出一个分层拆解的视角,由近到远,一层层讲。

2.1 卡间互联层:NVLink 与 PCIe

最底层、速度最快的连接,是同一台服务器内部 GPU 卡之间的连接。英伟达目前主流做法是 NVLink,它可以理解成 GPU 之间的专用“高速公路”。NVLink 不是用普通的 PCIe 插槽,而是 GPU 上专门的金手指,通过桥接器或者背板直接对接。

以 A100 为例,NVLink 3.0 单向带宽 50GB/s,双向 100GB/s。到了 H100 的 NVLink 4.0,双向带宽飙到 900GB/s。这是什么概念?就是一块满血的 PCIe 4.0 x16 插槽(约 32GB/s 单向)完全不是它的对手。NVLink 的意义在于,卡与卡之间传显存数据几乎不用绕道 CPU 和内存,直接把显存数据从一个卡搬到另一个卡,传输延迟极低。

对你实际部署有什么用?如果你是在单台服务器里塞了 8 张卡,跑张量并行或者流水线并行,卡间通信是最大瓶颈。如果你买的服务器只有 PCIe 连接,没有 NVLink,那么 8 卡就像一个走廊很窄的合租房,人多了就堵。这也是为什么二手市场里带 NVLink 桥的主板比不带桥的贵一大截。

PCIe 则是更基础的连接方式,GPU 通过 PCIe 插槽连到 CPU,再通过 CPU 连到网卡。PCIe 的版本和通道数决定了数据传输上限。买服务器时一定要看是 PCIe 4.0 还是 5.0,通道数是 x16 还是 x8。很多号称“支持 8 卡”的服务器,实际每张卡只能跑 x8 甚至 x4 带宽,训练效率会大打折扣。

注意:NVLink 也有物理限制。它只支持同一台机器内部的 GPU 互联,不支持跨服务器。跨服务器的卡间通信,就必须走网络了。

2.2 机内网络层:网卡与 RDMA

单机内部通信再快,也只覆盖 8 张卡的能力。当参数规模超过单机上限,必须把多台服务器连成一个集群。这时每台机器都需要一个高性能网卡,常见的是 100Gbps、200Gbps 甚至 400Gbps 的以太网卡,或者 InfiniBand 网卡。

网卡收发数据的时候,CPU 负担很重,每个数据包都要中断 CPU,CPU 被频繁打扰后就没空算数了。为了解决这个问题,业界用了一种叫 RDMA 的技术。简单说,RDMA 允许网卡直接读写另一台机器的内存,不用经过双方的 CPU 和操作系统。就像两个人隔着墙递纸条,纸条不会经过中间人的手。

RDMA 又分两种主流实现:

  • InfiniBand:专用网络,价格贵,延迟极低,丢包率极低,大模型训练首选。
  • RoCEv2:跑在普通以太网上的 RDMA,便宜很多,但部署时对交换机丢包要求很高。

大模型训练集群普遍推荐用 InfiniBand,因为它有无损网络支持。以太网哪怕 99.99% 的包都能成功送达,剩下的 0.01% 丢包在万卡级训练里也会反复触发重传,造成“木桶效应”——整体速度被最慢的那一跳拖垮。

2.3 机间网络层:交换机与拓扑

多台服务器连起来,光靠网卡不够,还得有交换机把它们串到一起。交换机的选择直接决定了集群的扩展能力。

最经典的拓扑是Fat-Tree(胖树)。想象一棵倒过来的树,最下面是计算节点(也就是服务器),往上是叶子交换机、脊交换机、核心交换机。任何一台服务器到另一台服务器,都有多条路径可选。胖树的好处是带宽可以线性扩展,服务器越多,核心层带宽越大。

还有更先进的Torus(环装网)Dragonfly(蜻蜓网),主要是为了在超大集群中减少跳数、降低延迟。这些拓扑对普通用户来说太遥远,但了解基本思路是有用的:拓扑越复杂,交换机数量和链路数量越多,管理难度和成本越高。

对大模型训练而言,通信模式有个显著特点叫All-to-All。简单说,每一轮梯度同步,所有机器要把自己的数据发给所有其他机器。这种模式很吃网络,网络拓扑如果不均匀,某些链路就会拥堵,形成“热点”。很多训练框架例如 Megatron-LM 或 DeepSpeed,会专门做拓扑感知的调度,目的就是为了尽量减少跨交换机通信。

2.4 数据中心出口层:前端网络与存储网络

前面说的都是“东西向流量”,也就是服务器之间横向互传。实际上还有另一类流量叫“南北向流量”,指的是用户请求进入数据中心,或者数据中心去访问外部对象存储。

这类流量对带宽的要求没有训练流量那么极端,但对稳定性和会话保持有要求。通常机房会单独搭建前端网络,跑标准 TCP/HTTP 协议,用常见的 25G/50G 网卡接到接入交换机上。训练网络和前端网络往往是物理隔离的,目的就是防止训练流量把用户请求挤崩。

还有一个常被忽略的是存储网络。大模型训练时,每过一段时间就要保存模型权重(checkpoint)。一个万亿参数的模型 FP16 存下来就是 2TB,如果几十个节点同时去写存储,存储网络带宽不够会导致训练暂停等待。所以大厂一般会用专有的并行文件系统,比如 Lustre 或 GPFS,搭配高性能网卡,确保 checkpoint 快速落盘。

这块对零基础读者来说可能有点超出,但记住一句话就行:大模型集群不是只有 GPU,还有一套存储网络和文件系统,它们同样决定训练能不能跑得动。

3. 为什么说网络是大模型规模化的“隐形瓶颈”

我在前面反复强调网络重要,但到底有多重要?举几个真实场景。

3.1 训练阶段的“卡顿”可能不是 GPU 问题

有一次我们内部测试一个 1750 亿参数的模型训练,观察到一个怪现象:每个 step 计算时间只占 60%,剩下 40% 时间都花在等待。监控面板上 GPU 利用率很低,但训练就是快不起来。

查了半天,发现是两台机器间的一根光模块故障,速率从 400Gbps 掉到 100Gbps。网络层的流控机制让整条链路的传输性能大幅下降。那根光模块不在告警范围,因为物理链路没断,只是光衰增大。后来换了光模块,训练速度立刻涨了近一倍。

类似的问题在千卡集群里非常常见。显卡本身不坏,网线也没断,但某个交换机端口丢包率高了,就会拖垮整轮训练。所以做大规模训练的人常说:GPU 是上限,网络是下限。网络不好,再强的 GPU 也发挥不出来。

3.2 推理阶段的“第一 token 延迟”与网络关系密切

做推理优化的人常挂嘴边一个指标叫Time To First Token(TTFT),也就是从发出请求到模型吐出第一个字符花了多久。这个指标不仅取决于模型算得快不快,还取决于请求从客户端到服务器的网络延迟。

如果用户在 A 地,服务器在英国,物理距离决定光速极限,再怎么优化也得绕地球半圈。所以大模型厂商会在多个区域部署边缘节点,目的就是把“最后一公里”的网络距离缩到最短。

这个思路对普通开发者也有启发。你如果自己部署 Ollama 做开发调试,建议把模型装在同一台电脑或者同一个局域网内,不要挂在内网穿透到很远的服务器上。那样每次交互网络延迟太高,体验会非常糟糕。

3.3 参数服务器架构中的网络压力

老一代分布式训练常用参数服务器(PS)架构:一批 Worker 负责计算,一批 Server 负责存参数和更新梯度。每个 Worker 每算完一个 batch,就要把梯度推到 Server,Server 再把最新参数拉回来。这种架构在模型规模不大时很稳定,但模型大了以后,服务器的网络带宽成了瓶颈。

现在大模型训练主流是全规约(All-Reduce)架构,不再单独设参数服务器,而是让所有 GPU 组成环网,梯度数据在环里转一圈就能完成求和。这种模式对网络拓扑的均衡性要求更高,但只要网络基础好,扩展性远超 PS 架构。

所以你会看到,大模型训练发展史其实很大程度就是网络通信结构的发展史:从集中式参数服务器,到去中心化的 All-Reduce,再到现在多模态时代的高带宽拥塞控制。每一步都在和网络较劲。

4. 从设备到协议:常用网络硬件与软件栈解析

这部分我按“硬件选型”和“软件配置”两个维度展开,给想要自己动手的读者一些参考。

4.1 硬件层面该看哪些参数

挑服务器和交换机的时候,重点看带宽和延迟。带宽单位是 Gbps(吉比特每秒),需要换算成 GB/s 才有直观感受。100Gbps 除以 8,就是 12.5GB/s。一个 80GB 的模型权重,在不考虑其他开销的情况下,通过 100Gbps 网卡传完需要约 6.4 秒。听起来还能接受,但训练过程中每秒钟要传好几轮梯度,这个量级就会变得非常紧张。

另一组参数是网络接口类型,SFP28、QSFP28、QSFP-DD。QSFP-DD 是目前 400G 以太网的主流接口。买之前一定要看光模块的支持列表,不同厂商的模块和交换机可能存在兼容问题。

再看网卡的 PCIe 通道数。一张 400G 网卡如果只插在 PCIe 4.0 x8 上,理论带宽只有约 16GB/s,远低于 400Gbps 的 50GB/s,直接变成瓶颈。所以在服务器里,400G 网卡通常要求 PCIe 5.0 x16 插槽,这个细节最容易踩坑。

4.2 软件层面要知道哪些组件

网络硬件装好后,软件栈决定了你能不能把性能发出来。

  • NCCL(NVIDIA Collective Communications Library):英伟达提供的多卡通信库,几乎所有大模型训练框架底层都调它。它支持 NVLink、PCIe、InfiniBand、RoCE 等多种后端。在实际使用中,设置NCCL_DEBUG=INFO环境变量可以打印出通信初始化信息,非常管用。
  • IB Verbs / libfabric:InfiniBand 的驱动接口。装驱动时,建议用ibstat检查端口状态,用ib_write_bw测试点对点带宽。
  • RDMA CM:管理 RDMA 连接的组件,负责建立连接、管理队列对。如果连接建不起来,多半是子网管理器(Subnet Manager)没配好。
  • TCP 调优:即使你不需要 RDMA,也会依赖 TCP 做控制面流量。可以调的参数有 MTU、拥塞控制算法(比如 BBR)、缓冲区大小等,但这些优化空间远不如 RDMA 显著。

我遇到太多人买了 InfiniBand 网卡,驱动装了,IP 也配了,但训练速度还是很慢。一查才发现是没装子网管理器,或者子网管理器没有跑起来。InfiniBand 不像以太网有自协商机制,它是“无主不欢”的,必须有一个子网管理器来分配路径。这个细节不写进任何快速上手指南,但我踩过,所以必须提醒。

4.3 本地部署场景的网络需求

如果你只是在自己电脑上跑 Ollama、跑 llama.cpp,其实不需要 400G 网卡和 NVLink。这类工具设计出来就是单机运行,模型加载完后推理主要在本地完成,网络只负责下载模型和发送 API 请求。

但有一个容易被忽略的点:模型下载和加载时的网络问题。Ollama 默认从模型仓库拉取权重文件,一个 7B 模型约 4GB,70B 模型约 40GB。如果网速一般,下载过程会非常煎熬。后来我发现可以用环境变量OLLAMA_MODELS把模型仓库指向一个容量足够大的磁盘,避免装到系统盘把 C 盘挤爆。另一个设置是把OLLAMA_HOST改成0.0.0.0:11434,这样同一局域网内其他设备也能访问你的 Ollama 服务,相当于搭了一个小微推理服务器。这些操作我后面章节详述。

5. 从零到一:搭建一个最小可用的推理服务网络

理论讲太多容易晕。这里我以最本土化的场景为例,带你实操一遍:用一台普通的 Linux 服务器加上 Ollama,搭建一个能对外提供大模型 API 的最小部署,并且把网络配置梳理清楚。

5.1 机器准备与网络设计

假设你有一台 32 核 CPU、128GB 内存、单张 24GB 显存显卡的机器(比如 RTX 3090/4090)。对 7B 模型来说,这个配置足够跑 FP16 精度;如果想跑 70B,就得考虑量化版本或者多卡并行。

网络方面,建议把机器接在局域网内,固定 IP,例如 192.168.1.100。如果你希望外网也能访问,不建议直接暴露公网端口,更稳妥的做法是用内网穿透工具或者云上的反向代理。因为大模型 API 是没有鉴权机制的,直接把服务挂公网,任何人都能白嫖你的显卡,还可能被恶意刷流量。

安全提醒:Ollama 服务本身没有身份认证。如果必须暴露在外网,请在前面加一层网关,比如 Nginx,配 Basic Auth 或者用专用工具做 Token 校验。别问我怎么知道的,我见过太多人把 11434 端口裸奔在公网上,一天产生几百美元流量账单。

5.2 安装 Ollama 并验证服务

Ollama 的安装很简单,Linux 上执行一行脚本:

curl -fsSL https://ollama.com/install.sh | sh

安装完成后,执行ollama serve启动服务。默认监听 127.0.0.1:11434,只允许本机访问。这时你用 RestClient 或浏览器打开http://127.0.0.1:11434,会返回Ollama is running的提示。

要拉取一个模型,比如千问 7B 的量化版:

ollama pull qwen2.5:7b

拉取完成后,运行:

ollama run qwen2.5:7b

直接在终端对话测试。确认能正常输出后,再用代码方式测一下 API 是否通:

curl http://127.0.0.1:11434/api/generate -d '{ "model": "qwen2.5:7b", "prompt": "你好,请介绍一下你自己", "stream": false }'

如果能正常返回 JSON,说明本地推理链路已经通了。

5.3 开放局域网访问

要让同一局域网的其他设备访问这台机器的 Ollama,需要修改服务监听的地址。在 systemd 服务里设置环境变量:

sudo mkdir -p /etc/systemd/system/ollama.service.d sudo tee /etc/systemd/system/ollama.service.d/override.conf > /dev/null <<EOF [Service] Environment="OLLAMA_HOST=0.0.0.0:11434" EOF sudo systemctl daemon-reload sudo systemctl restart ollama

改完后,在另一台电脑上用http://192.168.1.100:11434测试。如果访问不了,先检查防火墙:

sudo ufw allow 11434/tcp

这个操作非常实用。很多人把 Ollama 装在主机上,想在笔记本上远程调用。如果不改监听地址,笔记本永远连不上。

5.4 配置 Nginx 反向代理与访问控制

如果你要在团队里分享这个 Ollama 服务,不想让所有人都知道 IP 和端口,也不想裸奔,可以用 Nginx 反代加一层密码保护。

安装 Nginx 后,在/etc/nginx/sites-available/ollama写入:

server { listen 80; server_name your-domain.com; auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; location / { proxy_pass http://127.0.0.1:11434; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

创建密码文件:

sudo apt install apache2-utils sudo htpasswd -c /etc/nginx/.htpasswd yourusername

然后启用配置并重载 Nginx。这样外部访问就是先过 Nginx 的认证,再到 Ollama,安全性和可管理性都提升一个档次。

5.5 用 Docker 部署时的网络资源配置

不少人喜欢用 Docker 跑 Ollama,比如:

docker run -d -v /ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

Docker 部署时,网络模式默认是 bridge,容器内端口映射到宿主机。需要注意的一点:如果容器内 Ollama 要访问外部对象存储或者模型仓库,需要确保宿主机能正常出网。还有,容器内显存映射是自动的,不需要自己配置 GPU,但前提是安装了 NVIDIA Container Toolkit。

如果你想给容器分配更多网络带宽,可以用--network host模式,让容器直接使用宿主机网络栈,减少一层 NAT 转发延迟。但 host 模式下端口管理会更麻烦,适合单机测试,不适合多服务并存。

6. 大模型网络的未来方向与个人学习路线建议

讲了这么多,回头看会发现:大模型的网络基础设施,本质上是一个“如何让更多 GPU 高效协同”的问题。解决这个问题的思路,正随着模型规模变大而不断演进。

6.1 超节点架构与液冷机房

大厂最新的方向,是从“几千台服务器松散连接”走向“超节点”。超节点可以理解为一个巨大的逻辑 GPU 系统,内部用超高带宽的光互连,外部再用传统网络连接多个超节点。这种架构下,单卡之间的通信延迟可以低到几微秒级别,训练万亿模型变得相对可控。

超节点对机房基础设施要求也变了。功率密度大增,风冷压不住,必须上液冷。液冷不仅给 GPU 降温,也给交换机和光模块降温。光模块对温度极其敏感,温度一高,信号完整性下降,误码率上升,网络质量直接崩盘。

所以你会看到,大模型网络建设早已不是纯 IT 问题,而是暖通、供电、网络、算力四维协同的系统工程。这个认知对你面试或者做规划都会有帮助。

6.2 从工程师视角怎么入门网络方向

如果你对这个方向感兴趣,我建议按这个顺序来:

  1. 先会单机跑模型,把显存、内存、CPU 的分配搞明白。
  2. 再用 NCCL 跑多卡训练,理解单机多卡的通信。
  3. 然后尝试双机训练,配置 RoCE 或 InfiniBand,跑通一个小规模集群。
  4. 最后学习网络拓扑设计和性能调优,比如看 NVIDIA 的 HPC 网络文档,了解 Fat-Tree 和 Dragonfly 的差异。

每一步都不需要一开始就啃论文。先从“跑通”开始,再逐步优化。很多概念比如 PFC、ECN、拥塞控制,等你真正在集群里遇到问题时再去查,印象会深刻得多。

工具方面,个人推荐掌握这几个:

  • ibstatib_write_bw:查 InfiniBand 状态和测带宽。
  • perfnvidia-smi:查 GPU 利用率和通信状态。
  • ethtool -S:查网卡丢包和错误计数。
  • tcpdump:抓包定位故障。

核心思路就一条:遇到性能问题,先用这些工具做“二分定位”,先确认是计算瓶颈还是网络瓶颈,再聚焦排查。不要一上来就怀疑模型代码,很多问题其实在网络配置。

6.3 最后几句实在话

大模型网络基础设施这个话题,门槛确实不低,涉及硬件、协议、操作系统、分布式系统多个层次。但它的底层逻辑并不复杂:无非就是在低成本的前提下,把数据尽量快地从一个计算单元搬到另一个计算单元。

我见过太多人花几十万买 GPU 服务器,结果网络买的是千兆网卡和低端交换机,训练性能惨不忍睹。也见过有人用几块钱的网线跑百G传输,结果误码率飙升、训练反复中断。网络这东西,看着不起眼,但它决定了大模型集群的上限。

如果你现在还是零基础,别慌。先跑通一个单机 Ollama,感受一下模型推理的完整流程。然后找两台机器,试着把模型加载到 A 机、从 B 机发请求,体会一次真正的“分布式调用”。从单机到多机,从局域网到跨机房,每一步踩过的坑,都是最好的教材。希望这篇文章能帮你少走一点弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 12:03:45

CPU指令生命周期:乱序执行、多发射与SMT深度解析

做底层性能优化久了&#xff0c;你会发现一个问题&#xff1a;CPU 明明叫“中央处理器”&#xff0c;可真正把指令喂进去之后&#xff0c;它内部发生的很多事情&#xff0c;和你从课本上学的“按顺序执行”完全是两回事。指令在流水线里的实际路径&#xff0c;更像是一条拥挤的…

作者头像 李华
网站建设 2026/9/6 12:03:45

770B MoE开源模型Hy4 preview:本地部署与WorkBuddy实战

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

作者头像 李华
网站建设 2026/9/6 12:00:25

无线电规则2020条款卷实用指南:频率划分与应用场景全解析

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

作者头像 李华
网站建设 2026/9/6 11:59:59

GLM-5.3-Flash免费接入Cline:配置指南与真实体验

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

作者头像 李华
网站建设 2026/9/6 11:56:28

把AI Agent调教成专属数字助理:上下文记忆与任务流实战指南

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

作者头像 李华