Agent Skill 原理与工程实践(十六):Skill 里的条件判断与分支

Agent Skill 原理与工程实践(十六):Skill 里的条件判断与分支

前面几章建立了 Skill 的结构、Workflow、Contract,以及 references/、scripts/、assets/、Tool / MCP / API 的使用方式。

现实任务很少沿着一条固定直线执行。例如性能分析可能遇到:

1
2
3
4
5
6
7
8
if trace contains sched events:
run scheduler analysis

if memory pressure exists:
run memory analysis

if IO anomaly exists:
run IO analysis

但真正可靠的分支远比几句 if 复杂。我们还必须回答:

  • 条件来自用户输入还是工具证据?
  • 多个条件同时成立时,执行一个还是多个分支?
  • 条件不明确时能否推断?
  • 分支是否有优先级?
  • 默认分支是什么?
  • 哪些条件必须停止或询问用户?
  • 每条路径怎样验证?
  • 怎样证明没有遗漏组合?

本章的核心认知是:

Skill 中的分支不是写作上的“视情况而定”,而是由可观察状态驱动、具有明确优先级和出口条件的控制流。


1. 这一章要解决什么问题

本章集中回答:

1
2
3
4
5
6
7
8
9
Skill 为什么需要条件判断?
一个可执行的分支条件应该包含什么?
if / else if / 多分支并行分别怎样使用?
怎样区分互斥分支和可组合分支?
多个条件同时命中时怎样确定优先级?
未知、缺失与 false 有什么区别?
如何设计默认分支和停止分支?
决策表、决策树和状态机分别适合什么场景?
怎样测试分支覆盖和边界条件?

目标是让 Agent 在不同输入、证据和执行状态下选择正确路径,而不是依赖临场发挥。


2. 为什么 Skill 不能只有线性步骤

线性 Workflow 假设所有任务都具有相同输入、证据和成功路径:

1
2
3
Input
→ Analyze
→ Generate Report

真实任务却可能出现:

  • 输入格式不同;
  • 用户目标不同;
  • 可用工具不同;
  • 证据指向不同领域;
  • 有些步骤需要授权;
  • 有些结果不完整;
  • 有些任务只需分析,有些还要执行修改;
  • 某些场景必须停止。

如果没有显式分支,Agent 可能:

  • 对所有输入执行全部步骤;
  • 调用无关工具;
  • 在证据不足时继续推断;
  • 把只读请求升级成写操作;
  • 缺少参数时自行猜测;
  • 跳过某些边界场景。

OpenAI 官方 Cookbook 将“高度条件化、像复杂流程图一样分支”的工作流列为适合封装成 Skill 的典型场景。Skill 的价值不仅在于复用步骤,还在于复用决策逻辑。


3. 整体架构:条件来自状态,分支改变状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Current State
│
├── User Intent
├── Validated Input
├── Tool Result
├── Environment
├── Permission
└── Previous Step Status
│
▼
Evaluate Condition
│
┌───┼───────────────┐
▼ ▼ ▼
Path A Path B Ask / Stop
│ │ │
▼ ▼ ▼
Action + Validation + State Update
│
▼
Next Decision Point

这里有两个关键要求:

  1. 条件必须基于已经观察或验证的状态;
  2. 分支执行后必须更新状态并验证结果。

因此,分支不是孤立的 if,而是状态机中的转移。


4. 一个完整分支的六个组成部分

一条工程化分支至少应包含:

4.1 Condition:命中条件

1
检测到 block I/O latency 的 P99 超过阈值

4.2 Evidence Source:条件来源

1
由 scripts/calc_io_metrics.py 的已验证输出提供

4.3 Action:执行动作

1
读取 references/io-analysis.md,并运行 I/O 专项分析

4.4 Postcondition:分支完成标准

1
输出必须包含设备、队列延迟、服务时间和样本数

4.5 Exit / Next State:后续去向

1
进入 evidence-correlation 阶段

