LiteLLM实战:统一大模型API网关的接入、部署与踩坑指南
做后端接入大模型服务第一年我就在三个不同厂商的API之间来回横跳。每个平台的鉴权方式不一样、请求体结构不一样、流式和非流式的字段名不一样连报错信息都各说各话。每次想换个模型试试都要改一堆调用代码改完还要重新跑回归。后来我接触到了LiteLLM整个接入方式一下子就清晰了。这篇文章就把我实际使用的经验和踩过的坑完整记录下来从核心原理到生产部署一次讲透。1. 为什么每个接过大模型服务的团队最后都会搭一个“统一网关”1.1 多模型接入的混乱比想象的严重得多假设你只对接一个模型供应商代码很快就能稳定下来。但现实往往不是这样你今天用A家的GPT系列明天想试试B家的Claude系列对比效果后天可能还要接本地部署的开源模型。每个供应商的API设计思路都存在差异请求参数、消息格式、token统计方式、错误码体系全都不一样。我举个具体例子调用OpenAI格式的API消息体是{model: xxx, messages: [{role: user, content: 你好}]}而调用Anthropic格式的API结构变成了{model: xxx, system: ..., messages: [{role: user, content: 你好}]}system提示词的放法都不同。如果本地模型跑在Ollama上又要用Ollama自己的SDK。一旦业务代码里直接散落这三套调用逻辑后续维护就是噩梦。这种情况下团队通常的解决方案是写一个内部函数库把三家调用封装起来。封装本身不难难在持续维护每家的参数更新、新模型上线、限流策略调整你都得同步改封装代码。而且每换一个工程师交接成本又叠加一层。长期来看这个兼容层会越写越厚越来越像一个小型网关但功能上又比正经网关简陋得多。1.2 网关不只是在做“格式转换”很多人的第一反应是统一调用层不就是把各家API翻译成一种格式吗其实这只是最基础的一部分。生产环境里你还需要考虑重试策略、速率限制、成本追踪、模型降级、密钥管理、多租户隔离、日志审计。比如某个供应商短时抖动返回了500你是直接报错还是自动重试一次如果重试重试间隔怎么控制如果A家的模型因为负载过高开始限流能不能自动把流量切到B家的同级别模型团队里不同业务线各自调用模型每个月的token开销怎么分摊这些问题如果散落在业务代码里处理每个业务方都要重复解决一遍一模一样的难题。统一网关的核心价值是把这些横切关注点收敛在一个独立组件里。2. LiteLLM核心能力拆解它到底替你做了什么2.1 它本质上是什么LiteLLM是一个开源项目核心功能是通过统一的调用接口兼容市面上主流的大模型API服务。它既可以作为Python库被直接引入也可以作为独立代理服务部署。这个项目的设计思路很有意思以OpenAI的API协议为基础标准让所有兼容OpenAI格式的服务无需额外适配同时把其他厂商的API映射到这一套协议上。用一句话概括你在代码里只面对一套API约定背后是哪个供应商的模型全部由配置决定。这样一来从OpenAI切换到Anthropic从云厂商模型切换到本地Ollama业务代码一行都不改只要修改配置文件里的模型映射关系。这个特性让我在模型选型和测试时有了极大的自由度。2.2 核心能力一览我把生产环境里用得最频繁的功能整理成了一张表方便快速对照能力说明典型使用场景统一API格式提供OpenAI兼容的访问方式业务系统一套代码调用所有模型多模型路由同一个逻辑模型名映射到多个实际模型金丝雀发布、新模型灰度切换自动重试与降级请求失败自动重试或切换到备用模型供应商抖动、限流、故障恢复成本追踪每次请求自动统计输入输出token及费用多部门费用分摊、预算控制密钥管理服务端统一保存各厂商密钥客户端无需持有安全合规、密钥轮换速率限制按用户或密钥设置每分钟请求数、Token数上限防止单个业务线过度消耗预算控制设置总预算或单用户预算超额自动熔断测试环境、客户Saas租户管理缓存对相同请求启用缓存内存或Redis高频重复问题、降低延迟和成本这中间最常用到的还是路由、重试、成本追踪这三个能力。我下面详细展开讲。2.3 先想清楚用SDK还是用ProxyLiteLLM提供两种主流使用方式。第一种是作为Python库直接在代码里import litellm调用completion方法这种方式适合单机脚本、Notebook实验、快速验证。第二种是作为代理服务Proxy Server部署本质是一个独立运行的HTTP服务对外暴露OpenAI兼容的/v1/chat/completions接口适合团队级接入和生产环境。如果只是自己写脚本调模型SDK方式就够用了。但如果公司里有多个业务团队都在调用大模型API我的经验是直接上Proxy模式。理由很简单代理模式把密钥集中管理在服务端业务方只拿一个LiteLLM生成的虚拟密钥就能消费所有模型。权限控制、配额限制、调用审计都在网关层统一完成业务方不需要关心后端到底接了多少个供应商。3. 从零跑通SDK快速上手到Proxy生产部署3.1 五分钟跑通第一个请求SDK方式SDK方式是最直观的切入点。先安装依赖pip install litellm[proxy]然后写一段最简单的调用代码import litellm response litellm.completion( modelgpt-4o, messages[ {role: user, content: 用一句话解释什么是API网关} ], temperature0.7 ) print(response.choices[0].message.content)默认情况下LiteLLM会读取环境变量中的OPENAI_API_KEY来调用OpenAI官方接口。注意到这里有个关键细节你传的参数格式和直接写OpenAI SDK几乎一样但LiteLLM在底层把请求转发给了实际的供应商服务并自动完成了token统计、成本计算、响应解析等工作。如果你想测试Anthropic模型不需要改调用代码只需要换模型名并设置对应密钥import os os.environ[ANTHROPIC_API_KEY] your-key import litellm response litellm.completion( modelclaude-3-5-sonnet-20240620, messages[ {role: user, content: 用一句话解释什么是API网关} ] )我把这种体验讲给团队里后端的同事听他们的第一反应往往是模型名去哪查供应商这里就得提一下LiteLLM的模型命名约定provider/model-name。例如openai/gpt-4o、anthropic/claude-3-5-sonnet-20240620、ollama/llama3、bedrock/anthropic.claude-3-sonnet。如果不带前缀默认走OpenAI格式。这个命名规则在配置文件中会频繁用到需要提前记住。3.2 用Proxy模式搭一个真正的团队网关单机脚本始终替代不了生产网关。我这里给出一个可以直接抄作业的Proxy部署方案。准备一个config.yaml定义模型列表和认证信息。这是最核心的配置文件model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY model_info: max_tokens: 128000 input_cost_per_token: 0.0000025 output_cost_per_token: 0.00001 - model_name: claude-3-5-sonnet litellm_params: model: anthropic/claude-3-5-sonnet-20240620 api_key: os.environ/ANTHROPIC_API_KEY model_info: max_tokens: 200000 - model_name: local-llama litellm_params: model: ollama/llama3.1:8b api_base: http://localhost:11434 litellm_settings: set_verbose: False drop_params: True general_settings: master_key: sk-your-master-key几个关键点需要说明model_name是对外暴露的逻辑名称业务方只感知这个名字。litellm_params.model是实际调用的模型标识格式为供应商/模型。api_key推荐用os.environ/XXX的形式避免密钥直接写在配置文件里。drop_params: True这个参数我强烈建议开启。它会把代码里传入但当前模型不支持的参数自动丢弃避免因为某个模型不支持temperature之类参数而直接报错。master_key是访问网关的主密钥业务方统一用它做初始认证。启动服务docker run -d \ --name litellm-proxy \ -p 4000:4000 \ -v $(pwd)/config.yaml:/app/config.yaml \ -e OPENAI_API_KEYsk-your-openai-key \ -e ANTHROPIC_API_KEYsk-your-anthropic-key \ ghcr.io/berriai/litellm:main-latest \ --config /app/config.yaml \ --port 4000启动完成后在任意支持OpenAI SDK的代码里把base_url指向LiteLLM服务即可from openai import OpenAI client OpenAI( api_keysk-your-master-key, base_urlhttp://localhost:4000/v1 ) response client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 你好}] ) print(response.choices[0].message.content)这么做最大的好处是业务方原本用的就是OpenAI SDK现在一行base_url替换就能接入LiteLLM网关后续模型再怎么切换业务代码完全无感。3.3 负载均衡、重试与自动降级配置生产环境里单一供应商不可用的概率并不低。我遇到过某家服务连续抖动半小时的情况如果没有降级策略线上功能基本就是瘫的。LiteLLM支持把同一个model_name映射到多个实际模型网关自动做负载均衡和故障转移。配置方式如下model_list: - model_name: primary-llm litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: primary-llm litellm_params: model: anthropic/claude-3-5-sonnet-20240620 api_key: os.environ/ANTHROPIC_API_KEY litellm_settings: num_retries: 3 request_timeout: 60 fallbacks: [{primary-llm: [anthropic/claude-3-5-sonnet-20240620]}]这里有一点需要特别提醒fallbacks里配的是具体的模型标识带供应商前缀不是逻辑名。我第一次配置时写成了逻辑名primary-llm结果降级时它又路由回同一个故障模型等于白配。当第一个模型连续失败超过阈值时LiteLLM会自动把请求转给备用模型。这对关键业务场景来说是提升可用性非常实用的一招。3.4 成本和预算控制防止被“偷跑”的token吃掉利润大模型API调用不像传统服务每次调用的价格是浮动的。如果不做预算控制一个临时测试脚本就可能跑出几百块的账单。在LiteLLM里我一般做三层防护第一层在model_info里配置每百万token单价LiteLLM会自动统计每次请求的实际花费并暴露到监控接口。第二层在general_settings里配置全局预算general_settings: master_key: sk-your-master-key max_budget: 1000 # 全局每日最大花费单位美元第三层为每个业务方创建独立的虚拟密钥并设置单独的预算和速率限制。这样即使某个业务方的Key泄露了影响范围也是可控的。curl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer sk-your-master-key \ -H Content-Type: application/json \ -d { models: [primary-llm], max_budget: 100, rpm_limit: 100 }返回结果里有一个key字段这就是该业务方专用的虚拟密钥它是调用上游真实密钥的中间凭证比直接把OpenAI密钥交给每个开发者安全得多。4. 生产环境踩坑实录与排查技巧4.1 常见的四类报错与定位思路LiteLLM代理的好处是它帮你把上游五花八门的报错统一成了OpenAI风格的错误码。但统一之后有些排查逻辑需要重新适应。我梳理了几个高频问题。首先是认证类错误常见表现是401 AuthenticationError。排查时先确认网关master_key是否正确再确认上游供应商的真实密钥是否在环境变量里正确注入。有时候docker容器里忘了加-e参数上游密钥没进去网关层还没有自动校验上游密钥是否真的有效业务方一看401容易误以为自己的Key写错了。其次是限流类错误429 RateLimitError。这种一般不是配置问题而是上游配额确实触顶了。处理方法是开启自动重试或在模型列表里配置多个同级别模型做负载均衡。我的经验是对于生产环境的流量不要单靠一家供应商的免费额度该开付费额度就开该配备用模型就配。第三类是上下文超长400 ContextWindowExceededError。这属于请求内容超出了模型最大窗口。虽然LiteLLM无法替你压缩上下文但可以启用drop_params、限制max_tokens、或在网关层做上下文截断策略。代码里把max_tokens设置到合理范围能有效减少这类报错。第四类是上游超时TimeoutError。这种我遇到过很多次尤其是本地Ollama模型或自建vLLM服务。默认超时时间往往偏短需要在litellm_settings里显式调大request_timeout。如果你的模型思考时间比较长60秒都可能不够要根据实际业务需求调整。4.2 缓存用得好省成本用得差出“幻觉”LiteLLM支持响应级缓存。相同参数、相同消息内容的请求直接返回缓存结果能大幅降低延迟和成本。典型的应用场景是客服系统的常见问题回答、FAQ机器人等。开启缓存只需要在litellm_settings中配置litellm_settings: cache: True cache_params: type: redis host: localhost port: 6379 ttl: 3600这里最大的坑是不要把任何具备时效性的请求放进缓存。比如实时天气查询、股票价格分析一旦缓存命中返回的就是过期数据。更危险的是某些场景下模型的输出结果会被业务方做持久化如果缓存了错误或敏感内容后续所有相同请求都会拿到同一个错误答案这种问题在普通报错排查里几乎无法发现。我的建议是默认关闭全局缓存对特定接口或场景按需开启。在SDK模式中可以给单个请求传入cachingTrue参数来做精细化控制。4.3 想让网关好用可观测性一定要配齐LiteLLM本身提供/health健康检查端点和/metrics监控端点。如果部署在Kubernetes里直接把这些端点接入Prometheus就能看到请求量、延迟、成本等指标。但真正让我觉得好用的是它的请求追踪粒度足够细。每个请求里都有独立的request_id有对应的model_name、实际命中的供应商模型、token消耗和花费。当业务方反馈某个请求特别慢时我可以直接通过日志定位到它到底走了哪个供应商、是否触发了重试、是否命中了缓存。如果你的监控体系用的是云服务厂商的链路追踪LiteLLM也支持自定义回调。通过litellm.success_callback和litellm.failure_callback可以把每个请求的成功、失败、耗时、成本这些数据推送到自己的数据平台。我建议上线后第一天就把监控接好否则等出问题再补会错过很多关键历史数据。4.4 版本升级和配置改动的注意事项LiteLLM的迭代速度比较快版本升级偶尔会带来配置格式的变化。如果你长期使用某个版本我的建议是升级前先在测试环境跑一遍完整回归重点验证模型列表是否正常加载、各供应商认证是否通过。订阅项目的Release更新说明遇到breaking change配置文件里的字段可能需要同步调整。生产环境固定版本号不推荐每次都拉latest镜像。等发布一段时间后再选一个稳定的版本计划性升级。我见过有团队直接把生产环境的镜像锁在main-latest结果某天发布后所有请求开始报模型不存在的错误。后来发现是新版本对模型名的解析规则变了。环境固定版本可以避免这类无谓的事故。5. 我的选型建议和实际使用体会5.1 什么情况下值得上LiteLLM如果你所在团队属于下面这些情况我建议尽早引入LiteLLM业务需要同时接入多家大模型供应商或者经常需要对比测试不同模型效果。团队规模不算小多个业务线各自有调模型的需求但希望统一管理密钥、预算和日志。公司内部有完善的多环境发布流程希望把“换模型”从代码变更降级为配置变更。对成本敏感需要将每次API调用的实际花费精确记录并分摊。在这些场景下LiteLLM能显著降低协作成本和维护成本。一个业务方接入新的模型只需要在网关配置里加一条映射然后申请一个密钥不需要改动线上代码也不用等待发版窗口。5.2 什么情况下不需要用它如果你们只使用一家供应商的模型并且未来也没有切换计划那么直接使用官方SDK会更简单没必要引入额外组件。另一个让我犹豫的场景是如果公司要求极低的端到端延迟每增加一个网络跳跃都会带来额外的延迟和故障点这时候引入代理服务反而得不偿失。还有一种情况如果公司已经有一套自研的模型网关平台那就更不必替换了——LiteLLM的核心价值在于“开箱即用的统一网关”而不是替代已有的企业级自研系统。5.3 一些实战经验后再聊几句我在生产环境跑LiteLLM已经有大半年了最大的感受是这类基础设施组件难的不是跑通而是保持“克制”。能不加的功能就不加能用配置解决的就不用代码能让业务无感的就不要让业务感知。如果你的团队刚开始接触多模型接入我建议从Proxy模式起步配置好成本追踪和监控后再放开给业务方。有了完整的观测数据你才能知道哪些模型真正值得上线哪些模型的真实成本比预想高得多。模型调用这种看似简单的事情放到规模化的环境里细节会决定体验的下限。

相关新闻

C语言猜数游戏实战:从随机数生成到输入缓冲区处理

C语言猜数游戏实战:从随机数生成到输入缓冲区处理

1. 项目概述与整体思路拆解1.1 为什么从猜数游戏开始学C语言绕不过猜数游戏,这几乎是每个初学者的第一个“有交互”的项目。别小看这个看似简单的程序,它几乎囊括了C语言入门阶段的全部核心知识点:变量定义、输入输出、逻辑判断、循环控制、随…

2026/10/13 5:39:34 阅读更多 →
CBAM注意力机制详解:通道与空间注意力原理及实战

CBAM注意力机制详解:通道与空间注意力原理及实战

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

2026/10/13 5:39:34 阅读更多 →
进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

简介:这是一份数据库课程设计完整参考项目——某商店进销存管理系统,面向计算机类专业学生、数据库初学者及需要完成课设的开发者,用于解决数据库原理课程设计中从系统分析到数据库实现的全流程问题。资源为RAR压缩包,共3个文件&a…

2026/10/13 5:38:34 阅读更多 →

最新新闻

嵌入式静态分析实战:用Cppcheck拦截疑难bug的完整指南

嵌入式静态分析实战:用Cppcheck拦截疑难bug的完整指南

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

2026/10/13 6:20:46 阅读更多 →
汽车电子硬件选型实战:高边开关、FPGA、MCU与SiC FET四类器件协同设计指南

汽车电子硬件选型实战:高边开关、FPGA、MCU与SiC FET四类器件协同设计指南

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

2026/10/13 6:20:46 阅读更多 →
PSO优化SVR超参数:风电功率预测回归拟合实战

PSO优化SVR超参数:风电功率预测回归拟合实战

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

2026/10/13 6:20:46 阅读更多 →
Zemax像差分析图全解:从点列图到MTF的判读方法

Zemax像差分析图全解:从点列图到MTF的判读方法

简介:这是一份面向Zemax初学者的像差分析图解文档,专门解决光学设计入门时难以从点列图、垂轴像差曲线等各类图像中快速识别像差类型的问题。文档以Zemax生成的典型图像为素材,逐类讲解初级球差、轴向色差、垂轴色差、子午慧差、子午场曲、弧…

2026/10/13 6:20:45 阅读更多 →
planck.js 版本演进与架构变迁:从 Box2D 移植到 TypeScript 引擎的完整技术脉络

planck.js 版本演进与架构变迁:从 Box2D 移植到 TypeScript 引擎的完整技术脉络

游戏开发 【免费下载链接】planck.js 2D JavaScript Physics Engine 项目地址: https://gitcode.com/gh_mirrors/pl/planck.js 点击查看 免费下载 planck.js 是一个以 TypeScript/JavaScript 实现的 2D 物理引擎(MIT 协议,源自 Box2D 的跨平…

2026/10/13 6:20:45 阅读更多 →
C语言核心知识点详解:const指针、野指针、assert断言与传值/传址

C语言核心知识点详解:const指针、野指针、assert断言与传值/传址

一、const 与指针:权限控制的核心逻辑 核心原则:const 靠近谁,就限制谁的修改权限,共三种核心场景,覆盖所有实用需求。 常量指针(const 修饰指向的内容)规则:指针 p 的指向可修改&…

2026/10/13 6:19:45 阅读更多 →

日新闻

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

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

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

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 阅读更多 →