统一多模型API网关litellm实战:从配置到生产部署
这段时间我一直在做一个内部的多模型调度平台见得最多的一个词就是 litellm。它不是一个具体的大模型也不是某个框架的插件而是一个把各种模型 API 统一成一套格式的网关层工具。说白了你只需要学会接一个服务剩下的几十个模型都由它帮你转成标准格式。这个工具很适合正在做 AI 应用、又不想被某一家模型 SDK 绑死的开发者也很适合团队里要统一管理模型密钥、统计成本的负责人。哪怕你只是个刚接触 LLM 开发的新手把它当成一个“API 转发服务”来理解也完全够用。这套东西我用了一段时间从单机调试到生产环境部署都踩过不少坑也实打实验证过它的稳定性。这篇文章不打算贴一大堆官方文档而是把我实际配置、运行、排查的过程拆开来讲包括为什么这么设计、哪些参数必须调、哪些功能看着有用但实际容易翻车。你要是正准备引入 litellm或者已经在用但被配置和路由搞到头大这篇文章应该能省你不少时间。1. 为什么需要 litellm多模型时代的基础设施需求1.1 被不同模型 API 格式支配的痛苦先聊一个很实际的问题如果你手头同时接了 GPT 系列、Claude 系列、Gemini 系列再加上国产的 DeepSeek、文心、通义、豆包的一两个模型你的代码会变成什么样我最早做多模型接入时给每个厂商写了一个封装类。每个类的请求参数不一样鉴权方式不一样返回结构不一样工具调用的字段也不一样。今天模型 A 的 SDK 升级了明天模型 B 的接口加了新参数后天你自己代码里要加流式输出每个封装类都要跟着改一遍。到后来改一个公共字段能改出十几个文件测试跑半天。最崩溃的是不同模型对 system prompt 的优先级处理不一致同一个指令在这家有效、在那家无效排查起来完全靠试。这种情况持续了大概两个月我就意识到必须把“模型接入”这件事从业务代码里剥离出去。我需要一个统一的入口不管底层是哪个模型业务代码只关心一套 API 格式。这也是 litellm 最核心的价值。1.2 统一网关做的事从“改代码”到“改配置”litellm 做的事情可以类比成电源转换头。你去国外出差不会因为插座形状不一样就重新装修酒店你会带一个转换头。litellm 就是 AI 领域的转换头上游接各家模型的原生 API下游统一暴露成 OpenAI 风格的接口。你的业务代码只要适配这一种风格后续想换模型、加模型全部在网关配置里改一行业务代码都不用动。它的第二个价值是集中管理。密钥统一放在网关侧业务侧拿到的都是网关下发的独立 key可以随时吊销、限流、统计用量。第三个价值是策略化路由同一个请求可以配置主模型、备用模型、负载均衡策略、超时重试机制这些原本要写在业务代码里的逻辑全部下沉到网关层。我自己后来的经验是凡是准备长期做 AI 应用的团队不管现在接了几家模型都值得在最前面放一个 litellm 这样的网关。它前期多花半天配置后期能省下一整个“模型兼容性维护”的岗位。2. 快速上手把 litellm 跑起来2.1 安装与基础配置文件litellm 的安装很简单pip 一行命令pip install litellm[proxy]这里我建议直接装带 proxy 的版本因为单独装纯 SDK 版还得自己写服务封装没必要。装完之后你会有两个核心东西一个是litellm命令行工具用来启动代理服务一个是 Python 模块可以在代码里直接调用。我们这里主要用代理服务模式。接着创建一个config.yaml这是整个网关的核心配置。我第一次写的时候以为越复杂越好结果发现最小可用配置其实只有几行model_list: - model_name: gpt-3.5-turbo litellm_params: model: gpt-3.5-turbo api_key: os.environ/OPENAI_API_KEY - model_name: claude-3-haiku litellm_params: model: claude-3-haiku api_key: os.environ/ANTHROPIC_API_KEY注意几个容易踩的坑model_name是你在网关里对外暴露的名字客户端请求时填这个名字。它不必和上游真实模型名一样你可以把 gpt-3.5-turbo 改成你喜欢的别名。litellm_params.model是真正传给上游服务的模型标识必须和厂商模型名完全一致。api_key不要直接写在 yaml 里用os.environ/变量名的方式引用环境变量否则配置文件一泄露所有厂商密钥全暴露。这背后的逻辑其实很清晰model_name是网关的“门牌号”litellm_params.model是“真实房间号”两者解耦之后你随时可以把门牌号指向另一个房间客户端无感知。2.2 发出第一个请求配置写好后启动服务litellm --config config.yaml --port 4000看到类似 “Uvicorn running on http://0.0.0.0:4000” 的日志就说明起来了。然后你可以用 curl 验证curl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-your-master-key \ -d {model:gpt-3.5-turbo,messages:[{role:user,content:你好请做个自我介绍}]}正常情况下你会拿到一个 OpenAI 风格的 JSON 返回里面的model字段可能显示的是gpt-3.5-turbo。如果你请求claude-3-haiku返回格式也是一模一样的。如果你业务代码已经用了 OpenAI 的 Python SDK那就更简单了只需要改两个地方from openai import OpenAI client OpenAI( base_urlhttp://localhost:4000/v1, api_keysk-your-master-key ) resp client.chat.completions.create( modelgpt-3.5-turbo, messages[{role: user, content: 你好}] ) print(resp.choices[0].message.content)这就完了。之前我为各家 SDK 写的兼容层全部可以删掉以后所有模型调用统一走这一套。2.3 最少必要配置背后的设计逻辑为什么 litellm 要用一个 yaml 文件集中管理而不是像很多工具那样提供一大堆编程接口我理解它的设计哲学是模型接入本质上是一个运维配置问题而不是业务代码问题。你换模型、加模型、改密钥这些都不应该触发代码发布流程。用配置文件管理意味着运维同事也能参与维护改完重启或热加载即可。另外你可能注意到litellm 对外暴露的接口完全对齐 OpenAI 格式这不是因为它“抄袭”而是因为 OpenAI 格式已经事实上成了 LLM API 的通用语言。几乎所有模型厂商都提供了 OpenAI 兼容接口或者有转换中间层。litellm 选择把自己的输出统一成这个格式等于借力了整个生态——LangChain、各类框架、各种开源工具都能直接对接不需要额外适配。3. 核心功能深挖路由、密钥与成本3.1 模型路由与回退策略litellm 能火起来靠的不只是格式统一还有路由能力。生产环境里最怕的一件事是上游模型突然抖动或者限流而你的业务是强依赖它的。如果没有网关层你就只能眼睁睁看着线上报错临时改代码切备用模型等发布完高峰已经过了。在 litellm 里这种逻辑只需要在config.yaml里声明。比如我想实现主调用 GPT 系列某模型如果它报错或者超时自动切换到 DeepSeek 的模型model_list: - model_name: gpt-4o-mini litellm_params: model: gpt-4o-mini api_key: os.environ/OPENAI_API_KEY - model_name: deepseek-chat litellm_params: model: deepseek-chat api_key: os.environ/DEEPSEEK_API_KEY router_settings: fallbacks: [ {gpt-4o-mini: [deepseek-chat]} ]这里我把主模型命名为gpt-4o-mini备用模型命名为deepseek-chat。实际请求时litellm 会先尝试主模型如果出现连接错误、限流、超时等情况就自动把请求转发给备用模型。客户端拿到的还是一样的 OpenAI 风格结果只是模型变成了备用的。我实测过这种 fallback 的效果模拟把上游密钥改成错误的网关层会在几十毫秒内感知并切换到备用模型业务侧完全无感。这种能力在生产环境的价值怎么强调都不过分。3.2 密钥管理与多租户隔离很多团队接 litellm 之前都是直接把厂商密钥写在前端或客户端里这其实非常危险。密钥一旦泄露别人可以拿你的额度疯狂调用账单分分钟爆掉。litellm 提供虚拟密钥机制可以很好地解决这个问题。启动服务时要设置一个master_key这个 key 是管理员权限用来调管理接口和创建其他 key。你可以给每个业务线、每个客户、甚至每个功能模块单独生成一个虚拟 keycurl -X POST http://localhost:4000/key/generate \ -H Authorization: Bearer sk-master-key \ -H Content-Type: application/json \ -d { models: [gpt-4o-mini], max_budget: 10, budget_duration: 1d }返回结果里会包含一个新的sk-开头的 key这个 key 只能调用指定的模型并且有每天 10 美元的预算上限超过就自动拒绝。这些虚拟 key 都有一个唯一标识你可以随时查询它的用量、手动吊销、修改模型权限。听起来是不是很像云平台的 API key 管理对litellm 做的是就是这一层只不过它管的是模型网关。这个功能对 To B 场景尤其重要。假设你做了一个 SaaS 应用有几十个企业客户你不可能为每个客户单独去注册一家模型厂商的账号更不可能把自己的主密钥发给客户。正确做法是全公司共用一个上游账号通过 litellm 给每个客户下发独立的虚拟 key各自限额、各自统计、各自审计。真出问题吊销一把钥匙即可不影响其他客户。3.3 成本追踪与用量统计多模型接入之后你很快会遇到一个头疼的问题钱花哪儿了以前每家模型一个账单出自不同平台、不同币种对账能对到怀疑人生。litellm 会把每一次请求的 token 数、模型、用户、key 都记录下来并提供查询接口和界面。主要看两个东西/spend/logs接口按时间、key、模型查询调用日志和费用。Prometheus 指标litellm 内置了/metrics端点可以接入监控系统看请求量、延迟、错误率、tokens 消耗趋势。我自己习惯每天看一眼按模型维度的费用排行。这一步很有用有时候你以为某个模型很便宜结果调用量一大费用远超预期有时候一个新的模型性能差不多价格只有原来的一半这时候直接在配置里加一个路由规则把流量切过去成本立刻降下来。4. 生产环境的关键设置从“能用”到“扛得住”4.1 超时、重试与并发控制本地调试时litellm 默认配置已经够用。但一旦上生产上游模型的抖动、慢响应、限流都是家常便饭你需要显式地配置超时和重试策略。我推荐的router_settings配置router_settings: timeout: 30 retry_policy: Timeout: 2 RateLimitError: 3 max_retries: 3 allowed_fails: 2 cooldown_time: 30逐个解释一下timeout单个请求等待上游响应的最大秒数。模型推理通常很慢30 秒是个比较合理的值太长会拖垮你的服务太短大模型容易超时。retry_policy.Timeout超时后的重试次数。注意重试不是无脑越多越好因为重试请求同样消耗上游配额而且如果你的业务对实时性要求高重试 2 次就够表心意了。retry_policy.RateLimitError遇到上游限流HTTP 429时重试 3 次。限流通常是瞬时峰值造成的隔几秒再试成功率很高。allowed_fails和cooldown_time当某个上游实例连续失败达到一定次数后litellm 会把它拉入冷却状态暂停流量一段时间避免继续往已经挂掉的服务上打请求。这些参数看着不起眼但生产环境稳定性全靠它们托底。4.2 缓存策略降本增效的关键LLM 调用贵这是绕不开的痛点。如果一个 prompt 在短时间内被重复请求每次都去上游算一遍既浪费钱又增加延迟。litellm 内置了缓存机制支持精确缓存和语义缓存。精确缓存的配置很简单在litellm_settings里加上litellm_settings: cache: true cache_params: type: redis host: localhost port: 6379开启后完全相同的请求会在缓存有效期默认 24 小时内直接命中缓存返回不再请求上游。这个功能对 FAQ 机器人、文档问答这类场景效果显著——用户翻来覆去问的就那几个问题命中率轻松超过 50%。语义缓存的差别是它会对用户的文本做 embedding然后算相似度意思相近的提问也能命中同一个结果。这配置更复杂而且有误判风险比如两个相似但意图不同的问题可能被当成同一个返回所以我的建议是先开精确缓存命中率不够再考虑语义缓存。实际使用后你会发现缓存带来的不只是省钱还有响应速度的质变。原本要等 3 秒的请求命中缓存后 100 毫秒内返回用户体验完全两个档次。4.3 部署形态网关该放在哪里litellm 是一个 Python 服务部署形态很灵活。开发环境直接跑在本机就行生产环境我建议用容器化部署挂到 Kubernetes 或者直接用 Docker Compose 跑。关键配置项有这么几个日志持久化默认日志打到标准输出容器一重启就丢了。建议配置日志文件挂载到持久卷方便追查历史问题。环境变量注入所有密钥用环境变量注入不要写死在镜像或 yaml 里。健康检查litellm 暴露了/health/liveliness和/health/readiness端点容器编排时可以配置探针。网关部署的位置要尽量靠近你的业务服务别跨个大洲去调远端网关。因为 litellm 本身是一个代理每多一层网络跳转就多一份延迟把它跟业务部署在同一个内网延迟几乎可以忽略。5. 常见问题与排查技巧实录5.1 上游限流与配额报错这是我遇到最多的一类问题。现象是请求偶尔成功偶尔返回 429 或者上游的错误信息提示 rate limit表现为线上接口成功率不稳定。排查思路先看 litellm 日志确认 429 来自哪个上游模型。有时候不是整个厂商限流而是某个模型本身并发额度低。看自己有没有设置num_retries和重试策略。如果没配429 直接透传给客户端业务表现就是偶发失败。如果上游确实频繁限流最有效的解法不是调大重试次数而是配置多模型 fallback。让主模型限流时自动切到备用模型这样用户无感成功率直接拉满。5.2 响应格式不一致不同模型返回的格式细节差异很大尤其是工具调用function calling和流式输出。litellm 虽然统一了外层格式但某些字段语义还是会有差异。常见情况GPT 系列的工具调用参数是 JSON 字符串Claude 系列某些版本的工具调用结构不同。litellm 在大多数情况下能正确转换但遇到模型特定扩展字段时偶尔会丢失信息。我的排错方法是先用网关的日志接口查看原始上游响应再用网关返回的结果对比逐字段检查。如果确实有字段差异最简单的做法不是改网关代码而是尽量避免直接依赖模型特定的返回字段统一在业务层做解析。5.3 配置加载与热更新问题我最初以为改完config.yaml重启服务就完事了后来发现生产环境重启代价很高。litellm 支持部分配置的热更新可以通过管理接口动态新增 key、修改预算但model_list的变更通常还是需要重启。这里分享一个降低痛点的做法不要把配置写死成一个文件而是分环境管理。开发环境用最小配置生产环境用完整配置通过环境变量切换。再配合 CI/CD 流程在集群里做滚动重启把影响降到最低。6. 实测心得与扩展脑洞6.1 我踩过的坑用了一个多月我遇到过几个比较隐蔽的问题这里列一下供参考。虚拟 key 和上游 key 的鉴权关系容易搞混。虚拟 key 是 litellm 自己管理的它只负责决定“你能不能用网关”而真正调用上游的是配置里的厂商 key。也就是说即使虚拟 key 有效如果上游 key 过期或余额不足请求照样失败。排查时别只盯着虚拟 key上游 key 的状态也要一起看。缓存误判的问题。开启语义缓存后我发现有一个问“如何申请退款”的请求命中了“如何申请发票”的缓存结果用户直接看懵了。后来我把语义缓存关掉只保留精确缓存虽然命中率降了一点但正确性优先。如果确实要用语义缓存建议只在 FAQ 这类高风险敏感度低的场景开启。日志量过大的问题。litellm 默认记录每次请求的完整输入输出在流量大的时候会产生海量日志存储成本肉眼可见地涨。后来我调低了日志级别只记录错误日志和关键指标完整内容按需抽样记录。6.2 这个工具后续还能怎么玩litellm 的能力不止上面这些。我还试过把它和本地部署的开源模型接在一起作为云端模型不可用时的最后兜底。也试过用它的管理接口配合内部的审批流让前端动态申请和释放模型权限。这其实就是把模型资源当成云资源来管理思路打开之后能玩出很多花样。根据我个人的经验如果你所在团队的业务和模型深度绑定litellm 这种网关层工具越早引入越好。与其天天切到不同平台去配模型、统计账单、处理限流不如把这些问题全部收敛到一个入口解决。架构上简化的不只是代码更是团队协作方式和排障路径。最后再分享一个小技巧litellm 提供了和 LangChain 的兼容接口意味着你原来用 LangChain 写的应用只需要把 base_url 改成本地网关地址其他代码基本不用动。你要是已经在用 LangChain 做开发这个接入成本几乎为零值得马上试一试。

