agent-skills:智能体技能化封装与复用实践指南
1. 从“agent-skills”这个标题说起它到底在解决什么问题第一次看到“agent-skills”这个标题我的直觉是这大概率是一个围绕智能体能力封装、复用与编排的项目。事实也确实如此。过去一年里我接触过不少团队在做智能体相关的落地大家普遍卡在同一个地方——每个智能体都像一次性筷子用完就扔能力无法沉淀换个场景就得从头写提示词、重接工具、重调流程。agent-skills 想做的就是把这堆散落的能力变成可插拔、可组合、可版本管理的“技能包”。说白了它要解决的是智能体开发中的复用问题和边界问题。复用问题好理解就是别重复造轮子边界问题则更微妙——一个智能体到底该会什么、不该会什么能力边界怎么定义、怎么测试、怎么在运行时动态加载这些在传统软件开发里有成熟答案但在智能体语境下很多人还在用“一个大提示词包打天下”的蛮力做法。这个项目适合谁看三类人最值得花时间一是正在做智能体应用但被提示词膨胀折磨的开发者二是想把内部工具链封装成标准能力供多个智能体调用的平台工程师三是对智能体架构设计感兴趣、想了解“技能”这一抽象层怎么落地的人。哪怕你只是刚接触智能体理解这套思路也能帮你少走很多弯路。我下面会从设计思路、核心细节、实操过程、问题排查四个维度展开中间会穿插我实际踩过的坑和验证过的参数。文章偏长建议先收藏遇到具体问题时再回来翻对应章节。2. 整体设计与思路拆解为什么是“技能”而不是“工具”或“插件”2.1 技能、工具、插件三者的本质区别很多人第一次听到 agent-skills会下意识把它等同于“工具调用”或“插件系统”。我一开始也这么想直到自己动手封装了十几个技能之后才发现这三者在抽象层级上完全不同。工具是最底层的原子能力比如“发送HTTP请求”“读取文件”“执行SQL”。它不关心业务语义只关心输入输出。插件通常是对工具的打包带一点配置和生命周期管理但本质上还是“外部能力的接入点”。而技能不一样它更接近“一个完整的任务单元”——包含触发条件、执行逻辑、所需工具、失败处理、甚至输出格式约定。举个例子一个“查询天气”的工具可能只是调一个API返回JSON但一个“出行建议”技能会先判断用户是否提供了地点和时间再调用天气工具、交通工具最后按特定格式组织成自然语言建议。技能是有“意图”的工具没有。agent-skills 选择“技能”作为核心抽象我认为是经过深思熟虑的。因为智能体落地时最缺的不是底层工具而是把工具组合成可复用任务单元的能力。你不可能让每个智能体都从零开始编排工具调用那样成本太高、一致性太差。2.2 为什么不做成一个大而全的框架市面上有不少智能体框架试图包揽一切规划、记忆、工具、执行、反思全塞进去。agent-skills 反其道而行只聚焦“技能”这一层。这个取舍很关键。我试过用大框架做项目前期爽后期痛。痛在哪耦合太深。你想换个规划器发现技能定义和规划器绑死了你想单独测试某个技能发现必须把整个运行时跑起来。agent-skills 的轻量路线让技能定义和运行时解耦你可以用任何编排引擎来调度这些技能也可以用任何模型来驱动它们。这种设计还有一个好处渐进式采用。你不需要推翻现有系统只需要把重复的逻辑抽成技能逐步替换。我们团队就是这么干的先抽了三个高频技能跑通之后再慢慢扩展风险可控。2.3 技能的生命周期设计一个技能从定义到退役agent-skills 设计了完整的生命周期这点我觉得很实用。具体包括定义阶段声明技能名称、描述、输入输出模式、所需工具、依赖关系。注册阶段把技能注册到技能仓库支持版本管理。发现阶段智能体运行时根据任务需求动态发现可用技能。执行阶段按技能定义的流程执行处理中间状态和异常。评估阶段记录执行结果用于后续优化和淘汰。退役阶段标记废弃保留历史版本供回溯。这个生命周期看起来简单但实际落地时注册和发现是最容易出问题的环节。后面我会专门讲。2.4 与主流智能体架构的兼容性agent-skills 没有强制你用什么模型、什么编排方式。它更像一个“技能协议”你可以把它接到 ReAct 风格的智能体上也可以接到 Plan-and-Execute 架构上。我们内部同时跑了两套不同架构的智能体共用同一批技能定义切换成本几乎为零。这种兼容性带来的直接好处是技能资产不会因为架构升级而作废。今天你用 A 框架明天换 B 框架技能还是那些技能只需要改适配层。这对长期维护来说太重要了。3. 核心细节解析与实操要点技能定义到底怎么写3.1 技能描述文件的结构拆解agent-skills 的技能定义通常是一个结构化文件我用得最多的是 YAML 和 JSON 两种格式。下面是一个典型技能定义的骨架我把它拆开讲name: travel_advice version: 1.2.0 description: 根据用户提供的地点和时间结合天气和交通信息给出出行建议 inputs: - name: location type: string required: true description: 目的地城市或区域 - name: date type: string required: false default: today outputs: - name: advice type: string description: 自然语言出行建议 tools: - weather_query - traffic_query steps: - id: check_input action: validate - id: get_weather action: call_tool tool: weather_query - id: get_traffic action: call_tool tool: traffic_query - id: compose action: generate prompt: | 根据以下信息给出出行建议 天气{{get_weather.output}} 交通{{get_traffic.output}}这个结构里inputs 和 outputs 的 schema 定义是最容易被忽视但最重要的部分。我见过太多人随便写个type: string就完事结果运行时各种类型错误。建议至少把必填项、默认值、枚举范围写清楚。steps 的设计也有讲究。agent-skills 支持顺序、条件分支、循环三种基本控制流。顺序最简单条件分支用when字段循环用foreach。我建议初期只用顺序和简单条件循环逻辑尽量放在工具内部实现否则调试起来很痛苦。3.2 输入输出模式设计的三个原则设计技能输入输出时我总结了三条原则都是踩坑踩出来的原则一输入尽量扁平避免深层嵌套。嵌套结构在提示词渲染和参数校验时都容易出错。如果确实需要复杂输入拆成多个技能用编排层组合。原则二输出要有明确的类型约定。不要返回“一段文本”就完事尽量返回结构化数据让调用方可以程序化处理。如果必须返回自然语言也要约定格式模板。原则三默认值要谨慎设置。默认值能简化调用但也可能掩盖问题。我的做法是对业务无关的参数设默认值对业务关键参数强制必填。3.3 技能依赖与组合的注意事项技能可以依赖其他技能这是 agent-skills 比较强大的地方。但依赖关系一旦复杂就会出现循环依赖、版本冲突、执行顺序不确定等问题。我的经验是依赖层级不要超过三层。超过三层说明你的技能粒度太细了应该合并。另外依赖版本尽量用精确版本号不要用范围版本否则不同智能体加载到的技能版本可能不一致导致行为差异。还有一个坑技能组合时的上下文传递。agent-skills 默认会把上游技能的输出注入下游技能的输入但字段名冲突时容易覆盖。建议在定义时给输出字段加前缀比如weather_result、traffic_result避免歧义。3.4 技能注册与发现的实现细节技能注册通常有两种方式静态注册和动态发现。静态注册就是在启动时加载所有技能定义简单可靠适合技能数量少的场景。动态发现则是运行时从技能仓库拉取适合技能多、更新频繁的场景。我们内部用的是混合模式核心技能静态注册保证启动即可用扩展技能动态发现按需加载。动态发现时缓存策略很关键。我试过每次请求都去拉技能列表延迟高得离谱。后来改成定时刷新加本地缓存性能立刻上来了。发现机制还有一个细节技能匹配的优先级。当多个技能都能处理同一任务时怎么选agent-skills 支持按名称精确匹配、按标签模糊匹配、按描述语义匹配三种模式。我建议默认用精确匹配模糊匹配作为兜底语义匹配慎用因为不确定性太高。4. 实操过程与核心环节实现从零搭一个技能化智能体4.1 环境准备与依赖安装假设你要从零开始搭一个基于 agent-skills 的智能体第一步是环境准备。我以 Python 生态为例因为大部分智能体项目都用 Python。python -m venv venv source venv/bin/activate pip install agent-skills-core agent-skills-runtime如果你用的是其他语言agent-skills 也有对应的 SDK但成熟度参差不齐。我建议初期用 Python 快速验证稳定后再考虑迁移。安装完成后先跑一个最小示例确认环境没问题from agent_skills import SkillRegistry, SkillExecutor registry SkillRegistry() registry.load_from_directory(./skills) executor SkillExecutor(registry) result executor.run(hello_skill, {name: world}) print(result)这个示例里hello_skill是你自己定义的一个最简单技能只做一件事返回一句问候。别小看这个步骤它能帮你快速验证注册、发现、执行整条链路是否通畅。4.2 定义第一个可用技能我建议第一个技能选“文本摘要”因为它足够简单又能体现技能的核心价值。定义如下name: text_summary version: 1.0.0 description: 对输入文本进行摘要输出不超过指定字数的摘要 inputs: - name: text type: string required: true - name: max_length type: integer required: false default: 200 outputs: - name: summary type: string steps: - id: validate action: validate rules: - text.length 0 - max_length between 50 and 1000 - id: summarize action: generate prompt: | 请对以下文本进行摘要摘要长度不超过 {{max_length}} 字 {{text}}这个技能定义里validate步骤做了输入校验generate步骤调用模型生成摘要。注意max_length的校验规则我设了 50 到 1000 的范围防止用户传极端值导致模型输出异常。定义好之后注册并测试registry.register_from_file(./skills/text_summary.yaml) result executor.run(text_summary, { text: 这里是一段很长的文本..., max_length: 150 }) print(result[summary])实测下来这个技能在大多数模型上都能稳定工作。如果摘要质量不稳定可以在 prompt 里加 few-shot 示例或者调整 temperature 参数。4.3 技能编排把多个技能串起来单个技能跑通后下一步是编排。agent-skills 支持在技能定义里直接调用其他技能也支持在运行时动态编排。我推荐后者因为更灵活。下面是一个编排示例先摘要再翻译最后格式化输出。from agent_skills import SkillOrchestrator orchestrator SkillOrchestrator(registry) result orchestrator.run_pipeline([ {skill: text_summary, inputs: {text: {{input.text}}}}, {skill: translate, inputs: {text: {{text_summary.summary}}, target: en}}, {skill: format_output, inputs: {content: {{translate.result}}}} ], input_data{text: 原始文本...})这个 pipeline 里{{text_summary.summary}}这种引用语法是关键它把上游技能的输出注入下游技能的输入。注意字段名要和技能定义里的 outputs 名称一致否则会取不到值。编排时还有一个重要参数失败策略。默认是遇到错误就中断但你可以配置成“跳过失败步骤继续执行”或“重试指定次数”。我建议对非关键步骤用跳过策略对关键步骤用重试策略。4.4 参数计算与选择过程技能执行时很多参数需要根据实际情况计算。我举两个例子。例子一超时时间设置。一个技能如果调用外部 API超时时间设多少我的经验公式是超时 平均响应时间 × 3 缓冲时间。比如天气 API 平均响应 500ms缓冲 1s超时设 2.5s 比较合理。设太短容易误判失败设太长会拖慢整体流程。例子二重试次数。重试次数不是越多越好。对于幂等操作可以重试 2-3 次对于非幂等操作重试要非常谨慎。我一般用指数退避策略第一次等 1s第二次等 2s第三次等 4s最多三次。这些参数在 agent-skills 里都可以配置建议根据实际压测结果调整不要拍脑袋。4.5 实操现场记录一次完整的技能化改造我们团队之前有一个“客服问答”智能体所有逻辑写在一个巨大的提示词里维护起来极其痛苦。后来用 agent-skills 做了改造过程如下第一步梳理现有逻辑识别出可复用的任务单元。我们找到了五个意图识别、知识检索、答案生成、敏感词过滤、格式美化。第二步把每个任务单元定义成技能。意图识别技能负责分类用户问题知识检索技能负责从知识库拉取相关内容答案生成技能负责组织语言敏感词过滤技能负责合规检查格式美化技能负责输出排版。第三步用编排层把五个技能串起来。意图识别决定后续走哪条分支知识检索和答案生成是核心链路敏感词过滤和格式美化是后置处理。第四步压测和调优。改造后平均响应时间从 3.2s 降到 1.8s因为技能可以并行执行的部分并行化了。维护成本也大幅下降改一个技能不影响其他技能。这个改造过程中最大的收获是技能粒度要适中。太细编排复杂太粗复用性差。我们的经验是一个技能对应一个“可独立测试的任务单元”这样粒度刚好。5. 常见问题与排查技巧实录那些文档里不会写的坑5.1 技能加载失败的五种常见原因技能加载失败是最常见的问题我整理了五种原因和对应的排查方法问题现象可能原因排查方法启动时报文件找不到路径配置错误检查技能目录的绝对路径和相对路径技能注册成功但执行报未找到名称大小写不一致统一用下划线命名避免驼峰版本冲突导致加载失败依赖版本范围过宽锁定精确版本号技能定义解析报错YAML 缩进或特殊字符问题用在线 YAML 校验工具检查动态发现拉不到技能缓存未刷新或网络问题手动触发刷新检查日志提示技能名称建议只用小写字母和下划线避免数字开头这样能规避大部分命名相关问题。5.2 执行超时与死循环的排查思路执行超时通常有两个原因外部依赖慢或者技能内部逻辑有死循环。排查时先看日志确认卡在哪一步。如果是外部依赖慢加超时和重试如果是死循环检查循环条件和退出机制。我遇到过一次死循环原因是技能 A 调用技能 B技能 B 又调用技能 A形成了循环依赖。agent-skills 默认不检测循环依赖需要自己加校验。后来我在注册阶段加了一个依赖图检查发现环就报错问题就解决了。5.3 输出格式不稳定的处理技巧模型生成的输出格式不稳定是智能体落地的老大难问题。我的处理技巧有三条第一在技能定义里加输出 schema 校验。如果输出不符合 schema自动触发重试或降级。第二用 few-shot 示例约束格式。在 prompt 里给两三个正确示例比单纯描述格式有效得多。第三后置格式化技能兜底。即使模型输出有偏差也能通过格式化技能修正。这三条组合使用输出稳定性可以从 70% 提升到 95% 以上。5.4 技能版本升级的兼容性处理技能升级时最怕的是调用方不兼容。我的做法是新版本必须向后兼容不兼容的改动走大版本号。比如 1.x.x 到 2.0.0 表示有破坏性变更调用方需要显式升级。另外技能仓库要保留历史版本方便回滚。我们内部规定至少保留最近五个版本。回滚时只需要改版本号不需要改代码。5.5 独家避坑技巧汇总最后分享几个我踩坑后总结的技巧技能描述要写清楚“不做什么”而不仅仅是“做什么”。这能帮助智能体更准确地选择技能。给每个技能加一个最小测试用例注册时自动跑一遍确保技能可用。技能执行日志要记录输入输出摘要但注意脱敏不要记录敏感信息。定期清理废弃技能否则技能仓库会越来越臃肿发现效率下降。技能命名用“动词_名词”格式比如query_weather、generate_summary比单纯名词更清晰。这些技巧看起来琐碎但实际用起来能省很多时间。尤其是第一条和第二条我强烈建议从第一个技能开始就执行。6. 技能化改造的收益与边界我实际用下来的体会技能化改造不是银弹它有明确的适用边界。我实际用下来收益最大的场景是多个智能体共享同一批能力或者同一智能体需要频繁调整能力组合。这两种场景下技能化的复用价值能充分体现。但如果你的项目只有一个智能体能力也很固定那技能化带来的抽象成本可能大于收益。我见过有团队为了技能化而技能化把简单逻辑拆得七零八落反而增加了维护负担。另外技能化对团队的工程能力有一定要求。你需要有人懂 schema 设计、懂版本管理、懂依赖治理。如果团队里全是算法背景、没有工程背景初期会比较吃力。我个人在实际操作中的体会是先从两三个高频技能开始跑通闭环再逐步扩展。不要一上来就设计大而全的技能体系那样大概率会过度设计。技能体系是长出来的不是设计出来的。每次遇到重复逻辑就抽一个技能每次技能不够用就补一个。这样长出来的体系才是最贴合实际需求的。最后再分享一个小技巧技能定义文件建议用 Git 管理每次变更都走 PR 流程。这样技能的历史变更可追溯出问题也容易定位。我们团队就是这么做的效果很好。

相关新闻

AMD定制APU掌机可玩PS5游戏:技术可行性与体验预期深度解析

AMD定制APU掌机可玩PS5游戏:技术可行性与体验预期深度解析

1. 掌机市场的变局与这次爆料的真实分量掌机这个品类在过去几年经历了一轮明显的复兴。从PC掌机的崛起到各家用机厂商对便携形态的重新审视,玩家对"随时随地玩3A"的需求从来没有像现在这么强烈过。而这次关于某款定制掌机的爆料之所以能引起这么大的讨论&…

2026/10/14 10:46:54 阅读更多 →
JavaScript构造函数与类语法对比解析

JavaScript构造函数与类语法对比解析

1. 构造函数与类的本质差异 在JavaScript的发展历程中,ES5的构造函数和ES6的类代表了两种不同的面向对象编程范式。虽然它们最终都能创建对象实例,但底层机制和语法特性存在显著区别。 构造函数本质上就是个普通函数,通过new操作符调用时会创…

2026/10/14 10:46:54 阅读更多 →
Python GIL移除实战:多线程性能优化与迁移指南

Python GIL移除实战:多线程性能优化与迁移指南

1. 项目背景与核心挑战 Python的全局解释器锁(GIL)一直是制约其多线程性能的瓶颈。随着Python 3.12版本正式宣布了移除GIL的提案(PEP 703),这个存在了近30年的技术限制终于迎来了变革。这个手册正是针对这一重大技术变…

2026/10/14 10:46:54 阅读更多 →

最新新闻

基于PSO算法的双微网优化调度MATLAB实现

基于PSO算法的双微网优化调度MATLAB实现

1. 多微网优化调度模型概述 微电网作为分布式能源系统的重要实现形式,其优化调度一直是能源领域的研究热点。当多个微电网通过联络线相互连接时,就形成了多微网系统(Multi-Microgrid System)。这种架构能够实现能源的互补共享&…

2026/10/14 11:36:46 阅读更多 →
Python循环结构详解:从基础到高级优化技巧

Python循环结构详解:从基础到高级优化技巧

1. 循环结构基础概念 循环是编程中最基础也最强大的控制结构之一。简单来说,循环就是让计算机重复执行某段代码,直到满足特定条件为止。想象你在教一个小朋友数数,从1数到100,你不会说"说1,说2,说3...…

2026/10/14 11:36:46 阅读更多 →
Grok Bot从0到1实战:环境搭建、群组接入与任务调试全指南

Grok Bot从0到1实战:环境搭建、群组接入与任务调试全指南

1. 从零理解 Grok Bot:它到底能帮你干什么很多人第一次听到 Grok Bot 这个词,脑子里冒出来的第一个问题就是:它跟普通的聊天机器人有什么区别?我直接说结论——Grok Bot 的核心价值不在于“聊天”,而在于“干活”。它是…

2026/10/14 11:36:46 阅读更多 →
KITTI Raw Data转TUM格式:位姿基准、坐标变换与SLAM评估避坑指南

KITTI Raw Data转TUM格式:位姿基准、坐标变换与SLAM评估避坑指南

简介:面向运行VINS-Fusion等SLAM算法时进行精度比对的开发者,这份资源集中整理了KITTI raw data中00-10序列的groundtruth位姿与时间戳,并给出了可直接使用的TUM格式位姿轨迹。包内还包含各序列对应的轨迹图、数据集sequence说明以及一个转换…

2026/10/14 11:36:46 阅读更多 →
Grok Bot 保姆教程:从环境搭建到拉群协作的完整指南

Grok Bot 保姆教程:从环境搭建到拉群协作的完整指南

1. 从零理解 Grok Bot:它到底能帮你干什么 很多人第一次听到 Grok Bot 这个词,脑子里冒出来的第一个问题就是:这玩意儿跟普通的聊天机器人有什么区别?我直接开个网页对话不就行了吗,为什么还要专门去"装"一个…

2026/10/14 11:36:46 阅读更多 →
Grok Bot 从零搭建实战:群聊自动回复与知识库接入指南

Grok Bot 从零搭建实战:群聊自动回复与知识库接入指南

1. 从零上手 Grok Bot:先搞清楚它到底能干什么很多人第一次听到 Grok Bot 这个词,脑子里浮现的可能是那种满屏代码、需要自己搭服务器、配环境变量的硬核玩意儿。其实不是。Grok Bot 本质上是一个可以接入群聊、自动响应消息、执行特定任务的机器人。你可…

2026/10/14 11:35:45 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/14 7:53:34 阅读更多 →