LiteLLM统一网关实战:搞定大模型API接入与模型切换难题
不知道你们有没有这种经历项目对接了好几个模型服务商的API每个服务商的鉴权方式不一样、返回结构不一样、限流策略也不一样。最难受的是方案评审时说的是“随时可以切换模型”真正切的时候才发现切换一次要改几十处代码。我盯上litellm这个统一网关就是因为团队在那个月被模型切换折腾得够呛。这篇文章把我从第一次接触litellm到把它放进生产环境的完整过程包括配置、原理、踩坑全部整理出来希望能给同样在跟大模型API打交道的你一个可以照着做的参考。1. 先聊我为什么会盯上这个大模型统一网关事情要从一个模拟项目X说起。当时团队接了一个智能客服的需求产品经理拍板说“先用A厂商的模型后续根据效果换B厂商的”。我听的时候没太当回事觉得换模型不就是在代码里改一下base_url吗。真正动工之后才发现完全不是那么回事。A厂商的SDK有自己的请求签名方式B厂商的SDK用的是另一种鉴权头A厂商返回的流式事件字段叫这个B厂商的返回字段叫那个还有超时时间、重试机制、限流报错格式各家都有自己的脾气。最麻烦的是我们的业务代码里到处散落着对上游SDK的依赖今天在这个服务里调一下对话接口明天在那个任务里调一下Embedding接口。真要切换模型等于把所有调用点全部捞出来重写一遍。当时我脑子里冒出来的第一个想法是能不能做个中间层把上游的差异性全部挡在外面业务代码只面向一种接口格式这样切换模型就只是改配置的事了。然后我就找到了litellm。严格来说litellm做了两件事。第一它是一个Python SDK可以让你用统一的代码去调用各种主流大模型服务商不管是对话模型、Embedding模型还是其他类型调用方式基本一致。第二它内置了一个轻量级的网关服务也就是常说的Proxy模式你把服务商API密钥配置好、启动一个服务团队所有人只需要把请求发到这个服务上由它再去转发给真正的模型服务商。这个概念听起来很简单但真正用下来你会发现中间层能承载的东西比想象中多得多。模型路由、密钥管理、预算控制、限流、重试、日志追踪这些在大模型工程化里很麻烦的事都能在这个统一网关里一起解决。这也是我这篇文章想讲清楚的核心不只告诉你litellm怎么用更想让你知道为什么中间层方案能解决大模型API接入的绝大多数痛点。2. 拆开看litellm 到底把哪些事接了过去2.1 把各家API差异收敛成一种请求格式不同模型服务商对外提供的接口风格千差万别但有一个趋势是明显的越来越多的服务商在兼容业界常见的/chat/completions这种对话补全接口格式。litellm也选择了这种格式作为它的统一入口。你在业务代码里写的请求基本就是固定的结构模型名、消息列表、温度、最大token数等参数。至于上游服务商到底需要什么样的鉴权方式、什么样的请求体、什么样的URL拼接这些全部由litellm在内部翻译处理。这就意味着你的业务代码里不再需要引入某个服务商专门的SDK只需要记住一套请求写法就行。2.2 模型路由与别名litellm里有一个很重要的设计请求里的model参数并不一定等于上游真实的模型标识而是你配置出来的一个“别名”。比如你在配置里定义model_name: customer-service-v1把它映射到A厂商的某个旗舰对话模型。业务方调用时只需要传model: customer-service-v1。等你想换成B厂商的模型了只需要在网关配置里把这个别名指向新模型业务代码一行都不用动。这个设计在生产环境里太有用了。产品、算法、业务可以在同一个网关下各自管理自己的模型映射后端同学不用天天跟着模型版本升级改代码。2.3 多密钥负载均衡很多模型服务商是按API密钥来限流的。一个密钥每分钟只能发那么多请求超了就报429。litellm支持为同一个模型配置多个API密钥网关会自动做轮询或根据策略分配请求。我们当时用这个功能把一个密钥的限流压力拆到三个密钥上线上429报错立刻少了很多。配置也简单给同一个上游模型多挂几个api_key就行。2.4 重试与降级大模型API的故障率并不低尤其是高峰期上游偶尔会返回超时或5xx错误。litellm可以配置重试次数和备用模型。比如主模型超时后自动重试两次两次还不行就把请求转到备用模型。这个降级能力非常实用因为对用户来说一次智能客服请求背后到底是哪个模型在回答根本没人在意只要别一直报错就行。2.5 成本追踪与配额大模型的成本是按token算的一个不小心某个团队一个月能烧掉不少钱。litellm会记录每个请求的输入token数、输出token数以及估算费用并且支持按API密钥、按团队设置预算上限。额度用完了后续请求直接拒绝。这对于需要把成本分摊到不同业务线的团队来说几乎是刚需。3. 快速跑通从 pip install 到第一个代理请求理论说再多不如亲手跑一遍。下面是我第一次跑通litellm的完整过程。3.1 安装我建议先用Python 3.9以上的虚拟环境避免和系统环境冲突。pip install litellm[proxy]这里装的是带代理网关能力的完整版本。如果只是想在本地代码里用统一SDK直接pip install litellm也够。3.2 写一个最小配置文件在项目目录下新建config.yaml内容大概是这样的model_list: - model_name: demo-chat litellm_params: model: provider-a/chat-model-1 api_key: os.environ/PROVIDER_A_API_KEY - model_name: demo-embedding litellm_params: model: provider-b/embedding-model-1 api_key: os.environ/PROVIDER_B_API_KEY这里我用provider-a/chat-model-1这样的占位符来代表真实模型标识。实际使用时你把model字段替换成对应模型服务商支持的标识格式就行。注意环境变量的用法。litellm支持在YAML里写os.environ/变量名这样密钥不会直接暴露在配置文件里这个习惯建议从一开始就保持。3.3 启动网关export PROVIDER_A_API_KEY你的密钥 export PROVIDER_B_API_KEY你的密钥 litellm --config config.yaml --port 4000启动成功后终端会显示网关地址http://localhost:4000。此时它就相当于一个本地的模型API服务了。3.4 发第一个请求用curl测试最直接curl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: demo-chat, messages: [{role: user, content: 你好}], temperature: 0.7 }如果你之前用过业界常见的对话补全接口会发现这个请求长得很眼熟。litellm网关就是把自己伪装成了一个标准API服务内部再转换成上游服务商真正需要的格式。3.5 在Python业务代码里调用我们的业务代码基本都是Python统一通过openai风格的客户端去连网关但base_url指向本地服务from openai import OpenAI client OpenAI( api_keysk-any-key, base_urlhttp://localhost:4000/v1 ) resp client.chat.completions.create( modeldemo-chat, messages[{role: user, content: 你好}] ) print(resp.choices[0].message.content)这里有个细节网关默认有虚拟密钥机制请求时必须带一个key但本地测试时可以先用任意字符串顶替。后面讲到团队协作时我再展开说虚拟密钥怎么配置。4. 配置文件的几个关键字段决定了生产环境稳不稳如果你只是本地玩一下上面那个最小配置就够了。但要上生产配置文件里的几个细节必须认真对待。4.1 model_list 里的模型标识要写完整很多人在litellm_params.model字段里漏写了前缀。不同服务商对模型标识的格式要求不一样有的直接是模型名有的要求服务商前缀/模型名。litellm的通用约定是服务商名称/具体模型标识。配置前先确认一下你要映射的那个服务商到底认什么格式不要想当然。4.2 超时和重试参数大模型接口响应慢是常态尤其遇到长文本生成。如果网关层不设超时一个慢请求可能会拖垮整个服务的连接池。我一般会在litellm_params里加超时控制model_list: - model_name: demo-chat litellm_params: model: provider-a/chat-model-1 api_key: os.environ/PROVIDER_A_API_KEY timeout: 60这个超时是网关等待上游响应的上限。超过60秒还没返回网关会中断这次请求。设置多少取决于你的业务场景如果是聊天类应用30到60秒比较常见如果是离线批量处理可以放宽到120秒。重试方面litellm不是简单地在每次失败后盲目重发它也会考虑错误类型。比如上游返回限流错误重试的间隔会适当拉开返回4xx参数错误重试也没意义。配置重试次数时我建议从2次开始不要一上来就配5次。重试越多对上游的压力越大也越容易造成重复请求。4.3 备用模型与降级策略有条件的团队一定配置备用模型。我们的做法是给核心对话模型配一个备用池model_list: - model_name: customer-service litellm_params: model: provider-a/chat-model-1 api_key: os.environ/PROVIDER_A_API_KEY model_info: mode: completion - model_name: customer-service litellm_params: model: provider-b/chat-model-2 api_key: os.environ/PROVIDER_B_API_KEY当同一个model_name对应多个配置时网关可以在主模型异常时自动使用备用。这种降级对业务方完全透明用户只知道请求成功了不会去关心到底用的是哪个模型。4.4 日志和审计litellm默认会把请求日志打印在终端但生产环境一定要接入外部日志系统。我们在配置里把日志输出到标准输出再由日志收集器采集到统一平台。这样每次请求的模型、token数、耗时、费用都能查到。排查线上问题的时候这些日志比什么都管用。提示不要把网关日志只留在本地进程里进程一重启就什么都没了。日志持久化要提前规划。5. 一次请求在网关内部的完整旅行理解了配置再来看请求从发出来到拿到结果在litellm网关内部到底经历了什么。这能帮你推断很多线上问题。5.1 第一步鉴权和准入检查请求到达网关后第一件事是检查这个Key能不能用。这个Key可能是你配置的虚拟密钥也可能是团队某个成员申请的子密钥。通过鉴权后网关还会检查这个Key对应的额度、速率限制。如果预算超了直接返回错误根本不会帮你转发给上游。这个前置检查很重要它把很多成本风险挡在了真正调用之前。5.2 第二步根据模型名找路由接着网关根据请求里的model字段去配置表里查。你会看到同一个model_name下可能有多个上游配置网关要决定这次走哪个。这里涉及负载均衡逻辑。如果所有上游配置都健康网关会按配置好的策略分配流量。如果某个上游最近返回了大量错误网关会动态降低它的权重把更多请求分给健康的上游。5.3 第三步翻译请求并调用上游确定上游后网关把业务方传来的标准格式请求翻译成上游服务商需要的样子包括URL、鉴权头、请求体结构然后发起真正的网络调用。这一步也是超时、重试、熔断发生的地方。上游如果迟迟不响应网关会在预设超时时间后中断然后根据配置决定是否重试或切换到备用模型。5.4 第四步响应组装与记录上游返回后网关解析回包把它统一成标准响应格式再返回给业务方。如果是流式请求网关会把上游的流式数据逐段转发同时统计token用量。最后请求日志、费用数据、token统计都会被记录下来。了解了这个链路你就能理解为什么很多问题其实不出在业务代码而是出在网关配置。比如某个请求特别慢你先看是不是鉴权/限流阶段被卡了再看是不是网关在无休止地重试最后再看上游本身的状态。排查路径清晰很多。6. 预算、限流、虚拟密钥团队协作时绕不开的控制面litellm对个人开发来说是便利工具对团队来说更像一个控制面板。下面这几个能力是我们当时决定把它作为团队统一入口的关键。6.1 虚拟密钥网关不会要求你把上游服务商的真实密钥发给每个开发。你可以在网关上为每个团队成员或每个项目生成独立的虚拟密钥。虚拟密钥相对于真实密钥有几个好处可以单独吊销、单独设额度、单独限流。比如某人离职了只需要把他的虚拟Key删掉不影响其他同事某个项目预算收紧直接把那个项目的Key额度调低就行。生成密钥的管理界面或API一般会返回类似sk-开头的字符串。注意虚拟密钥和上游的真实密钥要严格分开管理不要混用。我们之前就吃过混用的亏后面详细说。6.2 预算限制我们可以为每个虚拟Key设置预算上限单位可以是美元或其他币种也可以按token数量限制。举个例子给A项目设置的月度预算是500美元当所有通过这个Key发出的请求累计费用达到500美元时后续请求会被拒绝。这样财务上就不会出现“月底一查账单吓一跳”的情况。预算设置需要考虑的是估算费用和实际账单可能有细微差异因为网关是根据token数乘单价估算的而服务商账单可能有其他税费或折扣。我一般会把网关预算设为实际预算的90%留一点缓冲。6.3 速率限制大模型API经常有限流常见单位是RPM每分钟请求数和TPM每分钟token数。在团队场景里你可以按Key为不同人配置不同速率。比如测试环境的Key限制每分钟10次请求生产环境的Key限制每分钟1000次请求。这样测试代码不会把生产额度打爆生产流量也不会被测试拖垮。6.4 多项目隔离如果团队同时维护多个产品最好让每个产品线使用独立的虚拟Key、独立的模型别名空间。比如A项目和B项目都调用同一个大模型但A项目的预算和B项目完全隔离。网关会在日志里按Key区分请求归属月底出成本报表时直接按Key分组汇总就行。这个做法让财务核算简单了很多。7. 实测中的血泪经验重试、超时、缓存、流式最后这部分是我真正愿意称之为“经验”的内容。很多东西文档上写得简单但实际用起来坑都在细节里。7.1 重试会放大重复请求最开始我们天真地给所有请求配了3次重试。结果有一次上游服务商出现半故障状态网关这边疯狂重试上游那边收到大量重复请求我们的费用也翻了好几倍。后来我们改了策略只有明确的连接超时、5xx错误才重试某些4xx错误直接放弃。另外对于非幂等的操作尽量少重试。大模型对话请求本身是幂等的但如果你的业务里有联网搜索或工具调用重复请求可能带来副作用这一点要评估清楚。7.2 流式请求要关注连接断开流式输出是聊天场景的标配。网关转发流式数据时如果客户端中途断开网关需要感知并停止上游请求否则上游还在继续生成token费用一直累积而我们根本没人消费这些数据。我们在网关层做了客户端断连检测一旦发现连接关闭立即取消上游请求。这个细节不处理流式场景下钱会烧得特别快。7.3 缓存不是越多越好litellm支持响应缓存尤其是Embedding这类结果相对固定的请求缓存命中率很高可以显著降低成本。但是对话类请求的缓存要谨慎。相同的问题在一段时间内可能确实适合复用同一个答案但过度缓存会导致用户得不到实时反馈。我推荐只缓存那些有明确标识的、结果稳定的请求比如文本Embedding、分类任务、关键词提取。还有一种语义缓存简单理解就是对输入做语义相似度匹配相似的问题直接返回缓存答案。这个功能效果很好但要额外消耗Embedding模型的调用也需要评估成本和收益。7.4 真实密钥和虚拟密钥混用的坑我们曾经在一个内部工具里图省事直接把上游真实密钥配给了某个测试脚本绕过了网关。结果那个脚本在跑批量任务时消耗了大量token而网关的成本报表里完全看不到这笔费用因为请求根本没走网关。后来我们做了个硬性规定所有模型调用必须走网关真实密钥只保存在网关配置里任何人不得在业务代码或脚本里使用上游真实密钥。这样一来成本报表才真正变得可信。7.5 网关本身的异地部署和网络延迟网关所在服务器到上游服务商之间的网络质量会直接影响请求耗时。我们一开始把网关部署在本地办公室结果每次调用都要经过漫长的公网链路响应时间多了几百毫秒。后来我们把网关挪到了离上游服务商较近的云服务器上业务服务再通过内网或专线访问网关整体延迟降了下来。如果你对响应时间敏感一定不要忽略这个网络链路问题。8. 如果你也要上 litellm我的建议回头再看litellm帮我们解决的问题本质上不是“如何调用大模型”而是“如何把大模型接入这件事变得可管理、可治理、可切换”。对于还在早期阶段、模型选型经常变的团队来说这个价值尤其大。我个人实际操作用下来的体会是不要把它当成一个简单的API转发工具而要当成你团队大模型基础设施的一部分来规划。从安装、配置、虚拟Key、预算、日志、监控每一步都按生产标准来做后面会少踩很多坑。有一个小技巧可以分享一下初次安装后别急着配一堆模型先用一个模型、一个虚拟Key、一台本地服务把请求链路完整跑通。确认你能看到日志、能统计到token和费用再逐步加模型、加团队成员。这样循序渐进出了问题也容易定位。litellm这个方向还会继续演化模型服务商会越来越多接口标准也可能变化。但只要统一网关这个中间层在我们面对未来的模型切换就能从容很多。希望这篇实战记录能帮你少走点弯路。

相关新闻

Python实战:伦敦住房数据清洗、分析与HTML报告生成

Python实战:伦敦住房数据清洗、分析与HTML报告生成

简介:这份资源是面向数据分析初学者与进阶学习者的伦敦住房市场分析项目,基于超过13000条真实记录,涵盖平均房价、房屋销售数量与犯罪率等关键指标,帮助读者理解房地产市场的动态与影响因素。压缩包共5个文件,约566KB&…

2026/10/13 5:13:27 阅读更多 →
光学仿真必会:VirtualLab Fusion通用探测器配置与实战指南

光学仿真必会:VirtualLab Fusion通用探测器配置与实战指南

搞光学仿真的人,几乎都会在项目里遇到同一个问题:光路搭好了,模拟也跑了,屏幕上各种光栅、透镜、波导都在发光,可你到底怎么知道“光斑长什么样”“相位抖没抖”“偏振转没转”?在 VirtualLab Fusion 里&am…

2026/10/13 5:13:27 阅读更多 →
Persome屏幕捕获管线深度解析:Accessibility事件、本地OCR与截图加密存储

Persome屏幕捕获管线深度解析:Accessibility事件、本地OCR与截图加密存储

【免费下载链接】personal-model Build your HUMAN.md. 项目地址: https://gitcode.com/gh_mirrors/pe/personal-model 点击查看 免费下载 Persome(开源项目 personal-model)的屏幕捕获管线是整座个人模型的"眼睛":它通…

