cuda2ascend
【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills
社区版直调算子开发工作流。用户描述算子需求,Agent 团队按统一流程从需求分析走到代码上库,全程可追溯、可恢复、可定制。
借鉴了面向对象的设计思想,本仓内维护一套通用工作流基类,各生态算子仓作为子类,可以拉取使用本工作流,覆写与自身耦合的领域知识,按照仓内开发流程定制本工作流,达到一套核心流程服务所有算子仓,消除重复建设的目的。
设计思想
借鉴面向对象思想重构直调算子工作流:CANNBot 仓维护一套通用工作流作为基类,各算子仓的工作流作为子类,继承基类编排流程,仅覆写与自身耦合的领域知识和验收实现。
- 封装:对算子仓隐藏编排的复杂实现,工作流将编排逻辑封装为知识接口。算子仓只关心"我提供什么知识",不关心"工作流怎么用"。
- 继承:CANNBot 提供基类,算子仓继承基类,只覆写自己需要的部分。
- 多态:工作流核心始终通过逻辑名引用可覆写 Skill(领域知识、验收标准),实际实现在 init 时由 symlink 绑定确定。
知识分层
知识分布按抽象层级从高到低分层,越靠上越通用稳定、越靠下越具体易变:
| 层级 | 承载形式 | 职责 | 可否被子仓覆写 |
|---|---|---|---|
| 主 Agent | 根目录 AGENTS.md | PM Agent 的全局知识,规范行为边界 | final |
| 工作流 | ops-direct-invoke-workflowskill | 编排流程的组织与调度 | final |
| 子 Agent | agents/*.md | 调度执行的最小单位,规范每一个子步骤的行为 | final |
| Skill | skills/repo-*/、skills/workflow-*/ | 仓库领域知识、工作流定义(模板/验收标准) | virtual |
| 仓内文档 | 仓库 doc 目录 | 面向开发者的参考资料 | 仓库自有 |
其中 Agent 与 Skill 相邻两层职责最易混淆,判定原则:会变、需被子仓 override 的领域知识归 Skill;跨仓通用、用于定义角色身份与行为边界的内容归 Agent。
参与角色
| 角色 | 类型 | 职责 |
|---|---|---|
| 用户 | 验收/决策 | 需求提出、各确认点审批 |
| PM(主 Agent) | 调度 | 用户交互、流程编排、问题裁定;只调度不执行 |
| architect | 执行 | Spec 形式化、开发方案与测试方案设计 |
| developer / -code / -test / -doc | 执行 | 代码、测试、文档开发与修复 |
| QA | 验收 | 各 CP 点验收,加载对应workflow-cp*Skill 完成判定,产出验收报告与用户确认问卷 |
开发流程概览
完整流程从需求分析到上库分 8 个阶段,方案线与测试线在设计/开发阶段并行,CP3/CP4/CP5 构成验收状态机:
| 编号 | 流程 | 角色 | 输入 | 输出 | 说明 | 备注 |
|---|---|---|---|---|---|---|
| 阶段0:开发准备 | ||||||
| 0 | 开发准备 | developer | - | 环境信息文档 | 检查 NPU 设备、CANN 环境、编译环境,写入.cannbot | 交付件可复用,支持独立触发 |
| ⛔ CP0 | 环境确认 | QA | 环境信息文档 | 用户问卷 json | QA 加载workflow-cp0生成环境确认问卷,PM 发送给用户 | 固定用户确认;失败由用户决定修复或停止 |
| 阶段1:需求分析 | ||||||
| 1.1 | 需求分析 | PM | 对话上下文、仓库设计约束 | 需求文档 | 数学定义、算子原型、目标芯片、精度/性能要求;缺项发问卷补齐 | |
| CP1 | 需求确认 | QA | 需求文档 | 验收结论 | QA 加载workflow-cp1核对需求;需用户确认时生成问卷 json 交 PM 发送 | 不通过打回 1.1 |
| 1.2 | Spec 生成 | architect | 需求文档 | Spec(spec.yaml,机器可校验) | 需求形式化为 L0 数学契约,作为后续方案与测试设计的统一真值源;规范见 ops-spec-gen | |
| CP1' | Spec 确认 | QA | spec.yaml | 验收结论 | QA 加载workflow-cp1-prime核对 Spec(9-stage 校验通过);需用户确认时生成问卷 json 交 PM 发送 | 不通过打回 1.2 |
| 阶段2:方案设计(方案线 / 测试线并行) | ||||||
| 2.1 | 黑盒测试设计 | architect | spec.yaml | 测试方案文档 | golden 实现方案、L0/L1/L2 分级用例设计 | 测试线 |
| CP2.1 | 测试检查 | QA | 测试方案文档 | 验收结论 | QA 加载workflow-cp2-1完成黑盒测试评审 | 不通过打回 2.1 |
| 2.2 | 开发方案设计 | architect | spec.yaml | 开发方案文档 | 代码架构、Buffer 规划、Tiling、多核切分、Ascend C 接口验证 | 方案线 |
| CP2.2 | 方案检查 | QA | 开发方案文档 | 验收结论 | QA 加载workflow-cp2-2完成开发方案评审 | 不通过打回 2.2 |
| CP2' | 方案确认 | QA | 开发方案 + 测试方案 | 验收结论 | QA 加载workflow-cp2-prime,CP2.1、CP2.2 均通过后合并确认 | 不通过打回对应步骤 |
| 阶段3:代码开发(开发线 / 测试线并行) | ||||||
| 3.1 | 算子开发 | developer-code | 开发方案文档、修改要求 | 算子代码 | 按方案实现、编译验证通过;被打回时按修改要求调整 | 开发线 |
| 3.2 | 测试工程开发 | developer-test | 测试方案文档 | golden 代码 + 用例表 + 性能采集框架 | 实现 golden、功能用例、性能采集框架 | 测试线 |
| 3.3 | 白盒测试补全 | developer-test | 算子代码、测试代码 | 白盒测试用例 | 覆盖黑盒未涉及的分支 | 3.1/3.2 汇合后 |
| CP3 | 功能验收 | QA | 算子代码 + 测试代码 | 功能验收报告 | QA 加载workflow-cp3执行全量功能测试(含精度比对) | 不通过回退 3.1 |
| 阶段4:性能验收 | ||||||
| 4.1 | 性能采集执行 | developer-test | 算子代码(CP3 通过后) | 性能数据 | 用 3.2 搭的性能采集框架跑出性能数据 | 基于 CP3 通过后的最终代码 |
| CP4 | 性能验收 | QA | 算子代码 + 性能数据 | 性能验收报告 | QA 加载workflow-cp4评估性能是否达标 | 不通过回退 3.1(重走 3.3→CP3→4.1→CP4) |
| 阶段5:代码检视 | ||||||
| CP5 | 代码检视 | QA | 全部变更文件 | 检视结论 | QA 加载workflow-cp5完成多维度代码检视 | 不通过回退 3.1(重走至 CP5) |
| 阶段6:上库准备 | ||||||
| 6.1 | 文档补全 | developer-doc | 算子代码 + 设计文档 | 算子文档 | 补全算子使用文档 | |
| 6.2 | 提交 PR | developer-doc | 全部代码 + 文档 | PR | 提交 PR | |
| 6.3 | CI 流水线 | CI(外部) | PR | CI 报告 | 触发 CI:编译 + UT + ST | 非调度子 Agent |
| 6.4 | codecheck 修复 | developer | CI 报告 | 修复后代码 | 修复 codecheck 问题 | |
| 6.5 | 检视意见修复 | developer | PR 检视意见 | 修复后代码 | 修复 PR 检视意见 | |
| CP6 | CI 通过确认 | QA | CI 报告 + PR 状态 | 上库确认 | QA 加载workflow-cp6确认 CI 通过、检视意见闭环 | 未通过回退 6.4/6.5 后重触发 CI |
| 阶段7:开发总结 | ||||||
| 7.1 | 开发报告 | developer-doc | 全部交付物 | 开发报告 | 整理开发过程与交付物清单,写入.cannbot | |
| 7.2 | 经验总结 | developer-doc | 开发过程记录 | 经验总结文档 | 沉淀开发经验与踩坑记录,写入.cannbot |
设计约束
为保证实现一致性、在方案出现分歧时提供统一指导,本工作流约定了一组设计约束。理解这些约束能帮助参与开发的开发者把握最初的设计思路——为什么定制要靠 override 而非改编排、为什么执行方与验收方必须分离、为什么中间状态要落盘。
约束由 skill 看护:这组约束不是一次性文档,而是由
ops-direct-invoke-workflow-maintainskill 持续看护的维护红线。任何对工作流文件的新增/修改/删除都须先触发该 skill,改完后按其派生的可执行检视条款逐条自查——约束不通过则回退修改。开发者若要演进工作流,务必先阅读该 skill。
结构约束(SOLID)
| 条款 | 说明 |
|---|---|
| 单一职责(S) | 每个 Skill 只负责一个功能域,只有一种原因引起它需要修改 |
| 开闭(O) | 编排对扩展开放、对修改关闭;子仓扩展步骤应 override virtual skill,而非改动编排 |
| 里氏替换(L) | 子仓 override 后须保持相同逻辑名、输入输出格式与调用方式,上层无感知 |
| 接口隔离(I) | 子仓只 override 自己需要的组件,不被迫实现全部 virtual 组件 |
| 依赖倒置(D) | 上层只依赖抽象逻辑名,不依赖具体实现路径 / 章节结构 |
| 基类演进兼容 | 基类对外契约(逻辑名 / 输入输出格式 / 调用约定)一经发布只增不破坏;确需破坏性变更须提供迁移路径并通知已接入仓 |
层级感知
层级感知方向:主 Agent → 工作流 → 子 Agent → Skill → 仓内文档。
- 层级间单向感知:下级模块不感知上级(子 Agent 不知自己在流程哪一步,Skill 不提及被谁调用)。
- 层级内黑盒感知:同级模块之间互不了解对方内部逻辑。
调度约束
| 条款 | 说明 |
|---|---|
| 职责分离 | 任务的执行方与验收方不能是同一 Agent 实例 |
| 最小信息 | 每个子 Agent 只获取完成当前任务所需的最小信息集 |
| 最小权限 | 每个子 Agent 只获取完成当前任务所需的最小操作权限(当前由 hook 落地为写权限约束) |
| 过程有界 | 所有可能循环/重试的环节必须声明最大次数,超限暂停并报告 |
| 确定性交付 | 每个子环节有明确交付件与可判定的通过指标 |
| 状态可观测 | 每阶段完成后状态持久化到外部(.cannbot/state.json),不依赖会话记忆 |
| 可恢复性 | 暂停/失败落盘到可恢复状态点,恢复时不重跑已通过阶段 |
| 修改不越权 | 执行角色严格遵循上游设计,发现问题回退上游修改,不自行变更上游决策 |
风格约束
- SKILL.md 只做路由:入口文件只做意图识别与路由分发,知识细节放 references。
- 机制优于自然语言:能用 hook / 脚本 / 权限声明约束的行为,不写成 prompt 自然语言。
- 引用而非硬编码:涉及仓库领域知识时引导 Agent 读原文,而非全文硬编码进 Skill。
- 开发者知识外置:对开发者同样可见的知识优先放仓内 doc,Skill 只做引导。
- 举例不引入外部概念:举例只用仓内已有知识或通用概念,不引入需额外背景才懂的概念。
【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体,本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考