news 2026/9/9 2:13:19

Ollama本地大模型实战指南:从安装部署到IDE与API接入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ollama本地大模型实战指南:从安装部署到IDE与API接入

1. 先聊聊为什么要折腾本地大模型

最近大模型本地部署这件事越来越热,很多人跑来问我:Ollama 到底值不值得折腾?我的回答是,如果你写代码、做文档、跑自动化脚本,那它基本是当前门槛最低的一条路。你下载一个安装包,拉一个模型,本地就多了一个随时可用的推理服务,不联网也能跑,不按 token 计费,也不怕对话记录被第三方平台拿去。

我最早接触 Ollama 是从实在受不了在线 API 开始的。白天写代码的时候,每一次补全都要等网络往返,有时候还会碰上限流,代码灵感全被那个转圈动画打断了。后来把模型拉到本地,再把 IDE、Web 界面、API 全部接上,整个体验完全不一样。这篇博文就按我实际走过的流程写,从下载安装说起,一直讲到怎么把它接到 IDE、网页端和程序里,最后附上我认为最值得看的避坑经验。

先说结论:本地大模型不是要替代云端的千亿参数巨兽,它解决的是“隐私、成本、可控性、离线可用”这四个问题。适合的人群也清晰——在乎代码和数据不出去的开发者,需要在断网环境完成文本处理的工程师,想研究模型原理的学生,以及觉得云 API 月账单太夸张的个人用户。如果你是这几类人,下面这套流程可以无脑照抄。

2. 安装与模型下载:从卡到不行的下载说起

2.1 官方安装包与三种系统安装方式

Ollama 的安装本身不算复杂,麻烦主要在下不动。Windows 用户到官网下载ollama-setup.exe一路点下一步就行,装完系统托盘会常驻一个 Ollama 小图标,这时候命令行已经可以用了。macOS 我习惯用 Homebrew,一条命令搞定:

brew install ollama

Linux 用户通常是走官方安装脚本:

curl -fsSL https://ollama.com/install.sh | sh

我实测过三套方案,最稳的反而是 Windows 离线包。为啥?因为官方脚本要现场拉网络资源,一旦网络不稳就挂;Windows 的 exe 是完整安装包,下载下来之后本地安装不依赖网络。所以你要是发现脚本一直报错,别硬扛,换离线包通常能解决问题。

装完验证一下:

ollama --version

能输出版本号,说明服务已经在跑了。注意 Windows 上安装完不会自动把服务注册成系统服务,你要保证托盘里那个 Ollama 进程没有退出,后边所有接入操作才成立。

2.2 模型权重文件的加速方式与模型目录迁移

真正让人崩溃的是拉模型。很多人第一次执行ollama pull qwen2.5:7b,看到速度只有几十 KB/s,心态直接裂开。这里我说一个比较实操的结论:与其和下载速度较劲,不如绕开官方源。

第一个必须做的事,是先把模型目录切到剩余空间大的分区。Models 目录默认在用户主目录下,Windows 是C:\Users\<用户名>\.ollama\models,macOS 是~/.ollama/models。一个 7B 的模型量化完大约 4 到 5 GB,14B 要 9 GB 以上,系统盘很容易被塞爆。我习惯通过设置环境变量解决:

# Windows PowerShell 里执行 [System.Environment]::SetEnvironmentVariable("OLLAMA_MODELS", "D:\ollama_models", "User")

改完环境变量之后,务必重启 Ollama 进程,不然后台服务读不到新路径,模型还会往旧目录写。

第二个加速手段,是从国内模型社区直接下载 GGUF 格式的模型文件,再手动导入 Ollama。以通义千问的qwen2.5-7b-instruct为例,你可以在魔搭社区找到量化好的 GGUF 权重,下载回来之后写一个 Modelfile:

FROM ./qwen2.5-7b-instruct-q4_k_m.gguf TEMPLATE """{{- if .Messages }} {{- range .Messages }} {{- if eq .Role "user" }}<|im_start|>user {{ .Content }}<|im_end|> {{- else if eq .Role "assistant" }}<|im_start|>assistant {{ .Content }}<|im_end|> {{- end }} {{- end }} {{- end }} <|im_start|>assistant """ PARAMETER temperature 0.7

然后执行:

ollama create qwen7b -f Modelfile

原理很简单:Ollama 本身就是一个模型文件加载器和推理服务,GGUF 文件只要配上正确的对话模板,就能注册成本地模型。这条路能完美绕开官方源慢速问题,而且你能选到社区调好的量化版本。

2.3 第一次拉模型:通义千问、DeepSeek 还是 Llama

我不建议一上来就拉 70B 的大模型,笔记本跑不动。先用小模型跑通流程,再根据显存往上加。下面这张表是我反复测试后比较适合本地部署的模型:

模型显存需求(Q4量化)中文能力代码能力适用场景
qwen2.5:7b约 6GB很强中等偏上中文文本处理、日常问答
deepseek-r1:7b约 6GB较强代码解释、推理任务
llama3.1:8b约 6GB一般中等英文场景、通用助手
qwen2.5:14b约 10GB很强本地算力较好的场景
deepseek-r1:14b约 10GB复杂推理与代码重构

我自己最常用的组合是qwen2.5:7b做日常中文内容处理,deepseek-r1:14b做代码分析。注意这里说的是量化后的显存需求,模型量化等级不同,实际占用有浮动。跑之前用ollama pull拉到本地,再ollama run qwen2.5:7b,看到交互式对话框出现,第一条消息有响应,基本就通了。

当你第一次在命令行里和本地模型对话成功,那种“这台机器终于会说话了”的感觉,是云端 API 给不了的。

3. 命令行与关键参数调优

3.1 最常用的 Ollama 命令

Ollama 的命令设计得很克制,核心就几个。我列出天天会用的:

  • ollama pull <模型名>:从模型仓库拉取权重文件。
  • ollama run <模型名>:启动交互式对话界面。
  • ollama list:列出本地已经装好的模型。
  • ollama ps:查看当前正在运行的模型进程、显存占用、上下文长度。
  • ollama show <模型名>:查看模型详细信息,包括参数总量、量化等级、上下文长度上限。
  • ollama stop <模型名>:手动停掉某个后台推理进程。
  • ollama rm <模型名>:删除不再需要的模型,释放磁盘空间。

ollama ps是最容易被忽略但最有用的命令。你想知道一个 7B 模型到底占了多大的显存,当前有几个请求在排队,上下文有多长,看一眼这个输出全明白了。有一次我连续跑了好几个模型不退出,显卡显存被占满,其他程序直接报申请显存失败。用ollama ps一查,发现三个模型同时驻留在显存里,这才是罪魁祸首。

3.2 上下文长度与采样参数设置

在交互模式下,/set命令可以临时调整参数。我最常改的是上下文长度:

/set parameter num_ctx 8192

num_ctx直接决定模型能“记住”多长的对话历史。Ollama 默认值常常是 2048,也就是约两千个 token,稍微聊长一点,前面的内容就被截断了,模型开始答非所问。我建议至少设置到 8192,如果你的物理内存或显存允许,设到 16384 体验更好。

这里有个很重要的原理:上下文长度越大,KV Cache 越大,显存占用直接上涨。所以别一上来就拉满,先看ollama ps里的显存数字,再决定往上加还是往下降。

其他常用参数:

  • temperature:控制随机性。写代码建议 0.2 到 0.4,需要发散性回答可以调高到 0.8。
  • top_p:核采样参数,配合 temperature 用的,一般保持默认即可。
  • num_predict:限制生成的最大 token 数,防止模型无限制地输出。

如果你想让这些参数对某个模型永久生效,就得回到 Modelfile,用PARAMETER指令写进去,再ollama create重新生成模型。临时调试用/set,固化逻辑用 Modelfile,两种方式都值得掌握。

3.3 并发、显存与多模型调度

Ollama 默认一次只加载一个模型,而且处理完请求后模型会在内存里驻留一段时间。你连续调用不同模型,会看到服务反复加载和卸载权重,这在本地部署里非常影响体验。

解决办法是通过环境变量调优:

set OLLAMA_MAX_LOADED_MODELS=2 set OLLAMA_NUM_PARALLEL=4 set OLLAMA_KEEP_ALIVE=10m
  • OLLAMA_MAX_LOADED_MODELS:允许同时驻留多个模型,避免频繁卸载。
  • OLLAMA_NUM_PARALLEL:一个模型实例可以并行处理的请求数,4 是一个比较保守且能明显提速的值。
  • OLLAMA_KEEP_ALIVE:模型在空闲后保留的时间,设为10m表示 10 分钟内不卸载。

调完之后你会明显感觉到:IDE 补全、API 调用、Web 页面同时连着用,不再互相“踢下线”了。不过要注意显存是硬约束,如果你的显卡只有 8GB,同时驻留两个 7B 模型基本就是极限。

4. 把模型接进 IDE:从 VS Code 到 Claude Code

4.1 在 VS Code 里用 Continue 接入

本地模型最大的应用场景其实是写代码。VS Code 里我踩过不少插件,最后稳定留下来的是 Continue 这个开源项目。它天然支持 Ollama 作为后端,不需要额外写代码,直接在插件设置里加一个 provider 就行。

安装步骤很简单:插件市场搜“Continue”,装好后打开设置面板,找到模型配置区域,新增一个 Ollama 类型的 provider,填上localhost:11434,再填模型名,比如qwen2.5:7b。保存后回到编辑器侧边栏,选好模型,就能开始对话。

这里有个经验细节:Continue 的补全和聊天是两个独立配置。聊天模型用 7B 的生成型模型没问题,但代码补全建议单独指定一个专门做 Fill-in-the-middle 的模型。这类模型在训练时就针对“中间填一段代码”做了优化,补全质量比通用对话模型高很多。如果你用的是 Ollama 拉下来的对话模型做补全,效果会差一截,这不是接入姿势的问题,是模型类型的问题。

4.2 JetBrains 系列与登录鉴权问题

JetBrains 家族的 IDE(IDEA、PyCharm、GoLand 等)接 Ollama,也比较省事。社区有专门的 Ollama 插件,也可以装 Continue 的 JetBrains 版本。配置思路和 VS Code 一样,填一个本地地址和模型名。

JetBrains 用户容易踩的坑跟 Ollama 本身关系不大,而是 IDE 自身的 AI 插件登录问题。很多人会同时装 GitHub Copilot、GitLab Duo 这类云端插件,这时候一旦网络环境不稳,就会弹各种报错,比如:

login failed. check api token or gitlab version. log in via git if the version supports it

这个报错是 GitLab Duo 之类的插件在检查 token 和 GitLab 版本时失败,和本地模型没有关系。我建议把云端 AI 插件和本地 Ollama 插件分开管理,本地优先。如果遇到 token 报错,先看 GitLab 地址对不对、token 有没有过期、IDE 是不是旧版本,别把时间耗在查 Ollama 上。

4.3 Antigravity IDE 登录报错的真实原因

热搜里有个高频词是 Antigravity IDE 登录问题。这个 IDE 主打 AI 编程,很多人在装完后卡在第一步登录。报错常见的是登录窗口反复刷新、二维码过期、提示重新打开 URL 之类。这类问题本质上是它的鉴权流程需要跳转外部网页完成身份认证,网页一旦打不开或者回调地址没被本机防火墙放行,登录就失败。

我的建议是:如果你只打算接本地 Ollama 模型,没必要死磕 Antigravity 这种重度云绑定的 IDE。VS Code + Continue 是完全开源、配置透明的方案,模型、地址、密钥都掌握在自己手里,出现问题也好排查。把时间花在真正能提高代码效率的地方,而不是和登录按钮较劲。

4.4 Claude Code + cc switch + Ollama 的灵活组合

Claude Code 是最近讨论度很高的 AI 编程终端工具。原本它只支持 Anthropic 官方模型,但社区有人做出了 cc switch 这样的配置切换工具,把模型 provider 指向本地 Ollama,就能用上的开源模型来驱动。

基本思路是:安装 cc switch 之后,新增一个 provider,把 API 地址填成http://localhost:11434/v1,模型名随便填本地已有的模型,比如deepseek-r1:7b。这样 Claude Code 发出的请求就不是往云端走了,而是直接打到本地。

实测下来,Claude Code 的终端交互体验很顺,但要注意本地模型的能力上限。小参数模型在执行长链路、多步骤任务时,稳定性和云端大模型还有差距。我的定位是:用本地模型做私有代码库的初筛、总结、脚本解释,遇到非常复杂的重构任务,再切回云端大模型。

5. 给本地模型配上 Web 界面

5.1 部署 Open WebUI:一条命令跑起来

命令行用久了,总觉得差点意思。特别是想分享给同事用、或者想上传几个文档让模型帮忙检索的时候,还是要配一个 Web 界面。我目前用下来最顺手的是 Open WebUI,功能覆盖对话、文件上传、知识库管理、模型切换,还内置了联网搜索能力。

推荐直接用 Docker 方式部署:

docker run -d -p 3000:8080 \ --add-host=host.docker.internal:host-gateway \ -v open-webui:/app/backend/data \ --name open-webui \ --restart always \ ghcr.io/open-webui/open-webui:main

没有 Docker 环境的话,也可以用 pip 直接跑:

pip install open-webui open-webui serve

第一次打开http://localhost:3000,会让你注册一个管理员账号。注意重点来了:第一个注册的用户会被设为管理员,后续别人再注册都只是普通用户。Open WebUI 内部自带用户体系,默认情况下只是局域网内部使用,不需要额外做账号系统对接。

5.2 Web 会话认证常见报错

Web 化部署之后,认证问题开始浮现。最典型的是两类报错。

第一类是登录后页面一直提示“authentication required;reopen the url printed by……”这种类似信息。这种提醒常见于某些命令行工具拉起浏览器做 Web 登录时的回调失效,因为浏览器要打开的完整认证 URL 包含一次性 token,页面没打开,或者打开后 token 已经过期,整个认证流程就断了。解决思路很简单:重新执行命令,让工具再打印一条新的 URL,用默认浏览器打开,不要手动复制粘贴旧地址。

第二类是 Open WebUI 接入外部 API 或反向代理后的“your last request has been blocked for security purposes”提示。这类报错本质上是中间层的安全策略把请求拦了,可能是反代配置里启用了 WAF,也可能是防火墙规则太严。解决办法是检查反向代理的访问控制规则,把自己或内部网络的 IP 加入白名单。

5.3 对局域网和公网暴露的安全设置

聊完认证,必须说一个我吃过亏的环节:安全暴露。Open WebUI 默认只监听本机,想要让局域网里其他机器也能访问,就要在启动 Ollama 时设置:

set OLLAMA_HOST=0.0.0.0:11434

这样 Docker 里的 Open WebUI 才能通过host.docker.internal连上宿主机。但是注意,把 Ollama 绑定到 0.0.0.0 等于告诉整个网段这里有台模型服务器,任何人都能直接调用它的 API。别问我怎么知道的——我把端口暴露在公司局域网之后,第二天日志里就有不认识的人来调用模型了。

如果确实需要外网访问,正确姿势是加一层反向代理,做 HTTPS 和 Basic Auth。不要直接把 11434 端口映射到公网。本地模型是你的私有资产,不是公共福利站。

6. API 接入与编程调用

6.1 本地 OpenAI 兼容 API

Ollama 最让我喜欢的一点是,它原生实现了 OpenAI API 的兼容接口。这意味着你写过 OpenAI SDK 的代码,几乎不用改就能切换到本地模型。

本地 API 基础地址是http://localhost:11434,常用的两个端点:

  • GET /v1/models:列出可用的模型。
  • POST /v1/chat/completions:发送多轮对话请求。

用 curl 试一下:

curl http://localhost:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:7b", "messages": [ {"role": "user", "content": "用一句话解释什么是RESTful API"} ], "stream": false }'

响应 JSON 的结构和 OpenAI 几乎一致,包括choicesmessageusage这些字段。这等于把你的程序从云端换到本地,只改一个 base URL 就能跑通。对自己动手做自动化工具的人来说,这简直是白送的福利。

6.2 用 Python 调用本地模型

Python 场景我用的是openai这个官方库,把base_url指向本地就行:

from openai import OpenAI client = OpenAI( base_url="http://localhost:11434/v1", api_key="ollama", # 本地服务不校验, 随便填一个 ) response = client.chat.completions.create( model="deepseek-r1:7b", messages=[ {"role": "user", "content": "帮我写一个Python函数,读取当前目录下所有JSON文件并合并成一个列表。"} ], temperature=0.3, max_tokens=2048, stream=False, ) print(response.choices[0].message.content)

注意api_key参数不能省略,OpenAI SDK 不传 key 会直接报错,本地填一个占位字符串就行。这个脚本我平时封装成一个小函数,放到自己常用的工具库里,写报告、整理代码注释、批量翻译,一行代码就能调用。

6.3 context length 报错与参数修正

接入 API 之后,最常见的报错就是上下文超长。

典型报错长这样:

api error: 400 this model's maximum context length is 1048576 tokens. however...

这种报错通常出现在两种场景:一是你在请求里传了特别大的max_tokens或者塞了超长文本进去,超出了模型声明的上下文限制;二是模型配置里num_ctx设置得比实际窗口小,导致生成到一半超出范围。

解决办法分两层。第一层,检查请求参数,把max_tokens调到一个合理值,比如 2048 或 4096。第二层,如果问题出在模型本身的服务配置,回到 Modelfile,把PARAMETER num_ctx 8192写进去,重建模型。对于本地部署,我还会用ollama ps查看当前实际加载的上下文大小,和模型支持的最大值对比,避免盲目拉长文本导致越界。

6.4 模型命名规范和云端 API 差异

本地 API 和云端 API 有一个隐蔽的差别:模型名称的校验机制。云端服务会把模型名卡得很死,报错里经常列出一串允许的模型名,比如:

the supported api model names are deepseek-v4-pro, deepseek-v4-flash...

但本地 Ollama 没有这层限制,同一个模型你可以取任何名字。这带来一个好处,写代码的时候可以用统一的 model 字段,指向不同测试模型;坏处是容易写错名字还发现不了,直到服务端报 404。

另外一个差异是鉴权。云端 API 要求你在请求头里带Authorization: Bearer <token>,本地 Ollama 默认不校验 token,随便填都能通过。如果你在本地服务前面加了反向代理做鉴权,那请求头就一定要带对,否则会收到 401 或安全策略拦截。

这里也顺带提一个建议:如果你在程序里同时接云端和本地接口,最好写一个小的封装层,把 model 名称、base_url、api_key 统一放在配置里,按环境切换,而不是在代码里写死。不然哪天把本地模型名传给了云端 API,或者反过来把云端密钥暴露给了本地,麻烦就大了。

7. 常见问题排查速查表

做本地大模型部署这一路,我整理的报错和解决思路有不少。下面是我认为最值得记录的一张速查表:

问题可能原因解决思路
下载模型速度极慢官方源在特定网络环境下不稳定设置模型目录、从国内社区下载GGUF再导入
ollama run没有响应后台服务未启动检查托盘进程,或手动执行ollama serve
显存不足导致加载失败模型超过显存容量换更小的量化版本,或调低num_ctx
对话总是“忘记”前文num_ctx太小/set parameter num_ctx 8192
IDE 插件连不上本地服务base_url 或模型名写错核对端口和模型名,用 curl 先测通
Web 登录提示需要重新打开 URL认证 token 过期或回调地址失效重新发起登录流程,生成新 URL
局域网能打开页面但无法对话Ollama 未绑定 0.0.0.0设置OLLAMA_HOST=0.0.0.0:11434并重启
API 请求 400上下文超长或max_tokens不合理调整num_ctxmax_tokens
内外网同时访问被安全策略拦截反代规则或防火墙限制检查访问控制配置,加白名单

排查第一条原则是分层定位:先确认 Ollama 服务本地是否正常,再测工具配置,最后查网络与鉴权。用 curl 直接请求http://localhost:11434/v1/models,基本三秒钟就能判断是服务问题还是工具配置问题。

8. 本地模型内容安全的一个提醒

最后想聊一个很多新手忽略、但对部署方式影响极大的话题:本地模型没有云端那套内容过滤机制。本地部署的模型权重,选什么模型、生成什么内容、服务暴露给谁,责任都在你自己这边。

哪怕是同一个开源模型,官方云平台会叠一层又一层的内容审核,但在自己电脑上跑的时候,那些审核默认是不存在的。这也是为什么有些人会问“本地部署的模型会不会生成不合适内容”——技术上完全可能,因为没有任何一个人工的审核层在模型前面拦截。所以我的建议非常明确:

  • 不要把本地推理服务对公网开放,尤其是默认没有任何鉴权的 11434 端口。
  • 如果需要共享给团队,至少加反向代理、账号认证和基础的内容过滤。
  • 不要用于生成违法、违规、违背公序良俗的内容,模型能力边界不等于使用边界。

我自己现在固定用了两套方式:内网个人开发环境里,直接连本地 Ollama,方便快捷;外网或有第三方参与的场景,一律走带内容审核的正式 API。这样既保住隐私和成本,又不把风险敞口拉得太大。

另外还有一个小经验:本地模型回答得不好,很多时候不是你配置的问题,而是模型本身能力就到这了。7B 模型硬要挑战复杂推理,结果肯定不如云端大模型;反过来,简单的文本批量处理、分类、抽取,本地模型响应快、费用低、还不出网,体验明显更好。认清每个模型的适用边界,比一味追新参数更实在。

我自己现在写代码的日常已经离不开了:VS Code 里挂着本地模型做补全,Open WebUI 里挂着另一个模型处理文档,脚本里再留一个 API 入口随时调用。整套系统稳定跑了两三个月,最大的体会是,本地部署没那么多玄学,先把下载和参数这两个硬骨头啃下来,后面就是水到渠成的事。

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

基于SpringBoot+Vue的超市管理系统毕业设计实现指南

很多计算机专业的学生在做毕业设计时&#xff0c;都会面临同一个灵魂拷问&#xff1a;到底选一个什么题目&#xff0c;才能既保证工作量、又能顺利通过答辩&#xff0c;最好还能在写进简历时显得不那么“水”&#xff1f;超市管理系统&#xff0c;恰好就是这样一个“看起来烂大…

作者头像 李华
网站建设 2026/9/9 2:12:48

UCIe与Chiplet互连:从协议栈到封装实战解析

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

作者头像 李华
网站建设 2026/9/9 2:11:39

无FIFO OV7670图像采集实战:STM32 DCMI+DMA链路解析

简介&#xff1a;基于STM32F1单片机的OV7670无FIFO摄像头驱动源码&#xff0c;主要面向嵌入式入门者以及需要低成本图像采集方案的开发者&#xff0c;解决无FIFO模式下网上参考资料较少、可直接运行的工程难以找到的问题。工程中包含完整的Keil项目&#xff0c;实现了摄像头数据…

作者头像 李华
网站建设 2026/9/9 2:10:33

Django实战:智能水果商城销售系统设计与实现

最近在帮一个做社区团购的朋友整理他们的线上销售流程&#xff0c;顺手把之前带学生做的那套“基于Django的智能水果商城销售系统”重新翻出来打磨了一遍。这个项目说是毕业设计选题&#xff0c;但拆开看其实就是一套标准的小型生鲜电商系统&#xff0c;只不过业务场景落在了“…

作者头像 李华
网站建设 2026/9/9 2:08:27

ECC:把AI Agent从Demo推向生产稳定的工程操作层解析

先给结论&#xff1a;ECC 不是一个新出的模型&#xff0c;也不是又一个 Agent 开发框架&#xff0c;而是一层专门负责把 Agent 从“能跑”变成“能稳定上线”的工程操作层。我第一次看到它在 GitHub 冲到 245K star 量级时还愣了一下&#xff0c;毕竟能到这个热度的大多是收藏型…

作者头像 李华
网站建设 2026/9/9 2:05:50

汇川PLC与EtherCAT伺服总线配置实战:从组态到故障排查

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

作者头像 李华