相关新闻

高中化学实验题满分攻略:从操作原理到误差分析的系统梳理

高中化学实验题满分攻略:从操作原理到误差分析的系统梳理

1. 为什么高中化学实验题总是“看着全会、做题全废”先抛个问题:你有没有过这种经历——课本上的实验都读了一遍,氯气的实验室制法、氨气的喷泉实验、酯化反应的装置图,看着都觉得挺简单,可一到考试,装置图给你一个洗气…

2026/10/13 13:58:46 阅读更多 →
AI写代码的质量保卫战:规范、评审与风险测试三重防线

AI写代码的质量保卫战:规范、评审与风险测试三重防线

1. 这不是又一个“AI写代码”的热闹话题,而是工程团队正在真实发生的质量保卫战最近在几个技术社区和内部分享会上,我反复听到同一个问题:“我们上了Copilot、接入了CodeWhisperer、也试了各种本地大模型,但代码质量没变好&#x…

2026/10/13 13:58:46 阅读更多 →
PyCharm安装配置避坑指南:跨平台解释器绑定与IDE工程化预检

PyCharm安装配置避坑指南:跨平台解释器绑定与IDE工程化预检

简介:本资源是一份面向Python初学者与转行开发者的PyCharm零基础安装与入门配置指南,聚焦解决“不会装、不敢用、配不熟”三大实操痛点。PDF文档结构清晰,完整覆盖Windows、macOS、Linux三大主流系统下的下载选择、分步安装、首次配置&#x…

2026/10/13 13:58:46 阅读更多 →

最新新闻

CFSFDP参考代码实战:密度峰值聚类原理、决策图与调参指南

CFSFDP参考代码实战:密度峰值聚类原理、决策图与调参指南

简介:资源内含CFSFDP算法的Python参考代码,面向数据挖掘与聚类分析方向的学习者与研究人员,适用于包含离散、连续及模糊属性的复杂数据集,主要解决模糊数据分区前的特征选择与降维问题。压缩包共7个文件,约12KB&#x…

2026/10/13 15:27:06 阅读更多 →
【血糖】患者血糖数据、PID反馈控制和食物的切换,模拟混合人工胰腺Matlab实现

【血糖】患者血糖数据、PID反馈控制和食物的切换,模拟混合人工胰腺Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长数学建模、模型改进、算法创新、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研,博学之、审问之…

2026/10/13 15:27:06 阅读更多 →
ROSTCM6中文分词与词频统计实操:从编码清洗到内容分析

ROSTCM6中文分词与词频统计实操:从编码清洗到内容分析

简介:这是由武汉大学沈阳教授研发的免费社会计算平台ROSTCM6,主要面向人文社科领域的师生与研究者,解决文本内容分析与量化研究中的分词、词频统计、情感挖掘等需求。工具覆盖微博分析、聊天分析、全网分析、网站分析、浏览分析、流量分析、聚…

2026/10/13 15:27:06 阅读更多 →
两级式单相光伏并网Simulink仿真:从Boost MPPT到SPWM逆变全解析

两级式单相光伏并网Simulink仿真:从Boost MPPT到SPWM逆变全解析

光伏并网仿真这条路,很多做电力电子的人都是从两级式拓扑起步的。MATLAB 2021a版本下搭建两级式单相光伏并网仿真模型,前级用DC-DC变换完成升压与最大功率点跟踪,后级用桥式逆变器实现直流到交流的转换和并网电流控制,这套架构不论…

2026/10/13 15:27:06 阅读更多 →
SQL Server人事管理系统课程设计:表结构、存储过程与事务实践

SQL Server人事管理系统课程设计:表结构、存储过程与事务实践

简介:面向高校数据库课程设计场景的SQL Server人事管理系统完整项目,适合需要掌握数据库建表、数据关系设计与Java GUI联调的在校学生,可直接作为课设参考模板或二次开发底座。系统核心围绕员工、部门、职位等数据表展开,涵盖查询…

2026/10/13 15:27:06 阅读更多 →
TokenTracker:轻量嵌入式LLM Token用量治理工具

TokenTracker:轻量嵌入式LLM Token用量治理工具

1. 这不是又一个“统计面板”,而是一套嵌入式 token 使用量治理闭环你有没有遇到过这样的场景:团队里三个项目共用一套大模型 API 接口,但没人知道谁在调用、调了多少、哪次请求耗 token 最狠?某天账单突然翻倍,排查时…

2026/10/13 15:26:05 阅读更多 →

日新闻

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

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

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

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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →