news 2026/9/7 17:52:32

API实测对比DeepSeek与GPT:中文推理、代码生成与模型选型指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
API实测对比DeepSeek与GPT:中文推理、代码生成与模型选型指南

之前群里在讨论国产大模型的最新进展,顺手想把 DeepSeek V4 Pro 的真实水平摸一摸。本来只打算跑一组“API 调用 + 中文逻辑题”的常规测试,结果没想到,在同样的测试集下,GPT 这边的表现成了整场实验里最意外的一环——不是变强了多少,而是在某些中文表达、数学推理和幻觉控制场景里,反而暴露了和预期完全相反的能力分布。

于是就有了这篇文章。我会把整个测试思路、完整可运行的对比代码、结果分析、常见坑点和模型选型建议全部整理出来。内容不算深,但每一步都能照着跑;里面涉及到的模型版本号、API 参数、响应格式都以实际返回为准。适合刚接触大模型 API 的开发者,也适合想在 DeepSeek、GPT 之间做技术选型的朋友。

1. 背景与核心概念

1.1 DeepSeek 与 GPT:不是一个层面的“对手”

很多文章喜欢把 DeepSeek 和 GPT 放在一起比较,好像它们是两个可以直接掰手腕的同类产品。严格来说,这种说法并不准确。

DeepSeek 是一个大语言模型产品,它的核心是 DeepSeek 系列模型,可以通过官网、API 接口、本地部署等多种方式使用。你可以把它理解成“模型 + 应用层服务”的组合,既能拿来对话,也能作为后端能力被业务系统调用。

GPT 则是 OpenAI 旗下生成式预训练 Transformer 模型的统称。大家常说的“GPT 这边”通常有两种含义:一是通过 ChatGPT 网页端/客户端体验产品能力,二是通过 OpenAI API 调用模型能力。工程上更常用的是第二种,因为 API 可以精确控制参数、统计 token、接入业务。

关键区别在于:DeepSeek 在中文语境、推理展示、性价比上有比较明显的取舍;GPT 在指令遵循、多轮一致性、生态兼容性上积累了更久。两者的“能力边界”不是固定不变的,而是跟你的测试方式强相关。

1.2 为什么模型对比一定要用 API

很多人的模型对比方式是“左边开一个网页,右边开一个网页,同一个问题各问一遍”。这种方式适合体验,不适合工程决策。

网页端对比有几个无法回避的问题:

  • 模型版本不透明,你无法确定后台是否已经切到最新版。
  • 采样参数不可控,温度、top_p、max_tokens 都是黑盒。
  • 存在多轮记忆污染,前面随便聊的内容可能影响后面回答。
  • 没有 token 统计数据,无法估算真实成本。
  • 无法自动化复现,也就无法量化稳定性。

而通过 API 对比,我们可以固定 prompt、固定参数、固定模型名称,只改变模型这一唯一变量,得到的结论才真正有参考价值。

这也是这篇文章的出发点:既然要测 DeepSeek V4 Pro,就用标准的 OpenAI SDK 兼容方式去调,让两个模型面对完全相同的题目。

1.3 本次实验的事实声明

在开始前需要说明一点:网络上关于“DeepSeek V4 Pro”的不少信息是社区讨论的产物,甚至存在版本名称混用的情况。本文不参与命名争议,只以“DeepSeek V4 Pro”这个模型名称为入口,测试的是通过官方 API 能实际访问到的 DeepSeek 模型服务。具体模型标识符以你在 DeepSeek 开放平台控制台看到的实际值为准。

GPT 部分同样不做虚构版本宣传,统一以 OpenAI API 默认可用模型作为测试对象,只比较同一次实验中的实际返回。

这样做是为了保证内容真实可复现。如果你拿到的模型名称、参数结构跟我这里写的不完全一致,请先到对应开放平台文档里确认最新 API 结构。

2. 环境准备与版本说明

2.1 实验环境

本文测试代码在以下环境中验证通过:

项目说明
操作系统Windows 11 / Ubuntu 22.04 均可
语言版本Python 3.10+
依赖库openai、python-dotenv、requests
网络环境可正常访问 DeepSeek API;GPT 相关 API 请在合法、合规、可用的网络条件下访问
IDEVS Code(也可用 PyCharm 或命令行)

如果你还不确定自己的 Python 环境是否干净,建议先创建一个独立的虚拟环境:

python -m venv llm-compare-env

激活虚拟环境:

Windows:

llm-compare-env\Scripts\activate

macOS / Linux:

source llm-compare-env/bin/activate

2.2 安装依赖

pip install openai python-dotenv

这里简单解释一下为什么需要 openai 库:DeepSeek API 兼容 OpenAI 的接口格式,所以我们完全可以用 openai SDK 同时访问 DeepSeek 和 GPT,不用为两个平台各写一套 HTTP 请求代码。代码层面的一致性,保证了对比实验的公平性。

2.3 API Key 准备

分别前往 DeepSeek 开放平台和 OpenAI 平台创建 API Key。

创建好后,建议在项目根目录建立.env文件保存密钥,绝对不要把 Key 硬编码在代码里:

DEEPSEEK_API_KEY=你的_deepseek_key OPENAI_API_KEY=你的_openai_key

然后通过 python-dotenv 读取:

import os from dotenv import load_dotenv load_dotenv() DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

2.4 项目结构

llm-compare/ ├── .env ├── main.py ├── questions.py ├── clients.py ├── compare.py └── results/ └── output.json

上面的结构不是必须的,但对于后面扩展测试题、增加模型、保存结果很有帮助。文中接下来会逐个文件给出内容。

3. 调用大模型 API 的核心原理拆解

3.1 OpenAI SDK 兼容模式是什么

DeepSeek API 的设计思路是“方便开发者迁移”。如果你之前用过 openai SDK 调 GPT,那么调 DeepSeek 几乎不用改代码,只需要换 base_url 和 api_key。

这个机制的核心在于 SDK 会把你的请求封装成标准的 HTTP 调用,而服务端只要实现了同样的路由和响应结构,客户端就能无缝切换。

看一个最小的 DeepSeek 调用示例:

from openai import OpenAI client = OpenAI( api_key="你的_deepseek_key", base_url="https://api.deepseek.com" ) response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "user", "content": "你好,请介绍一下你自己"} ], stream=False ) print(response.choices[0].message.content)

这里面的关键是base_url参数。GPT 的官方接口地址是https://api.openai.com/v1,而 DeepSeek 的兼容地址是https://api.deepseek.com。SDK 会自动把/chat/completions拼到 base_url 后面。

3.2 理解模型名称与参数

如果你刚接触,可能会对model参数感到困惑。不同平台、不同时期,模型标识符都可能发生变化。

常见情况包括:

  • deepseek-chat:DeepSeek 通用对话模型。
  • deepseek-reasoner:DeepSeek 推理增强模型,会输出思维链。
  • GPT 系列:OpenAI 平台提供的各类模型标识。

本文实验中会用一个统一的模型映射字典,把“名称”和“实际标识符”分开,方便之后切换版本。

采样参数方面,需要重点关注下面几个:

参数作用建议
temperature控制随机性,值越大回答越发散对比测试统一设为 0.2
max_tokens限制生成最大长度根据题目设置 1024 或 2048
top_p核采样参数对比测试统一设为 1.0
stream是否流式输出对比测试统一设为 False

对比实验中,除了 model 不同,其他参数必须完全一致。这是控制变量的基本原则。

3.3 为什么要用 messages 结构

大模型是无状态的,每次调用都是一次独立计算。messages列表就是你把“上下文”传给模型的方式。

[ {"role": "system", "content": "你是一个严谨的技术评测助手"}, {"role": "user", "content": "题目内容"} ]

在单轮对比测试中,我通常只设置 user 一条消息,不加 system prompt,也不带历史对话,这样可以最大程度还原模型本身的“裸能力”。如果你做的是业务接入,system prompt 往往能显著改变输出质量,这个差异要心里有数。

4. 完整实战案例:同题对比 DeepSeek V4 Pro 与 GPT

这一部分会带大家从零搭建一个可复现的模型对比测试脚本。整个流程分四步:准备测试题、封装客户端、执行对比、保存结果。

4.1 创建测试题目集

为了覆盖不同能力维度,我设计了 6 类题目,每类包含具体问题:

# 文件路径:questions.py TEST_QUESTIONS = [ { "id": "math_01", "category": "数学推理", "question": "一个水池有一个进水管和一个出水管。单独打开进水管需要 6 小时注满水池,单独打开出水管需要 9 小时排空水池。如果两个管子同时打开,需要多少小时才能注满水池?请给出详细计算过程。" }, { "id": "logic_02", "category": "逻辑推理", "question": "有三个人 A、B、C,其中一个人始终说真话,一个人始终说假话,一个人随机说真话或假话。A 说:'B 是那个随机的人'。B 说:'C 是那个说真话的人'。C 说:'A 不是那个说假话的人'。请问三人分别是什么身份?请逐步推理。" }, { "id": "code_03", "category": "代码生成", "question": "请用 Python 实现一个函数,输入一个整数 n,返回斐波那契数列的前 n 项。要求:使用迭代方式实现,时间复杂度和空间复杂度尽量低。请给出完整代码和简要注释。" }, { "id": "fact_04", "category": "事实准确性", "question": "请列举中国四大古典名著,并简要说明每部作品的作者和主要内容。不要编造不确定的细节。" }, { "id": "chinese_05", "category": "中文表达", "question": "请将下面这段文字翻译成更正式、更书面化的中文:'那个项目搞了很久,最后总算上线了,中间踩了不少坑,一开始配置老有问题,后来发现是版本不对。'" }, { "id": "instruction_06", "category": "指令遵循", "question": "请只输出以下 JSON 格式,不要输出任何额外的解释文字:{\"name\": \"测试\", \"count\": 3, \"items\": [\"a\", \"b\", \"c\"]}" } ]

为什么选这些题?

  • 数学推理:考察模型的分步计算能力。
  • 逻辑推理:考察模型的长期依赖和约束跟踪。
  • 代码生成:最贴近开发者日常。
  • 事实准确性:用于观察幻觉倾向。
  • 中文表达:考验中文语感和润色能力。
  • 指令遵循:考验模型是否严格服从输出格式。

4.2 封装双模型客户端

接下来写客户端封装。为了公平,两个模型都用同一个 openai SDK,只切换 base_url、api_key 和 model。

# 文件路径:clients.py from openai import OpenAI def create_deepseek_client(api_key: str) -> OpenAI: return OpenAI( api_key=api_key, base_url="https://api.deepseek.com" ) def create_openai_client(api_key: str) -> OpenAI: return OpenAI( api_key=api_key, base_url="https://api.openai.com/v1" ) MODEL_CONFIG = { "deepseek": { "client_builder": create_deepseek_client, "model": "deepseek-chat" }, "gpt": { "client_builder": create_openai_client, "model": "gpt-4o-mini" } }

这里说明一下:MODEL_CONFIG中的模型标识符是示例值。DeepSeek 平台如果已经为你的账号开放了 V4 Pro 等新模型,请改成实际可用的模型 ID;GPT 侧同理,以你账号真实可见的模型列表为准。

4.3 编写核心对比逻辑

这里的重点不是“调用”,而是“记录”。一次有效的模型对比,至少需要记录四个信息:

  • 返回内容
  • 耗时
  • 输入 token 数
  • 输出 token 数
# 文件路径:compare.py import json import time from clients import MODEL_CONFIG from questions import TEST_QUESTIONS def run_single_query(client, model_name, question, max_tokens=2048): start_time = time.time() response = client.chat.completions.create( model=model_name, messages=[ {"role": "user", "content": question} ], temperature=0.2, max_tokens=max_tokens, top_p=1.0, stream=False ) elapsed = time.time() - start_time return { "content": response.choices[0].message.content, "elapsed_seconds": round(elapsed, 2), "prompt_tokens": response.usage.prompt_tokens, "completion_tokens": response.usage.completion_tokens, "total_tokens": response.usage.total_tokens } def run_comparison(deepseek_client, gpt_client): results = {} for question_item in TEST_QUESTIONS: qid = question_item["id"] question = question_item["question"] print(f"正在测试:{qid} - {question_item['category']}") ds_result = run_single_query( deepseek_client, MODEL_CONFIG["deepseek"]["model"], question ) gpt_result = run_single_query( gpt_client, MODEL_CONFIG["gpt"]["model"], question ) results[qid] = { "category": question_item["category"], "question": question, "deepseek": ds_result, "gpt": gpt_result } # 每次请求间隔一点时间,避免触发限流 time.sleep(1) return results

4.4 主入口与结果保存

# 文件路径:main.py import json import os from dotenv import load_dotenv from clients import MODEL_CONFIG from compare import run_comparison load_dotenv() def main(): deepseek_api_key = os.getenv("DEEPSEEK_API_KEY") openai_api_key = os.getenv("OPENAI_API_KEY") if not deepseek_api_key or not openai_api_key: raise ValueError("请在 .env 文件中配置 DEEPSEEK_API_KEY 和 OPENAI_API_KEY") deepseek_client = MODEL_CONFIG["deepseek"]["client_builder"](deepseek_api_key) gpt_client = MODEL_CONFIG["gpt"]["client_builder"](openai_api_key) results = run_comparison(deepseek_client, gpt_client) os.makedirs("results", exist_ok=True) with open("results/output.json", "w", encoding="utf-8") as f: json.dump(results, f, ensure_ascii=False, indent=2) print("测试完成,结果已保存到 results/output.json") if __name__ == "__main__": main()

4.5 运行与验证

在项目根目录执行:

python main.py

如果一切正常,你会看到类似输出:

正在测试:math_01 - 数学推理 正在测试:logic_02 - 逻辑推理 正在测试:code_03 - 代码生成 正在测试:fact_04 - 事实准确性 正在测试:chinese_05 - 中文表达 正在测试:instruction_06 - 指令遵循 测试完成,结果已保存到 results/output.json

然后可以用下面的命令快速查看结果:

python -c "import json; data=json.load(open('results/output.json', encoding='utf-8')); print(data['math_01']['deepseek']['content']); print('---'); print(data['math_01']['gpt']['content'])"

预期结果是一个结构化的 JSON 文件,里面包含每道题的模型返回、耗时和 token 消耗。

4.6 我这次测试的发现

由于模型版本会持续变化,我不在这里给出“绝对准确”的回答内容,只描述我在这次测试中观察到且值得关注的几个点。

第一,DeepSeek 在中文数学题上的推理过程非常完整。比如水池注水那道题,模型会先把进水管效率、出水管效率拆开,再列方程求解,步骤清晰。对中文题目里“多少小时注满”这个细节抓得很准,没有出现单位错乱。

第二,GPT 在代码生成和 JSON 格式遵循上表现稳定。斐波那契函数不但给出了迭代解法,还主动加了类型注解和边界判断。指令遵循那道题,它严格只输出了 JSON,没有额外废话。这一点在工程接入中非常重要,因为下游解析 JSON 时最怕模型乱加 markdown 代码块。

第三,也是最让我意外的点:在个别中文表达的润色题上,GPT 给出了一个看似通顺、但完全不符合中文书面语习惯的版本。比如把“搞了很久”处理成了略带翻译腔的表达,没有 DeepSeek 处理得自然。另一道逻辑推理题中,GPT 在某些转折步骤上表现得比较“自信”,但推理链存在跳跃,而 DeepSeek 则会更按部就班地把可能性列表列出来逐一排除。

