1. 数据不出境的大模型API平台到底在解决什么问题先把概念说清楚。所谓“数据不出境的大模型API平台”指的是模型的推理服务部署在境内服务器上你通过API发过去的prompt、上传的文档、返回的结果整个链路的数据流转都在境内完成不经过海外节点。这件事对两类人特别重要一类是做企业级应用的开发者尤其是金融、医疗、政务、教育这些对数据流向有硬性要求的行业另一类是个人开发者或者小团队用海外API时经常遇到网络不稳定、账单支付麻烦、账号被封等问题想找一个更省心的替代方案。我过去一年帮三个团队做过大模型API的选型和迁移踩过的坑不算少。最典型的一次是某客户用海外某平台的API做合同摘要结果因为网络抖动导致批量任务跑了一半全挂掉重试成本极高。后来换成境内平台同样的任务稳定性好了很多延迟从平均3秒降到了800毫秒左右。这不是说境内平台一定比海外强而是在“数据不出境”这个约束下境内平台是唯一合规的选择同时在实际工程表现上也有不少优势。这篇文章面向的读者包括正在做AI应用开发但不确定选哪个API平台的工程师、需要给公司做技术选型的架构师、以及想低成本试水大模型能力的个人开发者。我会从平台能力、接口兼容性、价格模型、实操接入四个维度展开重点讲清楚“为什么这么选”和“怎么接最快”。涉及具体平台时我会基于公开信息和实际测试经验来描述不吹不黑只讲我验证过的东西。提示本文讨论的所有平台均指境内合规运营的大模型API服务不涉及任何跨境网络访问方案。选型的首要原则是合规其次才是性能和价格。2. 五家值得关注的平台各自凭什么上榜2.1 选型逻辑我按什么标准筛出这五家市面上做境内大模型API的平台少说有二三十家我不可能每个都深度用过。筛选标准有四条第一模型能力得过硬至少在中文理解、代码生成、长文本处理这三个维度上不能有明显短板第二接口得兼容OpenAI格式这样迁移成本最低现有代码改个base_url和api_key就能跑第三价格得透明不能藏着掖着搞复杂计费第四得有实际可用的免费额度或者低价试用方便开发者先验证再付费。按这四条筛下来能同时满足的平台其实不多。有些平台模型能力不错但接口不兼容OpenAI迁移起来要重写大量代码有些平台价格便宜但文档稀烂接入过程全靠猜还有些平台免费额度给得大方但正式版价格陡增适合尝鲜不适合生产。下面这五家是我认为在2026年这个时间点上综合表现比较均衡的排名不分先后按平台类型分组来说。2.2 DeepSeek代码和推理场景的性价比之选DeepSeek的API在开发者社区里的口碑一直不错核心原因是它的模型在代码生成和数学推理这两个场景下表现突出而价格又压得很低。我实测过用它的deepseek-chat模型做Python代码补全在HumanEval风格的测试集上一次通过率大概在70%左右这个水平对于日常开发辅助完全够用了。接口方面DeepSeek完全兼容OpenAI的chat completions格式你原来用openai库写的代码只需要把base_url改成它的端点api_key换成在它平台申请的key其他基本不用动。这一点对已经有海外API接入经验的团队来说非常友好迁移成本几乎为零。价格上它的计费方式是按token数算输入和输出分开计价。具体数字平台会调整但整体处于境内平台的中低档位。我建议新用户先领免费额度跑一轮测试确认模型输出质量符合预期后再充钱。需要注意的是DeepSeek的API在高峰期偶尔会有排队如果你做的是实时性要求很高的应用建议做好超时重试和降级预案。2.3 智谱AI企业级场景的稳妥选择智谱的GLM系列模型在中文理解和知识问答上表现很稳尤其是处理长文档、做信息抽取这类任务时输出格式的稳定性比很多同价位模型要好。我帮一个做法律文书分析的团队接的就是智谱的API他们的场景是把几十页的合同扔进去让模型提取关键条款和风险点。实测下来GLM-4在条款识别的准确率上比我们之前用的某海外模型还高一些而且因为数据不出境客户的合规部门直接放行了。智谱的接口同样兼容OpenAI格式但它额外提供了一些自己的扩展参数比如对输出格式的更强控制、对敏感内容的过滤级别调整等。这些扩展参数在OpenAI的SDK里用不了需要用requests库直接发HTTP请求。我的建议是如果你的应用对输出格式有严格要求值得花时间研究一下它的扩展能力如果只是做通用的对话或摘要用OpenAI兼容接口就够了。价格方面智谱的定位比DeepSeek稍高但它的免费额度给得比较大方新注册用户能领到足够跑完一个中型项目的token量。另外它对企业用户有专门的商务通道量大可以谈折扣这一点比纯自助式平台灵活。2.4 百度千帆生态整合能力最强百度千帆的优势不在于单个模型的能力而在于它把模型API和百度云的其他服务打通了。比如你可以用千帆的API做文本生成同时直接调用百度的OCR、语音识别、知识图谱等服务在一个项目里完成多模态的处理。这种生态整合能力对于做复杂AI应用的团队来说很有吸引力省去了对接多家供应商的麻烦。千帆平台上可选的模型比较多既有百度自研的文心系列也接入了第三方模型。接口方面它提供了OpenAI兼容的端点但也有一些自己的原生接口。我的经验是如果你只用文本生成走OpenAI兼容接口最省事如果需要用到百度特有的能力比如知识增强或者多模态融合那就得用原生接口学习成本会高一些。价格上千帆的计费方式比较灵活有按调用次数计费的也有按token计费的还有包月套餐。我建议先估算一下自己的调用量如果每天调用次数比较稳定包月套餐通常比按量付费划算。另外千帆对新用户有比较长的免费试用期足够你把整个接入流程跑通。2.5 阿里通义长文本和多模态的均衡选手通义千问的API在长文本处理上有一个很实用的特性它支持的最大上下文长度比较长具体数字平台文档里有我实测下来处理几万字的文档没问题。这对于做文档问答、长文摘要的场景很关键因为很多模型虽然宣称支持长上下文但实际用起来在中间部分会丢失信息通义在这方面的表现相对稳定。多模态方面通义的API支持图片输入可以做图文理解类的任务。我试过用它做商品图片的描述生成效果中规中矩但对于不需要极高精度的场景够用了。接口同样兼容OpenAI格式图片输入的方式和OpenAI的vision接口类似迁移起来不麻烦。价格上通义走的是阿里云的标准计费体系有按量付费和资源包两种模式。如果你已经在用阿里云的其他服务走内网调用可以省掉公网流量费这一点在量大时能省不少钱。需要注意的是通义的API在阿里云体系内需要先开通相应的服务开通流程比纯API平台多几步但跟着文档走也不复杂。2.6 讯飞星火语音场景的差异化优势讯飞星火的API在纯文本生成上和其他几家差距不大但它在语音相关的能力上有明显优势。如果你的应用涉及语音识别、语音合成、或者语音对话讯飞是境内平台里整合得最顺的。我做过一个语音助手的小项目用讯飞的API做语音转文字再送给大模型处理整个链路的延迟控制在可接受范围内。接口方面讯飞提供了WebSocket和HTTP两种接入方式OpenAI兼容接口也有但功能相对基础。如果你只需要文本生成用兼容接口就行如果要调用语音能力得用它的原生SDK。Python的SDK文档比较全照着示例代码改改就能跑。价格上讯飞的语音服务和大模型服务是分开计费的做语音应用时要算两笔账。我的建议是先用免费额度把语音转文字和大模型生成的链路跑通确认整体效果后再根据实际调用量选套餐。3. 接入实操从申请key到跑通第一个请求3.1 申请API Key的通用流程和避坑点不管选哪家平台申请API Key的流程大同小异注册账号、完成实名认证、在控制台创建应用、生成Key。这里有几个坑我踩过提前说一下。第一个坑是实名认证。境内平台基本都要求实名个人认证和企业认证的权限不一样。如果你代表公司做选型建议直接用企业认证因为有些平台的企业版模型或者高并发配额只对企业账号开放。个人认证虽然也能用但QPS限制会比较紧。第二个坑是Key的权限范围。有些平台在创建Key的时候可以勾选权限比如只读、只写、或者限定某个模型。我建议遵循最小权限原则给每个应用单独创建一个Key只开通它需要的模型权限。这样万一Key泄露损失可控。第三个坑是Key的保存。生成Key后平台通常只显示一次关掉页面就再也看不到了。我习惯是把Key存到环境变量里而不是硬编码在代码中。下面是一个Python的例子import os from openai import OpenAI client OpenAI( api_keyos.environ.get(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com/v1 ) response client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: 你是一个简洁的助手。}, {role: user, content: 用一句话解释什么是API。} ] ) print(response.choices[0].message.content)这段代码里base_url和model名字需要根据你选的平台替换。api_key从环境变量读取这样代码可以安全地提交到代码仓库。3.2 OpenAI兼容接口的迁移要点如果你之前用的是OpenAI的API迁移到境内平台主要改三个地方base_url、api_key、model名称。但有几个细节容易忽略。第一有些平台的OpenAI兼容接口不支持某些参数。比如OpenAI的response_format参数用于强制JSON输出不是所有境内平台都支持。迁移前先查一下平台的接口文档确认你用的参数在兼容列表里。第二错误码的格式可能不一样。OpenAI返回的错误结构是{error: {message: ..., type: ...}}境内平台有的沿用这个格式有的用自己的格式。如果你的代码里有针对特定错误码的处理逻辑迁移后要重新测试。第三流式输出的行为可能有差异。OpenAI的流式输出是SSE格式境内平台大多也支持但chunk的切分方式可能不同。如果你的前端依赖特定的chunk结构做逐字显示迁移后要调一下。我一般建议的迁移步骤是先用非流式请求跑通基本对话确认模型输出质量再开流式确认前端显示正常最后跑一轮压力测试看并发和超时表现。整个过程快的话半天就能完成。3.3 用Python封装一个多平台可切换的调用层如果你需要同时对接多家平台做对比测试或者想留一个备用通道可以封装一个简单的调用层。核心思路是把不同平台的差异抽象成配置调用代码统一。import os from openai import OpenAI PLATFORMS { deepseek: { base_url: https://api.deepseek.com/v1, api_key_env: DEEPSEEK_API_KEY, model: deepseek-chat }, zhipu: { base_url: https://open.bigmodel.cn/api/paas/v4, api_key_env: ZHIPU_API_KEY, model: glm-4 }, qwen: { base_url: https://dashscope.aliyuncs.com/compatible-mode/v1, api_key_env: QWEN_API_KEY, model: qwen-plus } } def ask(platform_name, prompt): cfg PLATFORMS[platform_name] client OpenAI( api_keyos.environ.get(cfg[api_key_env]), base_urlcfg[base_url] ) resp client.chat.completions.create( modelcfg[model], messages[{role: user, content: prompt}] ) return resp.choices[0].message.content if __name__ __main__: for name in PLATFORMS: try: answer ask(name, 用一句话说明你的模型特点。) print(f[{name}] {answer}) except Exception as e: print(f[{name}] 调用失败: {e})这个封装的好处是你可以在同一个脚本里对比不同平台的输出选型时心里有数。实际生产环境里我建议再加一层重试和降级逻辑主平台超时就切备用平台保证服务可用性。3.4 参数调优temperature、max_tokens和top_p怎么设这三个参数直接影响模型输出的质量和成本值得单独说一下。temperature控制输出的随机性。值越低输出越确定适合做信息抽取、代码生成这类需要稳定结果的场景值越高输出越多样适合做创意写作、头脑风暴。我的经验是做企业应用时temperature设在0.1到0.3之间比较稳妥做内容生成可以放到0.7到0.9。max_tokens控制输出的最大长度。设得太小会导致回答被截断设得太大浪费token。一个实用的估算方法是中文一个字大约对应1.5到2个token英文一个单词大约对应1.3个token。如果你期望的回答是200字左右max_tokens设在400到500比较合适。top_p是另一种控制随机性的方式和temperature二选一调就行不要同时大改。一般保持默认值1.0需要更确定输出时降到0.8左右。注意不同平台对这三个参数的默认值可能不同迁移后建议显式设置不要依赖默认值。4. 成本控制与性能优化实战4.1 Token计费的隐藏成本输入比输出便宜但量大很多人只关注输出token的价格忽略了输入token的累积成本。在对话类应用里每一轮对话都要把历史消息重新发给模型输入token会随着对话轮次线性增长。一个10轮的对话第10轮的输入token可能是第1轮的10倍。控制输入token的方法有几个一是限制历史消息的保留轮数比如只保留最近5轮二是对历史消息做摘要压缩把长对话浓缩成短摘要三是用system prompt精炼指令避免冗长的背景描述。我实测过把历史保留轮数从10轮降到5轮token成本能降40%左右而对话质量的下降在大多数场景下用户感知不到。4.2 缓存策略哪些请求可以复用结果如果你的应用里有大量重复或相似的请求缓存能省不少钱。比如电商场景里的商品描述生成同一类商品的描述模板是相似的可以把模型输出缓存起来下次遇到相似请求直接返回缓存结果。实现上可以用一个简单的键值存储key是请求的哈希值value是模型输出。更精细的做法是用向量相似度做语义缓存但实现复杂度高一些。我的建议是先从精确匹配缓存做起覆盖那些完全重复的请求通常能省10%到20%的token。4.3 并发控制QPS限制下的排队与重试境内平台的免费额度和低价套餐通常有QPS限制比如每秒最多3次请求。如果你的应用需要高并发要么升级套餐要么在客户端做排队。排队的基本思路是用一个队列缓冲请求消费者按QPS限制的速度从队列里取请求发送。Python里可以用asyncio.Semaphore控制并发数或者用消息队列做更复杂的调度。重试策略上遇到429请求过多错误时不要立即重试而是等一个指数退避的时间再试避免加重平台负担。4.4 模型选择不是越贵越好同一个平台通常提供多个档位的模型比如轻量版、标准版、旗舰版。轻量版便宜但能力弱旗舰版强但贵。选哪个取决于你的任务复杂度。我的经验是做分类、抽取、简单问答这类任务轻量版模型足够用做复杂推理、长文生成、代码编写才需要上旗舰版。一个实用的做法是先用旗舰版跑一批测试样本确认任务难度再换轻量版跑同样的样本看效果差距有多大。如果差距在可接受范围内就用轻量版省钱。5. 常见问题与排查技巧实录5.1 401错误Key无效的几种原因401 Unauthorized是最常见的错误原因通常有这几种Key复制时多了空格或换行、Key已过期或被删除、Key的权限不包含你要调用的模型、环境变量没设置对。排查时先打印一下Key的前几位和后几位确认没有多余字符再去平台控制台确认Key的状态和权限。5.2 400错误参数格式和上下文超限400错误里最常见的是上下文超限报错信息通常会写“maximum context length is X tokens”。这时候要么缩短输入要么换支持更长上下文的模型。另一个常见原因是消息格式不对比如role字段写了不支持的值或者content为空。对照平台文档检查请求体格式基本能解决。5.3 超时和连接失败网络与平台侧排查超时问题先分清楚是网络问题还是平台问题。用curl或Postman直接发一个最简单的请求如果也超时大概率是网络或平台侧的问题如果curl能通但代码不通那就是代码里的超时设置太短或者代理配置有问题。平台侧的问题通常会在状态页公示遇到大面积故障时等平台修复比自己做无用重试更明智。5.4 输出质量不稳定提示词和参数的联合调优同一个模型不同的提示词写法输出质量可能差很多。我的经验是把指令写具体给出输出格式的示例明确告诉模型“不要做什么”和“必须做什么”。比如不要只说“总结这段文字”而是说“用三句话总结这段文字每句话不超过20字按重要性排序”。参数上降低temperature能让输出更稳定但太低会导致输出死板需要根据场景找平衡点。问题现象可能原因排查动作401 UnauthorizedKey无效或权限不足检查Key字符串、控制台权限设置400 Bad Request参数格式错误或上下文超限对照文档检查请求体、缩短输入429 Too Many Requests超过QPS限制降低并发、加指数退避重试超时无响应网络问题或平台故障用curl测试、查看平台状态页输出截断max_tokens设太小增大max_tokens或缩短期望输出输出质量差提示词不明确或temperature不当优化提示词、调整temperature5.5 免费额度的正确用法免费额度不是用来省钱的是用来验证的。我的建议是拿到免费额度后不要零散地试而是设计一组有代表性的测试用例覆盖你实际场景里的典型输入一次性跑完记录每个平台的输出质量和响应时间。这样你手里就有一份对比数据选型决策有依据而不是凭感觉。6. 我的选型建议和后续扩展思路如果你做的是代码辅助类工具DeepSeek的性价比最高接口兼容性好迁移成本低。如果你做的是企业级文档处理智谱的稳定性和中文能力更让人放心。如果你需要多模态或者和云服务深度整合百度和阿里是更顺的选择。如果涉及语音交互讯飞的整合度最好。实际选型时不要只看模型能力还要看你的团队已有的技术栈。如果已经在用某家云服务选同一家的API能省掉很多对接工作。如果是从零开始那就按场景需求来先跑测试再决定。后续扩展上我建议关注两个方向一是模型微调如果你有大量领域数据微调后的模型在特定任务上的表现会明显好于通用模型而且微调后的模型通常有独立的API端点调用方式和通用模型一样二是多模型路由根据请求的复杂度自动选择不同档位的模型简单请求走轻量版复杂请求走旗舰版在成本和效果之间找最优解。我在实际项目里踩过最大的坑是过早优化成本为了省token把max_tokens设得很小结果输出频繁截断用户体验很差返工的成本远大于省下的token费。后来我的做法是先用充足的token把效果跑通再逐步压缩成本每一步都做A/B对比确认效果没有明显下降才继续压。这个顺序很重要反过来做会浪费很多时间。
企业数字化 ERP 产品动态
相关推荐
上下文管理机制:编码助手效果忽好忽坏的根因与优化实践 1. 上下文窗口不是内存条,而是一条每次都要重新排队的传送带先说个可能不太讨喜的结论:编码助手 codebuddy 这类工具在同一个项目里表现忽好忽坏,九成不是模型换了,而是上下文管理出了问题。很多人第一反应是"模型不行了&quo… · 2026/11/4 8:40:10
测试工程师如何从质检员转型为质量架构师 1. 测试工程师的困境与机遇 在当前的敏捷开发环境中,测试工程师常常陷入一个尴尬的境地。每天面对不断变化的需求和日益压缩的开发周期,很多测试人员感觉自己就像救火队员,疲于奔命却难以体现核心价值。我曾经带领过一个金融科技项目的测试团… · 2026/11/4 8:39:09
G-Star Gathering Day:AI与量子技术的区域创新交流 1. 活动背景与核心价值G-Star Gathering Day作为区域性行业交流活动,今年首次落地合肥具有特殊意义。这座"中国声谷"所在的城市,正以每年15%的增速聚集着人工智能、量子信息等领域的创新企业。本次活动选址合肥高新区中安创谷科技园࿰… · 2026/11/4 8:39:09
VS2022迁移实战:预编译头从stdafx.h到pch.h的完整指南 1. 为什么一个头文件能让整个项目编译崩溃 如果你最近把老项目从旧版工具链搬到 Visual Studio 2022,大概率会在某个平平无奇的下午撞上这么一幕:满屏红色波浪线,错误列表里刷出几百条 fatal error C1083: 无法打开包含文件"stdafx.h&q… · 2026/11/4 9:25:27
Laravel知识付费系统:MySQL单表驱动虚拟商品交付与分佣 简介:这是一套2023年全新发布的彩虹晴天多功能系统源码,面向知识付费创业者、虚拟商城开发者及中小型SaaS服务搭建者,提供开箱即用的商业级后台系统解决方案。资源包共951个文件,涵盖346个核心PHP业务逻辑文件、310个PNG界面图标与… · 2026/11/4 9:25:27
Hive自定义执行引擎优化实践与性能提升 1. 项目背景与核心价值 在大数据生态系统中,Hive作为数据仓库基础设施已经服务了十余年。但原生Hive执行引擎(MapReduce/Tez/Spark)在面对特定业务场景时,往往存在性能瓶颈或功能局限。去年我们在处理千亿级用户行为数据时,就遇到了UDF执行效… · 2026/11/4 9:25:27
银行核心系统可观测性建设与1-5-10故障处理框架实践 1. 银行核心系统可观测性建设的必要性在金融行业数字化转型的浪潮中,银行核心系统作为金融业务的中枢神经,其稳定性和可靠性直接关系到银行的业务连续性和客户体验。然而,随着系统架构的日益复杂化,传统的监控手段已经难以满足现代… · 2026/11/4 9:25:27
VS2022预编译头迁移实战:从stdafx.h到pch.h的完整指南 1. 从一次编译报错说起:预编译头迁移到底难在哪如果你最近把项目从旧版工具链搬到 Visual Studio 2022,大概率会在某个下午被一条C1010: 在查找预编译头时遇到意外的文件结尾或者fatal error C1083: 无法打开预编译头文件拦住去路。这类报错有个共同特征… · 2026/11/4 9:25:27
LangGraph入门:状态图、条件路由与Agent工具调用循环 最近连续有几个人跑来问我同一个问题:LangGraph 和 LangChain 到底什么区别?问得多了,我发现大家不是不懂用法,而是卡在了同一个点上——链式调用写多了之后,根本想象不出"图"怎么组织 Agent。这篇就围绕标题… · 2026/11/4 9:24:26
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38