首页/新闻资讯/正文详情

2026年AI API安全实战:成本、限流与密钥管理

发布时间:2026/9/25 6:45:00 来源:云帆数科 栏目:资讯中心
2026年AI API安全实战:成本、限流与密钥管理
1. 为什么2026年AI API的安全问题突然变得棘手过去两年我帮不少团队做过AI能力的接入和治理一个很明显的感受是AI API的安全问题已经从要不要管变成了不管就出事。2024年之前大部分团队接大模型API就是拿个密钥、写个请求、跑通就行没人太在意成本、限流和密钥管理。但到了2026年情况完全变了——模型调用量暴涨、多供应商混用、Agent自动调用链路变长任何一个环节没管住账单和事故就会同时找上门。先说成本。以前一个应用可能一天调几百次API现在一个Agent工作流跑一轮就可能触发几十次调用加上多轮反思、工具调用、上下文重放单次用户请求背后的API调用次数可能是表面的5到10倍。我见过一个团队做文档问答上线第一周账单就超了预算的3倍原因不是用户量大而是没有对单次请求的token消耗做上限控制一个超长文档被反复塞进上下文单次调用就烧掉几万token。再说限流。很多人以为限流是供应商那边的事自己不用管。但实际情况是供应商的限流是最后一道防线它只保证你不把对方打挂不保证你的业务不被自己的突发流量冲垮。我遇到过好几次某个定时任务和用户请求共用同一个API密钥定时任务一跑用户请求全部429体验直接崩掉。限流必须做在自己的调用层而不是依赖供应商。最后说密钥。这是最容易被忽视、但出事最严重的一块。我见过密钥被硬编码在前端代码里、被提交到公开仓库、被打印在日志里、被多个环境共用。2026年AI API密钥的价值比传统API密钥高得多——它直接对应真金白银的token消耗一旦泄露别人可以用你的额度跑自己的任务账单算你的。更麻烦的是很多AI平台的密钥权限粒度很粗一个密钥能调所有模型泄露一个等于全泄露。所以这篇内容我想把这三块——成本、限流、密钥——拆开讲清楚每一块都给出可落地的做法。不管你是刚接AI API的新手还是已经在管多个供应商的老手这三块都是绕不过去的基础设施。下面按我实际踩过的顺序来展开。2. 成本控制从月底看账单到调用前就拦住2.1 成本失控的三个真实来源成本问题最坑的地方在于它不像限流那样会立刻报错而是悄无声息地累积等到你发现的时候已经烧了一大笔。我复盘过几个超支案例来源基本集中在三个地方。第一个是上下文膨胀。很多团队做RAG或者多轮对话时习惯把历史消息全量带上或者把检索到的文档整篇塞进去。一次两次没问题但当对话轮次变多、文档变长token消耗是指数级上升的。我见过一个客服机器人单次请求平均消耗从最初的800 token涨到后来的12000 token就是因为历史消息没有做截断和摘要。第二个是重试放大。AI API的超时和失败率比传统API高很多团队会加自动重试。但如果没有对重试做成本控制一次失败触发三次重试每次重试又带着完整的上下文成本直接翻三倍。更糟的是有些重试逻辑写在循环里失败一次重试一次最后变成无限放大。第三个是模型选型错配。不是所有任务都需要最强的模型。我见过用顶级模型做简单分类任务的单次成本是轻量模型的20倍效果还没好多少。成本优化的第一步不是省钱而是把任务和模型匹配对。2.2 在调用层做token预算而不是在账单层做分析大部分团队的成本管理是事后分析——月底看账单发现哪个模型花得多然后下个月注意。这种做法的问题是滞后等你看到账单钱已经花了。我的做法是把成本控制前移到调用层在每次请求发出之前就估算token消耗超过预算直接拦截。具体怎么做以OpenAI风格的API为例你可以在调用前用tokenizer估算输入token数加上你设置的max_tokens得到这次调用的token上限。然后给每个用户、每个会话、每个任务类型设置不同的预算阈值。比如import tiktoken def estimate_cost(messages, modelgpt-4o, max_output1000): enc tiktoken.encoding_for_model(model) input_tokens sum(len(enc.encode(m[content])) for m in messages) # 假设输出按max_output算上限 total_tokens input_tokens max_output # 按模型单价换算这里用相对值示意 price_per_1k {gpt-4o: 0.005, gpt-4o-mini: 0.00015} cost total_tokens / 1000 * price_per_1k.get(model, 0.005) return input_tokens, total_tokens, cost这个估算不需要特别精确它的作用是在调用前给你一个拦截依据。你可以设置规则单次请求预估成本超过0.1元就拒绝或者单个用户当天累计超过5元就降级到轻量模型。这样成本就从不可控变成了可预算。注意不同供应商的token计算方式不一样有的按字符、有的按token、有的对中文和英文计价不同。估算逻辑要按你实际用的供应商调整不要直接套用。2.3 用缓存和降级把重复成本压下去除了拦截还有两个立竿见影的降本手段缓存和降级。缓存针对的是重复请求。很多AI调用其实是重复的——同样的用户问题、同样的文档摘要、同样的分类任务。如果你能把结果缓存起来命中缓存就不调API成本直接归零。我一般用两层缓存一层是精确匹配缓存key是请求内容的hash一层是语义缓存用向量相似度判断是否命中。精确缓存简单可靠语义缓存能覆盖换个说法问同一个问题的场景但要注意设置相似度阈值太高会漏太低会错。降级针对的是非核心请求。把请求按重要性分级核心请求用强模型非核心请求用轻量模型或者排队处理。比如用户主动发起的对话用强模型后台的批量摘要用轻量模型定时任务在低峰期跑。我见过一个团队把夜间批量任务从强模型换成轻量模型成本直接降了70%效果差异在可接受范围内。2.4 成本监控要看单位成本不是总成本最后说监控。很多团队只看总成本这个指标没有指导意义——用户涨了总成本当然涨。真正要看的是单位成本每次请求的平均成本、每个活跃用户的平均成本、每个任务的平均成本。这些指标才能告诉你效率有没有变差。我一般会记录每次调用的模型、输入token、输出token、耗时、是否命中缓存、所属任务类型。然后按天聚合看单位成本的变化趋势。如果某天单位成本突然涨了就去查是哪个任务、哪个用户、哪种请求导致的。这套监控不需要很复杂一张表加一个定时聚合脚本就够了关键是持续看。3. 限流与熔断别等供应商给你429才反应过来3.1 供应商限流和自建限流是两回事先澄清一个常见误解很多人觉得供应商有限流我不用自己做。这个想法很危险。供应商的限流是保护他们自己的不是保护你的业务的。它只保证你不把对方打挂不保证你的业务在突发流量下还能正常服务。我遇到过最典型的情况是一个应用同时有用户实时请求和后台定时任务两者共用同一个API密钥。定时任务一启动瞬间发出大量请求触发供应商限流结果用户请求全部被429前端直接报错。供应商的限流是按密钥维度算的它分不清哪些请求重要、哪些不重要一视同仁地拒绝。所以自建限流是必须的它的作用是在请求到达供应商之前就按你自己的优先级和配额做控制。供应商限流是最后一道防线自建限流是第一道。3.2 令牌桶和滑动窗口选哪个自建限流最常用的两种算法是令牌桶和滑动窗口。我实际用下来令牌桶更适合AI API场景原因是它允许突发。令牌桶的逻辑是桶里按固定速率生成令牌每个请求消耗一个令牌桶空了就拒绝或排队。它的好处是允许一定程度的突发——只要桶里有积累的令牌短时间内的突发请求可以放过去。这对AI API很重要因为用户请求往往是不均匀的偶尔会有小高峰如果限流太死正常用户也会被误伤。滑动窗口的逻辑是统计过去N秒内的请求数超过阈值就拒绝。它更精确但不允许突发容易在边界处误伤。我的做法是令牌桶做入口限流滑动窗口做用户级配额。入口限流控制整体速率防止把供应商打挂用户级配额控制单个用户的调用频率防止某个用户刷爆额度。两层配合既保护系统又保护公平性。import time from collections import deque class TokenBucket: def __init__(self, rate, capacity): self.rate rate # 每秒生成令牌数 self.capacity capacity # 桶容量 self.tokens capacity self.last_time time.time() def allow(self, n1): now time.time() # 补充令牌 self.tokens min(self.capacity, self.tokens (now - self.last_time) * self.rate) self.last_time now if self.tokens n: self.tokens - n return True return False这个实现很简单但够用。实际部署时如果你是多实例需要把令牌桶的状态放到Redis里用原子操作保证一致性。3.3 熔断不是可选项是保命项限流解决的是请求太多熔断解决的是下游挂了。AI API的可用性没有传统API那么稳偶尔会出现超时、5xx、响应变慢。如果没有熔断一个下游故障会拖垮你的整个调用链——请求堆积、线程占满、上游服务跟着挂。熔断的逻辑是当某个下游的错误率超过阈值直接切断对该下游的调用快速失败过一段时间再试探性放几个请求过去如果恢复正常就重新打开。这样做的目的是避免在已知故障的情况下继续浪费资源和时间。我一般用现成的熔断库比如Python的pybreaker或者Java的Resilience4j。配置上错误率阈值设50%熔断时间设30秒半开状态放3个请求试探。这些参数不是固定的要根据你的业务容忍度调整。核心请求可以设得更宽松非核心请求可以设得更严格。提示熔断和重试要配合使用但要注意顺序。正确的顺序是先熔断判断再重试而不是先重试失败了再熔断。否则重试会把已经故障的下游打得更惨。3.4 排队和降级比直接拒绝更友好限流触发之后直接返回429是最简单的做法但体验不好。更好的做法是排队和降级。排队是把超出的请求放进队列等有令牌了再处理。适合那些可以延迟但不适合丢弃的请求比如后台任务。队列要有上限满了还是要拒绝否则会无限堆积。降级是把请求转到备用方案。比如主模型限流了转到轻量模型主供应商限流了转到备用供应商。降级的关键是提前准备好备用方案而不是等出事了再临时找。我一般会配置一个降级链主模型 → 备用模型 → 缓存结果 → 友好提示。每一层都有明确的触发条件这样即使主链路出问题用户也不会直接看到报错。4. 密钥管理泄露一个等于泄露全部4.1 AI API密钥为什么比传统密钥更危险传统API密钥泄露最坏情况是别人用你的接口做点事损失有限。AI API密钥泄露损失是直接的钱——别人可以用你的密钥跑自己的任务token消耗全部算在你头上。而且AI API的调用量可以很大一个泄露的密钥在几小时内就能烧掉几百甚至几千块。更麻烦的是权限粒度。很多AI平台的密钥权限很粗一个密钥能调所有模型、所有接口没有细粒度的权限控制。这意味着泄露一个密钥等于泄露了你在这个平台上的全部能力。我见过一个团队把密钥写在前端代码里被人扒出来之后一夜之间账单涨了十几倍。所以AI API密钥的管理要比传统密钥更严格。核心原则是最小权限、最短有效期、最严隔离。4.2 密钥绝对不能出现在这些地方先列一下我见过的密钥泄露重灾区这些都是绝对要避免的前端代码不管是JS还是移动端只要密钥在客户端就等于公开。前端只能调你自己的后端由后端去调AI API。代码仓库硬编码在代码里的密钥一旦仓库公开或者被内部人员导出就泄露了。即使用私有仓库也不建议硬编码。日志很多团队在调试时会把完整请求打出来包括Authorization头。日志一旦被收集、转发、存储密钥就扩散了。配置文件明文把密钥写在config文件里跟着代码一起部署等于把密钥散播到每台机器上。聊天记录和文档把密钥发给同事、贴在文档里这些地方往往没有访问控制。我的一般做法是密钥只存在于密钥管理服务里应用启动时拉取内存中持有绝不落盘、绝不打印、绝不进代码。如果做不到密钥管理服务至少用环境变量并且确保环境变量不会被日志打印。4.3 用密钥管理服务做集中管理如果你们团队有一定规模强烈建议用密钥管理服务。它的核心价值是密钥集中存储、访问受控、轮换方便、审计可查。常见的方案有云厂商的密钥管理服务、HashiCorp Vault、或者自建的加密配置中心。选哪个看你的部署环境核心能力是一样的应用通过身份认证去拉密钥而不是把密钥写死在配置里。我实际用下来几个关键点要注意第一应用身份要能验证。不能谁都能拉密钥要有明确的身份认证机制比如IAM角色、服务账号、mTLS证书。第二拉取要有缓存和降级。密钥管理服务本身也可能故障应用要能缓存最近拉到的密钥在服务不可用时继续用缓存而不是直接挂掉。第三轮换要自动化。密钥轮换是安全的基本要求但手动轮换很容易忘、很容易出错。要能做到定期自动轮换并且轮换过程中应用无感知。4.4 多环境、多供应商的密钥隔离实际项目里你往往有多个环境开发、测试、生产和多个供应商OpenAI、Anthropic、国内厂商等。这时候密钥隔离就很重要。环境隔离开发、测试、生产用不同的密钥绝不共用。开发环境的密钥泄露了影响有限生产环境的密钥泄露了损失巨大。而且不同环境的配额和限流策略也不一样共用密钥会导致互相干扰。供应商隔离每个供应商用独立的密钥不要一个密钥走天下。这样某个供应商出问题不会影响其他供应商某个密钥泄露不会波及其他平台。用途隔离如果平台支持给不同的用途分配不同的密钥。比如用户请求用一个密钥后台任务用另一个密钥。这样即使某个密钥出问题影响范围也可控。我一般会维护一张密钥清单记录每个密钥的用途、环境、供应商、负责人、轮换周期。这张清单本身也要加密存储不能明文放着。4.5 密钥泄露后的应急处理即使做了所有预防也要准备好泄露后的应急方案。我处理过几次密钥泄露总结下来关键是快。第一步是立即吊销泄露的密钥。不要犹豫不要想着先观察一下直接吊销。吊销之后业务可能会短暂中断但比继续被刷要好。第二步是评估影响范围。查这个密钥在泄露期间被用来做了什么调用了哪些模型、消耗了多少token、有没有异常请求。这些数据要留档用于后续分析和追责。第三步是轮换所有相关密钥。如果泄露的密钥和其他密钥有关联比如同一个平台、同一个用途要一并轮换防止连带泄露。第四步是复盘和改进。查清楚密钥是怎么泄露的是代码问题、日志问题还是流程问题然后针对性改进。不改进的话下次还会以同样的方式泄露。注意密钥吊销和轮换要有预案不能等出事了才现查怎么操作。建议提前写好操作手册定期演练。5. 三块怎么配合一个可落地的调用层设计5.1 调用层的整体结构前面三块分开讲了但实际落地时它们是配合工作的。我一般会在应用和AI API之间加一个调用层所有请求都经过这一层由它统一做成本控制、限流熔断和密钥管理。调用层的结构大概是请求进来 → 身份识别和配额检查 → 成本预估和拦截 → 限流判断 → 熔断判断 → 密钥获取 → 发起调用 → 结果缓存 → 记录指标。每一步都可能拒绝请求但拒绝的理由和返回给用户的信息不一样。这个结构的好处是关注点分离业务代码只管调调用层不用关心成本、限流、密钥这些横切关注点。调用层统一处理策略调整只需要改调用层不用改业务代码。5.2 关键指标要持续记录调用层要记录足够的指标才能支撑后续的优化和排查。我一般会记录这些指标用途请求ID全链路追踪用户/租户ID配额和成本归属任务类型成本分析和模型选型模型成本分析和效果对比输入/输出token成本计算预估成本/实际成本成本监控是否命中缓存缓存效果评估限流/熔断状态系统健康度耗时性能监控错误码故障排查这些指标不需要一开始就全上但成本、限流、密钥相关的必须记录。没有数据就没法优化。5.3 策略要能动态调整调用层的策略不能写死在代码里要能动态调整。原因是成本预算会变、限流阈值会变、供应商会变、业务优先级会变。如果每次调整都要改代码、发版响应速度太慢。我的做法是把策略放在配置中心调用层定期拉取。策略包括各模型的单价、各任务的预算上限、各用户的配额、限流阈值、熔断阈值、降级链。调整策略只需要改配置不用发版。配置变更要有审计谁改了什么、什么时候改的都要记录。避免有人误改导致线上问题。5.4 从最小可用开始逐步完善最后说落地节奏。不要一上来就追求完美先把最小可用的调用层搭起来能跑通就行。然后按优先级逐步完善先做密钥管理安全底线再做限流稳定性底线最后做成本控制优化项。我见过一些团队一开始就想做全套结果复杂度太高迟迟上不了线。实际上密钥管理是最紧急的因为泄露的后果最严重限流是次紧急的因为不限流会拖垮业务成本控制是持续优化的可以慢慢来。每完善一块都要有对应的监控和告警。没有监控的优化等于没做因为你不知道它有没有生效、有没有副作用。6. 几个我踩过的坑和对应的解法6.1 限流阈值设太死正常用户被误伤早期我做限流时阈值设得很保守结果正常用户偶尔的突发请求也被拒绝体验很差。后来我改成令牌桶加突发容量允许短时间内的突发误伤就少了很多。关键是要区分持续高频和偶尔突发前者要限后者要放。6.2 成本预估不准拦截误判token估算和实际消耗有偏差尤其是不同供应商、不同模型的计算方式不一样。我一开始用统一估算结果经常误判。后来改成按供应商和模型分别配置估算参数准确度提升了很多。估算不需要100%准但要有合理的误差范围并且定期校准。6.3 密钥轮换导致服务中断有一次做密钥轮换新密钥还没生效就把旧密钥吊销了导致服务中断了几分钟。后来我改成先启用新密钥确认可用后再吊销旧密钥中间有个重叠期。轮换要有回滚方案出问题能快速恢复。6.4 熔断后没有恢复机制早期做熔断切断之后没有半开试探导致下游恢复了但调用层还在熔断服务一直不可用。后来加上半开状态定期放几个请求试探恢复正常就自动关闭熔断。熔断不是一断了之要有恢复路径。6.5 监控指标太多没人看一开始我把能记的指标都记了结果看板太复杂没人看。后来精简到几个核心指标单位成本、限流触发率、熔断触发次数、密钥拉取失败率。这几个指标能覆盖大部分问题看板也清爽。7. 写在最后的一点个人体会这三块——成本、限流、密钥——看起来是三个独立的问题但实际做下来它们共享同一套基础设施一个统一的调用层。把调用层搭好三块都能在里面解决调用层没搭好三块就会各自为政到处打补丁。我的建议是不管你现在的AI API调用量是大是小都尽早把调用层建起来。哪怕一开始只是简单地记录指标、统一管理密钥也比散落在业务代码里强。等到调用量涨起来、供应商多起来、团队大起来再想重构就难了。另外这三块的策略都不是一成不变的。成本预算会变、限流阈值会变、密钥会轮换所以策略要能动态调整要有监控要有告警。没有监控的优化是盲目的没有告警的故障是灾难性的。最后分享一个小技巧每次上线新的AI功能先在小流量上跑一周观察成本、限流、密钥相关的指标确认没问题再放量。这一周的时间往往能发现很多在测试环境发现不了的问题。

