Litellm实战:统一LLM网关,解决多模型接入与成本管控难题
1. 为什么需要 litellm被模型接入“烦透”之后的必然选择先说个真实场景。某公司内部有一个智能客服项目最初只接了一家大模型厂商的接口一切正常。后来升级需求要同时对比多家头部模型的回答效果再后来要接入本地私有化部署的开源模型做敏感数据隔离。结果是什么代码里出现了三套 SDK、两套异步调用方式、一套自己封装的 HTTP 客户端。每个模型厂商的鉴权方式不同、超时设置不同、出错返回格式也不同光是统一报错解析就写了两百多行胶水代码。更头疼的是运维同事说“你给我加个预算控制”我一看 SDK 文档根本没有这个参数只能自己做一层计数拦截又费劲又不准。litellm 解决的就是这一类问题。它是一个开源的 LLM 网关API Gateway核心思路非常朴素把 Anthropic、Gemini、Azure OpenAI、Hugging Face、本地 vLLM 等几十种模型来源全部转换成一套统一的 OpenAI 风格接口。应用端只需要认识一个 base_url 和一个 API Key剩下的模型路由、重试、负载均衡、配额管控、成本统计全部交给网关处理。你不需要在自己的业务代码里引入 SDK甚至可以让多个团队共用同一个网关入口。我用它大约半年最大的感受是这个项目把“模型接入”这个本来很琐碎、很容易写出脏代码的环节变成了一个纯配置动作。对刚起步的独立开发者它能省掉一整套封装成本对中大型团队它是最快的模型治理入口。下面我会从设计思路、核心功能、部署实操、生产环境踩坑四个维度把整个落地方案完整讲透。2. 核心功能拆解不只是“API 转发”那么简单2.1 统一接口层是怎么“变魔术”的litellm 之所以能做到统一是因为它内部实现里有一个东西叫 provider adapter。每接入一个新的模型供应商项目里就对应一个适配器负责把该厂商的原始 API 格式转换成统一的协议。你作为调用方请求体长这样{ model: gpt-4o, messages: [{role: user, content: 你好}], temperature: 0.7 }这个格式就是 OpenAI 的 Chat Completions 格式。litellm 收到后会根据你配置的模型映射规则把请求再翻译成目标厂商的格式。比如你要转发到 Claude它会在内部把消息结构、参数命名、停止符这些差异全部处理好。对一个业务团队来说今天用 gpt-4o明天换 Claude 3.5 Sonnet代码层面一个字符都不用改只改网关的 model 映射配置就行。这个设计有两点值得思考。第一为什么选 OpenAI 格式作为统一标准原因很直接OpenAI 的接口生态最成熟各种开源工具、LangChain 框架、开发工具都对它做了兼容选它做中间标准能最大程度减少上下游的适配成本。第二为什么不用 SDK 而用 HTTP 网关因为网关是独立部署的服务语言无关Java、Go、Python、Node 都能直接调用不会把团队绑死在某种语言上。2.2 模型路由、负载均衡与失败重试litellm 另一个让我很意外的能力是它对路由策略的处理。你可以给同一个模型别名配置多个上游供应商比如配置了 3 个不同的 gpt-4o 来源。网关默认按顺序轮询也可以配置权重分配model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY # 权重为 3 weight: 3 - model_name: gpt-4o litellm_params: model: azure/chatgpt-v4o api_key: os.environ/AZURE_OPENAI_API_KEY api_base: os.environ/AZURE_OPENAI_ENDPOINT weight: 1调用方永远只请求 modelgpt-4ogateway 会按照 3:1 的概率把流量分配到 OpenAI 和 Azure 两个后端。如果某个上游连续返回 5xx 或超时litellm 会自动把它标记为不健康并把流量切换到健康节点等它恢复后再重新纳管。这种能力对应到业务侧的价值是你再也不用自己在代码里写重试逻辑了网关帮你把“哪个渠道可用就用哪个”这一层决策消化掉了。我自己的经验是如果你的业务对响应时间敏感建议把超时时间拆细。litellm 的默认超时是 600 秒这个值对绝大多数实时对话场景都太长了。我把全局 timeout 调成 60 秒同时给关键模型单独设置 connection timeout 为 10 秒这样即使某个厂商的 API 完全失联我的服务最多等 10 秒就能降级不至于让调用方一直挂着。2.3 预算控制、速率限制与密钥管理预算控制是我最看重的功能之一。litellm 支持按 API Key、按团队Team、按用户三个维度做预算限制。假设你分配给某个项目的 key 月预算是 50 美元一旦消耗达到上限网关会直接拒绝后续请求并返回 429。这个功能对做 to B 产品的团队特别有用——你给不同客户分配不同 key每个客户消耗多少费用清清楚楚完全不用自己写账单系统。它的速率限制底层用的是令牌桶算法。你可以针对某个 key 配置 RPM每分钟请求数和 TPM每分钟 token 数。TPM 限制尤其有价值因为很多厂商是按 token 计费的如果你不限制某个异常循环的请求可能一分钟把你一个月预算烧完。我之前就把所有内部调试 key 的 TPM 限制在 10 万防止有人拿着测试 key 跑批量任务。再说密钥管理。传统做法是每个业务服务里各自保存各厂商的 API Key一旦某个 key 漏了你都不知道是哪里泄露的。litellm 可以把所有真实厂商 key 集中在网关的配置或密钥管理服务里业务侧只使用网关生成的虚拟 key。这样你随时可以吊销某个业务线的访问权限不需要去厂商控制台重新申请 key也降低了密钥在多个服务里流转的风险。2.4 可观测性请求日志、Token 统计与成本追踪生产环境用了 litellm 之后你会发现最大的收益反而不是省钱而是“终于能看清楚自己的 AI 服务到底发生了什么”。litellm 自带一个管理后台你可以在里面看到每一次请求的模型、延迟、token 消耗、估算成本、返回码。这个后台还有简单的图表能按时间维度看总请求量和成本趋势。更关键的是它支持 OpenTelemetry 协议可以把追踪数据导出到 Prometheus Grafana 或云厂商的监控系统。我自己的习惯是把关键指标单独拉出来token 消耗速率、按模型分组的延迟分位数p50 与 p95、错误率。有了这些数据你就知道到底该不该升级模型版本哪些模型对业务性能影响最大。相比直接调用原始厂商接口这个观测能力是质变以前只能看到自己的请求返回了现在能看到整个系统里每一笔 token 的来龙去脉。3. 部署实操从零搭一个可用的 litellm 网关3.1 环境准备与安装方式选型litellm 对部署环境没有太多要求只要机器能联网即可。我自己推荐两种方式。Docker 部署是最省事的一条命令就能跑起来docker run -d \ --name litellm-proxy \ -p 4000:4000 \ -v $(pwd)/litellm_config.yaml:/app/config.yaml \ -e LITELLM_MASTER_KEYsk-1234 \ ghcr.io/berriai/litellm:main-latest如果你不想用 Docker直接用 pip 安装也很简单pip install litellm[proxy] litellm --config /path/to/config.yaml --port 4000安装之后第一件事设置 LITELLM_MASTER_KEY。这个 key 相当于网管的超级管理员密钥所有创建子 key、修改配置、查看后台的权限都通过它验证。注意这个 key 必须用一个强随机字符串千万不要用 123456 这种弱口令因为任何人只要拿到了 master key就能读取网关里的所有厂商密钥这属于最高级别的安全事件。3.2 配置文件完整拆解litellm 的配置默认是一个 YAML 文件下面这个是我实际使用版本的简化版model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: claude-3-5-sonnet litellm_params: model: anthropic/claude-3-5-sonnet-20240620 api_key: os.environ/ANTHROPIC_API_KEY - model_name: llama3-local litellm_params: model: vllm/llama3-8b-instruct api_base: http://localhost:8000/v1 api_key: dummy litellm_settings: drop_params: true set_widget: true num_retries: 3 request_timeout: 60 fallbacks: [ {gpt-4o: [claude-3-5-sonnet]} ] general_settings: master_key: os.environ/LITELLM_MASTER_KEY database_url: os.environ/DATABASE_URL逐项解释一下关键点。model_list 里 model_name 是你暴露给调用方的名字litellm_params 里的 model 字段是真实供应商模型标识格式为“供应商/模型名”。api_key 建议直接写 os.environ/XXX不要硬编码明文这样密钥不会出现在代码仓库里。fallbacks 配置的意思是如果 gpt-4o 不可用就自动降级到 claude-3-5-sonnet这个机制对保障服务连续性太重要了。database_url 这个参数建议生产环境一定要配。默认情况下 litellm 会把 key、使用量、日志存在 SQLite 里一旦重启可能丢数据。接一个 PostgreSQL 之后所有历史请求、密钥记录、预算用量都能持久化存储。我生产环境就是用一个 PostgreSQL 实例存数据用起来没有任何额外负担。3.3 生成子 Key 与业务对接配置网关启动之后你可以用 master key 创建若干子 key。最简单的办法是调用管理接口curl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer sk-1234 \ -H Content-Type: application/json \ -d {max_budget: 50, budget_duration: 30d}这一步会返回一个以 sk- 开头的虚拟 key你把这个 key 给下游业务团队用设置 30 天 50 美元的预算上限。业务侧的代码不需要引入 litellm 的任何 SDK只需要把 OpenAI SDK 的 base_url 指向网关地址即可。以 Python 为例from openai import OpenAI client OpenAI( base_urlhttp://litellm-gateway:4000/v1, api_keysk-your-virtual-key ) resp client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 你好}] )如果你用的是 LangChain 或 LlamaIndex也只需对应修改 base_url 参数方式完全相同。这里的“model”填的是你在 model_list 里自定义的 model_name而不是厂商原始模型名。这样上游厂商的模型迭代、替换、迁移对调用方完全透明。3.4 验证连通性与快速排障配置完成后用一条 curl 就能验证网关是否正常工作curl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-your-virtual-key \ -d {model: gpt-4o, messages: [{role: user, content: ping}]}如果返回了正常的 choices 结构说明链路已经打通。如果报错最常见的三种情况我会在后面单独讲。这里先说一个调试小技巧把 litellm 的请求日志等级调到 DEBUG可以直接在日志里看到网关转发给上游的完整请求体和响应体排查格式差异时非常有用。设置方式是在启动命令里加--debug或者配置litellm_settings: {debug: true}。4. 生产环境经验高频问题与排查实录4.1 模型名映射 404 或返回错误模型这是刚上手时最常踩的坑。很多人在 litellm_params 的 model 字段里填错了前缀比如 openai/gpt-4o 写成了 gpt-4o导致网关在解析供应商时失败。litellm 的模型标识是有前缀约定的openai/、anthropic/、azure/ 这些前缀决定了走哪个适配器。如果你的模型名带 azure/ 但后端其实是普通的 OpenAI 兼容服务请求就会被错误路由返回各种奇怪的认证错误或 404。我的排查思路是先看日志中的 DEBUG 输出确认 litellm 实际发出的上游请求 URL 是什么。如果 URL 的 host 或 path 不对基本可以确定是前缀问题。另外你可以在 litellm 的路由规则里配置自定义前缀映射但通常没必要官方前缀覆盖的主流服务已经非常全面。4.2 子 Key 权限不足或 401 问题很多团队把 master key 当成业务 key 直接用这非常危险因为 master key 权限太高一旦泄露所有密钥和配置都可能被改。正确做法是创建独立的子 key并在创建时指定模型访问范围。例如curl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer sk-1234 \ -H Content-Type: application/json \ -d {models: [gpt-4o], max_budget: 10}这样生成的 key 只能调用 gpt-4o预算 10 美元。如果出现 401先确认 Authorization 头带的是子 key 而不是 master key再确认这个 key 是否已过期。litellm 的 key 可以设 expire 时间如果你之前创建 key 时填了较短的有效期到期后密钥会自动失效这是安全机制也是排查重点。4.3 请求超时与重试引发的连环故障请求超时是生产环境最常见的性能问题。litellm 默认会对失败的请求做重试这本来是好事但如果你没有配置 fallback而某个上游厂商长时间故障所有请求都堆积在重试上大量的重试流量可能把网关的资源打满。我总结了一套组合策略。第一全局 request_timeout 设置为 60 秒连接超时单独设短一些推荐 10 秒左右。第二num_retries 设置成 2 或 3 就够不要设 5 次以上。第三配置 fallbacks 参数让失败的流量降级到备用模型。第四如果业务允许在网关前再加一层队列或熔断逻辑避免突发流量把网关打爆。这套组合拳打下来我这边连续稳定运行几个月基本没再出现因为上游故障导致整体服务不可用的情况。4.4 预算异常扣减与统计误差预算和 token 统计这块有很多细节坑。litellm 在估算成本时需要根据模型单价来计算如果你的模型不在官方内置价格表里它会按一个默认价格估误差可能偏大。我遇到过一个本地开源模型实际部署 in 模型的价格应该很低但默认价格表按商业模型算导致预算提前触顶。解决办法是在配置里手动指定模型价格model_list: - model_name: llama3-local litellm_params: model: vllm/llama3-8b-instruct api_base: http://localhost:8000/v1 api_key: dummy model_info: input_cost_per_token: 0.0000001 output_cost_per_token: 0.0000002另外如果你用流式输出模式litellm 统计 token 通常是在流结束之后才记录完整数值所以实时性会有一点延迟。如果你们后台需要实时展示 Token 消耗建议自己在前端做一层消息长度的近似统计跟网关的最终数据做一次校准不要在观测面板上过度依赖秒级实时数字。4.5 配置热更新与多环境隔离建议litellm 支持部分配置在运行时修改比如通过管理接口更新模型列表和路由规则而无需重启进程。但我的建议是生产环境的改动尽量走配置文件的版本化管理不要在生产环境用 API 直接改配置因为那样改完没有审计记录出了问题很难回滚。我自己的做法是配置文件放在一个独立仓库里走 MR 评审用 CI 做 YAML 格式校验和模型名合法性检查通过后再触发部署。多环境隔离方面基础的原则是测试环境和生产环境至少要用不同的数据库。因为预算数据、密钥数据混在一起很容易出现测试 key 消耗掉生产预算的乌龙。如果有条件建议每个环境一套独立的网关实例并给测试环境的模型设置特别低的预算上限。5. 扩展玩法与个人实践总结litellm 不只是给业务做模型路由它还可以当作一个团队内部的 AI 能力统一出口。比如我们内部把所有 AI 工具的调用统一走了这个网关包括代码辅助工具、客服知识库的 embedding 服务、内容总结批处理任务。每个工具分配一个独立子 key月末复盘时直接在后台看每个 key 的花费再也不用翻各个厂商的账单逐个对账了。另外一个很实用的场景是模型测评。我们做模型对比评测时只需要在网关里临时加一个 model_name指到新的模型通过同一个调用入口并行发请求从结果对比里找差异。这个方案比我之前分别写脚本调用不同厂商速度快了很多代码量也少了一个数量级。最后分享一个我踩过多次之后养成的习惯复制密钥前先确认它只出现在两份文件里一份是 CI 里的加密变量库一份是本地私有的环境变量文件里。litellm 的 master key、各厂商 key 都遵循这个原则。刚开始我图省事把 key 直接写在配置里推到了仓库后来差点造成泄露还好及时发现并轮换。自那以后任何密钥都不进仓库只通过环境变量注入。如果你正在被多模型接入、预算失控、接口不统一这些问题困扰litellm 应该是目前解决这些问题的最短路径。先跑通一个小流量场景把模型转发和密钥管理用起来再逐步把预算、可观测性、负载均衡这些重功能打开。我经历这个过程差不多用了一个月收益很大希望这篇内容能帮你少走一些弯路。

