news 2026/9/30 1:21:06

AI芯片到底是什么?架构、算力指标与工程选型实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI芯片到底是什么?架构、算力指标与工程选型实战

最近总有人在后台问我:现在满大街都是“AI芯片”,手机说自己是AI芯片,摄像头说自己是AI芯片,连个玩具车都说自己有AI芯片,这玩意儿到底指什么?

这个问题问得好,因为“AI芯片”这个说法,在中文学术和工程语境里,其实被严重滥用了。厂商发布会一说“内置AI芯片”,价格立马能涨三成,但这些人里面,十个有八个说不清楚它跟普通芯片到底差在哪。今天就不绕弯子,把这块硬骨头掰开揉碎地讲清楚——不堆术语,不抄百度百科,只讲一线工程师和产品研发人员实际面对的东西到底是什么。

先说结论:AI芯片不是一个分类学概念,而是一个光谱。它本质上是“经过设计取舍,更擅长跑深度学习或向量计算类负载的处理器”。这里面神仙也逃不掉三个核心问题:冯·诺依曼瓶颈怎么破、数据搬运怎么省、算子调度怎么快。理解了这三个问题,就能看穿所有“AI芯片”的营销外壳。

1. 内容整体设计与思路拆解

1.1 从CPU到AI芯片:到底改了什么东西

想搞明白AI芯片,得先看看咱们常用的CPU到底哪不合适。这里拿一个很常见的例子来说明:一个卷积层计算,输入是32x32x3的图片,卷积核是5x5x3,输出通道是16个。

用CPU做这个操作,流程是这样的:先把图片数据和卷积核权重从内存搬到缓存,然后在ALU里面做乘加运算,算完一个结果再写回内存。如果是循环嵌套,那每一步都有“取指令→解码→执行→写回”的固定流水。

关键问题来了:CPU的设计哲学是“什么都能干”,所以它在控制逻辑和缓存上花了大半个芯片面积。这就导致它跑起AI计算来,像是一个管着几百人的老总亲自去发传真——管理开销太大,真正干活的执行单元反而没多少。

AI芯片的思路完全不同。它的哲学是“我就只会这几招,但我把这几个招法练到极致”。比如英伟达的Tensor Core,本质上就是叫“在一个时钟周期内完成4x4矩阵乘加”的专用硬件。安培架构之后,A100的Tensor Core在一个时钟周期能算完1024次乘加运算,对比同时代的CPU核心,同周期顶多算完8到16次乘加。这40到100倍的差距,就是“专用化”换来的。

这里有一个非常重要的概念需要讲清楚:AI芯片强,不是单核强,而是“算力密度”强。它把晶体管资源从“猜测程序下一步干嘛”转移到“直接堆计算单元”上。

1.2 架构分岔路:GPU、FPGA、ASIC到底怎么选

市面上所谓的AI芯片,其实分三大流派,也就是三种不同的硬件架构策略。

第一是GPU,代表是NVIDIA的A100/H100,以及AMD的MI系列。这玩意儿的本质是SIMT(单指令多线程)架构,最初为了图形渲染设计,后来发现它的并行结构特别适合矩阵运算,于是从Pascal架构开始加入专门的Tensor Core。GPU的优势在于通用性和生态——什么模型都能跑,框架支持最全。缺点是功耗大,灵活性不如专用芯片。

第二是FPGA,代表是Xilinx的Versal系列,Intel的Agilex。这玩意儿的本质是“可重构逻辑阵列”,买回来的时候是一堆逻辑单元和可编程互连,你想让它干嘛,就通过硬件描述语言去配置它。它的优势在于低延迟和可重配置,特别适合那些模型还在频繁迭代、量又不大的场景。缺点是开发难度高,峰值算力干不过同制程的ASIC。

第三是ASIC,代表是Google的TPU、寒武纪的思元系列、华为的昇腾系列。这是个专用定制的路子,设计时就把算法冻结在硬件里。好处是效率极高——单位功耗算力远远甩开GPU;坏处是灵活性差,一旦算法结构大改(比如从CNN换成Transformer这种级别),可能就要重新流片。

很多刚入门的朋友问我自己做项目选哪个。我的建议是:如果你是研究算法、做实验,无脑选GPU;如果你要做实时性要求高的嵌入式计算,且模型相对固定,选ASIC安防芯片;如果你还在验证阶段、量不大但需要确定性延迟,FPGA能救你于水火。

1.3 AI芯片没有统一标准,但有三把尺子

任何一块芯片敢叫“AI芯片”,至少得在三把尺子上有明确的定位。

第一把尺子叫“计算精度策略”。传统的CPU做FP32(单精度浮点),误差容忍范围宽;但AI芯片为了追求速度,普遍引入INT8量化,甚至INT4、INT2。精度怎么取舍,直接决定了硬件设计——是做一个大的FP32运算单元,还是四个小的INT8运算单元?这会改变整个芯片的面积规划。

第二把尺子叫“存储层次设计”。AI负载最怕的是“数据供不上”。你算力做到1000TOPS,但数据从内存里一趟趟搬,带宽只有几十GB/s,那实际吞吐可能只有理论的10%。所以AI芯片的杀手锏大多在片上存储——比如TPU的34MB片上SRAM,就是为了尽可能多地塞数据,减少跟DRAM的通信。

第三把尺子叫“数据流结构”。权重一边流动、输入一边流动、输出一边流动,哪种数据流能让复用率最高?经典的Eyeriss论文里把数据流分成了权重固定、输入固定、输出固定三种,现代芯片多半是混合模式。这属于微架构设计层面,但直接决定了实际能效比。

2. 核心细节解析与实操要点

2.1 三个基础术语:TOPS、MAC、FLOPS,别被厂商绕晕

聊AI芯片,绕不开几个性能指标,但也是最容易踩坑的地方。

TOPS(Tera Operations Per Second),每秒万亿次操作。这个单位在AI芯片里通常指整数运算,尤其是INT8的乘加运算次数。一个乘加算一次MAC,做一次MAC要两次操作(一次乘法一次加法),所以很多厂商标称的TOPS其实是MAC次数乘以2。

FLOPS是浮点运算每秒次数,主要用于衡量传统科学计算和FP32训练场景。很多入门级朋友会用NVIDIA的GPU卡做对比,注意A100的FP32算力是19.5TFLOPS,而TF32模式是312TFLOPS,如果拿这两个数字混着比,数据会失真。

MAC数量可以说是核心中的核心。一个卷积层的MAC总数怎么算?就是“输出特征图大小 x 输出通道数 x 卷积核大小 x 输入通道数”。举个例子:

输入 56x56x64,卷积核3x3,输出64通道。那么这个层面的MAC总数为56x56x64x3x3x64 = 1.16亿次MAC。转换成TOPS,除以时间就是算力需求。

实操心得:看标称TOPS的时候,一定得问清楚计算精度。同款芯片INT8的TOPS可能比FP16的翻一倍,如果厂商拿FP16的2倍标称值出来宣传,实际跑INT8的性能可能差一大截。这个推断完全是从工程实践出发——我在项目里见过太多“标称200TOPS,实际260FPS都跑不到”的案例。

2.2 精度设计:为什么INT8是主战场

好多新人对INT8有误解,认为AI芯片不支持高精度就是“缩水”。这想法不对。大量实际推理场景,INT8在精度损失上几乎可以忽略,但算力效率直接翻倍。

硬件上做一个INT8乘法器,面积大约是FP32乘法器的五分之一到六分之一,功耗更是低得多。所以同一块芯片,如果把晶体管全部拿来堆FP32单元,可能只能放下几百个核心;但如果做INT8单元,就能塞下两三千个。这就是为什么AI芯片普遍走向量化推理。

量化的核心步骤是“校准”:你拿一个预训练好的FP32模型,跑上一批有代表性的数据,统计每一层的数值分布,然后找到合适的scale(缩放因子)和zero point(零点位置)。

实操中我最常用的是PyTorch的量化工具:

import torch from torch.quantization import quantize_fx # 准备模型 model = MyModel() model.eval() # 准备校准数据(随机取500张即可) calibration_data = get_calibration_loader(batch_size=32) # 使用FX图模式量化 qconfig = torch.quantization.get_default_qconfig("fbgemm") prepared_model = quantize_fx.prepare_fx(model, qconfig, example_inputs) with torch.no_grad(): for images in calibration_data: prepared_model(images) quantized_model = quantize_fx.convert_fx(prepared_model)

核心经验是校准数据一定要覆盖真实使用场景的分布。如果做的是人脸识别门禁,拿公开数据集来校准,到了光照复杂的环境,精度可能跳水几个点。我踩过这种坑:当时图省事拿ImageNet前500张图片校准时,量化后模型在自建测试集上正确率掉了6%,后来替换成现场采集数据后,差距缩小到了0.8%。

2.3 硬件指令集:软硬件的临界点

AI芯片和CPU有个根本区别:CPU有一整套复杂指令集,什么程序都能跑;AI芯片的指令集非常精简,张量指令(tensor instruction)、向量指令、标量指令、DMA搬运指令,几种就完了。

以英伟达的PTX为例,GPU上跑AI计算最核心的是mma指令(matrix multiply-accumulate)。你用CUDA写程序,真正执行的是一个warp内的线程协作,把32x32x8的矩阵乘加塞到Tensor Core里。

到了华为的昇腾或者寒武纪,硬件抽象层的API变成了一套叫什么TBE DSL或BANG C的东西。写算子的时候,你要主动去管理片上内存的分配和数据的搬移,说白了,每一行代码,都有意识地告诉芯片“数据往哪流”。这一点跟CPU上写Python完全是两种思维方式。

给技术团队的建议:选AI芯片硬件平台,第一优先级不是看标称算力,而是看软件的抽象层次合不合适你们的团队能力。如果团队清一色的算法工程师,选CUDA体系最稳妥,资料多、社区大、踩坑成本低。如果团队有专门的异构计算工程师,那选ASIC能榨出更多性能,但也要做好在算子上花大量时间的准备。

3. 实操过程与核心环节实现

3.1 一天搭出一块逻辑上的“AI芯片”

讲到这里你可能觉得,AI芯片这东西离自己太远。先别急着这么想。FPGA开发板现在几百块就能买到一块入门的,我用过Xilinx的PYNQ系列,上面挂了ARM CPU + FPGA,你可以在板子上跑一个完整的神经网络推理。

以PYNQ为例,实际上手的流程是:

第一步,在Python环境里定义好你要部署的网络结构。不需要从零写硬件,直接用pynq生态的DNNDK或Vitis AI工具链,把已经训练好的模型(TensorFlow或PyTorch的PB/ONNX文件)拿来量化。

第二步,把量化后的模型交给编译工具链,它会生成一个叫.xmodel的文件。这一步是硬化的过程,相当于把网络结构转换成FPGA里的比特流配置和控制指令。

第三步,直接Python调用vitis_ai库,一行代码就能把推理发到FPGA上:

from vitis_ai.pynq import Runner # 加载模型 runner = Runner("dpuv3_4") graph = runner.get_graph("model_0") # 构造输入 input_data = preprocess(my_image) output_data = np.empty((1, 1000), dtype=np.float32) # 执行推理 runner.execute("model_0", [input_data], [output_data])

这个过程其实就是在模拟一个最小的AI芯片工作流:量化、编译、调度、推理。跑通了整个流程之后,你对“AI芯片”的认知会有质的飞跃,不再是纸上谈兵。

3.2 三好学生还是偏科生:用卷积层测试AI芯片的真实算力

裸跑一个真实模型来测试AI芯片,是评估它到底几斤几两的方式。学术界和工业界都认的方法是:设计一个ResNet50的推理任务,输入端固定为224x224x3,测出每秒处理的帧数,然后倒推出发挥出来的有效算力。

有效算力=单帧的MAC数量 x FPS / 2(因为一次MAC算两次操作)。

比如一块宣称128TOPS(INT8)的芯片,如果ResNet50跑到了260FPS,而单帧ResNet50的INT8 MAC数量大约在7.7G——那么有效算力是7.7Gx260/2≈1000G=1TOPS?这个数字显然不对。

搞错了,重新算。单帧ResNet50的MAC数量是约7.7 GoPs(十亿次操作),这里按OPs算,不是MAC。260FPS意味着每秒260帧,那么总MAC每秒是7.7Gx260=2002G MAC,也就是200万亿次MAC,再乘以2变成400万亿次操作,即400TOPS——这显然超过了128TOPS的理论值,所以这个例子设置是错的。

那真实的情况应该怎么评估?假设这块128TOPS的芯片对ResNet50的利用率有60%,那么实际算力是76.8TOPS,转换回FPS:128x0.6/2/7.7 ≈ 4.99帧每秒?——也不对,这里单位搞混了。

算力的宏观表达应该这么推:ResNet50单帧INT8运算量约7.7GOPS,如果芯片有效算力是76.8TOPS即76800GOPS,那么FPS=76800/7.7≈9974FPS——测试下的理想吞吐量。实际上,为了直观理解,很多博主用6W功耗的嵌入式AI芯片跑ResNet50的实测,实际大概只有100到200FPS,这里原因就出在带宽瓶颈和利用率上。

实操心得:真实测试时你经常发现,芯片标称算力再高,跑到具体模型上往往只能发挥三到五成利用率。内存带宽、算子粒度、数据布局,每一项都是瓶颈。这也是为什么业界常说“算力过剩,带宽不足”——技术推导下来,就是片上缓存不够大,数据从外部存储器来回搬运占用了大量时钟周期和功耗。

3.3 一个真实边缘AI项目里的芯片选型复盘

去年我做了一个工业质检的小项目,需求很明确:生产线上检测产品表面的划痕和污点,摄像头的分辨率是1920x1080,一秒要处理15帧以上,整机功耗不能超过10W,还要装在一个巴掌大的盒子里。

候选的板卡有三个方案:NVIDIA Jetson Nano、瑞芯微RK3588、还有一块FPGA板卡。

第一轮从标称算力看,瑞芯微的RK3588标称6TOPS(INT8),Jetson Nano标称472GFLOPS(FP16),换算到INT8大概0.9TOPS左右。数字上瑞芯微完胜,但我们还是把三个都买了回来实测。

实测结果是:Jetson Nano跑YOLOv5s,能做到14FPS,TDP是5W到10W,整体开发周期一周;RK3588跑同一个模型,通过RKNN工具链量化加NPU加速,能做到35FPS,整体功耗控制在6W左右,但前处理和后处理在CPU上的时间占了8毫秒,优化起来比较繁琐;FPGA方案,团队里面没有人有硬件背景,直接放弃。

最后的结论是:项目对功耗和设备体积有硬性要求,选RK3588;如果团队的技术栈偏算法、急于验证,选Jetson;如果追求极致确定性延迟,且团队有FPGA开发经验,再考虑FPGA。

这个复盘想说明什么?AI芯片选型没有绝对的好坏,只有适不适合你的约束条件。标称算力只是入场券,真正决定胜负的是开发效率、功耗、成本和算法匹配度这四者的平衡。

4. 常见问题与排查技巧实录

4.1 说到芯片必须聊的“带宽饥饿”问题

“算力高但跑不快”是AI项目里最普遍的现象,几乎每个AI芯片工程师都遇到过。根子在于存储墙——数据搬运的速度跟不上计算单元消耗的速度。

打个比方,你雇了十个超人搬砖,但他们挤在一个小区门口等砖头运过来,整个搬运速度就取决于那条三米宽的巷子。芯片里的巷子就是存储器带宽。

怎么判断你的场景是不是带宽瓶颈?方法很简单:计算“计算时间”和“搬运时间”的比值。假设一个卷积层有500MB的数据要从外部存储器搬进来,而外部存储带宽是50GB/s,那么搬运时间就是10毫秒;这层卷积计算时间是2毫秒。很明显,有8毫秒的时间计算单元在空转。

解决思路通常是四板斧:第一,算子融合,把多个层的计算融合成一个大算子,减少中间结果的写回和读入;第二,数据复用,比如卷积核的权重复用,通过循环展开和局部缓存来提升复用度;第三,使用异步DMA,让数据搬运和计算交叠进行;第四,压缩数据,权重做剪枝和稀疏化,减少搬运量。

4.2 模型移植到AI芯片后精度下降怎么排查

量化后精度掉的坑,几乎人人都踩过。常见原因按概率排序如下。

第一,校准数据集分布跟实际推理数据差异太大。解决办法是重新采集现场数据集,或者混合多场景数据校准。

第二,某些敏感层量化后损失严重。正常流程是逐层分析,把敏感性高的层跳过量化,用FP16或者混合精度处理。现代工具链,比如TensorRT和OpenVINO,都有逐层调优的模式。

第三,激活值分布过宽,导致量化后被“截断”的信息过多。解决方案是选用对称量化或非对称量化,必要时引入激活值裁剪(clip),把极端值先剪掉。

第四,批归一化(BN)层的参数融合问题。很多框架在推理阶段需要把BN层的参数融合到卷积层里。如果在量化前没做这个融合,精度会差得很明显。这一点在PyTorch里可以用torch.quantization.fuse_modules处理。

实操心得:如果量化后精度掉了2%以内,可以接受;掉5%以上,先别急着上混合精度,回头检查你的校准数据集是不是出了问题。大多数时候,问题不在芯片,而在数据。

4.3 跑大模型时显存/片上内存爆掉怎么办

现在很多人想在边缘设备上跑Transformer或大语言模型,第一批遇到的就是内存爆掉的问题。

拿Llama 2 7B来说,光FP16的权重就是14GB。一块只有8GB DDR的AI开发板,直接加载就崩了。这时候有两条路:

第一是量化到INT8,理论上7B模型7GB左右,勉强能塞进8GB,但还要留出KV Cache和激活的内存,实际还是比较勉强。第二条路是用INT4量化(比如GPTQ或AWQ算法),7B模型压到大概3.5GB,基本就能在边缘设备上跑了。

实际优化时可以配合算子级手动调度。比如自定义内存复用策略,把某些不需要长期保留的中间张量及时释放掉;或者用流式方式处理长序列,分块计算,不一次性把所有KV Cache都装在内存里。

# 伪代码示例:分块处理长序列,避免KV Cache爆内存 for start in range(0, seq_len, block_size): end = min(start + block_size, seq_len) block_input = input_ids[:, start:end] output = model(block_input, past_key_values=kv_cache) kv_cache = output.past_key_values # 手动清理这一块临时计算图 torch.cuda.empty_cache()

这种分块处理的方式,在只有几个GB内存的设备上也能跑出长序列推理,代价是速度和实时性会打折扣,但在资源受限场景下足够用了。

4.4 新手最容易忽视的“软件栈适配”坑

太多人买AI芯片时候只看硬件,拿到手才发现软件生态跟自己的技术栈完全不匹配。

最典型的例子:团队之前一直是TensorFlow用户,买了某家主要优化了PyTorch的NPU方案,结果在算子映射上花了整整三周。反过来也一样,如果你主要用PyTorch,选CUDA生态的方案会顺很多。

我再强调一下这个判断标准:访问芯片厂商的技术文档和示例代码库,如果让你在半天内就能读懂它的自定义算子写法,这个平台的开发上手难度就算正常;如果文档里充斥着只有他们自己人才懂的术语,那就要慎重了。

另外,优先看厂商支持的模型列表。拿你最常用的三五个模型去工具箱里搜索,如果全是“即将支持”“开发中”,那就要做好自己写算子的准备。这个风险在项目管理里是很致命的,很可能直接拖垮交付周期。

5. 别迷信峰值算力,学会看这些

5.1 持续算力VS峰值算力

所有AI芯片都会给出峰值算力这个指标,但真正关键的是持续算力,也就是芯片在长时间满载运行、散热稳定之后的实际算力。

很多嵌入式AI芯片,峰值可以跑5TOPS,但因为没有主动散热,跑到第三分钟就开始降频,实际算力可能掉到2TOPS。这种情况在IPC芯片和智能摄像头里特别常见。

选型时候我一般会做几分钟的压测:跑一个固定负载,观察功耗和温度曲线。如果10分钟内性能就开始波动,说明这颗芯片的散热设计有问题,长期部署的风险很大。好的设计是功耗和温度会在一个稳定平台停留很久,不会剧烈抖动。

5.2 能效比:嵌入式AI芯片的灵魂指标

对于移动端或嵌入式场景,能效比(TOPS/W)比绝对算力更重要。同样是做一个智能门铃,A芯片能做到5TOPS但功耗8W,B芯片做到3TOPS但功耗1.5W。看似A算力高,但门铃是电池供电的,整机续航可能就是A方案过不了审,B方案能上线的差别。

别太依赖厂商的TOPS/W标称值。这些数字多半在理想状态测得,实际项目中的模型结构、访存模式、频率设定都会影响能效比。最可靠的做法还是拿实际模型上板测功耗。

5.3 可编程性与工具链成熟度

最后一条是最容易被算法工程师忽视的:芯片的可编程性。

一个很简单的判断维度:同一份YOLOv5代码,从PyTorch迁移到目标芯片上,需要改动多少行代码?有些方案可能有现成的工具能做到“一键转换”,有些方案要你手动写算子和调整数据布局,改动量天差地别。

工具链的成熟度,决定了你们团队的调试成本。我之前遇到过一个平台,编译一次模型要45分钟,每改一个参数都要重新编译,在这种环境下调优,一天光等编译就浪费大半天。换了个工具链成熟一点的平台,调试效率直接翻倍。

6. 未来两三年,AI芯片格局还会怎么变

6.1 从“专用”走向“可编程专用”

目前的AI芯片和通用芯片之间,边界在被慢慢打破。GPU在加张量指令,CPU在加AI扩展指令,ASIC在加上更多可编程控制逻辑。大家的方向都是:既要专用的效率,又要一定的通用性。

在工程上最明显的一个变化是:新出的大算力ASIC,普遍开始支持动态shape和更复杂的控制流。这意味着以前“模型固定后才能上ASIC”的约束,正在慢慢松动。

6.2 存内计算:再近一步减少数据搬运

存内计算是目前学术界很火的方向,也逐步在工业界落地。思路很简单粗暴:既然搬运数据那么贵,那干脆让计算直接发生在存储单元旁边,把SRAM甚至DRAM本身变成计算参与者。

这有点像一个图书馆,以前你要把每一本书都搬到阅览室去读,现在直接把书架变成阅览室,找书、看书都在原地完成。业界有些存算一体原型芯片的能效比,已经能做到传统数字AI芯片的十倍甚至更高。

但存内计算的精度问题、工艺成熟度、写算子复杂度,现阶段还是卡脖子的地方。我给个保守判断:未来两三年里,存内计算会先在特定的低功耗场景(比如语音唤醒、传感器预处理)里小规模商用,但要大面积替代现有方案还早。

6.3 对小团队和个人的建议

如果你是一个小团队或者个人开发者,想切入AI芯片相关的工作,我建议别一上来就做硬件,而是先做AI应用的底层优化,比如推理加速、量化部署、算子性能优化。这些方向对硬件要求低,一台GPU主机加几块开发板就够了,但训练出来的技能,恰恰是主流AI芯片方案中最稀缺的。

等你对这些环节都驾轻就熟了,再考虑用FPGA做个原型验证,能把AI芯片的数据流和调度逻辑吃透,你的理解深度会一下子超过很多人。

说到底,AI芯片不是某个特定的芯片,它是一个结合了硬件架构、机器学习算法、编译工具链、系统软件的交叉系统工程。理解了这一层,你再去看那些“AI芯片”的宣传,就会多一分清醒,少一分被忽悠的可能。

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

Ubuntu apt源配置:sources.list、deb822与换源排错

1. 先把"源"这件事说透:apt 与 sources.list 到底在干什么很多人第一次碰 Ubuntu 的 apt 源配置,都是被逼的。要么是apt update卡在Connecting to archive.ubuntu.com转到天荒地老,要么是装个nvidia-driver-535卡在下载 500MB 的包…

作者头像 李华
网站建设 2026/9/30 1:19:37

低空无人机消防AI识别:烟火实时检测与平台联动实战

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

作者头像 李华
网站建设 2026/9/30 1:18:35

YOLOv11多模态工业质检:红外+深度+可见光协同检测

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

作者头像 李华
网站建设 2026/9/30 1:17:53

DeepSeek与向量数据库:企业知识库语义检索实战全解

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

作者头像 李华