每日 AI 学习笔记|Day 14:Skill 技能的开发与编排机制
Agent:这是【每日 AI 学习笔记】Day 14 的博客整理版,围绕 Skill 的定义、编排机制、案例复盘与工程实践展开,尽量把“会用 Skill”上升为“会设计 Skill、测试 Skill、治理 Skill”。
1. Skill 到底是什么?
如果只把 Skill 理解成“一个 Prompt 模板”,会很快遇到上限。Day 14 的核心观点更完整:
Skill 的本质,是 Prompt + Tool + Workflow 的封装单元。
它通常同时包含三部分:
- Prompt:定义角色、目标、约束、输出结构;
- Tool:赋予执行能力,例如查询、审批、写文件、调用服务;
- Workflow:规定执行顺序、状态流转、人工确认点与异常处理策略。
从测试开发视角看,Skill 不是单一脚本,而是一个“可复用、可观测、可回归”的能力模块。一个设计良好的 Skill,至少应该具备以下特征:
- 输入边界清晰;
- 状态可追踪;
- 工具调用可审计;
- 输出结构稳定;
- 异常路径有明确兜底。
这也是为什么 Skill 设计天然适合引入 QA 思维:它既有 Prompt 的不确定性,也有 Tool 与 Workflow 的工程确定性。
2. 编排机制:路由分发、状态传递、质量控制
当一个系统里不止一个 Skill,问题就不再是“这个 Skill 能不能跑”,而是“多个 Skill 如何协同工作”。Day 14 把编排机制拆成三个关键层面。
2.1 路由分发
路由的任务是:把问题交给最合适的 Skill。
常见判断依据包括:
- 用户意图属于哪一类任务;
- 当前上下文中是否已存在前置结果;
- 是否需要人工确认;
- 是否涉及高风险工具或跨系统动作。
从测试角度,需要重点验证:
- 相似请求是否会被稳定路由到同一类 Skill;
- 路由器是否会误选“能力相近但边界不同”的 Skill;
- 高风险请求是否能被正确拦截到审批链路;
- 路由失败时是否能返回可解释的错误,而不是静默失败。
2.2 状态传递
多 Stage Skill 的本质是一条小型状态机。典型状态包括:
received -> analyzed -> waiting_human_confirm -> executing -> completed / failed / fallback
每一阶段都要回答两个问题:
- 上一阶段给了我什么?
- 我完成后,下一阶段该拿什么继续?
如果状态设计混乱,就容易出现:
- 人工确认前就提前执行;
- 重试时丢失上下文;
- 审批通过/拒绝状态覆盖错误;
- 最终结果看似成功,但中间过程不可追踪。
2.3 质量控制
Skill 编排不是“串起来就行”,还必须对质量设门槛。常见控制点包括:
- 输入校验:缺字段、非法枚举、上下文不完整时提前失败;
- 阶段验收:每一阶段都校验输出结构,而不是把脏数据放给下游;
- 人工确认:高风险动作必须进入确认环节;
- 执行审计:记录调用了哪些工具、谁触发的、是否产生副作用;
- 结果复核:执行后给出总结、证据和回滚建议。
一句话总结:编排不是把 Skill 连成链,而是给这条链加上边界、状态与质量守门人。
3. 案例复盘:bits-testcase-generator 的三阶段设计
Day 14 的案例复盘聚焦一个很有代表性的 Skill:bits-testcase-generator。它采用三阶段结构:
- 需求分析阶段
- 人工确认阶段
- 自动化执行阶段
3.1 阶段一:需求分析
这一阶段的目标不是“立刻生成测试用例”,而是先把问题想清楚:
- 用户要测什么对象;
- 测试范围是接口、流程还是 Agent 行为;
- 是否有已有资产可复用;
- 输出预期是用例列表、测试代码还是报告草案。
如果这个阶段做得好,后续阶段才不会在错误目标上越跑越远。
3.2 阶段二:人工确认
这是三阶段设计中非常关键的一层。原因很简单:
- 测试资产生成常常涉及范围确认;
- 自动化执行可能写代码、改文件、触发流程;
- 用户对“最终生成物长什么样”通常需要一次显式确认。
这一步本质上是把“隐性预期”转成“显性批准”。从 QA 视角,这相当于在 Skill 内部加入一个可审计的审批闸门。
3.3 阶段三:自动化执行
在确认之后,Skill 才进入工具调用与结果产出阶段。此时更适合引入结构化输入:
- 已确认的需求摘要;
- 目标接口或模块列表;
- 输出格式要求;
- 风险边界与排除项。
这样做的价值是:
- Prompt 更稳定;
- Tool 调用更可控;
- 执行失败更容易归因;
- 结果更适合回归测试。
3.4 这个三阶段设计为什么值得借鉴?
因为它把常见的 AI 能力链路,拆成了三个不同性质的问题:
- 分析问题:靠 Prompt 与结构化推理;
- 确认问题:靠人工决策与边界校准;
- 执行问题:靠 Tool 与 Workflow 工程化落地。
这比“一次 Prompt 直接生成最终结果”更稳,也更适合企业级质量保障。
4. 工程实践:设计一个“用例审批 Skill”
Day 14 的实践任务,是把上面的思路落到一个具体 Skill 上:设计用例审批 Skill。
目标场景可以这样理解:
- 上游已经产出测试用例草案;
- 当前 Skill 负责给出审批摘要;
- 用户可以 approve / reject;
- 通过后再触发后续自动化执行。
4.1 Prompt 设计思路
Prompt 不应只是“请审批这批用例”,而应显式限定输出结构,例如:
- 用例覆盖的核心范围;
- 风险点与遗漏点;
- 建议审批结论;
- 需要用户重点关注的确认项。
示意 Prompt:
你是测试方案审批助手。
请基于输入的测试用例草案,输出:
1. 覆盖范围摘要
2. 主要风险点
3. 是否建议通过(approve/reject)
4. 用户确认时需要重点检查的 3 个问题
输出必须为结构化 JSON。
这样做的好处是:审批前的“人看内容”与审批后的“程序接动作”之间,有了稳定桥梁。
4.2 Python 测试代码:mock approve / reject 工具调用
一个最小可测版本,可以先不接真实审批系统,而是 mock 两个工具:approve_case 与 reject_case。
from dataclasses import dataclass
from typing import Dict, Any
@dataclass
class ApprovalResult:
status: str
reason: str
def approve_case(case_id: str) -> Dict[str, Any]:
return {"case_id": case_id, "action": "approved", "success": True}
def reject_case(case_id: str, reason: str) -> Dict[str, Any]:
return {
"case_id": case_id,
"action": "rejected",
"success": True,
"reason": reason,
}
def run_approval_skill(case_id: str, decision: str, reason: str = "") -> ApprovalResult:
if decision not in {"approve", "reject"}:
raise ValueError("invalid decision")
if decision == "approve":
result = approve_case(case_id)
return ApprovalResult(status=result["action"], reason="用户确认通过")
result = reject_case(case_id, reason or "覆盖不足")
return ApprovalResult(status=result["action"], reason=result["reason"])
配套测试可以覆盖:
- decision 非法值;
- approve 正常路径;
- reject 必填原因是否生效;
- 工具调用失败时是否给出可解释错误;
- 同一 case 重复审批时是否具备幂等控制。
4.3 这个 Skill 真正的质量重点是什么?
不是“能不能调起 approve/reject 工具”,而是:
- 审批前摘要是否足够让人做决定;
- 审批结果是否被正确写回状态机;
- reject 后是否阻断后续自动化执行;
- approve 后是否带着确认过的上下文进入执行阶段;
- 整个过程是否留痕,可回放,可归因。
5. 多 Stage Skill 的测试设计建议
如果把 Skill 当成可交付的软件能力,而不是一次性 Prompt,测试方式也应该升级。
5.1 分层测试
可以按四层来做:
- Prompt 输出层:检查结构完整性、关键字段、禁止项;
- Tool 调用层:检查参数校验、异常处理、幂等与超时;
- Workflow 状态层:检查状态跳转是否合法;
- 人工确认层:检查确认/拒绝/超时未处理等分支。
5.2 常见失败模式
多 Stage Skill 往往会踩这些坑:
- 分析阶段输出不完整,却仍进入执行;
- 用户拒绝后,旧状态未清理,导致误执行;
- 重试时重复调用高风险工具;
- 某阶段成功但状态写回失败,导致系统“看起来没跑过”;
- 人工确认超时后,系统既不取消也不提醒。
5.3 推荐观测字段
如果要让线上问题更好定位,建议在 Skill 生命周期中至少记录:
skill_namerequest_idstagedecisiontool_nameretry_countstatuserror_reason
这些字段一旦形成统一约定,后续做 trace、回放和质量看板就容易很多。
6. 课后思考:如何设计多 Stage Skill 的容错与重试?
Day 14 最值得继续延伸的,是这个问题:
多 Stage Skill 的容错机制和重试策略应该怎么设计?
我会优先从四个角度思考:
- 按阶段区分重试策略:需求分析可重试,审批等待不应盲重试,执行阶段要区分是否有副作用;
- 显式记录重试上下文:避免重试后丢失前一次分析结果或人工确认状态;
- 引入幂等键与阶段锁:避免同一 Stage 被重复执行;
- 为失败设计安全出口:失败后能否停在可恢复状态,而不是半执行半中断。
对于 AI QA 场景,这个问题并不抽象。只要一个 Skill 涉及“先分析、再确认、后执行”,它本质上就已经是一条小型工作流,而工作流必然要面对:超时、重试、并发、状态一致性与审计。
7. 今日总结
Day 14 帮我把对 Skill 的理解,从“写 Prompt”升级成了“设计能力单元”:
- Skill 不是一句 Prompt,而是 Prompt + Tool + Workflow;
- 编排不是简单串联,而是 路由 + 状态 + 质量控制;
- 多 Stage Skill 的核心,不只是跑通,而是 可确认、可回溯、可治理。
从测试开发角度看,Skill 工程化最有价值的一点,是它终于把 AI 系统中那些“说不清的行为”,慢慢收敛成了可以设计、可以测试、可以复盘的结构化对象。
下一步如果继续深入,我会重点补两件事:
- 给多 Stage Skill 设计统一状态机与失败语义;
- 把审批、重试、降级做成可复用测试模板。