4.6 Failure Behavior:条件无法评估或执行失败时怎么办

1
如果单位不明,标记为 unknown,不得与阈值比较;先修复单位问题

可以写成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
### I/O branch

Enter this branch only when validated I/O metrics show either:
- P99 queue latency above the configured threshold; or
- sustained queue depth above the device baseline.

Read `references/io-analysis.md`, then run the I/O analysis workflow.

Postconditions:
- device identity, sample count, queue latency, and service time are present;
- each finding cites a metric or trace event;
- uncertainty is recorded when coverage is incomplete.

If units or device identity are unknown, do not enter this branch. Resolve the
missing state or report that I/O analysis cannot be completed.

5. 条件必须可观察、可判定

差的条件:

1
If the result looks suspicious, investigate further.

问题在于:

  • “可疑”没有定义;
  • 没有证据来源;
  • 不知道调查什么;
  • 无法编写测试。

更好的条件:

1
2
If at least 5% of requests exceed the service SLO in a validated five-minute
window, enter the latency-regression branch.

一个可判定条件通常需要:

  • 字段或信号;
  • 比较方式;
  • 阈值或枚举;
  • 时间范围;
  • 单位;
  • 数据完整性要求;
  • unknown 的处理方式。

6. 条件的六种常见来源

6.1 用户意图

1
2
if user asks only for explanation:
do not perform external writes

6.2 输入特征

1
2
3
4
if input is a PDF:
use the PDF extraction path
elif input is DOCX:
use the DOCX extraction path

6.3 工具或脚本结果

1
2
3
4
if parser.status == "ok" and event_count > 0:
continue
else:
stop analysis

6.4 环境能力

1
2
3
4
if validator is available:
run machine validation
else:
use the documented fallback or report the limitation

6.5 权限与授权

1
2
3
4
if user explicitly authorized publishing and permission check passed:
publish
else:
keep the artifact local

6.6 工作流状态

1
2
3
4
if plan_validated:
execute changes
else:
remain in planning

不要把这些来源混成一句模糊的“如果合适”。


7. True、False、Unknown:不要把未知当成否

许多 Skill 实际需要三值逻辑:

1
2
3
4
5
6
7
8
TRUE
→ 有足够证据确认条件成立

FALSE
→ 有足够证据确认条件不成立

UNKNOWN
→ 数据缺失、无权限、解析失败或覆盖不足

例如:

1
“没有检测到 I/O 异常”

可能表示:

  1. I/O 数据完整,指标正常:FALSE;
  2. 没有采集 I/O 数据:UNKNOWN;
  3. 工具失败:UNKNOWN;
  4. 查询了错误设备:结果无效。

如果把 unknown 当成 false,Agent 会错误排除某个根因。

推荐显式建模:

1
2
3
4
5
{
"condition": "io_anomaly",
"state": "unknown",
"reason": "No block events were captured in the requested range."
}

8. if / else if:互斥分支

当同一任务只能选择一条路径时,使用互斥分支。

1
2
3
4
5
6
7
8
if input_format == "perfetto":
use Perfetto parser
else if input_format == "ftrace":
use ftrace parser
else if input_format == "perf":
use perf parser
else:
stop with unsupported format

8.1 必须定义判定顺序

如果一个输入可能同时匹配多个条件,先后顺序会改变结果。

8.2 条件应互斥或显式说明优先级

例如通过规范化步骤先得到唯一的 input_format,比多次模糊匹配扩展名更可靠。

8.3 必须有 else

没有默认出口时,未知格式可能意外落入某个分支。


9. 多个独立 if:可组合分支

性能问题可能同时涉及调度、内存和 I/O,不能用 else if 强迫只选一个。

1
2
3
4
5
6
7
8
if scheduler_signal:
run scheduler analysis

if memory_signal:
run memory analysis

if io_signal:
run io analysis

