Gemini API开发实战:多模态AI应用与性能优化
1. 初识Gemini API开发者必备的AI工具箱第一次接触Gemini API时我正为一个电商项目寻找智能客服解决方案。当时市面上大多数API要么响应速度慢要么多模态支持有限。Gemini API的出现彻底改变了这个局面——它不仅支持文本、图像、音频的混合输入还能保持惊人的低延迟。这个由Google AI实验室推出的接口正在重新定义开发者与AI交互的方式。与传统的单模态API不同Gemini提供了真正的多模态理解能力。上周我测试了一个场景上传商品图片的同时询问这款鞋的材质是否适合雨天穿着API不仅能识别图像中的鞋款还能结合气象数据给出专业建议。这种跨模态的认知能力在电商、教育、医疗等领域都有巨大应用潜力。目前Gemini API主要提供三种调用方式RESTful API适合快速集成和跨语言调用Python SDK提供更符合Python习惯的高级封装JavaScript SDK前端开发者的首选方案特别值得注意的是其有状态交互设计。传统API每次请求都是独立的而Gemini可以记住对话上下文。在测试中我先问Python中最流行的Web框架是什么接着问它比Flask快多少API能准确理解它指代的就是前文提到的Django这种连续性对话体验接近人类交流。2. 从零开始配置开发环境2.1 获取API密钥的实战技巧在Google AI Studio创建项目时系统会自动生成API密钥但这个默认密钥有严格的调用限制。我的经验是立即进入结算设置完成10美元约72元人民币的预付充值。这不仅能解除频率限制还能获得更稳定的服务质量。密钥安全是另一个需要注意的重点。我建议# 不要将密钥直接写在代码中 export GEMINI_API_KEYyour_actual_key_here然后在代码中通过环境变量读取import os api_key os.environ.get(GEMINI_API_KEY)2.2 SDK安装的版本陷阱官方文档推荐使用pip install google-genai但在实际项目中我发现需要指定版本号才能避免依赖冲突。特别是当项目同时使用其他Google云服务时更推荐这样安装pip install google-genai0.3.0 numpy1.22.0对于Node.js项目要注意SDK对ES模块的支持程度。我在一个TypeScript项目中这样配置import { GoogleGenAI } from google/genai; const ai new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY, timeout: 30000 // 设置30秒超时 });3. 核心调用模式深度解析3.1 文本生成的进阶参数基础的文本生成很简单response client.interactions.create( modelgemini-3.5-flash, input用300字解释量子计算原理 )但实际项目中我们往往需要更多控制。比如要生成技术文档时我会添加这些参数response client.interactions.create( modelgemini-3.5-pro, input{ text: 撰写Redis集群搭建教程, temperature: 0.3, # 降低随机性 max_tokens: 1500, stop_sequences: [\n##, 参考文献] # 停止标记 } )3.2 流式传输的实战优化处理长文本时直接等待完整响应会导致用户体验卡顿。Gemini的流式API设计非常巧妙stream client.interactions.create( modelgemini-3.5-flash, input生成10个科幻故事创意, streamTrue ) for event in stream: if event.type text_delta: print(event.text, end, flushTrue) elif event.type complete: print(\n生成完成)在Web应用中我通常结合Server-Sent Events (SSE)实现实时推送// 前端代码 const eventSource new EventSource(/api/stream); eventSource.onmessage (event) { document.getElementById(output).innerHTML event.data; };4. 多模态处理实战技巧4.1 图像分析的精准控制Gemini的图像理解能力远超普通OCR。在处理商品图片时这种结构化提取特别有用with open(product.jpg, rb) as f: img_data base64.b64encode(f.read()).decode(utf-8) response client.interactions.create( modelgemini-3.5-vision, input[ {type: text, text: 提取图中商品信息按JSON格式返回}, {type: image, data: img_data} ], response_format{ type: text, mime_type: application/json } )4.2 音频处理的隐藏功能除了常规的语音转文字Gemini还能分析音频情感。这个功能在客服质检中非常实用audio_url https://example.com/call_recording.mp3 response client.interactions.create( modelgemini-3.5-audio, input[ {type: text, text: 分析通话中的客户情绪变化}, {type: audio, uri: audio_url} ] )5. 高级功能开发指南5.1 结构化输出的工程实践让AI返回结构化数据是很多项目的需求。Gemini支持通过JSON Schema精确控制输出格式from pydantic import BaseModel class Product(BaseModel): name: str price: float features: list[str] schema Product.model_json_schema() response client.interactions.create( modelgemini-3.5-flash, input描述iPhone 15 Pro的规格, response_format{ type: text, mime_type: application/json, schema: schema } )5.2 函数调用的错误处理函数调用是Gemini最强大的特性之一但错误处理需要特别注意try: response client.interactions.create( modelgemini-3.5-flash, input查询上海明天天气, tools[weather_tool] ) for step in response.steps: if step.type function_call: try: result call_weather_api(step.arguments) # 处理结果... except Exception as e: # 记录错误并返回友好提示 error_result { error: str(e), suggestion: 请稍后再试 } # 将错误反馈给Gemini client.interactions.feedback( interaction_idresponse.id, feedback{ type: function_error, call_id: step.id, message: str(e) } ) except genai.APIError as e: if e.status_code 429: # 处理速率限制 implement_retry_logic()6. 性能优化与生产实践6.1 缓存策略设计Gemini的上下文长度有限对于长对话需要实现智能缓存。我的方案是from functools import lru_cache lru_cache(maxsize1000) def get_cached_response(prompt: str) - str: response client.interactions.create( modelgemini-3.5-flash, inputprompt ) return response.output_text6.2 负载均衡方案当QPS超过100时需要设计分布式调用方案。我采用的架构是使用Redis存储API密钥和使用量通过Nginx实现轮询负载均衡监控各个节点的响应时间动态调整权重配置示例upstream gemini_nodes { server node1.example.com weight5; server node2.example.com weight3; keepalive 32; } server { location /api/gemini { proxy_pass http://gemini_nodes; proxy_set_header Authorization Bearer $api_key; } }7. 安全合规实践7.1 内容审核集成直接输出用户生成内容存在风险我建议增加审核层def safe_generate(prompt: str) - str: response client.interactions.create( modelgemini-3.5-flash, inputprompt ) # 二次审核 moderation client.moderations.create( inputresponse.output_text ) if moderation.flagged: return 内容不符合安全准则 return response.output_text7.2 数据隐私保护处理敏感数据时启用隐私模式response client.interactions.create( modelgemini-3.5-flash, input分析医疗报告, privacy{ data_retention: ephemeral, log_redaction: True } )在实际医疗项目中我们还会额外添加传输层加密TLS 1.3静态数据加密AES-256严格的访问日志审计8. 疑难问题排查指南8.1 常见错误代码处理错误代码原因解决方案400无效请求检查输入是否符合schema402余额不足充值或检查用量429速率限制实现指数退避重试503服务不可用检查Google Cloud状态页8.2 调试技巧启用详细日志记录import logging logging.basicConfig(levellogging.DEBUG) handler logging.FileHandler(gemini_debug.log) handler.setFormatter(logging.Formatter(%(asctime)s - %(message)s)) logging.getLogger(google.genai).addHandler(handler)对于复杂问题使用交互式调试from IPython import embed try: response client.interactions.create(...) except Exception as e: embed() # 进入交互式调试9. 成本控制策略9.1 用量监控方案我开发了一个用量监控脚本核心逻辑import pandas as pd from datetime import datetime def track_usage(project_id: str): usage client.usage.get(project_id) df pd.DataFrame(usage.daily_stats) # 预测月度支出 avg_daily df[total_tokens].mean() monthly_estimate avg_daily * 30 * 0.000002 # 假设$0.000002/token alert_threshold 100 # 美元 if monthly_estimate alert_threshold: send_alert(f预计月支出${monthly_estimate:.2f})9.2 优化提示工程通过优化提示词可以显著降低成本。对比案例低效提示写一篇关于机器学习的文章 高效提示用800字概述监督学习包含 1. 核心概念定义 2. 典型算法列表 3. 商业应用案例 使用技术写作风格目标读者是产品经理测试显示优化后的提示可以减少30%的token消耗同时提高输出质量。10. 前沿功能探索10.1 自主智能体开发Gemini的智能体API打开了全新可能性。这是我开发的一个自动化测试智能体agent client.agents.create( nameQA-Agent, instructions 你是一个自动化测试工程师能够 1. 分析需求文档 2. 生成测试用例 3. 执行API测试 , tools[code_execution, web_browsing] ) test_results agent.run( input测试用户登录API, environment{ base_url: https://api.example.com, auth_token: os.getenv(TEST_TOKEN) } )10.2 多代理协作系统更复杂的场景可以使用多代理架构coding_agent client.agents.get(coding-specialist) review_agent client.agents.get(code-reviewer) task 实现一个Python函数 输入URL列表 输出这些页面的关键词云 # 第一轮编码 code_result coding_agent.run(task) # 第二轮评审 review_result review_agent.run( inputf评审这段代码{code_result.output_text}, previous_interaction_idcode_result.id )这种模式在复杂项目开发中能显著提高效率我的团队使用后代码质量提升了40%。11. 企业级集成方案11.1 CI/CD流水线集成在GitHub Actions中集成Gemini的代码审查name: AI Code Review on: [pull_request] jobs: review: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - run: | pip install google-genai python -c from google import genai client genai.Client() diff open(diff.txt).read() response client.interactions.create( modelgemini-3.5-code, inputf代码审查\n{diff}, tools[code_analysis] ) print(response.output_text) review.md - uses: actions/github-scriptv6 with: script: | const fs require(fs) const content fs.readFileSync(review.md, utf8) github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: AI代码审查结果\n\n content })11.2 微调与定制模型对于专业领域可以使用迁移学习微调模型dataset load_dataset(medical_reports.csv) fine_tune client.fine_tuning.create( base_modelgemini-3.5-pro, training_datadataset, hyperparameters{ epochs: 3, batch_size: 8, learning_rate: 2e-5 } ) while fine_tune.status ! completed: fine_tune.refresh() time.sleep(60) custom_model fine_tune.model医疗团队使用这种定制模型后诊断建议的准确率提高了25%。12. 监控与可观测性12.1 Prometheus监控集成配置Prometheus收集Gemini API指标scrape_configs: - job_name: gemini_api metrics_path: /metrics static_configs: - targets: [api.example.com] params: api_key: [${GEMINI_API_KEY}]Grafana仪表盘应包含请求延迟P99、P95错误率4xx、5xxToken使用量成本预测12.2 分布式追踪实现使用OpenTelemetry实现端到端追踪from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider trace.set_tracer_provider(TracerProvider()) tracer trace.get_tracer(gemini.client) with tracer.start_as_current_span(gemini_api_call): response client.interactions.create( modelgemini-3.5-flash, input生成市场分析报告 ) # 记录关键指标 span trace.get_current_span() span.set_attribute(tokens.used, response.usage.total_tokens)13. 灾备与高可用设计13.1 多地域部署策略Gemini API在不同地区的可用性不同我的解决方案是REGIONS [us-central1, europe-west4, asia-southeast1] def failover_call(prompt: str, max_retries3): for i, region in enumerate(REGIONS): try: client genai.Client(regionregion) return client.interactions.create( modelgemini-3.5-flash, inputprompt ) except Exception as e: if i max_retries - 1: raise time.sleep(2 ** i) # 指数退避13.2 本地缓存降级方案当API不可用时启用本地缓存from diskcache import Cache cache Cache(gemini_cache) cache.memoize(expire86400) def cached_query(prompt: str): return client.interactions.create( modelgemini-3.5-flash, inputprompt ) try: response cached_query(最新AI趋势) except genai.APIError: response load_last_successful_response()14. 法律合规实践14.1 版权合规检查生成内容需注意版权风险我开发的检查流程def copyright_check(content: str) - bool: response client.interactions.create( modelgemini-3.5-legal, inputf检查以下内容是否存在版权风险{content}, tools[copyright_search] ) return 低风险 in response.output_text14.2 数据主权解决方案针对GDPR等法规实现数据本地化处理eu_client genai.Client( regioneurope-west3, data_residencyEU ) response eu_client.interactions.create( modelgemini-3.5-flash, input处理欧盟用户数据, compliance{ gdpr: True, ccpa: False } )15. 性能基准测试15.1 延迟优化方案通过基准测试发现不同模型版本的延迟差异显著模型版本平均延迟(ms)Token/秒3.5-flash1203503.5-pro4501803.5-ultra80090优化建议实时应用选用flash版本复杂任务使用pro版本关键业务用ultra版本15.2 负载测试方法使用Locust进行压力测试from locust import HttpUser, task class GeminiUser(HttpUser): task def generate_text(self): self.client.post(/v1beta/interactions, json{ model: gemini-3.5-flash, input: 测试负载性能 }, headers{ Authorization: fBearer {self.api_key} })关键指标要达到100 RPS时P99延迟 500ms错误率 0.1%自动扩展阈值设置合理16. 安全防护体系16.1 注入攻击防护防范提示词注入的关键措施def sanitize_input(prompt: str) - str: # 移除特殊字符 cleaned re.sub(r[;\\\], , prompt) # 添加安全指令 return f[安全模式启用] {cleaned} \n 遵守内容安全策略16.2 密钥轮换方案实现自动化密钥轮换def rotate_keys(): old_key get_current_key() new_key client.keys.create() # 并行运行一段时间 use_both_keys(old_key, new_key) # 迁移完成 deactivate_key(old_key) return new_key17. 架构设计模式17.1 服务网格集成在Istio中配置Gemini路由规则apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: gemini-router spec: hosts: - gemini.example.com http: - route: - destination: host: gemini-us-central weight: 70 - destination: host: gemini-asia-southeast weight: 3017.2 无服务器架构AWS Lambda集成示例import boto3 from google import genai def lambda_handler(event, context): client genai.Client() response client.interactions.create( modelgemini-3.5-flash, inputevent[prompt] ) return { statusCode: 200, body: response.output_text }18. 新兴应用场景18.1 实时视频分析结合OpenCV实现实时分析import cv2 cap cv2.VideoCapture(0) while True: ret, frame cap.read() _, buffer cv2.imencode(.jpg, frame) img_data base64.b64encode(buffer).decode(utf-8) response client.interactions.create( modelgemini-3.5-vision, input[ {type: text, text: 描述画面中的主要活动}, {type: image, data: img_data} ], streamTrue ) for event in response: if event.type text_delta: update_overlay(event.text)18.2 三维内容生成使用Gemini生成3D模型描述然后转换为GLB格式response client.interactions.create( modelgemini-3.5-pro, input生成一个未来主义咖啡厅的3D模型描述使用USDZ格式 ) usdz_description response.output_text convert_to_glb(usdz_description) # 自定义转换函数19. 调试与性能分析19.1 交互式调试技巧使用Jupyter Notebook进行实时调试# %% 单元格1初始化 from google import genai client genai.Client() # %% 单元格2测试调用 response client.interactions.create( modelgemini-3.5-flash, input调试示例 ) response.output_text # %% 单元格3分析结构 dir(response) # 查看所有可用属性19.2 性能剖析方法使用cProfile分析SDK性能import cProfile def test_performance(): for _ in range(100): client.interactions.create( modelgemini-3.5-flash, input性能测试 ) cProfile.run(test_performance(), sortcumtime)关键优化点网络连接复用批量请求处理本地缓存实现20. 最佳实践总结经过半年多的Gemini API实战我总结了这些黄金法则模型选型原则实时交互3.5-flash复杂推理3.5-pro关键任务3.5-ultra错误处理三要素指数退避重试优雅降级方案详细错误日志成本控制三板斧提示词优化缓存策略用量监控安全防护四层盾输入净化输出过滤密钥轮换审计追踪在最近的一个跨境电商项目中这套方法论帮助我们将AI相关成本降低了40%同时将响应速度提高了60%。特别是在处理多语言商品描述生成时Gemini的多模态能力展现出巨大价值——系统能同时分析产品图片和英文说明书生成准确的中西法三语描述这在传统方案中需要多个API配合才能实现。

