Kimi K3开源大模型实战:从本地部署到API集成完整指南

发布时间:2026/11/10 21:09:50

Kimi K3开源大模型实战:从本地部署到API集成完整指南 Kimi K3 开源模型实战指南从本地部署到应用开发全解析最近 AI 大模型领域迎来一个重要里程碑——Kimi K3 的发布让开源模型与闭源模型的性能差距缩小到了仅 4 分。这一突破意味着开发者和企业现在可以用更低的成本获得接近顶级商业模型的 AI 能力。本文将完整介绍 Kimi K3 的技术特性、本地部署方案、API 使用方法和实际应用案例帮助开发者快速掌握这一前沿技术。无论你是想要在本地环境体验大模型能力的学生还是需要在生产环境中集成 AI 功能的企业开发者本文都将提供从入门到实战的完整指导。我们将涵盖硬件要求、环境配置、代码示例以及性能优化技巧确保你能顺利将 Kimi K3 应用到实际项目中。1. Kimi K3 技术背景与核心特性1.1 开源模型与闭源模型的差距演变长期以来开源大语言模型与闭源商业模型之间存在明显的性能鸿沟。根据 Artificial Analysis 的最新智能指数评估传统开源模型在推理能力、代码生成和复杂问题解决方面通常落后闭源模型 10-15 分。而 Kimi K3 的发布将这一差距缩小到了历史性的 4 分标志着开源模型进入了新的发展阶段。这种差距的缩小主要得益于几个关键因素首先Kimi K3 采用了创新的模型架构设计在参数量不变的情况下显著提升了推理效率其次训练数据的质量和多样性得到了大幅改善最重要的是模型优化技术的进步让开源社区能够更充分地挖掘硬件潜力。1.2 Kimi K3 的核心技术突破Kimi K3 在多个技术维度实现了重要突破。模型采用了混合专家架构在保持推理速度的同时大幅提升了处理复杂任务的能力。其上下文窗口长度扩展到 128K token能够处理超长文档和复杂代码库。在数学推理和代码生成方面Kimi K3 的表现尤其突出在主流基准测试中达到了商用级别的水平。另一个重要特性是 Kimi K3 对硬件资源的高效利用。通过模型量化和优化它可以在消费级显卡上运行大幅降低了使用门槛。同时模型支持多种精度推理用户可以根据实际需求在性能和资源消耗之间进行灵活权衡。1.3 应用场景与生态优势Kimi K3 的开源特性为开发者社区带来了显著优势。企业可以基于模型进行定制化训练满足特定领域的业务需求研究人员能够深入分析模型机制推动技术进步个人开发者则可以免费使用强大的 AI 能力构建创新应用。典型应用场景包括智能代码助手、学术研究辅助、内容创作工具、企业知识库问答系统等。由于模型完全开源用户无需担心 API 调用费用和数据隐私问题这在金融、医疗等敏感行业尤为重要。2. 环境准备与硬件要求2.1 最低配置与推荐配置在部署 Kimi K3 之前首先需要评估硬件环境。模型的不同规模版本对硬件要求有显著差异以下是基于实际测试的配置建议最低配置要求GPUNVIDIA GTX 1080 Ti11GB VRAM或同等性能显卡内存16GB 系统内存存储50GB 可用空间用于模型文件和依赖库系统Ubuntu 18.04 / Windows 10 / macOS 12推荐生产环境配置GPUNVIDIA RTX 309024GB VRAM或 RTX 4090内存32GB 系统内存存储NVMe SSD至少 100GB 可用空间系统Ubuntu 20.04 LTS 或更新版本对于纯 CPU 推理场景需要至少 64GB 内存和现代多核处理器但推理速度会显著慢于 GPU 方案。2.2 软件环境依赖Kimi K3 支持多种部署框架以下是基于 PyTorch 生态的基础环境配置# 创建 Python 虚拟环境 python -m venv kimi_k3_env source kimi_k3_env/bin/activate # Linux/macOS # 或 kimi_k3_env\Scripts\activate # Windows # 安装基础依赖 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install transformers4.35.0 accelerate0.24.0 pip install bitsandbytes0.41.0 # 用于量化推理如果计划使用 WebUI 界面还需要安装额外的依赖pip install gradio4.0.0 streamlit1.28.02.3 模型下载与验证Kimi K3 的模型文件可以通过多种方式获取推荐使用 Hugging Face Hub 进行下载from huggingface_hub import snapshot_download import os # 设置模型缓存路径 os.environ[HF_HOME] /path/to/your/model/cache # 下载 Kimi K3 基础模型 model_path snapshot_download( repo_iddeepseek-ai/Kimi-K3-Base, revisionmain, # 使用最新版本 local_dir./kimi-k3-base, resume_downloadTrue ) print(f模型已下载到: {model_path})下载完成后建议验证模型完整性# 检查文件完整性 md5sum ./kimi-k3-base/pytorch_model.bin # 或使用官方提供的校验和进行验证3. 本地部署实战教程3.1 基础命令行部署最简单的部署方式是使用 transformers 库直接加载模型进行推理import torch from transformers import AutoTokenizer, AutoModelForCausalLM # 检查可用设备 device cuda if torch.cuda.is_available() else cpu print(f使用设备: {device}) # 加载 tokenizer 和模型 tokenizer AutoTokenizer.from_pretrained(./kimi-k3-base) model AutoModelForCausalLM.from_pretrained( ./kimi-k3-base, torch_dtypetorch.float16, # 使用半精度减少显存占用 device_mapauto ) # 示例推理 prompt 请用 Python 实现一个快速排序算法 inputs tokenizer(prompt, return_tensorspt).to(device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens500, temperature0.7, do_sampleTrue, pad_token_idtokenizer.eos_token_id ) response tokenizer.decode(outputs[0], skip_special_tokensTrue) print(response)3.2 使用量化技术降低资源需求对于显存有限的设备可以使用 4-bit 或 8-bit 量化技术from transformers import BitsAndBytesConfig # 配置 4-bit 量化 quantization_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16 ) model AutoModelForCausalLM.from_pretrained( ./kimi-k3-base, quantization_configquantization_config, device_mapauto )量化后模型显存占用可减少 60-70%但可能会轻微影响生成质量。3.3 基于 Gradio 的 Web 界面部署创建用户友好的 Web 界面便于交互式使用import gradio as gr import torch from transformers import pipeline # 创建推理管道 pipe pipeline( text-generation, model./kimi-k3-base, torch_dtypetorch.float16, device0 if torch.cuda.is_available() else -1 ) def generate_text(prompt, max_length500): try: outputs pipe( prompt, max_lengthmax_length, temperature0.7, do_sampleTrue, pad_token_idpipe.tokenizer.eos_token_id ) return outputs[0][generated_text] except Exception as e: return f生成错误: {str(e)} # 创建 Gradio 界面 iface gr.Interface( fngenerate_text, inputs[ gr.Textbox(lines3, placeholder请输入您的问题或指令..., label输入), gr.Slider(100, 1000, value500, label生成长度) ], outputsgr.Textbox(label模型回复), titleKimi K3 智能助手, description基于 Kimi K3 开源大模型的对话界面 ) iface.launch(server_name0.0.0.0, server_port7860, shareTrue)运行后可通过浏览器访问 http://localhost:7860 使用界面。4. API 服务部署与集成4.1 使用 FastAPI 创建 RESTful API对于生产环境通常需要部署为 API 服务from fastapi import FastAPI, HTTPException from pydantic import BaseModel import uvicorn import torch from transformers import AutoTokenizer, AutoModelForCausalLM app FastAPI(titleKimi K3 API Server) class GenerationRequest(BaseModel): prompt: str max_tokens: int 500 temperature: float 0.7 class GenerationResponse(BaseModel): generated_text: str tokens_used: int # 全局模型实例 tokenizer None model None app.on_event(startup) async def load_model(): global tokenizer, model try: tokenizer AutoTokenizer.from_pretrained(./kimi-k3-base) model AutoModelForCausalLM.from_pretrained( ./kimi-k3-base, torch_dtypetorch.float16, device_mapauto ) print(模型加载完成) except Exception as e: print(f模型加载失败: {e}) app.post(/generate, response_modelGenerationResponse) async def generate_text(request: GenerationRequest): if tokenizer is None or model is None: raise HTTPException(status_code503, detail模型未就绪) try: inputs tokenizer(request.prompt, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate( **inputs, max_new_tokensrequest.max_tokens, temperaturerequest.temperature, do_sampleTrue, pad_token_idtokenizer.eos_token_id ) generated_text tokenizer.decode(outputs[0], skip_special_tokensTrue) tokens_used len(outputs[0]) return GenerationResponse( generated_textgenerated_text, tokens_usedtokens_used ) except Exception as e: raise HTTPException(status_code500, detailf生成错误: {str(e)}) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)4.2 客户端调用示例其他应用可以通过 HTTP 请求调用 APIimport requests import json def call_kimi_api(prompt, max_tokens500, temperature0.7): url http://localhost:8000/generate payload { prompt: prompt, max_tokens: max_tokens, temperature: temperature } try: response requests.post(url, jsonpayload, timeout120) if response.status_code 200: result response.json() return result[generated_text] else: return fAPI 错误: {response.status_code} except requests.exceptions.RequestException as e: return f请求失败: {str(e)} # 使用示例 result call_kimi_api(解释一下机器学习中的过拟合现象) print(result)4.3 性能优化与并发处理对于高并发场景需要优化推理性能from concurrent.futures import ThreadPoolExecutor import asyncio class BatchProcessor: def __init__(self, model_path, max_workers2): self.executor ThreadPoolExecutor(max_workersmax_workers) self.model_path model_path async def process_batch(self, prompts): loop asyncio.get_event_loop() tasks [ loop.run_in_executor(self.executor, self._generate_single, prompt) for prompt in prompts ] return await asyncio.gather(*tasks) def _generate_single(self, prompt): # 每个线程独立的模型实例 tokenizer AutoTokenizer.from_pretrained(self.model_path) model AutoModelForCausalLM.from_pretrained( self.model_path, torch_dtypetorch.float16, device_mapauto ) inputs tokenizer(prompt, return_tensorspt).to(model.device) with torch.no_grad(): outputs model.generate(**inputs, max_new_tokens200) return tokenizer.decode(outputs[0], skip_special_tokensTrue)5. 实际应用案例开发5.1 智能代码助手实现利用 Kimi K3 强大的代码生成能力构建开发工具class CodeAssistant: def __init__(self, model_path): self.tokenizer AutoTokenizer.from_pretrained(model_path) self.model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, device_mapauto ) def generate_code(self, description, languagepython): prompt f 请用{language}实现以下功能 需求{description} 代码 inputs self.tokenizer(prompt, return_tensorspt).to(self.model.device) with torch.no_grad(): outputs self.model.generate( **inputs, max_new_tokens1000, temperature0.3, # 较低温度保证代码确定性 do_sampleTrue, pad_token_idself.tokenizer.eos_token_id ) full_text self.tokenizer.decode(outputs[0], skip_special_tokensTrue) # 提取代码部分 code_part full_text.split(代码)[-1].strip() return code_part # 使用示例 assistant CodeAssistant(./kimi-k3-base) code assistant.generate_code(一个计算斐波那契数列的函数, python) print(code)5.2 文档摘要与知识问答系统构建企业级知识管理应用class DocumentQASystem: def __init__(self, model_path): self.tokenizer AutoTokenizer.from_pretrained(model_path) self.model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, device_mapauto ) self.context def add_document(self, document_text): 添加文档到上下文 self.context document_text \n\n def ask_question(self, question, max_length2000): 基于文档内容回答问题 # 如果上下文太长进行智能截断 if len(self.context) 10000: truncated_context self.context[-10000:] else: truncated_context self.context prompt f基于以下文档内容回答问题 文档内容 {truncated_context} 问题{question} 回答 inputs self.tokenizer(prompt, return_tensorspt).to(self.model.device) with torch.no_grad(): outputs self.model.generate( **inputs, max_new_tokens500, temperature0.5, do_sampleTrue, pad_token_idself.tokenizer.eos_token_id ) response self.tokenizer.decode(outputs[0], skip_special_tokensTrue) answer response.split(回答)[-1].strip() return answer # 使用示例 qa_system DocumentQASystem(./kimi-k3-base) qa_system.add_document( 机器学习是人工智能的一个分支主要研究如何使计算机系统通过经验自动改进性能。 监督学习是机器学习的一种方法需要标注数据进行训练。 ) answer qa_system.ask_question(什么是监督学习) print(answer)6. 性能优化与资源管理6.1 显存优化策略大型语言模型对显存需求较高以下策略可帮助优化资源使用def optimize_memory_usage(model, strategybalanced): 根据策略优化模型内存使用 if strategy aggressive: # 激进优化最大程度节省显存 model.enable_input_require_grads() model.gradient_checkpointing_enable() model.config.use_cache False elif strategy balanced: # 平衡优化兼顾速度和内存 model.config.use_cache True elif strategy speed: # 速度优先使用更多显存提升速度 model.config.use_cache True if hasattr(model, to): model.to(torch.device(cuda)) return model # 使用示例 model AutoModelForCausalLM.from_pretrained(./kimi-k3-base) optimized_model optimize_memory_usage(model, strategybalanced)6.2 推理速度优化通过批处理和缓存机制提升吞吐量class OptimizedInferenceEngine: def __init__(self, model_path, batch_size4, cache_size100): self.tokenizer AutoTokenizer.from_pretrained(model_path) self.model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.float16, device_mapauto ) self.batch_size batch_size self.cache {} self.cache_size cache_size def batch_generate(self, prompts): 批量生成提升效率 # 编码所有提示 encoded_inputs self.tokenizer( prompts, paddingTrue, return_tensorspt ).to(self.model.device) with torch.no_grad(): outputs self.model.generate( **encoded_inputs, max_new_tokens200, temperature0.7, do_sampleTrue, pad_token_idself.tokenizer.eos_token_id ) # 解码所有结果 results [] for i, output in enumerate(outputs): text self.tokenizer.decode(output, skip_special_tokensTrue) results.append(text[len(prompts[i]):].strip()) return results6.3 监控与日志系统生产环境需要完善的监控机制import logging import psutil import GPUtil from datetime import datetime class ModelMonitor: def __init__(self, log_filemodel_monitor.log): self.logger logging.getLogger(ModelMonitor) self.logger.setLevel(logging.INFO) handler logging.FileHandler(log_file) formatter logging.Formatter(%(asctime)s - %(levelname)s - %(message)s) handler.setFormatter(formatter) self.logger.addHandler(handler) def log_inference(self, prompt_length, response_length, inference_time): 记录推理性能数据 gpus GPUtil.getGPUs() gpu_usage [f{gpu.name}: {gpu.load*100:.1f}% for gpu in gpus] self.logger.info( f推理统计: 输入长度{prompt_length}, f输出长度{response_length}, f耗时{inference_time:.2f}s, fGPU使用{gpu_usage} ) def check_system_health(self): 检查系统健康状态 cpu_percent psutil.cpu_percent() memory psutil.virtual_memory() disk psutil.disk_usage(/) health_info { timestamp: datetime.now().isoformat(), cpu_usage: cpu_percent, memory_usage: memory.percent, disk_usage: disk.percent, status: healthy if cpu_percent 90 and memory.percent 90 else warning } return health_info7. 常见问题与解决方案7.1 部署阶段常见问题问题1显存不足错误现象RuntimeError: CUDA out of memory解决方案使用模型量化4-bit/8-bit减小批处理大小使用梯度检查点考虑使用 CPU 推理或混合精度# 显存不足时的备选方案 model AutoModelForCausalLM.from_pretrained( ./kimi-k3-base, load_in_8bitTrue, # 8-bit 量化 device_mapauto )问题2模型加载缓慢现象首次加载模型耗时过长解决方案使用本地模型缓存预下载模型文件使用更快的存储设备NVMe SSD7.2 推理阶段常见问题问题3生成质量不稳定现象相同输入得到差异很大的输出解决方案调整生成参数# 稳定的生成参数配置 outputs model.generate( **inputs, max_new_tokens500, temperature0.3, # 降低随机性 top_p0.9, # 核采样 repetition_penalty1.1, # 避免重复 do_sampleTrue )问题4长文本处理错误现象处理长文档时出现截断或错误解决方案分块处理并维护上下文def process_long_document(document, chunk_size2000): 分块处理长文档 chunks [document[i:ichunk_size] for i in range(0, len(document), chunk_size)] results [] for chunk in chunks: # 处理每个块可以添加上下文连接逻辑 result generate_text(chunk) results.append(result) return .join(results)7.3 性能优化问题问题5推理速度过慢现象单个请求响应时间过长解决方案使用 GPU 推理启用模型缓存优化批处理大小考虑模型蒸馏或剪枝问题6并发处理能力不足现象多用户同时访问时系统响应缓慢解决方案部署多个模型实例使用负载均衡实现请求队列机制8. 生产环境最佳实践8.1 安全部署规范在生产环境中部署 AI 模型需要遵循安全最佳实践import secrets from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials security HTTPBearer() class SecureAPIServer: def __init__(self): self.api_keys set() def generate_api_key(self): 生成安全的 API 密钥 api_key secrets.token_urlsafe(32) self.api_keys.add(api_key) return api_key def validate_api_key(self, credentials: HTTPAuthorizationCredentials): 验证 API 密钥 return credentials.credentials in self.api_keys # 在 API 端点添加认证 app.post(/generate) async def secure_generate( request: GenerationRequest, credentials: HTTPAuthorizationCredentials Depends(security) ): if not secure_server.validate_api_key(credentials): raise HTTPException(status_code401, detail无效的 API 密钥) # ... 原有生成逻辑8.2 监控与告警系统建立完善的监控体系确保服务稳定性import prometheus_client from prometheus_client import Counter, Histogram, Gauge # 定义监控指标 requests_total Counter(api_requests_total, Total API requests) request_duration Histogram(api_request_duration_seconds, API request duration) gpu_memory_usage Gauge(gpu_memory_usage_bytes, GPU memory usage) app.middleware(http) async def monitor_requests(request, call_next): start_time time.time() response await call_next(request) duration time.time() - start_time requests_total.inc() request_duration.observe(duration) # 记录 GPU 内存使用 gpus GPUtil.getGPUs() if gpus: gpu_memory_usage.set(gpus[0].memoryUsed * 1024 * 1024) # 转换为字节 return response8.3 成本控制策略大规模部署时需要关注资源成本class CostController: def __init__(self, daily_limit1000, request_limit100): self.daily_usage 0 self.daily_limit daily_limit self.request_limit request_limit self.user_usage {} def check_quota(self, user_id, tokens_used): 检查用户配额 today datetime.now().date().isoformat() user_key f{user_id}_{today} if user_key not in self.user_usage: self.user_usage[user_key] 0 # 更新使用量 self.user_usage[user_key] tokens_used self.daily_usage tokens_used # 检查限制 if (self.daily_usage self.daily_limit or self.user_usage[user_key] self.request_limit): return False return True通过本文的完整指南你应该已经掌握了 Kimi K3 开源模型的本地部署、API 集成、性能优化和生产部署的全套技能。开源模型的快速发展为开发者提供了前所未有的机会现在就可以开始构建基于先进 AI 能力的创新应用。在实际项目中建议先从简单的概念验证开始逐步扩展到生产环境。记得定期关注 Kimi K3 社区的更新开源模型生态正在快速发展新的优化和工具会不断出现。
延伸阅读

更多相关文章

2026/11/9 22:49:27

NUMA-04 显存迁回内存:AMD/Intel 的 SVM 与Eviction的实现是否考虑了NUMA

前三篇的迁移都在“普通内存 ↔ 普通内存”。但 GPU 显存 CPU 根本访问不到,它是怎么被纳入进程地址空间、又怎么在缺页时自动迁回内存,以及回迁时怎么选择numa node。这将是本文的主题。 0. 本章要回答的问题 GPU 显存这种 CPU 不能直接读的内存&#…

2026/11/5 15:55:52

NUMA-03 页是怎么在 node 间搬家的:内核 NUMA 与页迁移机制

NUMA:一段内存到底在哪个 node:用户态 NUMA 编程接口在用户态调 move_pages 把页迁到某个 node,一行就返回了。但内核里到底发生了什么?“目标 node” 这个参数又是怎么一路传下去、最终决定新页落在哪的?这一章把这条…

2026/11/10 21:06:28

电工证怎么考在线咨询,外省证书怎么转,含金量高吗?

电工证怎么考在线咨询,外省证书怎么转,含金量高吗? 之前考的证在外省能不能转过来?这是很多已经持有电工证但跨省工作的朋友最关心的问题。很多人担心证书“地方保护主义”,或者因为工作调动需要重新考证,不仅浪费时间,还可能影响工作进度。其实,只要…

2026/11/10 21:06:28

去哪查电工证真假鉴别千万别踩坑

去哪查电工证真假鉴别千万别踩坑 证书过期了不知道怎么复审延期,这事儿在咱们圈里真的不是个例。我认识好几个电工朋友,就是因为在证书到期后没及时办理延期,结果被单位辞退,项目也做不了。你要是也正面临这个问题,那这篇文章你可得仔细看完,尤其是那些…

2026/11/10 21:06:28

低压电工证通风继续教育多少钱?证书过期了不知道怎么复审延期

低压电工证通风继续教育多少钱?证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,低压电工证通风继续教育多少钱?这些问题困扰着很多正在从事低压电工工作的朋友,尤其是像三门峡市政公用工程这类岗位,一旦证照不齐全,不仅影响日常工作,还可…

2026/11/10 21:06:28

高压电工证 考试时间证丢了怎么补办

高压电工证考试时间怎么查?内部消息教你避坑 你是不是正为 高压电工证考试时间 发愁?怕被中介骗钱、怕报名流程太复杂、怕错过关键节点?别急, 内部消息 告诉我,掌握这些关键点,报名流程和考试时间都能轻松搞定。…

2026/11/10 21:01:27

东城低压电工证办理怎么报名才不被坑

东城低压电工证办理怎么报名才不被坑 你是不是也遇到过这种情况,想办个低压电工证,结果跑了几家机构,不是被坑钱就是被推来推去?别急,今天就从一个在鹤壁从事房建工程的电工角度,手把手教你 东城低压电工证办理怎么报名才不被坑 ,避免被中介忽悠。…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/10 0:01:28

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了 你是不是也担心自己学历不高,考电工证报名费太贵,根本报不上名?别急,今天就来给你讲讲,怎么用最少的钱,把证拿到手,还能在工地上多挣点钱。 电工证报名费多少钱?网上查询是关键…

2026/11/10 0:01:29

绍兴考电工证培训机构怎么选?2026河南最新政策别错过

绍兴考电工证培训机构怎么选?2026河南最新政策别错过 怕考不过白交培训费?你不是一个人。2026河南最新政策出台,对电工证考试、报名、培训、复审都有明确规定。选择绍兴考电工证培训机构,别再踩坑,下面一步步教你避坑。…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