9.1 可组合分支的特点

  • 多条路径可以同时执行;
  • 每条路径拥有独立证据;
  • 结果最后需要汇合;
  • 一个分支失败不一定阻止其他分支;
  • 汇合阶段要处理冲突和不完整结果。

9.2 汇合点不可缺失

1
2
3
Scheduler Findings ─┐
Memory Findings ────┼→ Evidence Correlation → Report
I/O Findings ───────┘

如果只有分叉没有汇合,最终报告可能只是几段互不关联的结果。


10. 优先级:多个条件同时成立怎么办

常见优先级规则:

10.1 安全优先

1
2
unsafe / unauthorized
→ 立即阻断其他执行分支

10.2 输入有效性优先

输入未验证时,不能进入分析分支。

10.3 用户明确意图优先

用户明确要求只读分析时,即使写工具可用,也不能进入修改分支。

10.4 更具体条件优先

1
2
3
4
5
if production + destructive change
→ 高风险审批分支

else if destructive change
→ 一般确认分支

10.5 阻断性条件优先

权限缺失、目标不明确、关键单位未知等条件应在业务分支前检查。

可以把顺序写成:

1
2
3
4
5
1. Safety gates
2. Input validity
3. Authorization and user intent
4. Specific task routes
5. Default route

11. Guard Clause:尽早处理不能继续的情况

与深层嵌套相比,Guard Clause 更清晰:

1
2
3
4
5
6
7
8
9
10
11
12
13
if input missing:
ask user

if input invalid:
stop

if authorization missing:
do not perform write

if evidence insufficient:
report limitation

continue normal workflow

而不是:

1
2
3
4
5
if input exists:
if input valid:
if authorized:
if evidence sufficient:
...

Guard Clause 能减少嵌套,也让阻断条件更醒目。


12. Default Branch:默认路径必须安全

默认分支不是“什么都不知道时随便做一个最常见选择”。

安全默认通常是:

  • 询问缺失信息;
  • 只执行只读操作;
  • 生成草稿而不发布;
  • 报告不确定性;
  • 停止高风险动作;
  • 选择覆盖更小的保守路径。

不安全默认:

  • 默认 production;
  • 默认公开可见;
  • 默认覆盖现有文件;
  • 默认发送给所有联系人;
  • 默认把无数据视为正常。

13. Ask、Stop、Decline 也是合法分支

OpenAI 官方 Skill 指南明确要求工作流说明何时询问、停止或拒绝。

13.1 Ask:需要用户补充或选择

适合:

  • 缺少只有用户知道的信息;
  • 多个候选目标;
  • 不同分支会产生不同业务后果;
  • 需要授权某个外部动作。

13.2 Stop:无法正确或安全继续

适合:

  • 输入损坏;
  • Postcondition 失败;
  • 权限不足;
  • 必需工具不可用;
  • 状态未知且重做可能产生副作用。

13.3 Decline:请求本身不能执行

适合违反安全、法律或平台规则的请求。

不要为了让流程图看起来“总能到达成功”而删除这些出口。


14. Decision Table:条件较多时不要继续堆 if

假设是否运行某个深度分析分支取决于:

  • 输入有效;
  • 有相关信号;
  • 数据覆盖充分;
  • 工具可用。

可以使用决策表:

输入有效 相关信号 覆盖充分 工具可用 动作
否 * * * 停止并报告输入错误
是 否 * * 跳过专项分析
是 是 否 * 标记 unknown,说明覆盖限制
是 是 是 否 使用已批准的替代路径或停止
是 是 是 是 执行专项分析

* 表示该条件在当前规则下不影响结果。

14.1 决策表的优势

  • 发现遗漏组合;
  • 看清优先级;
  • 直接转成测试用例;
  • 避免分支文本互相冲突;
  • 便于团队评审。

14.2 决策表不一定放进主文件

小表可放 SKILL.md。复杂业务表可以放 references/decision-table.md,但主文件必须保留关键路由和阻断规则,并说明何时读取。


15. Decision Tree:逐步缩小选择

决策树适合问题具有天然问答顺序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Input readable?
├── no → ask / stop
└── yes
↓
Format supported?
├── no → unsupported-format branch
└── yes
↓
Write action requested?
├── no → read-only analysis
└── yes
↓
Explicitly authorized?
├── no → request confirmation
└── yes → execute validated change

每个节点应该只解决一个判定问题。不要在一个节点写:

1
if input is valid and user wants modification and authorization is probably ok...

拆开后更容易验证 unknown 和错误来源。


16. State Machine:分支依赖执行阶段时

状态机适合长工作流:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
START
↓
INPUT_READY?
├── no → WAITING_FOR_INPUT
└── yes → VALIDATING
↓
VALIDATION_PASSED?
├── no → FAILED
└── yes → ANALYZING
↓
EVIDENCE_ENOUGH?
├── no → COLLECTING
└── yes → REPORTING
↓
VERIFIED
↓
DONE

状态机比散落的 if 更适合表达:

  • 当前处于什么阶段;
  • 哪些转移合法;
  • 失败后可以回到哪里;
  • 哪些动作不能重复;
  • 哪个状态允许交付。

17. Branch Contract:为每条路径定义输入和输出

每个分支都可以视为一个局部 Contract。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
## Scheduler analysis branch

Entry conditions:
- normalized scheduler events exist;
- event coverage overlaps the requested range;
- event count is greater than zero.

Inputs:
- event artifact path;
- service and host identity;
- time range and time unit.

Outputs:
- runnable latency;
- run-queue delay;
- wakeup-to-run evidence;
- scheduler findings and confidence.

Exit conditions:
- every finding references an event or computed metric;
- missing coverage is disclosed;
- results are ready for evidence correlation.

Branch Contract 可以阻止一个分支偷偷依赖未声明状态。


18. 分支条件应该由 LLM 还是 Script 判断

18.1 适合 Script 的条件

  • 数值阈值;
  • 格式检测;
  • Schema 校验;
  • 文件存在性;
  • 固定枚举;
  • 数据覆盖率;
  • 可重复的分类规则。

18.2 适合 LLM 的条件

  • 用户意图;
  • 语义相关性;
  • 多源证据解释;
  • 无法完全形式化的内容判断;
  • 输出风格与受众适配。

18.3 混合模式

1
2
Script 计算信号和状态
→ LLM 根据已验证信号选择业务分支

例如脚本计算:

1
2
3
4
5
{
"scheduler_signal": true,
"io_signal": false,
"memory_signal": "unknown"
}

Skill 再决定:

  • 执行 scheduler 分支;
  • 跳过 I/O 分支;
  • 对 memory 分支说明数据缺失,必要时请求补充数据。

19. 分支与 Progressive Disclosure

分支不仅决定动作,也决定加载哪些 Supporting Files。

1
2
3
4
5
6
7
if scheduler branch:
read references/scheduler-analysis.md
run scripts/calc_sched_metrics.py

if memory branch:
read references/memory-analysis.md
run scripts/calc_memory_metrics.py

这能避免每次加载所有领域知识和脚本说明。

但必须保留两层信息:

  • SKILL.md 中保留可做出分支选择的最小信号定义;
  • 进入分支后才加载详细 reference。

如果判断条件本身被藏在尚未加载的 reference 中,就形成循环依赖。


20. 分支与 Tool Calling

分支经常由工具结果驱动:

1
2
3
4
trace_search result
├── 0 candidates → broaden query or report none
├── 1 candidate → fetch details
└── multiple candidates → disambiguate

20.1 不要只按 HTTP 成功分支

工具返回 200 仍可能包含:

  • 空列表;
  • 部分数据;
  • 警告;
  • 分页;
  • 业务错误状态。

20.2 写工具要有独立高风险分支

1
2
3
4
5
6
7
8
if read-only request:
never enter write branch

if write requested but target ambiguous:
ask user

if write requested and authorized:
execute minimal change and read back