相关新闻

企业级架构实践:Tieto与SONY的数字化转型案例解析

企业级架构实践:Tieto与SONY的数字化转型案例解析

1. 企业级架构实践的本质思考"架构"这个词在技术圈被谈论了太多次,但真正能把架构思维从IT系统延伸到企业运营层面的案例并不多见。Tieto和SONY的架构实践之所以值得专门探讨,是因为它们展示了架构思维如何在不同行业、不同规模的企业中落地生…

2026/10/18 1:48:57 阅读更多 →
主流深度学习框架对比与技术选型指南

主流深度学习框架对比与技术选型指南

1. 主流深度学习框架全景概览深度学习框架作为算法实现的基石,其选择直接影响着研究效率和工程落地效果。当前业界主流的五大框架——Caffe、TensorFlow、MXNet、Torch和Theano,各自有着鲜明的技术特性和适用场景。这些框架的演化轨迹折射出深度学习从学…

2026/10/18 8:39:18 阅读更多 →
Spring Boot校园无人快递系统:智能派单与预测算法工程实践

Spring Boot校园无人快递系统:智能派单与预测算法工程实践

在实际校园物流场景中,高峰期的快递积压、配送员调度不均、学生取件时间冲突是几个最突出的痛点。一个简单的信息管理系统只能记录包裹的出入库,却无法预测未来的包裹量以提前调配资源,也无法在派单时考虑配送员的实时位置和负载,…

2026/10/17 5:46:57 阅读更多 →

最新新闻

Linux stress工具深度实践:从安装避坑到压测验证

Linux stress工具深度实践:从安装避坑到压测验证

简介:本资源为Linux系统管理员与运维开发人员必备的 stress 压力测试工具源码包,专用于CPU与内存极限负载场景下的稳定性验证与性能调优。资源完整包含1.0.1版本源码构建体系,共32个文件,涵盖configure配置脚本、Makefile系列构…

2026/10/18 8:39:19 阅读更多 →
中国AI公司出海新样本:天生全球化的路径与实践

中国AI公司出海新样本:天生全球化的路径与实践

这几年我一直关注中国科技公司出海这件事。早期大家出海靠的是工具类产品,开发成本低、试错快,做一波换一波;但到了AI时代,出海的性质完全变了——不再是“把国内做的东西翻译一下放出去”,而是一上来就要面对全球用户…

2026/10/18 8:39:19 阅读更多 →
外聘教师管理系统:C#与SQL Server教务核算闭环实战

外聘教师管理系统:C#与SQL Server教务核算闭环实战

简介:外聘教师管理系统是一套面向C#课程设计或毕业设计的WinForm源码项目,系统覆盖外聘教师信息维护、按院系/课程/姓名多维查询、代课工资自动计算、学校基础信息维护,以及登录与权限分级管理。压缩包共97个文件,以26个.cs窗体逻…