相关新闻

Hadoop全分布模式:生产级集群部署与稳定性实践指南

Hadoop全分布模式:生产级集群部署与稳定性实践指南

1. 项目概述:为什么“全分布模式”是Hadoop落地的真正起点你搜“hadoop搭建”,前几页几乎全是伪分布式或单机模式教程——界面能跑起来,Web UI能打开,甚至MapReduce任务也能提交成功。但那只是玩具。真正让Hadoop在生产环境站稳脚…

2026/10/12 4:28:41 阅读更多 →
Dapp-Learning 实战:基于 Hardhat 组合 Aave V3 与 Uniswap V3 构建一键做多/做空杠杆合约

Dapp-Learning 实战:基于 Hardhat 组合 Aave V3 与 Uniswap V3 构建一键做多/做空杠杆合约

示例工程区块链 【免费下载链接】Dapp-Learning Dapp learning project for developers at all stages. Becoming and cultivating sovereign individuals. Nonprofit organization. 项目地址: https://gitcode.com/gh_mirrors/da/Dapp-Learning 点击查看 免费下载 …

2026/10/12 4:28:41 阅读更多 →
科研论文绘图工作流:Python+Inkscape+LaTeX三级出版级方案

科研论文绘图工作流:Python+Inkscape+LaTeX三级出版级方案

