AIGC文本检测攻防战:从特征工程到多引擎融合的企业级架构

发布时间:2026/10/20 1:50:39

AIGC文本检测攻防战:从特征工程到多引擎融合的企业级架构 聊AIGC内容检测很多人第一反应是跑个分类模型把AI写的挑出来真正做过企业级系统之后你会发现这事远比想象中复杂。我最近一年大部分精力都投在一套AI生成文本识别系统上从数据标注、特征工程、模型训练到API化部署全链路走了一遍过程中踩了不少坑也摸清楚了一些规律。这套系统的核心价值其实很直白帮内容平台、审核团队和合规口的人判断眼前这段文字到底是不是机器生成的。听起来是个二分类但拿到线上数据就明白真实场景里根本没有干净的人类文本和AI文本——有人用AI打草稿再手改有人故意让AI模仿特定文风还有人专门研究怎么绕过检测器。所以最后做出来的是一个多引擎融合的分层系统不是单一模型。这篇文章我把整个攻防战的思路、技术选型、实操流程和排查经验完整拆出来给准备做类似系统的团队一个可以直接抄作业的参考。1. AIGC内容检测为什么是个攻防战场而不是分类任务1.1 企业为什么突然需要这个东西需求爆发的直接原因是AIGC文本已经渗透到几乎所有线上业务。内容社区里每天涌入大量AI生成的长文和回答电商平台出现批量生成的虚假评价招聘平台收到用AI套话凑出来的简历教育机构需要甄别学生提交的作业和论文是否由模型代写。我接触过的一家内容平台上线检测系统之前后台人工审核每天要处理上万条疑似AI内容审核员全靠第六感判断标准完全统一不起来。所以企业的核心诉求并不是学术上区分人机而是要在业务风险上做拦截虚假评论影响消费者决策灌水内容拖垮社区质量批量生成的违规文本绕过审核规则这些都会直接转成经济损失和品牌风险。检测系统要解决的是能不能在可接受的误报成本下把机器文本从业务流里筛出来。1.2 真实场景里的三类使用方我总结下来使用方大概分三类。第一类是运营和审核团队他们要的是标记证据不是光给个概率而是要能解释为什么判定方便人工复核。第二类是风控和数据团队他们关注召回率允许一定误报因为后续还有人工兜底漏过去才是大问题。第三类是合规和法务他们需要审计日志和完整的判定依据要能追溯某条内容是什么时候、用什么版本模型、在什么阈值下被标记的。这三类需求直接影响了系统设计。审核团队逼着我把置信度区间和特征明细输出出来而不是抛一个0.87就完事风控团队要求支持批量离线扫描处理历史存量数据合规那边要求所有判定有版本记录模型更新不能影响线上那个昨天还准、今天不准的体验。做企业级系统本质上是在给不同角色做可分发的检测服务架构上必须从一开始就考虑这些。1.3 核心挑战检测是持续对抗不是一次性建模我见过很多团队踩同一个坑拿一个公开检测数据集跑出98%的准确率就以为系统做完了。实际上线之后新版本生成模型一发布检测率立刻掉到能看但不够用的水平用户开始用改写工具、翻译工具、穿插错别字等手段对抗判断就越来越模糊。检测本质上是一个对抗博弈问题。生成模型在进化用户的规避手段也在进化检测系统必须持续用新样本重新训练、持续做对抗评测。这套系统在我这里之所以叫攻防战就是因为它的生命周期是动态的数据飞轮、模型更新、攻防测试三个环节不断循环。理解了这一点后面所有架构设计都是围绕怎么让系统能快速迭代展开的。2. 四大技术路线与核心指纹原理2.1 统计指纹困惑度、突发性与概率分布偏差最经典的检测思路是统计AI生成文本的概率特征。语言模型生成token时每一步都会输出一个词表上的概率分布人类写作时选词的意外程度和模型选词的平稳程度存在统计学差异。核心指标是困惑度计算方法是把文本逐token输入一个开源语言模型取每个token交叉熵的平均值再取指数。直觉上理解困惑度越低说明这段文本越是模型觉得顺的文本而模型生成的文本恰恰最符合模型自己的预期。另一个关键指标是突发性中文可以理解成文本的波动程度。人类写作会有明显的起伏突然用了一个生僻词某句话很跳跃某个专用名词反复出现而AI生成的内容整体概率分布非常均匀词与词之间的惊喜程度差异很小。实操里我常用一组指标困惑度、困惑度方差、词表排名均值、排名方差、n-gram重复度、停用词比例。把这些特征喂给树模型单靠统计特征就能拿到不错的AUC。2.2 分类器路线让模型学会看痕迹统计指纹之外更直接的方法是训练一个分类器在大量人工标注和AI生成样本上学出人机差异的高维模式。一般来说基于编码器架构的文本分类模型效果最好它会把整段文本编码成向量再通过分类头输出AI生成的概率。这类模型能捕捉到统计特征抓不住的细节比如语气、逻辑链、连接词使用习惯、信息密度分布。我在实验里发现分类器对人类撰写的优秀文章和AI生成的高质量文章区分度尤其好因为编码器对句子之间的信息冗余和承接方式非常敏感。缺点是它需要大量贴近目标领域的训练数据换个领域效果会明显下降新闻文本上训练的模型拿去判断聊天记录分数就没那么可信。所以企业落地时我不建议只靠单分类器它会成为攻击者的活靶子。2.3 零样本检测与水印方案零样本检测的思路是不训练直接判断针对的是来不及收集样本的新模型。比如基于扰动一致性的方法把原文的一部分token随机遮挡或替换再观察生成模型输出概率的变化AI生成的文本在扰动后概率分布剧烈波动人类写的文本相对稳定。这类方案最大的价值是应对新模型初期的冷启动缺点是计算开销大处理一段几百字的文本要跑多遍推理。水印方案走的是另一条路生成阶段就在文本里埋信号检测阶段只需要查信号。具体做法是在模型采样时把词表按随机种子分成白名单和黑名单偏向选择白名单里的token检测时统计白名单token的出现比例是否显著高于随机水平。这个思路准确率极高几乎可以做到零误报但它依赖生成方配合只能检测用了同款水印模型生成的文本管不了其他来源的AI内容。企业级系统会把水印检测作为可选的强验证手段嵌入而不是主引擎。2.4 单一方案为什么不够稳我刚开始也纠结过用哪条路线后来发现这不是选择题而是拼图题。统计指纹快、解释性好但改写攻击一上就崩分类器准、能捕捉深层语义特征但跨领域和对抗样本下会掉点零样本方案稀罕但慢水印强硬但覆盖面窄。真实线上样本什么样都有有人工润色的AI内容有翻译过来的AI内容有故意插错别字的AI内容还有短到只有十几个字的评论。单一方案在每个场景上都有致命短板。最后我做的是多引擎融合统计特征给树模型出一个分数深度分类器出一个分数规则引擎处理短文本和特殊字符再送进一个校准层做最终融合。这个架构牺牲了一点推理性能换来了整体稳健性后面再细讲。3. 企业级系统的分层架构设计3.1 架构轮廓系统整体分成五层接入层、预处理层、特征与推理层、决策层、审计与回流层。接入层统一接收HTTP请求支持单条实时检测和批量离线扫描。预处理层做文本规范化包括去重、段落分割、去噪、错别字归一化等。特征与推理层是最重的部分并行跑统计特征计算、分类模型推理和规则引擎。决策层拿到所有引擎的输出后做置信度融合和阈值判定输出最终结果——不是简单的是/否而是概率、置信区间、各引擎分数明细和触发规则条目。审计与回流层把每次判定的特征快照、模型版本、结果都存下来为后续人工复核和模型更新留数据。当时架构上踩过的一个坑是把特征计算和模型推理混在一个服务里结果特征版本升级导致线上缓存全部失效。后来把特征服务拆成独立模块按特征组合版本管理模型服务只消费特征向量这个坑才算填平。3.2 特征层统计指纹的工程化实现特征层在企业系统里比模型层更关键因为它决定解释性和迭代速度。我在工程化时把所有统计指纹封装成特征算子按场景分三组词汇特征组停用词比例、生僻词比例、词性分布、标点密度、平均句长、句子长度标准差概率特征组困惑度、困惑度标准差、词表排名均值、Varentropytoken对数概率的方差、top-k命中率结构特征组n-gram重复度、段落连贯性、主题一致性、首尾句相似度概率特征需要一个固定版本的语言模型来做底层打分器。我建议把底层语言模型冻结版本因为如果频繁更换底层模型特征分布会漂移后续融合层全部要重新校准。特征计算结果全部缓存同一段文本重复检测时直接命中缓存节省大量推理成本。短文本是个特例。少于50字的文本困惑度统计意义很弱我会切到规则引擎检测模板化句式、AI常用连接词、无效重复结构。这些规则特征在短评、留言、客服会话里非常有效。3.3 模型层多引擎融合的信任机制模型层我保留了三个并行的引擎而不是训练一个超级大模型。第一引擎是LightGBM树模型输入所有统计特征输出一个概率。这个模型擅长捕捉特征间的非线性关系训练快、可解释性强线上出问题能快速定位。第二引擎是深度文本分类模型骨干网络用预训练编码器加分类头输入原文做端到端判断。它对语义层面的AI痕迹更敏感比如内容空洞、逻辑跳跃、套话连篇。第三引擎是零样本检测器只在常规模型置信度不高时才会被激活避免主链路被拖慢。三个引擎的输出不是平均而是再训练一个小型Logistic回归做融合融合权重根据验证集动态调整。关键技巧是给融合层加信任约束如果三个引擎分数差异过大说明样本落在模糊区系统会强制降级为存疑而不是强行给结论。这个设计让误报率降了大概三成。3.4 决策层阈值不是拍脑袋定的阈值设置是我见过最容易被低估的环节。我一开始用全局固定阈值0.5上线第一天就被审核团队投诉误报把大量人类写的短评标成AI。后来按场景拆分阈值内容社区场景误报成本高阈值拉高比如0.85以上才标记并要求至少两个引擎确认审核场景漏报成本高阈值降到0.6AI嫌疑内容一律进人工复审队列风控批量扫描场景用0.5作为初筛线配合规则引擎做全量预筛每个场景的阈值不是一次定死而是用验证集算误报率和召回率的权衡曲线再结合业务同学给的成本参数选点。我还会输出置信区间比如AI生成概率0.72置信度88%这样下游系统可以做更细腻的处置。决策层必须保留可解释的输出审核员点开详情能看到各引擎分数、命中的规则和关键特征值这样才能真正信任系统。4. 从数据到API的完整落地流程4.1 数据集构造与标注规范数据质量决定检测系统的上限。我最初从公开检测数据集开始很快发现线上场景跑不动后来自己搭了一套数据流水线。数据集分四类纯人类撰写、AI直出、AI生成后改写、AI生成后人工润色。前两类容易收集后两类必须自己造。AI直出数据我用多个主流生成模型在不同温度参数、不同提示词策略下批量生成覆盖新闻、评论、散文、问答、代码注释等多个体裁。改写数据我做了两条路径一条用改写模型自动改写一条找标注员手工润色。手工润色的样本尤其值钱它们是攻击性最接近真实用户的数据。标注规范上我要求两个标注员独立标注分歧样本进入仲裁池。四分类的界定标准写成文档AI直出指没有任何人工编辑、可直接看到生成痕迹改写指用工具改写但保留明显AI特征人工润色指人改动较多、接近人类写作纯人类指没有AI介入。这个四分类让模型学到的不只是像不像AI还有污染程度。4.2 特征计算与模型训练训练前先做特征计算。我用一个开源语言模型计算每段文本的困惑度相关特征看一个简化版实现import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_name your-frozen-lm-tokenizer # 实际部署时替换为内部冻结的底层模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) model.eval() def compute_ppl_features(text, stride32): inputs tokenizer(text, return_tensorspt) token_ids inputs.input_ids[0] n_tokens token_ids.shape[0] log_probs [] for start in range(0, n_tokens, stride): end min(start stride, n_tokens) seg token_ids[start:end].unsqueeze(0) with torch.no_grad(): out model(seg, labelsseg) loss out.loss.item() log_probs.append(loss) avg_loss sum(log_probs) / len(log_probs) return {ppl: float(torch.exp(torch.tensor(avg_loss)).item()), ppl_var: float(torch.var(torch.tensor(log_probs)).item())}特征算完拼上词汇和结构特征训练LightGBM。我用的配置要点是类别权重调高AI直出和AI改写样本因为纯人类样本在业务分布中占比最高不调权重模型会偏向全判人类。深度分类模型的部分我直接用了预训练编码器加分类头在自建数据集上做全参数微调。这里有个经验不要只在验证集上追求准确率要在线上难样本集上反复验证。难样本集是我从过去误报和漏报里挑出来的真实case专门用来测试每个模型版本是否改善。4.3 服务化部署与发布流程模型和服务都稳定后我用FastAPI做了推理服务核心接口接收文本返回结构化结果。发布时走灰度流程先切5%流量观察指标再逐步放大。线上指标我主要盯三个覆盖率、误报率、平均响应时间。覆盖率指真正能判定的文本比例短文本和非常规文本可能出现无法判定误报率先以审核团队二次标记作为近似信号。灰度期间出了一次事故某个新模型版本对英文夹中文的文本特别敏感大量标记成AI导致审核队列爆掉。回滚之后我加了一条规则任何新模型版本上线前必须跑一遍覆盖业务主要场景的回归集包含至少5000条历史线上样本误报率相比当前版本不得上升超过0.5个百分点。这个门槛挡住了后面好几次不靠谱的模型更新。5. 攻防实战常见对抗手段与系统加固5.1 改写攻击最常见的低成本绕过改写攻击是我在真实数据里看到最多的类型用户把AI生成的段落丢给改写工具或者让AI换一种风格重写一遍。改写后的文本困惑度会明显下降单纯靠统计指纹判断会漏掉大半。针对改写攻击我加入了语义指纹比对把待检测文本embedding和已知AI风格模板库里的embedding做相似度排序如果高度接近某些改写模板就触发高概率标记。另一个有效特征是语义密度与信息冗余度的组合。AI生成内容经过改写后表面语言变了但信息增量仍然偏低整段话往往在重复同一个意思。我用了一个简单指标——把文本压缩成摘要再比较摘要和原文的语义重合度。人工改写通常会增加细节和实例摘要重合度不高AI改写往往是高重复度内容改名不换核摘要重合度偏高。5.2 降困惑度攻击压低概率特征对抗者知道检测器在用困惑度之后会策略性地选择低概率词、插入人类化的语气词、故意写断句、加口头禅。这招确实能骗过纯统计引擎但对深度分类器效果有限因为分类器看的是整体语义模式不是单点统计。我在系统里加了专门针对这类攻击的反制层对文本进行规范化处理把语气词、口头禅、错别字归一化再重新计算特征。也就是说攻击者插入的干扰噪声会被预处理层剥掉露出底层的生成痕迹。针对降困惑度攻击我的实验结论是不要把阈值设死在困惑度的绝对值上改用全局分布对比。统计线上历史文本的困惑度分布定位当前提交文本在分布中的百分位。AI文本哪怕经过降困惑度处理它在人类文本分布里的位置仍然有明显偏移特别是在长文本上。5.3 翻译与跨语言攻击本地化绕行跨语言攻击的思路是先用AI生成中文翻成英文再翻回中文或者直接用其他语言生成再翻译。翻译会彻底扰乱token级统计特征困惑度和突发性几乎全部失效。这也是我前几个版本系统漏报最严重的攻击方式之一。处理跨语言攻击我引入了多语言编码器的嵌入特征。翻译后的文本在语义层面仍然保留很多AI固有的内容特征比如结构过于工整、信息密度均匀、观点衔接顺滑。用多语言嵌入模型得到文本向量再训练一个专用的跨语言AI内容判别器能抓住这些与具体语言无关的通用特征。实验里这个判别器对翻译攻击的召回率提升了十几个点。5.4 主动防御对抗样本自更新与红队评测攻防是动态过程系统必须有自己的红队机制。我每两周固定做一次对抗评测用市面上最新的生成模型和改写工具生成攻击样本跑一遍当前检测系统统计检测率下降幅度。这个环节一开始是手工做后来变成了自动化流水线攻击工具列表 提示词模板库 批量评测脚本。对抗样本不会全部直接进训练集因为有些攻击方式只在特定prompt下成立连AI生成的本质都没有改变。我会做一个筛选凡是能被现有系统正确识别的样本丢弃识别失败的样本按攻击类型分层抽样进入下一轮训练数据。这样数据飞轮滚起来之后系统对新攻击方式的衰变速度明显变慢。还有一招是主动混淆训练随机对训练数据中的AI样本做抵抗性扰动比如插入错别字、打乱段落、混入人工句子让模型在训练阶段就见过各种污染版本。这招牺牲了一点干净样本上的准确率但对真实场景的鲁棒性提升非常值。6. 常见问题与排查技巧实录6.1 误报率偏高人类文本经常被标记我们遇到的第一个大问题是专业领域的人类文本被误报成AI典型场景是医学论文、法律文书、技术文档。这些文本本身就句式工整、术语密集、几乎没有口语化表达从统计特征看和人机生成的标准感很像。排查发现是训练数据里缺少专业语料。解决办法是扩充人工采集的领域语料按行业做细分模型或做领域自适应同时降低纯粹的困惑度特征权重。上线后这类误报减少了一半以上。事后复盘任何检测系统都需要针对业务领域做数据补充通用模型是打不了天下的小白鼠。6.2 短文本检测不可靠完全没有区分度一句话评论、十几个字的留言特征太少统计和模型都跑不出可信结果。我的解决办法是双通道对短文本不走深度分类器而是走规则引擎专挑模板化表达和AI常用句式的指纹比如总的来说综上所述这类高频套话配合IP和设备维度的用户历史行为这个用户过去是否大量提交疑似AI文本做综合判断。规则命中只是线索权重很低主要用于初审排序让疑似队列排到人工面前。短文本场景里不误伤人类真实随手发言永远是优先级最高的指标。6.3 新模型发布后检测率断崖式下降某次一个新版本的大模型发布后我们检测器对它的直出文本识别率从95%掉到70%出头。原因是新模型在训练数据、输出风格上都迭代了旧模型学到的分布发生了变化。排查过程是先抓一批新模型输出对照特征分布发现困惑度区分度明显下降然后确认不是特征计算bug而是生成分布确实偏移。解法是把新模型生成的样本快速入库按比例重训深度分类器同时把底层冻结模型升级成新版本并重新计算全部历史特征。这个教训告诉我们底层特征模型的版本管理要和业务模型解耦否则每次生成模型迭代都要重跑全部数据。6.4 工程侧故障特征版本与缓存过期功能上线初期我碰到过特征版本不一致引起的诡异问题同一段文本A机房返回AI生成概率0.8B机房返回0.3。排查半天发现是两个机房的代码部署时间不同一个服务还在用旧特征组合另一个已经切到新特征组合。后来我给所有特征组合加版本号缓存key里带版本ID每次特征变更强制生成新版本缓存旧版本缓存自动失效。现在再也没出现过跨机房的特征漂移问题。这类问题表面上看起来是检测准确性bug实际上是工程发布流程漏洞做企业级系统时一定要把模型、特征、阈值三个版本全部纳入发布管理。最后单独列一个排查速查表团队在线遇到问题可以先对着表定位症状可能原因快速排查方法常用解法误报率高领域语料缺失阈值过低抽样检查误报文本的特征分布补充领域数据按场景调阈短文本无区分度特征不稳定统计意义弱看文本长度和特征值是否异常换规则引擎用户行为特征对新模型识别率低特征分布漂移模型过旧跑新模型样本的困惑度分布刷新底层模型重算特征跨机房结果不一致特征版本不一致缓存未同步检查特征版本与缓存key特征版本化缓存强制过期改写样本漏报单引擎被绕过看改写样本的各个引擎分数加入语义指纹比对扩充改写样本这套系统从立项到稳定运行我最大的感受是检测靠模型落地靠工程生存靠数据飞轮。上线只是开始每一轮新的生成模型发布都是一次小考。如果让我给正在做的团队一个建议我会说别花太多时间追求单一指标的极致把精力放在数据流水线、对抗评测、版本管理这些能持续迭代的基础设施上。系统不是建完的是养出来的。
延伸阅读

更多相关文章

2026/10/20 1:50:39

智能驾驶SoC选型:系统级约束驱动的车规芯片决策方法

/* 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 1:45:39

如何用oneshot提示词工程让LLM精准分析长篇财报?

先说明一下背景。手上拿到一份上市公司年报,是 PDF,转出来之后大概有二十万字。放进对话窗口里,模型一开始还能回复,聊到中间就明显“失忆”了——前面的数据忘了,后面的表格没读进去,最后甚至直接编了一个…

2026/10/20 2:55:42

TensorRT实战手册:GPU推理优化与INT8量化完整指南

要说GPU推理优化,TensorRT是绕不过去的那一个。框架跑训练、TensorRT做上线推理,这个分工在工业级落地里已经成了默认组合。简单讲,TensorRT是一个专攻推理阶段的高性能优化引擎,它把训练好的模型拿到手,通过层融合、精…

2026/10/20 2:55:42

Python工业相机实时画面获取实战:SDK配置到稳定出图

最近有个项目要在 Python 里把一台工业机器人相机的实时画面快速调出来。听起来真不算难:SDK 一装,OpenCV 一显示,不就成了吗?但真上手才发现,从设备枚举到图像格式转换,每一环都藏着能把人绊倒半天的细节。…

2026/10/20 2:55:42

Tomcat 9与Tomcat 11同机共存:端口、环境变量与配置实操

最近接手了一个交接过来的老项目,用的还是 Tomcat 9,而新起的服务又要求跑在 Tomcat 11 上。开发机就一台,来回卸了装、装了卸,折腾两天后我实在忍不了了——干脆研究了一下怎么让两个版本在同一台电脑上和平共处。这篇文章就是把…

2026/10/20 2:55:42

CNN-RNN-Attention时间序列预测实战:从数据处理到模型调参

前阵子有个朋友做某园区的能耗预测,单用 LSTM 效果一直卡在同一个台阶上,尖峰时刻总是慢半拍。我让他试试在 LSTM 前后分别加一层卷积和注意力,也就是标题里说的 CNN-RNN-Attention 结构,同一份数据上误差肉眼可见地往下走。时间序…

2026/10/20 2:55:42

MATLAB实现P-III型分布水文频率计算与适线法

简介:这份资源面向水文统计、工程计算与数据分析领域的学习者,提供在MATLAB中实现皮尔逊-III型(P3)分布的完整代码与示例数据,帮助完成数据建模、预测分析与不确定性评估。压缩包共2个文件,包含1个m脚本与1…

2026/10/20 2:50:42

别让向量检索背锅:GraphRAG与Agent调度器重塑RAG检索架构

做RAG项目的同学,最焦虑的时刻往往不是模型回答错了,而是检索回来的上下文看起来都对,模型却给出了一个完全编造的数字。最近我把一整套知识问答系统的检索层重构了一遍,核心思路就是标题里那句话:别让向量检索背上所有…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05: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/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

/* 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 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