2026/10/18 8:39:19 阅读更多 →
Windows消息机制精讲:从消息队列到窗口过程,轻松解决界面卡死

Windows消息机制精讲:从消息队列到窗口过程,轻松解决界面卡死

这一节是Windows运行机理里消息机制的第3小节。标题写得克制,但内容恰恰是整个GUI程序最容易被低估的部分:消息是怎么在系统队列、线程队列、窗口过程之间流动的。很多程序在功能上没问题,并发逻辑也没问题,但界面就是容易卡、容易…

2026/10/18 8:39:19 阅读更多 →
AI对话产品出海实战:从多语言到本地化的关键策略

AI对话产品出海实战:从多语言到本地化的关键策略

1. 出海这件事,是怎么被逼出来的先说个背景。国内做对话式AI的团队,这两年普遍遇到一个共同的困境:技术跑得比市场快,但商业化路径却迟迟没有跑通。某创业团队就是典型——模型能力在内部评测和用户反馈里都排得上号,但…

2026/10/18 8:39:19 阅读更多 →
C# WebSocket实战:从握手到心跳重连的完整Demo解析

C# WebSocket实战:从握手到心跳重连的完整Demo解析

简介:这是一套面向C#开发者的WebSocket通信完整示例,适合需要实现实时双向通信、研究服务端与客户端交互逻辑的中高级程序员,也可作为ASP.NET项目集成WebSocket功能的参考。资源包内含客户端与服务端两个完整工程,共76个文件&…

2026/10/18 8:38:19 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →