1. 个人项目跑推理为什么大家最后都绕不开选型这道坎做个人项目的人迟早会撞上同一个问题模型推理到底怎么跑。不是公司里那种有集群、有预算、有运维团队的环境而是你自己一台笔记本、一台旧台式机或者一台每月几十块钱的小服务器。你要跑一个聊天机器人、一个代码补全工具、一个文档问答系统甚至只是想让本地脚本能调用一下大模型这时候推理这两个字就从论文里的名词变成了你桌面上的现实问题。我自己的经历大概能代表一批人最开始图省事直接用托管 API注册、拿 key、写几行请求代码十分钟跑通。后来项目变多token 消耗上来了开始心疼钱再后来有些数据不想往外发开始琢磨本地模型再再后来发现本地模型也不是万能药显存、量化、上下文长度、推理速度每一项都能让你折腾一整个周末。所以个人项目怎么获取推理能力这个问题本质上不是一个技术问题而是一个取舍问题——你到底愿意用钱、用时间还是用硬件来换。这篇文章面向的是所有在个人项目里需要模型推理的人学生、独立开发者、业余爱好者、做副业的小团队。我会把托管 API、托管开源权重模型、本地模型这三条主流路线拆开讲清楚包括它们各自的成本结构、延迟表现、隐私边界、踩坑点以及我实际用下来觉得最稳的组合方式。关键词里的 inference、Codex、Claude、hosted open weight models、local models都会在对应章节里落到具体操作上不会只停留在概念层面。先说一个反直觉的结论对大多数个人项目来说最贵的方案往往不是 API而是你为了省 API 钱去折腾本地部署所花掉的时间。我见过太多人为了省每月二十美元的调用费花了两周去调量化参数最后项目本身一行没写。所以选型的第一步不是看技术而是先算清楚你的时间值多少钱、你的数据到底有多敏感、你的项目到底会不会长期跑下去。2. 托管 API 路线最省心但账单和限流会教你做人2.1 托管 API 到底解决了什么问题托管 API 的核心价值就一句话你不需要关心模型怎么加载、显存够不够、并发怎么调度你只需要发一个 HTTP 请求。对于个人项目这意味着你可以在半小时内从零到跑通一个可用的 AI 功能。Codex 这类代码补全服务、Claude 这类通用对话模型本质上都是这个模式——你付费对方提供推理算力。我最早做的一个个人项目是给本地笔记软件加一个总结这段文字的按钮。当时用的是托管 API整个实现就是一个函数把选中的文本拼进 prompt发请求把返回结果插回编辑器。前后不到一百行代码没有任何模型文件、没有 CUDA、没有量化。这就是托管 API 最大的优势——它把推理这件事从你的项目里彻底剥离出去了。但省心的代价是你要接受几个约束。第一是成本随使用量线性增长个人项目如果只是自己用一个月可能就几美元但如果你的项目有几十个用户账单会以你意想不到的速度上涨。第二是限流免费额度或者低价档位通常有每分钟请求数限制你的项目一旦有并发就会开始报 429。第三是数据出境你发出去的每一段文本都经过了对方的服务器这对处理敏感内容的项目是硬伤。2.2 成本到底怎么算别只看单价很多人算 API 成本只看每百万 token 多少钱这是不够的。真实成本要拆成三块输入 token、输出 token、以及重试和上下文膨胀带来的额外消耗。我拿一个真实的文档问答项目举例。假设每次问答平均输入 3000 token包含检索到的文档片段和系统提示输出 500 token一天问 50 次。按主流托管 API 的价格区间估算一天的输入大概是 15 万 token输出 2.5 万 token。如果输入按每百万 3 美元、输出按每百万 15 美元算一天成本大约是 0.45 美元加 0.375 美元接近 0.83 美元一个月就是 25 美元左右。这个数字看起来不高但问题在于上下文会膨胀。如果你做的是多轮对话每一轮都要把历史消息带上输入 token 会随轮次快速增长。我实测过一个十轮对话的场景最后一轮的输入 token 是第一轮的三倍多。所以做多轮对话项目时一定要做历史裁剪或者摘要压缩否则账单会悄悄翻倍。提示托管 API 项目里最容易被忽略的成本是失败重试。网络抖动、限流、超时都会触发重试而重试是要重新计费的。建议在代码里对重试次数设上限并且对相同请求做本地缓存。2.3 限流和稳定性个人项目最容易翻车的地方托管 API 的稳定性对个人项目来说是把双刃剑。好处是你不用自己维护坏处是你完全无法控制它的可用性。我遇到过好几次正在演示项目结果 API 返回 503只能尴尬地跟人说稍等一下。应对限流有几个实用做法。第一是指数退避重试遇到 429 不要立刻重发而是等 1 秒、2 秒、4 秒这样退避。第二是请求队列把并发请求排队串行化牺牲一点速度换稳定性。第三是多供应商兜底主用一家备用一家主供应商挂了自动切换。第三点在个人项目里其实很值得做因为不同供应商的接口格式虽然不同但抽象一层适配器并不难。我自己现在的做法是所有托管 API 调用都走一个统一的封装层里面处理重试、超时、日志和降级。这样上层业务代码完全不关心用的是哪家切换供应商只需要改配置。这个封装层大概两百行代码但省下来的调试时间远超这个投入。3. 托管开源权重模型介于省心和可控之间的中间地带3.1 hosted open weight models 到底是什么定位hosted open weight models这个词拆开看就清楚了模型权重是公开的但推理是别人帮你托管的。你不需要下载几十 GB 的模型文件也不需要买显卡但你能用到那些开源模型的能力而且通常价格比闭源旗舰模型便宜不少。这个路线的价值在于它同时缓解了成本和隐私两个焦虑。成本上开源模型的托管价格普遍低于闭源旗舰隐私上虽然数据还是经过第三方但至少模型本身是透明的你可以知道它大概是怎么训练的、有没有奇怪的限制。对于个人项目这是一个很实际的折中。我用这个路线做过一个代码解释器的小工具输入一段看不懂的代码输出逐行解释。选托管开源模型的原因是这个任务对模型的聪明程度要求没那么高开源的中等规模模型完全够用而价格只有闭源旗舰的几分之一。实测下来解释质量对日常代码完全够看偶尔在特别冷门的库上会答偏但个人项目能接受。3.2 什么场景适合什么场景别硬上托管开源权重模型不是万能的它有明确的适用边界。适合的场景包括文本分类、简单摘要、代码解释、格式转换、基础问答。这些任务的共同点是对推理深度要求不高但对成本和吞吐有要求。不适合的场景也很明确复杂多步推理、需要极强指令遵循的任务、对事实准确性要求极高的场景。开源模型在这些方面和闭源旗舰还有明显差距硬上只会让你在调试 prompt 上浪费大量时间。我踩过的一个坑是拿托管开源模型做根据需求生成完整项目代码。结果模型生成的代码结构混乱、依赖缺失、边界条件不处理我花在修 bug 上的时间比我自己写还多。后来换成闭源旗舰模型一次通过率明显提升。所以任务难度和模型能力要匹配不要为了省钱把难任务交给弱模型那是最贵的省钱方式。3.3 切换和对比的实操建议托管开源模型的一个好处是同一家平台往往提供多个模型切换成本很低。我的建议是在项目早期就把模型调用抽象成一个接口参数里带上模型名这样你可以用同一套代码快速对比不同模型的效果。具体做法是准备一组固定测试用例覆盖你项目里最典型的输入。每次换模型跑一遍测试用例记录输出质量和延迟。我自己的测试集大概二十条涵盖正常输入、边界输入和故意刁难的输入。这个测试集是我做模型选型时最有价值的资产比任何 benchmark 都贴近真实需求。注意对比模型时不要只看单次输出。同一个 prompt 多跑几次观察输出的稳定性。有些模型单次看还行但每次输出差异很大这种在需要稳定格式的项目里是灾难。4. 本地模型自由度高但硬件和调优是两道硬门槛4.1 本地推理的真实硬件门槛本地模型最大的吸引力是完全的数据自主和零边际成本。模型跑在你自己的机器上数据不出本地跑多少次都不额外花钱。但代价是硬件门槛和调优成本。先说硬件。一个 7B 参数量的模型如果用 FP16 精度大概需要 14GB 显存用 4-bit 量化可以压到 4GB 左右。这意味着一张 8GB 显存的消费级显卡就能跑 7B 量化模型。13B 模型 4-bit 量化大概需要 8GB 到 10GB32B 以上就需要 24GB 显存起步了。如果你只有 CPU7B 量化模型也能跑但速度会慢到让你怀疑人生——我实测过纯 CPU 跑 7B生成速度大概每秒两三个 token写个短句还行长文基本没法用。内存也很关键。模型加载时会把权重读进内存量化模型虽然小但加上推理时的 KV cache实际占用会比模型文件大不少。我的经验是留出模型文件大小两倍的内存余量否则容易在长上下文时爆内存。4.2 量化本地推理绕不开的核心技术量化是本地推理的关键技术简单说就是用更低的数值精度来存储和计算模型权重用一点点质量损失换取大幅的显存和速度收益。常见的量化等级有 8-bit、4-bit4-bit 里又有不同的实现方案。我用下来觉得4-bit 量化对大多数个人项目是甜点。质量损失在日常任务里几乎感知不到但显存占用直接砍到四分之一。8-bit 质量更好但省得不够多2-bit 省得多但质量掉得明显经常出现答非所问。量化模型的选择上建议优先选社区里下载量大、讨论多的版本因为这些版本通常经过了充分测试兼容性和稳定性更好。自己量化不是不行但对个人项目来说除非你有特殊需求否则没必要重复造轮子。4.3 本地推理框架怎么选本地推理框架这几年成熟了很多选择上主要看你的使用方式。如果你想要一个开箱即用的服务能通过 HTTP 接口调用那就选带服务端功能的框架如果你想在 Python 代码里直接调用那就选库形式的框架。我自己的组合是服务端用一个轻量推理框架常驻业务代码通过 HTTP 调用。这样做的好处是模型只加载一次多个项目可以共用而且服务端和业务解耦重启业务不影响模型。这个架构在个人项目里特别实用因为你往往同时有好几个小项目共用一套推理服务能省下大量显存。启动参数上有几个关键项要注意。上下文长度不要一上来就拉满先设一个够用的值比如 4096需要再往上加因为上下文越长 KV cache 占用越大。并发数在个人机器上建议设小一点甚至设成 1因为并发会成倍增加显存占用。GPU 层数如果显存够就全部卸载到 GPU不够就部分卸载剩下的用 CPU 算速度会慢但至少能跑。# 本地推理服务启动示例参数为通用示意 # 模型路径、上下文长度、GPU 卸载层数、服务端口 serve --model /path/to/model \ --ctx-size 4096 \ --n-gpu-layers 35 \ --port 80804.4 本地模型的真实体验和边界我对本地模型的整体评价是适合固定任务不适合开放任务。什么意思如果你有一个明确的、重复性的任务比如把这段中文翻译成英文把这段日志分类本地模型跑起来很稳成本为零隐私无忧。但如果你想要一个什么都能聊、什么都能干的通用助手本地模型在个人硬件上很难达到托管旗舰的水平。还有一个容易被忽略的点是冷启动时间。本地模型第一次加载可能要几十秒甚至几分钟如果你的项目是偶尔用一次每次都要等加载体验会很差。解决办法是让推理服务常驻别每次用完就关。我现在的做法是把推理服务设成开机自启平时挂着用的时候直接调。5. 三条路线的横向对比与组合策略5.1 一张表看清成本、延迟、隐私和门槛维度托管 API托管开源权重本地模型前期投入极低极低高硬件调优边际成本按量计费按量计费单价较低接近零延迟取决于网络和供应商取决于网络和供应商取决于本地硬件隐私数据出境数据出境数据不出本地质量上限最高中等中等偏下个人硬件运维负担无无高适合场景复杂任务、快速验证中等任务、成本敏感固定任务、隐私敏感这张表不是让你选一个而是让你根据项目阶段动态选择。我自己的项目基本都是组合使用开发阶段用托管 API 快速验证想法验证通过后把简单任务迁到本地或托管开源模型降本复杂任务继续留在托管旗舰。5.2 按项目阶段选型从原型到长期运行项目刚起步的时候唯一重要的是速度。这个阶段别碰本地模型直接用托管 API把功能跑通验证需求是否真实。我见过太多人在原型阶段就去折腾本地部署结果需求本身没验证白折腾。项目稳定运行、用户量上来之后开始做成本优化。把那些简单、高频、对质量要求不高的调用迁到托管开源模型或本地模型。这个迁移要基于数据先统计各类请求的占比和成本优先迁占比高、质量容忍度高的那部分。项目长期运行、数据敏感度上升之后考虑本地化。但本地化不是全量迁移而是把最敏感的那部分留在本地其余继续用托管。混合架构在个人项目里完全可行而且往往是最优解。5.3 混合架构的落地方式混合架构的核心是一个统一的路由层。所有推理请求先经过路由层路由层根据任务类型、数据敏感度、当前成本预算决定走哪条路。这个路由层不需要很复杂一个配置表加几个判断就够了。我的路由规则大概是这样的涉及用户隐私数据的请求走本地简单分类和格式转换走托管开源复杂推理和生成走托管旗舰。这个规则不是拍脑袋定的是跑了一段时间统计出来的。你也可以从简单规则开始边跑边调。提示混合架构里最容易出问题的是降级路径。当本地服务挂了、托管 API 限流了请求应该自动降级到备用路径而不是直接报错。这个降级逻辑一定要在项目早期就写好后期补会很痛苦。6. 我在个人项目推理上踩过的坑和攒下的经验6.1 那些让我浪费了整个周末的坑第一个坑是显存估算错误。我第一次跑本地模型时看模型文件 4GB以为 6GB 显存够了结果加载到一半就爆了。原因是没算 KV cache 和框架本身的占用。后来我养成了习惯显存需求按模型文件大小的 1.5 到 2 倍来估宁可留余量。第二个坑是上下文长度设太大。我一开始把上下文设成 32768觉得越大越好结果显存直接被吃满速度也慢得离谱。后来改成按需设置大部分任务 4096 完全够用需要长上下文的任务单独开一个配置。第三个坑是忽略冷启动。我早期写的脚本每次运行都重新加载模型一个简单的任务要等一分钟。后来改成常驻服务体验天差地别。这个改动很小但收益巨大。第四个坑是prompt 没做适配。同一个 prompt 在托管旗舰模型上效果很好换到本地小模型就答非所问。原因是不同模型对 prompt 格式的敏感度不同。解决办法是针对每个模型单独调 prompt别指望一套 prompt 打天下。6.2 让推理更稳的几个实用习惯第一个习惯是给所有推理调用加超时。不管是本地还是托管都要设超时否则一个卡住的请求会拖垮整个流程。本地推理的超时可以设长一点托管 API 设短一点。第二个习惯是记录每次调用的耗时和 token 数。这些数据是你做成本优化和性能调优的基础。我现在的项目里每次推理都会往日志里写一行时间戳、模型、输入长度、输出长度、耗时。积累一段时间后你能清楚看到钱花在哪、时间耗在哪。第三个习惯是对输出做校验。模型输出不一定符合预期格式尤其是需要结构化输出的场景。加一层校验和重试能大幅提升项目稳定性。我做过一个需要输出 JSON 的项目模型偶尔会多写一段解释文字加了校验和重试之后就稳了。6.3 关于 Codex 和 Claude 这类工具的个人体会Codex 和 Claude 这类工具在个人项目里的定位我觉得是加速开发和辅助编码而不是替代推理基础设施。它们能帮你快速写出调用推理的代码、调试报错、解释不熟悉的 API但真正跑推理的那套东西还是得你自己搭。我自己的用法是用这类工具帮我写推理封装层的样板代码、生成测试用例、解释报错信息。它们在这几件事上效率很高。但涉及具体的模型选型、成本权衡、架构设计还是得自己判断因为这些高度依赖你的具体场景工具给不了通用答案。有一点要提醒这类工具的可用性和你的网络环境、账号状态都有关系个人项目里不要把关键流程完全依赖在它们身上。它们适合做辅助不适合做唯一依赖。7. 给不同阶段个人项目的具体建议如果你现在还没开始我的建议是直接用托管 API 把功能跑通别在基础设施上花时间。选一个文档清晰、有免费额度的供应商写一个最简单的调用先把需求验证了。这个阶段的目标是能用不是好用。如果你已经在用托管 API 且成本开始上升先别急着迁本地。花半天时间统计一下你的调用数据哪些任务占比高、哪些任务对质量要求低。把低要求高占比的那部分迁到托管开源模型通常能省下一大半成本而且几乎不用改架构。如果你数据敏感必须本地化那就从最小的模型开始。先跑一个 7B 量化模型把流程跑通再根据效果决定要不要上更大的模型。本地化的关键是先跑起来不是一步到位。硬件不够就先跑小模型效果不够再考虑升级硬件。如果你同时有多个小项目强烈建议搭一个共用的推理服务。模型只加载一次所有项目通过 HTTP 调用。这个架构在个人场景下性价比极高省显存、省内存、省管理成本。我现在的几个小工具都共用一套本地推理服务维护起来轻松很多。最后分享一个我自己的判断标准当你在推理基础设施上花的时间超过写业务逻辑的时间时说明你的选型错了。个人项目的精力应该花在业务本身推理只是手段。选一条让你能专注业务的路比选一条技术上最优雅的路重要得多。
企业数字化 ERP 产品动态
相关推荐
TCP连接生命周期管理:从端口池到健康探测的全链路调优 1. 标题背后的真实场景:不是“能不能连多个”,而是“为什么必须管好连接生命周期” “同时连接多个以及如何配置?”——这个标题乍看像一句没说完的提问,甚至有点语病。但恰恰是这种不完整、不规范的表达,最真实地反映… · 2026/11/3 12:24:44
张量并行通信瓶颈怎么破?CAIS交换机内计算框架解析 在跑大模型分布式训练的时候,我们经常挂在嘴边的一句话是“通信掩盖计算”。但真正做过大规模训练的人都知道,张量并行(Tensor Parallelism)出现以后,网络就不再是“掩盖”能解决的问题了——它直接决定了一个 step 能… · 2026/11/3 12:24:44
Flutter工程鸿蒙化适配工具flad_cli详解 1. 为什么需要Flutter工程鸿蒙化适配工具 在Flutter生态与鸿蒙系统(HarmonyOS)加速融合的背景下,开发团队面临一个现实挑战:如何将现有Flutter工程无缝迁移到鸿蒙平台。传统手动适配方式存在三大痛点: 首先,资源文件转换效率低下… · 2026/11/3 12:24:44
Paperclip协议:Node.js构建AI应用胶水层的工程实践 1. 项目概述:Paperclip 不是回形针,而是一个被严重误读的 AI 工具链枢纽“Paperclip”这个词在中文技术社区里,最近三个月正经历一场诡异的语义漂移。它不再指代办公桌上那个弯折金属丝的小物件,而是频繁出现在 Node.js 安装教程评… · 2026/11/3 15:57:54
AI工程化从零构建:可审计、可压测、可回滚的系统实践 1. 这不是“搭积木”,而是重建AI系统的地基你有没有试过在深夜调试一个看似简单的模型服务接口,结果发现它在生产环境里每小时掉线三次、日志里堆满“CUDA out of memory”却查不出哪层在偷偷吃显存、监控面板上延迟曲线像心电图一样忽高忽低?… · 2026/11/3 15:57:54
Paperclip不是工具而是LLM本地工作流胶水层 1. 项目概述:Paperclip 不是回形针,而是一个被严重误读的 AI 工具链枢纽 “Paperclip”这个词在中文技术社区里,最近半年正经历一场诡异的语义漂移。它不再指代办公桌上那个弯折金属丝制成的物理小物件,而是悄然演变成一个高频混用… · 2026/11/3 15:57:54
DeepSeek本地化部署:CUDA 11.8与PyTorch训练环境配置避坑 简介:《DeepSeek 本地化部署实现私有化训练医疗数据实战方案》面向医疗信息化团队、深度学习算法工程师及需要处理敏感病历数据的技术人员,聚焦在受控本地环境中完成DeepSeek部署与医疗数据训练,兼顾隐私合规与模型落地。资料以单份PDF呈现&a… · 2026/11/3 15:57:54
WAF是什么:云WAF、反向代理与规则引擎选型指南 简介:《WAF的实现与架构演进.pptx》面向Web安全初学者及运维、开发人员,系统梳理Web应用防火墙的防护对象、产品形态与架构选型。内容从SQL注入、XSS、CSRF、恶意爬虫与CC等七层攻击的识别阻断切入,对比硬件WAF、软件WAF与云WAF的部署差异&am… · 2026/11/3 15:57:54
宏智树AI如何革新学术研究流程 1. 项目概述:重新定义AI辅助学术研究的边界 去年帮导师带本科生论文时,发现一个有趣现象:学生们使用AI工具时普遍存在两极分化——要么完全依赖生成内容导致学术事故,要么因担心抄袭彻底拒绝技术辅助。这促使我系统测试了市面上12… · 2026/11/3 15:56:52
双极步进电机控制实战: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/2 13:10:28
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/3 6:04:24
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/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战: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/2 13:10:28
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/3 6:04:24
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/3 5:52:46