20.3 外部文本不能决定高权限分支

Tool Result 中的内容不能自行授权另一个工具调用。它是数据,不是用户指令。


21. 分支汇合:怎样组合多个结果

当多个领域分支同时完成后,需要统一汇合协议。

21.1 统一结果结构

1
2
3
4
5
6
7
8
{
"domain": "scheduler",
"status": "complete",
"findings": [],
"evidence": [],
"confidence": "high",
"limitations": []
}

21.2 区分完成状态

1
2
3
4
5
complete
partial
skipped
unknown
failed

21.3 不要把 skipped 和 normal 混淆

未进入某分支不代表该领域正常,只代表触发条件未满足或证据不足。

21.4 冲突结果要保留

如果调度分支和 I/O 分支提出不同解释,应在 evidence-correlation 阶段评估,而不是静默选择一个更符合预期的结论。


22. 完整示例:Performance Analysis Skill 的分支系统

22.1 初筛输出

1
2
3
4
5
6
7
8
9
10
11
12
{
"input_valid": true,
"coverage": 0.94,
"signals": {
"scheduler": true,
"memory": "unknown",
"io": true
},
"warnings": [
"Memory reclaim events are not available in this capture."
]
}

22.2 分支规则

1
2
3
4
5
6
7
8
9
10
11
## Analysis routing

1. If `input_valid` is not true, stop before domain analysis.
2. If coverage is below 0.80, label all absence-of-signal conclusions as
unknown and disclose limited coverage.
3. For every domain whose signal is true, run its analysis branch.
4. For a false signal with sufficient coverage, skip the branch and record
`skipped_no_signal`.
5. For an unknown signal, do not claim the domain is normal. Record the reason
and request additional data only when it is necessary to answer the user.
6. After all selected branches finish, run evidence correlation.

22.3 路由结果

1
2
3
4
5
6
7
8
scheduler = true
→ 执行 scheduler branch

memory = unknown
→ 不执行深度分析;记录数据缺失

io = true
→ 执行 I/O branch

22.4 汇合

1
2
3
4
5
6
7
Scheduler: high run-queue delay during 01:12–01:18
I/O: device queue latency normal until 01:17, then increases
Deployment: new worker count applied at 01:10

Correlation:
→ 调度拥塞先出现,I/O 延迟可能是后续影响
→ 内存分支 unknown,不能排除 reclaim 参与

最终结论保留证据顺序和未知项,而不是为了给出单一答案而忽略分支状态。


23. 如何编写分支伪代码

推荐风格:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if blocking precondition fails:
stop

if required user choice is missing:
ask

selected_branches = []

if scheduler_signal == true:
selected_branches += scheduler

if memory_signal == true:
selected_branches += memory

if io_signal == true:
selected_branches += io

if selected_branches is empty:
if all signals == false and coverage sufficient:
report no supported anomaly in observed domains
else:
report insufficient evidence

run selected branches
validate each branch result
correlate results

它显式处理:

  • 阻断条件;
  • 用户输入;
  • 多分支;
  • 空分支集合;
  • false 与 unknown;
  • 汇合与验证。

24. 如何测试分支

24.1 Branch Coverage

每条分支至少有一个测试用例:

  • true;
  • false;
  • unknown;
  • error;
  • default。

24.2 Boundary Testing

例如阈值为 200 ms:

1
2
3
199.9
200.0
200.1

明确是 > 还是 >=。

24.3 Combination Testing

三个布尔信号有八种组合:

1
000 001 010 011 100 101 110 111

如果再加入 unknown,组合更多。可以使用 pairwise 测试、决策表和风险优先方法,避免只测最常见路径。

24.4 Priority Testing

构造多个条件同时成立的案例,检查是否执行正确优先级。

例如:

1
2
输入有效 + 用户请求发布 + 权限不足
→ 必须走权限阻断分支,而不是发布分支

24.5 Negative Testing

  • 不应进入的分支是否保持关闭;
  • 只读请求是否避免写工具;
  • unknown 是否没有被当成 false;
  • 无授权是否不执行副作用。

24.6 Path Testing

不仅测试单个条件,还要测试从开始到结束的完整路径:

1
input → validation → routing → domain branch → correlation → report

24.7 Mutation Testing 思路

尝试反转条件或删除一个分支,确认测试能失败。如果测试仍然全部通过,说明分支测试没有真正约束行为。


25. 分支可观测性

生产环境中应记录:

  • 决策点 ID;
  • 条件输入;
  • 条件状态;
  • 证据来源;
  • 选择的分支;
  • 跳过原因;
  • unknown 原因;
  • 分支执行结果;
  • 汇合状态。

示例:

1
2
3
4
5
6
7
{
"decision_id": "route-domain-analysis",
"condition": "scheduler_signal",
"value": true,
"source": "artifacts/triage.json",
"selected_branch": "scheduler-analysis"
}

不要记录不必要的敏感原始数据。可观测性的目标是解释“为什么走这条路”,不是复制全部上下文。


26. 安全:条件分支可能成为权限绕过点

26.1 不受信任内容不能决定授权

网页、邮件或工具结果中的文本不能触发高权限动作。

26.2 模糊条件不能用于破坏性操作

1
2
if cleanup seems necessary:
delete files

这种规则不可接受。删除范围、目标和授权必须明确。

26.3 安全分支不得被后续普通分支覆盖

如果安全检查失败,后续“业务成功”条件不能重新打开被阻断动作。

26.4 审查条件性指令

Anthropic 企业安全指南把“根据特定输入条件改变行为、隐藏动作或规避安全规则”的指令操纵列为高风险项。第三方 Skill 中看似普通的 if 也需要安全审查。


27. 常见错误

27.1 使用“视情况而定”

没有条件、证据和行为定义,无法执行和测试。

27.2 把 unknown 当 false

导致错误排除某条路径。

27.3 使用 else if 表达可组合根因

强迫系统只选择一个领域,遗漏并发问题。

27.4 多个 if 表达本应互斥的格式选择

同一输入可能被多个解析器重复处理。

27.5 没有默认分支

未知输入可能落入不安全路径或让 Workflow 中断。

27.6 默认分支过于激进

把不确定状态默认成 production、公开、覆盖或发送。

27.7 条件依赖未验证的工具结果

工具成功返回不代表字段完整或语义正确。

27.8 分支有入口,没有出口标准

无法判断何时汇合或交付。

27.9 只测试 Happy Path

未覆盖 false、unknown、多条件同时成立和阻断分支。

27.10 分支嵌套过深

难以理解、维护和验证,应该使用 Guard Clause、决策表或状态机。

27.11 条件分散在多个文件且相互冲突

路由主干应有单一权威位置。

27.12 用分支隐藏范围扩张

Skill 不能因为某个工具可用,就在没有用户授权时进入额外副作用分支。


28. 一份可复用模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
## Decision point: [name]

### Inputs
- [validated state or field]
- [evidence source]

### Priority
1. Safety and authorization gates
2. Input validity
3. User intent
4. Task-specific branches
5. Safe default

### Rules

- If [blocking condition]: stop and report [reason].
- If [missing user choice]: ask [specific question].
- If [condition A is true]: enter [branch A].
- If [condition B is true]: enter [branch B].
- If [condition is false]: record [skip state].
- If [condition is unknown]: do not treat it as false; record [reason].

### Branch contract

For each selected branch:
- required inputs: [...]
- action: [...]
- postconditions: [...]
- output status: complete / partial / skipped / unknown / failed

### Merge

- Normalize branch outputs to [schema].
- Preserve conflicting findings.
- Distinguish skipped, unknown, and failed branches.
- Run [correlation/final validation] before delivery.

29. 博客总结

条件判断与分支把 Skill 从固定步骤列表提升为真正的 Workflow。

1
2
3
4
5
6
7
8
9
Input / Evidence / State
↓
Explicit Condition
↓
Selected Branch
↓
Action + Postcondition
↓
Merge or Exit

OpenAI 官方资料指出,Skill 特别适合高度条件化的可复用过程,并要求作者明确何时询问、停止或拒绝,以及怎样处理缺失和歧义结果。Anthropic 的企业实践强调对触发、指令遵从、边界案例和条件性安全行为进行系统评估。

最重要的设计原则是:

  • 条件来自可观察状态;
  • unknown 不等于 false;
  • 互斥分支与可组合分支要区分;
  • 安全、输入有效性和授权拥有更高优先级;
  • 默认分支必须保守;
  • Ask、Stop、Decline 都是合法出口;
  • 每条分支都有 Contract 和 Postcondition;
  • 分叉之后必须定义汇合;
  • 分支逻辑必须能被测试覆盖。

30. 学完检查题

  1. 一个完整分支包含哪六个组成部分?
  2. 为什么“如果结果可疑”不是可执行条件?
  3. true、false 和 unknown 应怎样区分?
  4. 什么场景使用 else if,什么场景使用多个独立 if?
  5. 多个条件同时成立时,常见优先级是什么?
  6. Guard Clause 有什么优势?
  7. 为什么默认分支应保守?
  8. Ask、Stop、Decline 分别适用于什么情况?
  9. 决策表、决策树和状态机分别适合什么问题?
  10. 为什么分支判断条件不能全部放在尚未加载的 reference 中?
  11. 可组合分支为什么需要统一汇合协议?
  12. 怎样验证一套分支测试真正有效?

31. Skill 专项复盘

31.1 这个逻辑应该写在 SKILL.md 还是 reference?

主路由、优先级、阻断条件和默认分支写在 SKILL.md;大型决策表和详细领域判断规则可放 reference,但主文件必须说明何时加载。

31.2 这个步骤应该交给 LLM 还是 script?

数值阈值、格式和 Schema 条件优先由 script 判断;用户意图、语义相关性和证据解释可以由 LLM 判断;高风险分支需要额外的机器约束或服务端授权。

31.3 这个能力应该是 Skill 还是 Tool?

分支属于 Skill 的 Workflow;Tool 只提供原子能力和状态。不要把整个业务决策树塞进一个万能 Tool。

31.4 什么条件下应该触发这个 Skill?

Skill 的全局触发由 metadata 决定;本章分支发生在 Skill 已经加载之后,根据输入、证据、权限和工作流状态选择内部路径。

31.5 如何证明这个 Skill 比没有 Skill 更好?

测量分支选择准确率、无关分支执行率、unknown 误判率、阻断规则遵从率、路径完成率和分支覆盖率。


32. 本章实践

为 Performance Analysis Skill 设计一个三领域分支系统:

1
2
3
scheduler-analysis
memory-analysis
io-analysis

要求:

  1. 为每个信号定义 true、false 和 unknown;
  2. 指定信号来源、单位、阈值和数据覆盖要求;
  3. 使用 Guard Clause 处理输入失败、权限和工具不可用;
  4. 明确三个分支可以组合,而不是互斥;
  5. 为每个分支写 Entry、Output 和 Exit Contract;
  6. 设计统一汇合 Schema;
  7. 构造三个信号同时成立的测试;
  8. 构造一个分支 unknown、另两个分支完成的测试;
  9. 构造安全条件与业务条件同时成立的优先级测试;
  10. 使用决策表列出至少八个关键组合。

下一章将严格按照大纲进入:

第 17 章:循环、重试、Fallback 怎么设计。


官方参考资料


Agent Skill 原理与工程实践(十六):Skill 里的条件判断与分支
https://cj0510.github.io/2026/10/07/AI/Skill/16-Skill里的条件判断与分支/
作者
CJ1018
发布于
2026年10月7日
许可协议
CC BY-NC-SA 4.0