相关推荐

会聊天的机器人,为什么离不开一颗STM32?
会聊天的机器人,为什么离不开一颗STM32?

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

混淆矩阵与分类指标详解:TP、FP、FN、TN及精确率、召回率、准确率
混淆矩阵与分类指标详解:TP、FP、FN、TN及精确率、召回率、准确率

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

Claude Code嵌入式开发实战:寄存器初始化与编译日志分析
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/9/25 6:44:36

为什么选择 DiceBear:开源、隐私优先的确定性 SVG 头像生成器与免费 API
为什么选择 DiceBear:开源、隐私优先的确定性 SVG 头像生成器与免费 API

UI组件后端 【免费下载链接】dicebear DiceBear is an avatar library for designers and developers. 🌍 项目地址: https://gitcode.com/gh_mirrors/di/dicebear 点击查看 免费下载 DiceBear 是一个开源的 SVG 头像生成库:只要给一个字符串… · 2026/9/25 7:11:02

TypeScript 可选属性(Optional Properties)完全指南:语法、默认值与类型系统联动解析
TypeScript 可选属性(Optional Properties)完全指南:语法、默认值与类型系统联动解析

文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 TypeScript 的可选… · 2026/9/25 7:11:02

conventional-changelog 8.x 版本演进全解:从 CHANGELOG 看 Builder API、CLI 参数与生成流程
conventional-changelog 8.x 版本演进全解:从 CHANGELOG 看 Builder API、CLI 参数与生成流程

开发工具CLI文档 【免费下载链接】conventional-changelog Generate changelogs and release notes from a projects commit messages and metadata. 项目地址: https://gitcode.com/gh_mirrors/co/conventional-changelog 点击查看 免费下载 conventional-changel… · 2026/9/25 7:10:56

微信H5被拦截?X5内核诱导行为识别与合规重构指南
微信H5被拦截?X5内核诱导行为识别与合规重构指南

1. 这个提示不是“封禁”,而是微信内容安全策略的实时拦截反馈 你刚在微信里点开一个链接,页面还没加载完,就弹出一行红字:“网页包含诱导分享、关注等诱导行为内容,已停止访问”。很多人第一反应是——“完了&#x… · 2026/9/25 7:10:37

Unity Claude Code插件29个技能实战:AI编程助手嵌入编辑器工作流
Unity Claude Code插件29个技能实战:AI编程助手嵌入编辑器工作流

1. 这套插件到底解决了什么问题Unity 官方跟 Anthropic 合作推出的 Claude Code 插件,本质上是把 AI 编程助手从"浏览器标签页"搬进了引擎编辑器内部。过去我们写 Unity 脚本的典型流程是:在编辑器里发现需求,切到浏览器或独立聊天… · 2026/9/25 7:10:37

CTF-Wiki 密码学实战:CTR 计数器模式原理剖析与 CTF 逆向攻击
CTF-Wiki 密码学实战:CTR 计数器模式原理剖析与 CTF 逆向攻击

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 本文以 CTF-Wiki 文档 docs/zh-tw/docs/crypto/blockcipher/mode/ctr.md 为核心,系统讲解分组密… · 2026/9/25 7:10:37

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码