2026/10/13 5:13:27 阅读更多 →

最新新闻

AnyPS5实战:用开源面板统一管理PS5游戏库与远程串流

AnyPS5实战:用开源面板统一管理PS5游戏库与远程串流

AnyPS5 这个名字听起来像是一台主机,其实它是我折腾的一个本地工具项目。起因很简单:我手里的游戏、账号、主机状态越来越散,数字版躺在不同账号里,光盘版挤在书架上,想远程玩一把还得分清哪台机器、哪个账号、哪次打折…

2026/10/13 5:57:39 阅读更多 →
多AI Provider架构设计:从统一接口到动态路由的接入层重构

多AI Provider架构设计:从统一接口到动态路由的接入层重构

一个多月前,我把 HagiCode 平台的核心接入层从“单 Provider 写死”重构成了“多 AI Provider 架构”。今天把整个过程中的设计取舍、代码落地方案以及踩过的坑整理出来,算是给后端团队和做 AI 应用集成的朋友一份参考。这里说的 AI Provider&#xff0c…

2026/10/13 5:57:39 阅读更多 →
小程序加密实战:CE固定动态密钥与全流程自动化方案

小程序加密实战:CE固定动态密钥与全流程自动化方案

小程序加密这件事,很多团队一开始都低估了。刚接手一个电商小程序项目时,我以为把请求参数签个名、在本地存个AppSecret就够了,结果上线没几天,接口就被别人用脚本刷了一遍。原因不复杂:小程序包里的东西基本是透明的&…

2026/10/13 5:57:39 阅读更多 →
风机叶片开裂智能预警:机器学习方案的数据清洗、特征工程与模型落地

风机叶片开裂智能预警:机器学习方案的数据清洗、特征工程与模型落地

简介:一套面向风电运维与机器学习实践者的风机叶片开裂故障智能预警系统实现方案,系统阐述从多传感器网络部署、数据标准化滤波与质量校验,到共振频移、应变分布等敏感特征提取,再到集成学习与深度神经网络构建异常识别模型&#…

2026/10/13 5:57:39 阅读更多 →
小程序加解密动态密钥管理:从受控调试到自动化验证

小程序加解密动态密钥管理:从受控调试到自动化验证

做小程序加解密这一块,最难受的从来不是AES算法本身怎么写,而是密钥怎么发、怎么存、怎么换,以及出了问题之后怎么把密文层层剥开去定位。之前我处理过一个线上问题:同一套动态密钥在当前会话里加解密完全正常,换一个会…

2026/10/13 5:57:39 阅读更多 →
西门子PLC实战:锂电浆料线程序开发与通讯调试全流程

西门子PLC实战:锂电浆料线程序开发与通讯调试全流程

很多人找我聊西门子PLC程序开发怎么入门,我一般不会直接甩教程,而是先反问一句:你见过新能源浆料线吗?去年我接手了一条锂电正极浆料产线的整套PLC程序开发,从需求梳理到带料调试,前后折腾了小半年。说句实…

2026/10/13 5:56:39 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →