博客.
博客.
(联系方式)

保持联系

如果你想联系我,无论是讨论合作机会、分享想法,还是只是打个招呼,都可以通过以下方式找到我。

(最后更新)

版权所有 / 2026

(快捷键)C
返回文章列表
2025年2月26日

Skills 产品化融合:从能力包到智能测试设计全流程

图表索引

本文配套 5 张 draw.io 架构图,可在项目 docs/diagrams/ 目录下查看,用 draw.io 或 VS Code Draw.io 插件打开编辑。导出 PNG/SVG 后可嵌入其他文档。

图表文件说明
系统整体架构01-system-architecture.drawio前端 → API → MAS → Skills → 基础设施 分层
Skills 三层披露02-skills-3layer-disclosure.drawioL1 发现 → L2 激活 → L3 执行
ReAct 执行循环03-react-execution-loop.drawioThink → Act → Observe → Loop
产品交互与阶段流转04-product-interaction.drawio用户、Tab、对话区、产出物、门禁、后端
阶段内部流程05-phase-internal-flow.drawioLOAD-RULES → ANALYZE → GENERATE → VERIFY

为什么要写这篇

你可能会想:Skills 听起来像「技能」,但具体是啥?和产品、和测试设计又有什么关系?

这篇就是想用一篇讲清楚三件事:什么是 Skills、怎么把 Skills 融进产品、架构怎么设计。尽量口语化、通俗易懂。上面先给了图表索引,方便对着图看。


一、先说清楚:Skills 到底是什么?

一句话概括:Skills 就是一整套可被 AI Agent 按步骤执行的「能力包」,用文件夹 + Markdown 文件来描述,而不是写死在代码里。

打个比方:以前我们做测试设计,得在代码里写死「先分析需求、再建模型、再生成用例」——改一步就要改代码、发版。而 Skills 的做法是:把这些步骤写成一份份「说明书」(Markdown),Agent 启动时读一读,就知道该怎么做。加新能力 = 加新文件夹,不用动主流程代码

Skills 长什么样?

以 DongTDD 为例,一个 Skill 的目录结构大概是这样的:

skills/dongtdd/
├── SKILL.md                    # 主指南:这个 Skill 能干啥、怎么用
├── references/
│   ├── rules.md                # 全局规则
│   ├── modeling-sop.md         # 建模标准流程
│   └── phases/                 # 每个阶段的执行策略
│       ├── 01-req-preprocess/
│       │   ├── analyze.md      # 怎么分析
│       │   ├── generate.md     # 怎么生成
│       │   └── verify.md       # 怎么验证
│       ├── 02-domain-analyze/
│       ├── 03-mbt-design/
│       └── ...
└── assets/
    ├── templates/              # 产出物模板
    └── examples/              # 参考示例

核心就三块:

  • SKILL.md:总纲,告诉 Agent「我是谁、我能干啥、整体流程是啥」
  • references/phases/:每个阶段的「说明书」,分 analyze / generate / verify 三步
  • assets/:模板和示例,Agent 照着填、照着学

这种设计遵循一个叫 Agent Skills 规范 的东西,核心思想是「三层渐进式披露」:

  • L1 发现:先 list_skills(),只拿 name + description,轻量
  • L2 激活:需要时 read_skill_md(skill_id),读完整 SKILL.md
  • L3 执行:按需读 read_phase_guideread_templateread_example,用到哪读到哪

这样 Agent 不用一上来就把所有文档塞进上下文,按需加载,省 token、也省脑子。三层披露的流程示意见上文「图表索引」里的 02-skills-3layer-disclosure。


二、产品形态:用户看到的六个 Tab

说完 Skills 是什么,再看用户端长什么样。

在 qin-client 的用例设计页面里,你会看到六个阶段 Tab:

需求分析 | 测试分析 | 设计 | 规划 | 评审 | 沉淀

这六个 Tab 不是拍脑袋定的,而是和 DongTDD 的 6 个 Phase 一一对应:

产品 TabDongTDD Phase核心产出
需求分析01-req-preprocess需求分析文档、需求清单
测试分析02-domain-analyze + 03-mbt-design域划分、建模计划、测试模型
设计04-testcase-gen测试用例(思维导图)
规划原有功能执行计划、资源分配
评审05-quality-review追溯矩阵、质量报告
沉淀06-evaluation项目评测、经验沉淀

也就是说:前端的六个 Tab,就是 Skills 六个阶段在产品上的具象化。用户切 Tab,本质是在不同阶段之间切换;每个阶段背后,都有一套 Skills 定义的 analyze → generate → verify 流程在跑。产品交互与阶段流转见上文「图表索引」里的 04-product-interaction。


三、怎么把 Skills 融进工程?核心架构

Skills 是「说明书」,那谁来读、谁来执行?这就是 testdata-llm/app/mas 这套多智能体系统(MAS)要干的事。

3.1 整体思路:Skills 驱动,而不是硬编码

以前的做法:在代码里写死「需求分析 Agent 调 A 工具、测试分析 Agent 调 B 工具」——加一个阶段就要改一堆代码。

现在的做法:Agent 启动时先 list_skills() 发现能力,再根据用户意图选 Skill,读 SKILL.md 按步骤执行。加新 Skill = 在 app/skills/ 下放一个符合规范的文件夹,主流程几乎不用动。

3.2 核心组件一览

整体分层大概是:前端(六个 Tab)→ API 层(unified chat stream)→ MAS 多智能体层(小T + 各类 tools)→ Skills 层(dongtdd 等)。小T(Master Agent)手里有这几类工具:

  • skill_tools:发现 Skills、读 SKILL.md、读阶段指南(L1/L2/L3)
  • file_tools:读文档、读 URL
  • artifact_tools:保存/读取阶段产出物(OSS + MySQL)
  • script_tools:执行 Python 脚本
  • subagent_tools:动态创建子 Agent,上下文隔离
  • mcp_bridge_tools:复用现有文档/接口分析能力

系统整体架构的示意图见上文「图表索引」里的 01-system-architecture。

3.3 执行流程:Think → Act → Observe → Loop

小T 是一个 ReActAgent,核心循环就是:

  1. Think:根据当前上下文,决定下一步干啥(调工具 or 给答案)
  2. Act:调用工具(比如 skill_tools.read_phase_guide
  3. Observe:拿到工具返回结果,塞进对话历史
  4. Loop:继续 Think,直到任务完成或达到最大轮次

关键设计:第一步自动执行 list_skills(),这样 Agent 一上来就知道有哪些 Skill 可用,不会「瞎猜」。ReAct 循环的示意见上文「图表索引」里的 03-react-execution-loop。

当用户说「帮我分析这个需求文档」时,Agent 会:从 list_skills 的结果里匹配到 dongtdd → 调用 read_skill_md("dongtdd") 拿到完整执行指南 → 按 SKILL.md 的 Step 4,对每个阶段执行 LOAD-RULES → ANALYZE → GENERATE(读模板、生成、保存)→ VERIFY。每一步都会通过 skill_tools 按需读取 analyze/generate/verify 的 md,以及 read_template、read_example,而不是把整本「说明书」一次性塞给 LLM。阶段内部流程见上文「图表索引」里的 05-phase-internal-flow。

3.4 阶段间数据怎么传?

Skills 的每个 Phase 都有输入输出:比如「域分析」要读「需求分析」的产出,「用例生成」要读「建模计划」。

在 Web 环境下,没有本地 .dongtdd/ 目录,所以用 artifact_tools

  • 保存artifact_tools.save_artifact(project_id, phase_id, artifact_type, artifact_name, content) → 存到 OSS + MySQL
  • 读取artifact_tools.read_artifact(project_id, artifact_type, phase_id) → 前序阶段的产出物

同时,AgentContext 里有一个 shared_data,父子 Agent 共享,用来在内存里传递「当前项目 ID」「已完成阶段」等信息,避免重复执行。

3.5 兜底逻辑:阶段流程完整性检查

Agent 有时会「偷懒」:只说了句「我已经分析完了」就停,但实际没调用 save_artifact

所以 ReActAgent 里有一套 阶段流程完整性检查:检查是否读过 analyze / generate 指南、是否读过模板、是否调用了 save_artifact、是否执行了 verify。如果发现缺了哪一步,就自动给 Agent 塞一条系统提示,逼它把流程补全。这样即使用户不盯着,也能保证每个阶段按 SKILL.md 的标准流程跑完。


四、架构设计要点(为什么这样设计)

为什么用 Skill 而不是硬编码?

对比项硬编码Skills 驱动
加新能力改代码、发版加文件夹、重启即可
改流程改逻辑、回归测试改 md 文件
多 Skill 共存要写路由、if-else扫描目录、自动发现
能力描述写在代码注释里写在 SKILL.md,Agent 直接读

Skills 的本质是:把「做什么、怎么做」从代码里抽出来,变成可配置的文档。这样 Agent 更灵活,人也更好维护。

为什么 Agent 要「按需读取」?

如果一上来就把 SKILL.md + 所有 phases 的 md 全塞进 prompt,token 会爆,而且 LLM 容易「注意力涣散」。所以用三层渐进式披露:先发现、再激活、再按需读。Agent 只加载当前阶段需要的指南和模板,用完就丢,下一阶段再读下一阶段的。这样既省 token,又让每一步的指令更清晰。

工具和 Agent 的统一调度

在 MAS 里,调工具和调子 Agent 用的是同一个接口:ctx.call(callee, **kwargs)。Agent 不需要区分「这是工具还是子 Agent」,统一通过 call 调度,权限由 permitted_callees 控制,调用链通过 call_stack 追踪。

前后端怎么衔接?

前端六个 Tab 的 stage 会传到后端,后端通过 project_id + design_id 等上下文,知道用户当前在哪个阶段。Agent 执行时会从 ctx.shared_data 里拿到 completed_phases,避免重复执行;从 ctx.links 里拿到用户提供的文档链接。SSE 会推送 stage(thinking / acting / phase_progress / completed 等),前端根据这些状态更新 UI 和进度条。


五、产品交互:用户实际怎么用

界面布局上(以需求分析 Tab 为例):左侧文档输入区域(添加文档链接、文档预览),右侧小T 对话区;下方是产出物展示(需求清单、功能点列表、测试要点等)。SSE 的 stage(thinking / acting / phase_progress / streaming / completed / error)会驱动前端的「思考中…」「正在读取技能指南…」、进度条和完成态。

用户切换 Tab 时,前端有阶段门禁:例如进「测试分析」要先完成「需求分析」,进「规划」要先完成「设计」等。不满足时会提示对应文案;设计创建人可以点击阶段前图标切换状态(designStatus 的 status:0=未开始,1=进行中,2=已完成)。

一个典型的用户旅程:用户进「需求分析」Tab,粘贴文档链接,输入「帮我分析这个需求」→ 小T 自动 list_skills,匹配 dongtdd,读 SKILL.md,执行 01-req-preprocess:LOAD-RULES → ANALYZE → GENERATE → VERIFY → 产出物通过 artifact_tools 保存,前端展示需求清单等 → 用户切到「测试分析」Tab(门禁通过),继续「生成域划分」→ 小T 读 02-domain-analyze 指南,从 read_artifact 读需求分析产出,生成域划分和建模计划。


六、小结:一句话串起来

Skills 是一套用文件夹 + Markdown 描述的「能力包」,Agent 通过 skill_tools 发现、读取、按步骤执行;产品端的六个 Tab 对应 Skills 的六个阶段,每个阶段背后是 analyze → generate → verify 的标准流程;架构上 MAS 负责「读说明书、调工具、传数据」,Skills 只负责「写好说明书」——这样加新能力不用改主流程,改流程也不用改代码。

如果你要扩展:加一个新 Skill,就在 app/skills/ 下放一个符合规范的文件夹;加一个新阶段,就在对应的 phase 下补 analyze / generate / verify 三个 md。剩下的,交给 Agent 和工具链自动跑起来。

基于 DongTDD / testdata-llm / qin-client 的现有实现整理。