这说明什么?说明模型能力的比较结果高度依赖评测集。如果你天天写英文 prompt、做代码生成,GPT 的体验无疑更好;如果业务场景是中文客服、中文文案处理、中文知识问答,DeepSeek 的性价比和语言适配度很可能是更优解。

需要再三强调:单次测试、小样本测试都无法代表模型全局能力。要看模型真实水平,应该扩大题目量、做多次重复采样、统计得分均值和方差。这篇文章的价值在于提供一套可扩展的对比框架,而不是一个“最终结论”。

5. 常见问题与排查思路

在实际运行上面代码的过程中,有几类问题出现频率很高。下面整理成表,并逐一说明排查方式。

问题现象常见原因解决思路
报错AuthenticationErrorAPI Key 错误或环境变量未加载检查.env文件是否存在,确认load_dotenv()已执行
报错NotFoundError模型名称不存在或账号无权访问登录开放平台控制台,查看账号可用的模型 ID
报错RateLimitError请求频率过高或额度不足在每次请求之间添加time.sleep(1),检查账户余额
返回结果为空max_tokens 设置过小调大 max_tokens,给模型更多生成空间
返回内容带 markdown 代码块模型对指令理解偏差在 prompt 中明确指定输出格式,或在后处理中剥离代码块标记
中文内容乱码控制台编码问题保存文件时使用encoding="utf-8",终端使用 UTF-8 编码
对比结果不稳定温度参数过高对比测试固定 temperature=0.2,甚至设为 0

下面挑两个最容易踩坑的场景展开说明。

第一个是环境变量没有生效。很多人明明在.env里写了 Key,运行时报错找不到。这通常是因为当前工作目录不在项目根目录,或者.env文件名写成了.env.txt。Windows 下尤其要注意,系统默认隐藏文件扩展名,很容易创建出错。

第二个是模型名称不匹配。不同时间点,平台会把新的模型版本放到不同标识符下。不要理所当然认为“官网说 V4 Pro,API 里就一定能直接填 V4 Pro”。正确做法是调用模型列表接口,或者直接看控制台里的模型名称。

如果你使用的是国内中转 API 或其他兼容服务,还需要注意自定义 base_url 的路径问题。有的网关要求 base_url 以/v1结尾,有的要求不带任何路径,这个完全取决于服务商实现,没有统一标准。

6. 最佳实践与工程建议

6.1 对比测试不能只看答案,还要看稳定性

很多同学做模型选型,跑一遍代码觉得“差不多”,就下了结论。其实这个做法风险很大。

大模型带有采样随机性,即使是 temperature=0,也不能保证每次输出完全一致(部分平台对此有特殊处理,但也不是绝对)。更科学的做法是:同一个问题跑 5 次,看答案的正确率、格式合规率、回答长度方差。

你可以在run_single_query外层再嵌套一个循环:

def run_multiple_times(client, model_name, question, times=3): all_results = [] for i in range(times): all_results.append(run_single_query(client, model_name, question)) return all_results

这样就能得到一组样本,而不是一个孤立的输出。

6.2 成本估算要按 token 算,不要按“次数”算

对比模型性价比时,最科学的指标是“每百万 token 价格”。但工程上的真实成本不是模型单价,而是业务消耗量。

比如同样是生成一段 800 字报告,模型 A 需要 1500 个输出 token,模型 B 需要 2200 个输出 token。模型 B 即使单价更低,实际成本可能反而更高。

所以在真实业务接入中,建议多做一轮“压缩率测试”:给固定任务,统计平均输出 token 数,再乘以单价。这个数据比跑分更能反映你的账单。

6.3 一定要在业务上下文里测,不要测“裸模型”

裸模型能力是底线,但不是全部。实际项目中你一定会加 system prompt、few-shot 示例、后处理逻辑。

我的建议是分两步走:

  • 第一步,用裸模型测试,了解模型原生能力。
  • 第二步,用你的真实业务 prompt 测试,评估工程集成后的效果。

这两步结果可能完全相反。有些模型裸测一般,但加上 prompt 模板后表现非常好;有些模型裸测惊艳,但很难用 prompt 约束它的输出格式。

6.4 代码里做好异常兜底

调用外部 API 时,网络抖动、限流是常态。生产环境必须要有重试机制和降级方案。

一个简单的重试逻辑:

import time def call_with_retry(func, retries=3, delay=2): for i in range(retries): try: return func() except Exception as e: print(f"第 {i+1} 次调用失败:{e}") if i == retries - 1: raise time.sleep(delay)

run_single_query的调用包进call_with_retry,就能有效提高稳定性。

6.5 注意数据合规与安全边界

在调用任何大模型 API 时,都要注意以下几点:

  • 不要发送包含用户真实姓名、手机号、身份证号、交易数据的明文内容。
  • 如果必须发送敏感数据,先确认服务商的数据处理协议,并对字段做脱敏处理。
  • 生产环境使用独立 API Key,设置调用额度上限,避免 Key 泄露后被刷。
  • 不要把 Key 提交到 Git 仓库,使用.gitignore忽略.env文件。
  • 遵守目标平台的使用条款和所在地区法律法规,在合法合规的前提下使用相关服务。

6.6 善用日志和可观测性

每次 API 调用都应该记录如下信息:

{ "timestamp": "2025-06-01T10:00:00Z", "model": "deepseek-chat", "prompt_tokens": 120, "completion_tokens": 300, "elapsed_ms": 1800, "status": "success" }

有了这些日志,你才能在线上问题出现时快速定位是 prompt 问题、模型问题还是网络问题。

7. 总结与后续学习建议

这次测试给我最直接的感受是:大模型评测远比想象中复杂,同题对比只是第一步。

从技术角度看,这篇文章里最核心的可复用内容有三个:

  • 用 OpenAI SDK 统一调用 DeepSeek 和 GPT 的客户端封装方式。
  • 可扩展的测试题目结构和 JSON 结果保存逻辑。
  • 控制变量(temperature、top_p、max_tokens)进行模型对比的实验方法。

从产品选型角度看,DeepSeek 和 GPT 并不是简单“谁替代谁”的关系。中文内容理解、推理展示、成本控制场景下,DeepSeek 有它的独到之处;代码生成、格式遵循、生态成熟度方面,GPT 也有长期积累的优势。最稳的做法是根据自己的业务场景设计测试集,用数据说话。

如果你对后续进一步研究感兴趣,可以按这个顺序往下走:

  1. 扩展测试集到 50 题以上,覆盖长文本摘要、结构化抽取、多轮对话。
  2. 加入流式输出测试,对比首 token 延迟和生成吞吐。
  3. 尝试把模型接入到自己的项目里,比如做一个文档问答助手或代码审查机器人。
  4. 研究 function calling 能力,看模型能否正确触发外部工具调用。

动手跑通一次对比测试,比看十篇评测文章都有用。建议你先把自己的 API Key 配好,把上面的代码跑一遍,然后往TEST_QUESTIONS里添加你业务里真实遇到的问题。这样你得到的,才是对你项目最有价值的结论。

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

MCN机构AI脚本批量生成实战:从工具选型到SOP全流程

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

作者头像 李华
网站建设 2026/9/6 13:55:53

采埃孚与英伟达联合开发车载AI系统:技术架构与量产挑战解析

简介:这是一份关于采埃孚(ZF)与英伟达(NVIDIA)联合开发人工智能系统的技术资料,PDF格式,适用于自动驾驶、智能系统及汽车电子领域的研究人员、工程师和学习者,可作为系统开发与行业合…

作者头像 李华
网站建设 2026/9/7 17:22:56

RK3588多模态车内Agent:语音视觉手势融合与仲裁实践

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

作者头像 李华
网站建设 2026/9/7 18:01:53

重启旧技术博客账号:从内容备份到多平台分发的系统化管理

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

作者头像 李华
网站建设 2026/9/7 17:55:01

从零开始学电机驱动控制:一套可落地的BLDC/FOC培训方案

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

作者头像 李华