1. 这不是又一个“论文绘图工具”广告,而是一次坦诚的自我解剖“论文绘图工具——毛遂自荐”,这个标题乍看有点拗口,甚至带点文人气的自谦,但背后藏着一个非常现实、非常具体、也非常普遍的痛点:科研人员在论文写作后期…

2026/10/12 4:28:41 阅读更多 →

最新新闻

UE5实战:从性能卡顿到线程安全的5大工程断面解析

UE5实战:从性能卡顿到线程安全的5大工程断面解析

1. 这不是教程,是我在三个UE项目里拆出来的引擎骨架“游戏引擎架构深度解析(五):UE实战与高级主题”——看到这个标题,别急着点开。我见过太多人把这类内容当成“进阶技巧合集”,结果学完还是写不出一个能稳…

2026/10/12 5:19:07 阅读更多 →
AI日报制作全流程:从信息筛选到深度解读的实操指南

AI日报制作全流程:从信息筛选到深度解读的实操指南

1. 一份“AI 日报”到底在记录什么先说说我做这份日报的出发点。2026年10月3日这一期,是我连续更新的第两百多期,从最开始只是给自己留个备忘,到后来变成一个小圈子里每天早上必看的东西。很多人第一次听到“AI 日报”这四个字,脑…

2026/10/12 5:19:07 阅读更多 →
PentAGI中的数字取证集成:从渗透测试到证据收集的完整流程

PentAGI中的数字取证集成:从渗透测试到证据收集的完整流程

PentAGI中的数字取证集成:从渗透测试到证据收集的完整流程 【免费下载链接】pentagi Fully autonomous AI Agents system capable of performing complex penetration testing tasks 项目地址: https://gitcode.com/GitHub_Trending/pe/pentagi PentAGI 是一…

2026/10/12 5:19:07 阅读更多 →
Cherri Playground 在线编辑器实战:免安装快速编译导出签名快捷指令

Cherri Playground 在线编辑器实战:免安装快速编译导出签名快捷指令

【免费下载链接】cherri Siri Shortcuts Programming Language 🍒 项目地址: https://gitcode.com/gh_mirrors/ch/cherri 点击查看 免费下载 Cherri(樱桃)是一門能把代码直接编译成 Apple「快捷指令」(Shortcuts&…

2026/10/12 5:19:07 阅读更多 →
ant-design-blazor 数字输入框 InputNumber 完全指南:泛型类型、格式化与数值校验实战

ant-design-blazor 数字输入框 InputNumber 完全指南:泛型类型、格式化与数值校验实战

前端UI组件设计系统 【免费下载链接】ant-design-blazor 基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。 项目地址: https://gitcode.com/ant-design-blazor/ant-design-blazor 点击查看 免费下载 InputNumber 是 ant-des…

2026/10/12 5:19:07 阅读更多 →
Pylint 的 bad-string-format-type(E1307):旧式 `%` 格式化参数类型不匹配检查完全指南

Pylint 的 bad-string-format-type(E1307):旧式 `%` 格式化参数类型不匹配检查完全指南

静态分析代码质量Lint开发工具 【免费下载链接】pylint Its not just a linter that annoys you! 项目地址: https://gitcode.com/gh_mirrors/pyl/pylint 点击查看 免费下载 导读 bad-string-format-type(消息编号 E1307)是 Pylint 中用于检…

2026/10/12 5:18:06 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →