kc-beta 0.8.1 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/agent/context.js +17 -1
- package/src/agent/engine.js +85 -8
- package/src/agent/llm-client.js +24 -1
- package/src/agent/pipelines/_milestone-derive.js +78 -7
- package/src/agent/pipelines/skill-authoring.js +19 -2
- package/src/agent/tools/release.js +94 -1
- package/src/cli/index.js +28 -7
- package/template/.env.template +1 -1
- package/template/AGENT.md +2 -2
- package/template/skills/en/auto-model-selection/SKILL.md +55 -35
- package/template/skills/en/bootstrap-workspace/SKILL.md +13 -0
- package/template/skills/en/compliance-judgment/SKILL.md +14 -0
- package/template/skills/en/confidence-system/SKILL.md +30 -8
- package/template/skills/en/corner-case-management/SKILL.md +53 -33
- package/template/skills/en/cross-document-verification/SKILL.md +88 -83
- package/template/skills/en/dashboard-reporting/SKILL.md +91 -66
- package/template/skills/en/dashboard-reporting/scripts/generate_dashboard.py +1 -1
- package/template/skills/en/data-sensibility/SKILL.md +19 -12
- package/template/skills/en/document-chunking/SKILL.md +99 -15
- package/template/skills/en/entity-extraction/SKILL.md +14 -4
- package/template/skills/en/quality-control/SKILL.md +14 -0
- package/template/skills/en/rule-extraction/SKILL.md +92 -94
- package/template/skills/en/rule-extraction/references/chunking-strategies.md +7 -78
- package/template/skills/en/skill-authoring/SKILL.md +52 -8
- package/template/skills/en/skill-creator/SKILL.md +25 -3
- package/template/skills/en/skill-to-workflow/SKILL.md +23 -4
- package/template/skills/en/task-decomposition/SKILL.md +1 -1
- package/template/skills/en/tree-processing/SKILL.md +1 -1
- package/template/skills/en/version-control/SKILL.md +15 -0
- package/template/skills/en/work-decomposition/SKILL.md +21 -35
- package/template/skills/zh/auto-model-selection/SKILL.md +54 -33
- package/template/skills/zh/bootstrap-workspace/SKILL.md +13 -0
- package/template/skills/zh/compliance-judgment/SKILL.md +14 -0
- package/template/skills/zh/compliance-judgment/references/output-format.md +62 -62
- package/template/skills/zh/confidence-system/SKILL.md +34 -9
- package/template/skills/zh/corner-case-management/SKILL.md +71 -104
- package/template/skills/zh/cross-document-verification/SKILL.md +90 -195
- package/template/skills/zh/cross-document-verification/references/contradiction-taxonomy.md +36 -36
- package/template/skills/zh/dashboard-reporting/SKILL.md +82 -232
- package/template/skills/zh/dashboard-reporting/scripts/generate_dashboard.py +1 -1
- package/template/skills/zh/data-sensibility/SKILL.md +13 -0
- package/template/skills/zh/document-chunking/SKILL.md +96 -20
- package/template/skills/zh/document-parsing/references/parser-catalog.md +26 -26
- package/template/skills/zh/entity-extraction/SKILL.md +14 -4
- package/template/skills/zh/evolution-loop/references/convergence-guide.md +38 -38
- package/template/skills/zh/quality-control/SKILL.md +14 -0
- package/template/skills/zh/quality-control/references/qa-layers.md +65 -65
- package/template/skills/zh/quality-control/references/sampling-strategies.md +49 -49
- package/template/skills/zh/rule-extraction/SKILL.md +199 -188
- package/template/skills/zh/rule-extraction/references/chunking-strategies.md +5 -78
- package/template/skills/zh/skill-authoring/SKILL.md +108 -69
- package/template/skills/zh/skill-authoring/references/skill-format-spec.md +39 -39
- package/template/skills/zh/skill-creator/SKILL.md +71 -61
- package/template/skills/zh/skill-creator/references/schemas.md +60 -60
- package/template/skills/zh/skill-to-workflow/SKILL.md +24 -5
- package/template/skills/zh/skill-to-workflow/references/worker-llm-catalog.md +24 -24
- package/template/skills/zh/task-decomposition/SKILL.md +1 -1
- package/template/skills/zh/task-decomposition/references/decision-matrix.md +54 -54
- package/template/skills/zh/tree-processing/SKILL.md +1 -1
- package/template/skills/zh/version-control/SKILL.md +15 -0
- package/template/skills/zh/version-control/references/trace-id-spec.md +34 -34
- package/template/skills/zh/work-decomposition/SKILL.md +21 -33
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skill-creator
|
|
3
3
|
tier: meta
|
|
4
|
-
description:
|
|
4
|
+
description: Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# Skill
|
|
7
|
+
# Skill creator(KC 兜底)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
这是 Anthropic 上游 `skill-creator` 方法论的中文版,作为编写复杂技能时的深度参考随 KC 一并发布。KC 内部主流的技能编写路径是 `skill-authoring` 技能(核心思想沿袭自本技能)。只有当 `skill-authoring` 的指引对你正在编写的技能复杂度而言不够用时,才直接来查阅 `skill-creator`——例如你想跑正式的评估循环、做带方差分析的基准对比,或对触发用的 description 做优化。关于"先做哪些技能、怎样分组"的决策,请参考 `work-decomposition`。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
一个用于创建新技能并对其进行迭代改进的技能。
|
|
10
14
|
|
|
11
15
|
从高层次看,创建一个技能的流程大致如下:
|
|
12
16
|
|
|
@@ -20,26 +24,26 @@ description: Anthropic's skill-scaffolding toolkit — use for iterating/improvi
|
|
|
20
24
|
- 反复迭代,直到满意为止
|
|
21
25
|
- 扩充测试集,在更大规模上再跑一遍
|
|
22
26
|
|
|
23
|
-
使用这个技能时,你的工作是判断用户目前处在上述流程的哪个阶段,然后从那里切入帮他们继续推进。比如,用户可能说"我想做一个 X 的技能"
|
|
27
|
+
使用这个技能时,你的工作是判断用户目前处在上述流程的哪个阶段,然后从那里切入帮他们继续推进。比如,用户可能说"我想做一个 X 的技能"。你就可以帮他们澄清需求、写初稿、写测试用例、确定评估方式、跑完所有提示词、再迭代。
|
|
24
28
|
|
|
25
|
-
|
|
29
|
+
另一种情况是,他们已经有一个技能初稿。这时你可以直接跳到评估/迭代那一段循环。
|
|
26
30
|
|
|
27
|
-
当然,你应当保持灵活。如果用户说"我不想跑一堆评估,咱们就随意一点感觉感觉"
|
|
31
|
+
当然,你应当保持灵活。如果用户说"我不想跑一堆评估,咱们就随意一点感觉感觉",那就这样做也没问题。
|
|
28
32
|
|
|
29
|
-
技能基本完成之后(顺序仍然是灵活的),你还可以运行技能描述优化器——我们为此专门写了一个脚本——来优化技能的触发表现。
|
|
33
|
+
技能基本完成之后(顺序仍然是灵活的),你还可以运行技能描述优化器——我们为此专门写了一个脚本——来优化技能的触发表现。
|
|
30
34
|
|
|
31
35
|
可以了吧?可以了。
|
|
32
36
|
|
|
33
37
|
## 与用户沟通
|
|
34
38
|
|
|
35
|
-
skill creator 的使用者可能跨越从对编程行话非常陌生到相当熟悉的整个区间。如果你没听说过的话(也很正常,这个趋势也才刚出现没多久),现在出现了一股潮流:Claude 的能力激发着水管工去打开终端、爸爸妈妈和爷爷奶奶去 google "怎么安装 npm"
|
|
39
|
+
skill creator 的使用者可能跨越从对编程行话非常陌生到相当熟悉的整个区间。如果你没听说过的话(也很正常,这个趋势也才刚出现没多久),现在出现了一股潮流:Claude 的能力激发着水管工去打开终端、爸爸妈妈和爷爷奶奶去 google "怎么安装 npm"。不过绝大多数用户应该还是对计算机比较熟悉的。
|
|
36
40
|
|
|
37
41
|
所以请关注上下文线索,据此判断该如何措辞!默认情况下大概可以这样把握尺度:
|
|
38
42
|
|
|
39
43
|
- "evaluation" 和 "benchmark" 处于临界状态,但通常可以直接用
|
|
40
44
|
- 对于 "JSON" 和 "assertion",则要看到用户给出明确信号、表明他们了解这些概念之后,再直接使用、不加解释
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
如果拿不准,简短地解释一下术语也完全可以;只要担心用户可能不懂,就顺手给一个一句话的定义。
|
|
43
47
|
|
|
44
48
|
---
|
|
45
49
|
|
|
@@ -47,7 +51,7 @@ skill creator 的使用者可能跨越从对编程行话非常陌生到相当熟
|
|
|
47
51
|
|
|
48
52
|
### 捕捉意图
|
|
49
53
|
|
|
50
|
-
先从理解用户的意图开始。当前对话里可能已经包含了用户想要沉淀为技能的工作流程(例如他们说"把这个变成一个技能"
|
|
54
|
+
先从理解用户的意图开始。当前对话里可能已经包含了用户想要沉淀为技能的工作流程(例如他们说"把这个变成一个技能")。如果是这种情况,先从对话历史中提取答案——用过哪些工具、步骤的顺序、用户做过哪些修正、观察到的输入/输出格式。剩下的缺口由用户来补齐,并在进入下一步之前请他们确认。
|
|
51
55
|
|
|
52
56
|
1. 这个技能应该让 Claude 能做什么?
|
|
53
57
|
2. 这个技能应该在什么时候触发?(什么样的用户话术/语境)
|
|
@@ -56,16 +60,16 @@ skill creator 的使用者可能跨越从对编程行话非常陌生到相当熟
|
|
|
56
60
|
|
|
57
61
|
### 访谈与调研
|
|
58
62
|
|
|
59
|
-
|
|
63
|
+
主动询问关于边界情况、输入/输出格式、示例文件、成功标准和依赖项的问题。在把这一部分敲定之前,不要急着写测试提示词。
|
|
60
64
|
|
|
61
|
-
留意可用的 MCP
|
|
65
|
+
留意可用的 MCP——如果它们对调研有帮助(搜索文档、查找相似技能、了解最佳实践),并且环境支持子代理就并行调研,否则就在主线程内联进行。带着上下文进入,可以减轻用户的负担。
|
|
62
66
|
|
|
63
67
|
### 编写 SKILL.md
|
|
64
68
|
|
|
65
69
|
基于对用户的访谈结果,填写以下组成部分:
|
|
66
70
|
|
|
67
71
|
- **name**:技能标识符
|
|
68
|
-
- **description**:何时触发、做什么。这是最主要的触发机制——既要写技能"做什么",又要写"什么场景下使用它"的具体描述。所有"何时使用"的信息都放在这里,不要放在正文里。注意:当前 Claude 容易"触发不足"——明明应该用的技能却不调用。为了对冲这种倾向,请把技能描述写得稍微"催促"一点。比如,与其写"用于构建一个简单快速的仪表盘,以展示 Anthropic 内部数据。",不如写"用于构建一个简单快速的仪表盘,以展示 Anthropic 内部数据。只要用户提到 dashboard、数据可视化、内部指标,或者想要展示任何类型的公司数据,都要使用这个技能,即使他们没有显式说出'dashboard'这个词。"
|
|
72
|
+
- **description**:何时触发、做什么。这是最主要的触发机制——既要写技能"做什么",又要写"什么场景下使用它"的具体描述。所有"何时使用"的信息都放在这里,不要放在正文里。注意:当前 Claude 容易"触发不足"——明明应该用的技能却不调用。为了对冲这种倾向,请把技能描述写得稍微"催促"一点。比如,与其写"用于构建一个简单快速的仪表盘,以展示 Anthropic 内部数据。",不如写"用于构建一个简单快速的仪表盘,以展示 Anthropic 内部数据。只要用户提到 dashboard、数据可视化、内部指标,或者想要展示任何类型的公司数据,都要使用这个技能,即使他们没有显式说出 'dashboard' 这个词。"
|
|
69
73
|
- **compatibility**:依赖的工具、依赖项(可选,很少需要)
|
|
70
74
|
- **技能的剩余部分 :)**
|
|
71
75
|
|
|
@@ -91,14 +95,14 @@ skill-name/
|
|
|
91
95
|
2. **SKILL.md 正文**——技能被触发时进入上下文(理想情况下少于 500 行)
|
|
92
96
|
3. **打包资源**——按需加载(无上限;脚本可以执行而无需被加载进上下文)
|
|
93
97
|
|
|
94
|
-
|
|
98
|
+
这些字数都是大概数字,必要时可以放宽。
|
|
95
99
|
|
|
96
100
|
**关键模式:**
|
|
97
101
|
- 把 SKILL.md 控制在 500 行以内;如果接近上限,就再加一层目录层级,并清楚地告诉调用该技能的模型"下一步该去哪里"。
|
|
98
102
|
- 在 SKILL.md 中清晰地引用其他文件,并说明何时去读它们
|
|
99
103
|
- 对于较大的参考文件(>300 行),请加上目录
|
|
100
104
|
|
|
101
|
-
|
|
105
|
+
**按领域组织**:当一个技能要支持多个领域/框架时,按变体组织:
|
|
102
106
|
```
|
|
103
107
|
cloud-deploy/
|
|
104
108
|
├── SKILL.md (workflow + selection)
|
|
@@ -111,7 +115,7 @@ Claude 只会读取相关的那一份参考文件。
|
|
|
111
115
|
|
|
112
116
|
#### 不让用户惊讶的原则
|
|
113
117
|
|
|
114
|
-
这点几乎不言自明,但还是要说:技能不得包含恶意代码、漏洞利用代码,或任何可能危及系统安全的内容。技能的实际内容不应让用户对其意图感到意外——如果你向用户描述这个技能,它的真实行为应该与描述一致。不要配合用户写出误导性的技能,或者用于未授权访问、数据外泄等恶意目的的技能。但像"扮演 XYZ 角色"
|
|
118
|
+
这点几乎不言自明,但还是要说:技能不得包含恶意代码、漏洞利用代码,或任何可能危及系统安全的内容。技能的实际内容不应让用户对其意图感到意外——如果你向用户描述这个技能,它的真实行为应该与描述一致。不要配合用户写出误导性的技能,或者用于未授权访问、数据外泄等恶意目的的技能。但像"扮演 XYZ 角色"这种是可以的。
|
|
115
119
|
|
|
116
120
|
#### 写作模式
|
|
117
121
|
|
|
@@ -137,11 +141,11 @@ Output: feat(auth): implement JWT-based authentication
|
|
|
137
141
|
|
|
138
142
|
### 写作风格
|
|
139
143
|
|
|
140
|
-
尽量向模型解释清楚某件事情为什么重要,而不是堆砌生硬死板的"必须 MUST"
|
|
144
|
+
尽量向模型解释清楚某件事情为什么重要,而不是堆砌生硬死板的"必须 MUST"。运用心智理论,把技能写得通用一些,而不是死扣具体例子。先写一版初稿,然后过一段时间用全新的眼光重新审视、加以改进。
|
|
141
145
|
|
|
142
146
|
### 测试用例
|
|
143
147
|
|
|
144
|
-
写完技能初稿后,准备 2–3 条贴近实际的测试提示词——也就是真实用户实际可能说出的话。把它们摆给用户看:[不必照搬这段措辞]"这里有几条我想跑一下的测试用例,看着合适吗?还要再加几条吗?"
|
|
148
|
+
写完技能初稿后,准备 2–3 条贴近实际的测试提示词——也就是真实用户实际可能说出的话。把它们摆给用户看:[不必照搬这段措辞]"这里有几条我想跑一下的测试用例,看着合适吗?还要再加几条吗?"然后就去跑。
|
|
145
149
|
|
|
146
150
|
把测试用例保存到 `evals/evals.json`。这一步先不写断言(assertion),只写提示词。断言会在下一步、运行测试的过程中起草。
|
|
147
151
|
|
|
@@ -163,16 +167,14 @@ Output: feat(auth): implement JWT-based authentication
|
|
|
163
167
|
|
|
164
168
|
## 运行并评估测试用例
|
|
165
169
|
|
|
166
|
-
这一节是一个连续的整体——不要中途停下。不要使用 `/skill-test`
|
|
170
|
+
这一节是一个连续的整体——不要中途停下。不要使用 `/skill-test` 或任何其他测试用的技能。
|
|
167
171
|
|
|
168
|
-
把结果放在 `<skill-name>-workspace/` 下,与技能目录平级。在 workspace 内部,按迭代分组(`iteration-1/`、`iteration-2/` 等),每个测试用例再各占一个目录(`eval-0/`、`eval-1/`
|
|
172
|
+
把结果放在 `<skill-name>-workspace/` 下,与技能目录平级。在 workspace 内部,按迭代分组(`iteration-1/`、`iteration-2/` 等),每个测试用例再各占一个目录(`eval-0/`、`eval-1/` 等)。不必一开始就把所有目录建好——边做边建即可。
|
|
169
173
|
|
|
170
174
|
### 第 1 步:在同一轮里启动全部运行(with-skill 与 baseline)
|
|
171
175
|
|
|
172
176
|
针对每个测试用例,在同一轮里启动两个子代理——一个带技能,一个不带。这一点很重要:不要先把 with-skill 的那一轮全跑完、之后再回来补 baseline。所有任务一次性启动,让它们大约同时完成。
|
|
173
177
|
|
|
174
|
-
这种并行启动的安排不光是为了"省时间"——更重要的是保证两路运行处于尽可能相近的执行环境下(同一段时间窗口、同一组后端负载),减少由"先跑后跑"引入的系统性偏差。
|
|
175
|
-
|
|
176
178
|
**带技能的运行:**
|
|
177
179
|
|
|
178
180
|
```
|
|
@@ -203,9 +205,9 @@ Execute this task:
|
|
|
203
205
|
|
|
204
206
|
不要光等运行结束——这段时间可以利用起来。为每个测试用例起草定量断言,并向用户解释这些断言。如果 `evals/evals.json` 里已经有断言,过一遍并向用户说明每条检查的是什么。
|
|
205
207
|
|
|
206
|
-
|
|
208
|
+
好的断言是客观可验证的,并且名字有描述性——在基准查看器里一眼就能看出每条到底在检查什么。主观性的技能(写作风格、设计质感)更适合做定性评估——不要硬把断言套到需要人类判断的事情上。
|
|
207
209
|
|
|
208
|
-
起草完之后,把断言更新进 `eval_metadata.json` 和 `evals/evals.json
|
|
210
|
+
起草完之后,把断言更新进 `eval_metadata.json` 和 `evals/evals.json`。同时也告诉用户他们会在查看器里看到什么——既包括定性的输出,也包括定量的基准指标。
|
|
209
211
|
|
|
210
212
|
### 第 3 步:随着任务完成抓取计时数据
|
|
211
213
|
|
|
@@ -219,7 +221,7 @@ Execute this task:
|
|
|
219
221
|
}
|
|
220
222
|
```
|
|
221
223
|
|
|
222
|
-
|
|
224
|
+
这是你抓取这些数据的唯一机会——它们随任务通知一起来,并不会被持久化到别的地方。请收到一条就处理一条,不要等着攒一批再处理。
|
|
223
225
|
|
|
224
226
|
### 第 4 步:评分、汇总、并启动查看器
|
|
225
227
|
|
|
@@ -247,7 +249,7 @@ Execute this task:
|
|
|
247
249
|
```
|
|
248
250
|
到第 2 次及以后的迭代,还要加上 `--previous-workspace <workspace>/iteration-<N-1>`。
|
|
249
251
|
|
|
250
|
-
**Cowork /
|
|
252
|
+
**Cowork / 无界面环境:** 如果 `webbrowser.open()` 不可用,或者环境根本没有显示器,请用 `--static <output_path>` 来生成一份独立的 HTML 文件,而不是启动服务器。用户点击 "Submit All Reviews" 时反馈会被下载为 `feedback.json` 文件。下载之后,把 `feedback.json` 拷进 workspace 目录,下一轮迭代会读取它。
|
|
251
253
|
|
|
252
254
|
注意:请使用 generate_review.py 来生成查看器;没必要手写 HTML。
|
|
253
255
|
|
|
@@ -284,7 +286,7 @@ Execute this task:
|
|
|
284
286
|
|
|
285
287
|
反馈为空意味着用户觉得没问题。请把改进精力集中在那些用户提出了具体意见的测试用例上。
|
|
286
288
|
|
|
287
|
-
|
|
289
|
+
事情做完之后记得把查看器服务进程关掉:
|
|
288
290
|
|
|
289
291
|
```bash
|
|
290
292
|
kill $VIEWER_PID 2>/dev/null
|
|
@@ -294,17 +296,17 @@ kill $VIEWER_PID 2>/dev/null
|
|
|
294
296
|
|
|
295
297
|
## 改进技能
|
|
296
298
|
|
|
297
|
-
|
|
299
|
+
这一段是整个循环的核心。你跑完了测试用例,用户也评审了结果,接下来要根据他们的反馈把技能做得更好。
|
|
298
300
|
|
|
299
301
|
### 怎样思考改进
|
|
300
302
|
|
|
301
|
-
1. **从反馈中泛化。** 这里大局上要明白的是:我们想做的是能被使用上百万次(也许字面意义上、甚至更多次,谁知道呢)、横跨各种各样提示词的技能。眼下你和用户只是反复在少数几个例子上迭代,因为这样推进得快。这些例子用户烂熟于心,新输出他们一眼就能评估。但如果你和用户共同开发出来的技能只在这几个例子上管用,那就毫无意义。与其塞进各种过拟合的小补丁、或者堆上一堆压迫性的 MUST
|
|
303
|
+
1. **从反馈中泛化。** 这里大局上要明白的是:我们想做的是能被使用上百万次(也许字面意义上、甚至更多次,谁知道呢)、横跨各种各样提示词的技能。眼下你和用户只是反复在少数几个例子上迭代,因为这样推进得快。这些例子用户烂熟于心,新输出他们一眼就能评估。但如果你和用户共同开发出来的技能只在这几个例子上管用,那就毫无意义。与其塞进各种过拟合的小补丁、或者堆上一堆压迫性的 MUST,不如在遇到某个顽固问题时换条路子:尝试新的比喻、推荐不一样的工作模式。试一下成本很低,说不定就撞到一个特别好的写法。
|
|
302
304
|
|
|
303
|
-
2. **保持提示词精简。** 把那些没在出力的内容删掉。除了看最终输出,请务必读一下完整的 transcript
|
|
305
|
+
2. **保持提示词精简。** 把那些没在出力的内容删掉。除了看最终输出,请务必读一下完整的 transcript——如果发现技能让模型在无谓的事情上浪费时间,可以试着去掉造成这种浪费的部分,看看效果。
|
|
304
306
|
|
|
305
|
-
3. **解释"为什么"。** 努力把你要求模型做的每件事背后的**原因**讲清楚。今天的 LLM 是*聪明*的。它们有不错的心智理论,在有好用的引导框架时能跳出机械执行、把事情真正做成。即使用户的反馈很简短、甚至带着不耐烦,也要努力理解任务本身,理解用户为什么这样写、他们究竟写了什么,然后把这种理解传递到指令里去。如果你发现自己在用大写 ALWAYS 或 NEVER
|
|
307
|
+
3. **解释"为什么"。** 努力把你要求模型做的每件事背后的**原因**讲清楚。今天的 LLM 是*聪明*的。它们有不错的心智理论,在有好用的引导框架时能跳出机械执行、把事情真正做成。即使用户的反馈很简短、甚至带着不耐烦,也要努力理解任务本身,理解用户为什么这样写、他们究竟写了什么,然后把这种理解传递到指令里去。如果你发现自己在用大写 ALWAYS 或 NEVER、或者用上特别死板的结构,那是个黄色警示——尽可能换种说法,把背后的道理讲明白,让模型理解你为什么要求做这件事。这样更人性、也更有力、更有效。
|
|
306
308
|
|
|
307
|
-
4. **留意各个测试用例之间的重复劳动。** 阅读测试运行的 transcript,留意几个子代理是不是都各自独立写了类似的辅助脚本、或者走了同样的多步流程。如果 3 个测试用例里子代理都各自写了一个 `create_docx.py` 或 `build_chart.py`,那就是一个很强的信号:这个技能应该把那段脚本打包进来。写一次,放到 `scripts
|
|
309
|
+
4. **留意各个测试用例之间的重复劳动。** 阅读测试运行的 transcript,留意几个子代理是不是都各自独立写了类似的辅助脚本、或者走了同样的多步流程。如果 3 个测试用例里子代理都各自写了一个 `create_docx.py` 或 `build_chart.py`,那就是一个很强的信号:这个技能应该把那段脚本打包进来。写一次,放到 `scripts/`,然后让技能去调用它。这样以后每次调用都不必从零再造一遍。
|
|
308
310
|
|
|
309
311
|
这项任务相当重要(我们可是想在这上面每年创造数十亿美元的经济价值!),而思考时间从来不是瓶颈;请慢慢来,反复琢磨。我建议先写一版修订稿,然后用全新的眼光再看一遍,进一步打磨。真的努力站到用户的位置,去理解他们想要什么、需要什么。
|
|
310
312
|
|
|
@@ -313,7 +315,7 @@ kill $VIEWER_PID 2>/dev/null
|
|
|
313
315
|
改完技能之后:
|
|
314
316
|
|
|
315
317
|
1. 把改进应用到技能上
|
|
316
|
-
2. 把所有测试用例都重新跑一遍,写到一个新的 `iteration-<N+1>/` 目录里,也包括 baseline 运行。如果你在做的是创建新技能,baseline 一直是 `without_skill`(不带任何技能)——这在所有迭代里保持不变。如果你在改进已有技能,那么用哪种作为 baseline
|
|
318
|
+
2. 把所有测试用例都重新跑一遍,写到一个新的 `iteration-<N+1>/` 目录里,也包括 baseline 运行。如果你在做的是创建新技能,baseline 一直是 `without_skill`(不带任何技能)——这在所有迭代里保持不变。如果你在改进已有技能,那么用哪种作为 baseline 由你判断:用户最初带进来的原始版本,还是上一轮迭代的版本。
|
|
317
319
|
3. 启动评审器,并把 `--previous-workspace` 指向前一次迭代
|
|
318
320
|
4. 等用户评审完、告诉你结束为止
|
|
319
321
|
5. 读取新的反馈,再改进,再迭代
|
|
@@ -323,25 +325,23 @@ kill $VIEWER_PID 2>/dev/null
|
|
|
323
325
|
- 所有反馈都为空(全都看着没问题)
|
|
324
326
|
- 你已经不再做出有意义的进展
|
|
325
327
|
|
|
326
|
-
注意到第三条:"不再做出有意义的进展"是一个真实存在的终止状态——并不是每一轮迭代都必然带来改进。当你发现新一版主要是在"换个说法"或者"在某个例子上略微更好、在另一个例子上略微更差",那很可能就是接近天花板的信号;此时应该明说出来,让用户决定是收工还是改换思路(比如扩展测试集、加入完全不同的用例)。
|
|
327
|
-
|
|
328
328
|
---
|
|
329
329
|
|
|
330
330
|
## 进阶:盲对比
|
|
331
331
|
|
|
332
|
-
在需要对一个技能的两个版本做更严格比较的情况下(比如用户问"新版本到底是不是真的更好?"),有一套盲对比体系。详情请读 `agents/comparator.md` 和 `agents/analyzer.md`。基本思路是:把两份输出交给一个独立代理、但不告诉它哪份是哪份,让它来评判质量。然后再分析"赢的那份为什么赢"
|
|
332
|
+
在需要对一个技能的两个版本做更严格比较的情况下(比如用户问"新版本到底是不是真的更好?"),有一套盲对比体系。详情请读 `agents/comparator.md` 和 `agents/analyzer.md`。基本思路是:把两份输出交给一个独立代理、但不告诉它哪份是哪份,让它来评判质量。然后再分析"赢的那份为什么赢"。
|
|
333
333
|
|
|
334
|
-
|
|
334
|
+
这个步骤是可选的,需要子代理,多数用户用不到。人工评审循环通常已经够用。
|
|
335
335
|
|
|
336
336
|
---
|
|
337
337
|
|
|
338
338
|
## 描述优化
|
|
339
339
|
|
|
340
|
-
SKILL.md 前置元信息(frontmatter)里的 description 字段是决定 Claude 是否调用一个技能的主要机制。在创建或改进一个技能之后,可以主动提议优化它的 description
|
|
340
|
+
SKILL.md 前置元信息(frontmatter)里的 description 字段是决定 Claude 是否调用一个技能的主要机制。在创建或改进一个技能之后,可以主动提议优化它的 description,以提升触发的准确性。
|
|
341
341
|
|
|
342
342
|
### 第 1 步:生成触发评估查询
|
|
343
343
|
|
|
344
|
-
写出 20 条 eval 查询——里面既有"应当触发"的,也有"不应当触发"
|
|
344
|
+
写出 20 条 eval 查询——里面既有"应当触发"的,也有"不应当触发"的。保存为 JSON:
|
|
345
345
|
|
|
346
346
|
```json
|
|
347
347
|
[
|
|
@@ -364,7 +364,7 @@ SKILL.md 前置元信息(frontmatter)里的 description 字段是决定 Clau
|
|
|
364
364
|
|
|
365
365
|
### 第 2 步:与用户一起评审
|
|
366
366
|
|
|
367
|
-
用 HTML 模板把这套 eval
|
|
367
|
+
用 HTML 模板把这套 eval 集合呈给用户评审:
|
|
368
368
|
|
|
369
369
|
1. 从 `assets/eval_review.html` 读取模板
|
|
370
370
|
2. 替换占位符:
|
|
@@ -379,7 +379,7 @@ SKILL.md 前置元信息(frontmatter)里的 description 字段是决定 Clau
|
|
|
379
379
|
|
|
380
380
|
### 第 3 步:运行优化循环
|
|
381
381
|
|
|
382
|
-
告诉用户:"这个会花一点时间——我会在后台跑优化循环,并定期回来看看进展。"
|
|
382
|
+
告诉用户:"这个会花一点时间——我会在后台跑优化循环,并定期回来看看进展。"
|
|
383
383
|
|
|
384
384
|
把 eval 集合保存到 workspace,然后在后台运行:
|
|
385
385
|
|
|
@@ -396,23 +396,23 @@ python -m scripts.run_loop \
|
|
|
396
396
|
|
|
397
397
|
它运行期间,请周期性地 tail 一下输出,向用户汇报当前是第几轮迭代、得分是什么样子。
|
|
398
398
|
|
|
399
|
-
它会自动完成整个优化循环。它会把 eval 集合按 60% 训练 / 40% 留出测试拆开,先评估当前 description(每条查询跑 3
|
|
399
|
+
它会自动完成整个优化循环。它会把 eval 集合按 60% 训练 / 40% 留出测试拆开,先评估当前 description(每条查询跑 3 次以得到稳定的触发率),再调用 Claude 根据失败用例提出改进建议。它会在新 description 上重新跑训练集和测试集,最多迭代 5 轮。结束时,它会在浏览器里打开一份 HTML 报告,展示每一轮的结果,并返回包含 `best_description` 的 JSON——是按测试集得分而不是训练集得分挑出来的,以避免过拟合。
|
|
400
400
|
|
|
401
401
|
### 技能触发机制的工作原理
|
|
402
402
|
|
|
403
403
|
理解触发机制有助于设计更好的 eval 查询。技能会以 name + description 的形式出现在 Claude 的 `available_skills` 列表里,Claude 根据这个 description 决定是否查阅一个技能。一个要点是:Claude 只会在它自己很难独立完成的任务上去查阅技能——像"读一下这份 PDF"这种简单的一步式查询可能并不会触发技能,哪怕 description 完美匹配,因为 Claude 用基础工具就能直接处理。复杂的、多步骤的、或者专业性强的查询,在 description 匹配的前提下能够可靠地触发技能。
|
|
404
404
|
|
|
405
|
-
这意味着你的 eval 查询要足够有分量,让 Claude 真的能从查阅技能中获益。"读一下文件 X"这种简单查询不是好的测试用例——不管 description
|
|
405
|
+
这意味着你的 eval 查询要足够有分量,让 Claude 真的能从查阅技能中获益。"读一下文件 X"这种简单查询不是好的测试用例——不管 description 写得多好,它们都不会触发技能。
|
|
406
406
|
|
|
407
407
|
### 第 4 步:应用结果
|
|
408
408
|
|
|
409
|
-
从 JSON 输出里取出 `best_description`,更新技能 SKILL.md
|
|
409
|
+
从 JSON 输出里取出 `best_description`,更新技能 SKILL.md 的前置元信息。给用户看一下前后对比,并报告分数。
|
|
410
410
|
|
|
411
411
|
---
|
|
412
412
|
|
|
413
413
|
### 打包与呈现(仅在有 `present_files` 工具时进行)
|
|
414
414
|
|
|
415
|
-
先检查你是否有 `present_files` 工具。如果没有,跳过这一步。如果有,就把技能打包,并把 .skill
|
|
415
|
+
先检查你是否有 `present_files` 工具。如果没有,跳过这一步。如果有,就把技能打包,并把 .skill 文件呈现给用户:
|
|
416
416
|
|
|
417
417
|
```bash
|
|
418
418
|
python -m scripts.package_skill <path/to/skill-folder>
|
|
@@ -424,61 +424,71 @@ python -m scripts.package_skill <path/to/skill-folder>
|
|
|
424
424
|
|
|
425
425
|
## Claude.ai 专用说明
|
|
426
426
|
|
|
427
|
-
在 Claude.ai 上,核心工作流不变(起草 → 测试 → 评审 → 改进 → 重复),但因为 Claude.ai
|
|
427
|
+
在 Claude.ai 上,核心工作流不变(起草 → 测试 → 评审 → 改进 → 重复),但因为 Claude.ai 没有子代理,一些机制需要相应调整:
|
|
428
428
|
|
|
429
|
-
**运行测试用例**:没有子代理就意味着没有并行执行。对每个测试用例,先读技能的 SKILL.md
|
|
429
|
+
**运行测试用例**:没有子代理就意味着没有并行执行。对每个测试用例,先读技能的 SKILL.md,然后照着它的指示自己来完成测试提示词的任务。一次跑一个。这样的严谨度不如让独立子代理来跑(你既写了技能,也在执行它,会带着完整的上下文),但作为合理性检查仍然有价值——而且人工评审环节会作为补偿。跳过基线运行——就按照用户要求用技能完成任务即可。
|
|
430
430
|
|
|
431
|
-
**评审结果**:如果你打不开浏览器(比如 Claude.ai 的 VM 没有显示器,或者你在远端服务器上),那就完全跳过浏览器评审器。改为直接在对话中展示结果。对每个测试用例,展示提示词和输出。如果输出是一个用户需要看的文件(比如 .docx 或 .xlsx),先把它存到文件系统里、再告诉他们路径,让他们下载并查看。在对话中直接征求反馈:"看着怎么样?有什么想改的吗?"
|
|
431
|
+
**评审结果**:如果你打不开浏览器(比如 Claude.ai 的 VM 没有显示器,或者你在远端服务器上),那就完全跳过浏览器评审器。改为直接在对话中展示结果。对每个测试用例,展示提示词和输出。如果输出是一个用户需要看的文件(比如 .docx 或 .xlsx),先把它存到文件系统里、再告诉他们路径,让他们下载并查看。在对话中直接征求反馈:"看着怎么样?有什么想改的吗?"
|
|
432
432
|
|
|
433
|
-
|
|
433
|
+
**基准化**:跳过定量基准——它依赖的基线比较在没有子代理时本来就没什么意义。把精力放在来自用户的定性反馈上。
|
|
434
434
|
|
|
435
435
|
**迭代循环**:和之前一样——改进技能、重跑测试用例、收集反馈——只是中间不走浏览器评审器。如果有文件系统,你仍然可以把结果按迭代目录整理起来。
|
|
436
436
|
|
|
437
|
-
**Description 优化**:这一节需要 `claude` 命令行工具(具体来说是 `claude -p`),它只在 Claude Code 里可用。如果你在 Claude.ai
|
|
437
|
+
**Description 优化**:这一节需要 `claude` 命令行工具(具体来说是 `claude -p`),它只在 Claude Code 里可用。如果你在 Claude.ai,就跳过这一节。
|
|
438
438
|
|
|
439
|
-
|
|
439
|
+
**盲对比**:需要子代理。跳过。
|
|
440
440
|
|
|
441
|
-
**打包**:`package_skill.py` 脚本只要有 Python 和文件系统就能跑。在 Claude.ai 上你也可以运行它,用户可以下载生成的 `.skill`
|
|
441
|
+
**打包**:`package_skill.py` 脚本只要有 Python 和文件系统就能跑。在 Claude.ai 上你也可以运行它,用户可以下载生成的 `.skill` 文件。
|
|
442
|
+
|
|
443
|
+
**更新一个已存在的技能**:用户可能让你更新一个已存在的技能,而不是创建新技能。这时:
|
|
444
|
+
- **保留原有的名字。** 注意原技能的目录名和 `name` 字段,原样使用。例如已安装的技能叫 `research-helper`,就输出 `research-helper.skill`(不要写成 `research-helper-v2`)。
|
|
445
|
+
- **先复制到可写入的位置再编辑。** 已安装的技能路径可能是只读的。先复制到 `/tmp/skill-name/`,在那里编辑,再从副本打包。
|
|
446
|
+
- **如果要手动打包,先在 `/tmp/` 里组装好**,然后再复制到输出目录——直接写入输出目录可能因权限失败。
|
|
442
447
|
|
|
443
448
|
---
|
|
444
449
|
|
|
445
450
|
## Cowork 专用说明
|
|
446
451
|
|
|
447
|
-
如果你在 Cowork
|
|
452
|
+
如果你在 Cowork 环境里,主要要知道这几件事:
|
|
448
453
|
|
|
449
454
|
- 你有子代理,所以主流程(并行启动测试用例、跑基线、打分等等)都能照常工作。(不过如果你遇到严重的超时问题,把测试提示词改成串行执行也是可以的。)
|
|
450
455
|
- 你没有浏览器、也没有显示器,所以在生成 eval 查看器时请使用 `--static <output_path>` 生成一份独立 HTML,而不是启动服务器。然后把这个链接抛出来,用户可以点开在自己浏览器里查看。
|
|
451
|
-
- 出于一些原因,Cowork 这个环境似乎容易让 Claude 在跑完测试后不去生成 eval 查看器——所以再次强调:不管是 Cowork 还是 Claude Code,跑完测试之后你都应当先生成 eval 查看器、让用户先看一遍例子,然后再亲自去改进技能、做更正——而且必须使用 `generate_review.py`(不要自己手写一份花式 HTML)。抱歉这里我要全大写一下:先把 EVAL VIEWER
|
|
456
|
+
- 出于一些原因,Cowork 这个环境似乎容易让 Claude 在跑完测试后不去生成 eval 查看器——所以再次强调:不管是 Cowork 还是 Claude Code,跑完测试之后你都应当先生成 eval 查看器、让用户先看一遍例子,然后再亲自去改进技能、做更正——而且必须使用 `generate_review.py`(不要自己手写一份花式 HTML)。抱歉这里我要全大写一下:先把 EVAL VIEWER *生成出来*,再去自己评估输出。目的是让人尽快看到结果!
|
|
452
457
|
- 反馈机制不同:因为没有在跑的服务器,查看器里的 "Submit All Reviews" 按钮会把 `feedback.json` 作为文件下载。你之后从那个位置去读取它(可能需要先申请访问权限)。
|
|
453
458
|
- 打包能用——`package_skill.py` 只需要 Python 和文件系统。
|
|
454
|
-
- Description 优化(`run_loop.py` / `run_eval.py`)在 Cowork 下应当也没问题,因为它是通过子进程调用 `claude -p
|
|
459
|
+
- Description 优化(`run_loop.py` / `run_eval.py`)在 Cowork 下应当也没问题,因为它是通过子进程调用 `claude -p`,不是浏览器;但还是请等到技能整体做完、用户也认可后再做这一步。
|
|
460
|
+
- **更新一个已存在的技能**:用户可能让你更新一个已存在的技能,而不是创建新技能。参照上方 Claude.ai 节里的"更新一个已存在的技能"指引执行。
|
|
455
461
|
|
|
456
462
|
---
|
|
457
463
|
|
|
458
464
|
## 参考文件
|
|
459
465
|
|
|
460
|
-
agents/
|
|
466
|
+
agents/ 目录下是各种专用子代理的指令文件。需要派出对应的子代理时再去读取。
|
|
461
467
|
|
|
462
468
|
- `agents/grader.md` — 如何对照输出来评估断言
|
|
463
469
|
- `agents/comparator.md` — 如何对两份输出做盲式 A/B 对比
|
|
464
470
|
- `agents/analyzer.md` — 如何分析为什么某一版本胜出
|
|
465
471
|
|
|
466
|
-
references/
|
|
472
|
+
references/ 目录下是额外的文档:
|
|
467
473
|
- `references/schemas.md` — evals.json、grading.json 等的 JSON 结构
|
|
468
474
|
|
|
469
475
|
---
|
|
470
476
|
|
|
471
477
|
最后再把核心循环重申一次,以示强调:
|
|
472
478
|
|
|
473
|
-
-
|
|
479
|
+
- 弄清楚这个技能要解决什么问题
|
|
474
480
|
- 起草或编辑这个技能
|
|
475
481
|
- 让带有这个技能的 Claude 在测试提示词上运行
|
|
476
482
|
- 与用户一道评估输出:
|
|
477
483
|
- 生成 benchmark.json 并运行 `eval-viewer/generate_review.py` 来辅助用户评审
|
|
478
484
|
- 跑一遍定量评估
|
|
479
485
|
- 反复迭代,直到你和用户都满意
|
|
480
|
-
-
|
|
486
|
+
- 把最终的技能打包,并交付给用户
|
|
487
|
+
|
|
488
|
+
如果你那边有 TodoList 这种工具,请把这些步骤加进去,免得忘记。如果你在 Cowork 环境,请特别把 "Create evals JSON and run `eval-viewer/generate_review.py` so human can review test cases" 加进 TodoList,确保它真的会被执行。
|
|
481
489
|
|
|
482
|
-
|
|
490
|
+
祝顺利!
|
|
491
|
+
|
|
492
|
+
---
|
|
483
493
|
|
|
484
|
-
|
|
494
|
+
*方法论改编自 [anthropics/skills](https://github.com/anthropics/skills)(Apache 2.0)。*
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# JSON Schemas
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本文档定义 skill-creator 使用的各类 JSON schema。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## evals.json
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
定义某个技能的评估项。位于该技能目录下的 `evals/evals.json`。
|
|
10
10
|
|
|
11
11
|
```json
|
|
12
12
|
{
|
|
@@ -26,19 +26,19 @@ Defines the evals for a skill. Located at `evals/evals.json` within the skill di
|
|
|
26
26
|
}
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
- `skill_name
|
|
31
|
-
- `evals[].id
|
|
32
|
-
- `evals[].prompt
|
|
33
|
-
- `evals[].expected_output
|
|
34
|
-
- `evals[].files
|
|
35
|
-
- `evals[].expectations
|
|
29
|
+
**字段:**
|
|
30
|
+
- `skill_name`:与技能 frontmatter 中的 name 一致
|
|
31
|
+
- `evals[].id`:唯一的整数标识
|
|
32
|
+
- `evals[].prompt`:要执行的任务
|
|
33
|
+
- `evals[].expected_output`:以人类可读方式描述的成功标准
|
|
34
|
+
- `evals[].files`:可选的输入文件路径列表(相对于技能根目录)
|
|
35
|
+
- `evals[].expectations`:可被核验的断言列表
|
|
36
36
|
|
|
37
37
|
---
|
|
38
38
|
|
|
39
39
|
## history.json
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
跟踪 Improve 模式下的版本演进。位于工作区根目录。
|
|
42
42
|
|
|
43
43
|
```json
|
|
44
44
|
{
|
|
@@ -71,21 +71,21 @@ Tracks version progression in Improve mode. Located at workspace root.
|
|
|
71
71
|
}
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
- `started_at
|
|
76
|
-
- `skill_name
|
|
77
|
-
- `current_best
|
|
78
|
-
- `iterations[].version
|
|
79
|
-
- `iterations[].parent
|
|
80
|
-
- `iterations[].expectation_pass_rate
|
|
81
|
-
- `iterations[].grading_result
|
|
82
|
-
- `iterations[].is_current_best
|
|
74
|
+
**字段:**
|
|
75
|
+
- `started_at`:改进流程启动时间的 ISO 时间戳
|
|
76
|
+
- `skill_name`:正在改进的技能名
|
|
77
|
+
- `current_best`:当前表现最好的版本标识
|
|
78
|
+
- `iterations[].version`:版本标识(v0、v1、…)
|
|
79
|
+
- `iterations[].parent`:本版本派生自哪个父版本
|
|
80
|
+
- `iterations[].expectation_pass_rate`:评分得出的通过率
|
|
81
|
+
- `iterations[].grading_result`:"baseline"、"won"、"lost" 或 "tie"
|
|
82
|
+
- `iterations[].is_current_best`:本版本是否是当前最佳版本
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
86
86
|
## grading.json
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
由评分智能体输出。位于 `<run-dir>/grading.json`。
|
|
89
89
|
|
|
90
90
|
```json
|
|
91
91
|
{
|
|
@@ -149,20 +149,20 @@ Output from the grader agent. Located at `<run-dir>/grading.json`.
|
|
|
149
149
|
}
|
|
150
150
|
```
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
- `expectations[]
|
|
154
|
-
- `summary
|
|
155
|
-
- `execution_metrics
|
|
156
|
-
- `timing
|
|
157
|
-
- `claims
|
|
158
|
-
- `user_notes_summary
|
|
159
|
-
- `eval_feedback
|
|
152
|
+
**字段:**
|
|
153
|
+
- `expectations[]`:评过分的期望,附证据
|
|
154
|
+
- `summary`:通过/失败的汇总计数
|
|
155
|
+
- `execution_metrics`:工具使用与输出体量(来自 executor 的 metrics.json)
|
|
156
|
+
- `timing`:墙钟时间(来自 timing.json)
|
|
157
|
+
- `claims`:从输出中抽取并核实的论断
|
|
158
|
+
- `user_notes_summary`:executor 标记的问题
|
|
159
|
+
- `eval_feedback`:(可选)针对评估项的改进建议,仅当评分智能体发现值得提出的问题时才出现
|
|
160
160
|
|
|
161
161
|
---
|
|
162
162
|
|
|
163
163
|
## metrics.json
|
|
164
164
|
|
|
165
|
-
|
|
165
|
+
由执行智能体输出。位于 `<run-dir>/outputs/metrics.json`。
|
|
166
166
|
|
|
167
167
|
```json
|
|
168
168
|
{
|
|
@@ -183,22 +183,22 @@ Output from the executor agent. Located at `<run-dir>/outputs/metrics.json`.
|
|
|
183
183
|
}
|
|
184
184
|
```
|
|
185
185
|
|
|
186
|
-
|
|
187
|
-
- `tool_calls
|
|
188
|
-
- `total_tool_calls
|
|
189
|
-
- `total_steps
|
|
190
|
-
- `files_created
|
|
191
|
-
- `errors_encountered
|
|
192
|
-
- `output_chars
|
|
193
|
-
- `transcript_chars
|
|
186
|
+
**字段:**
|
|
187
|
+
- `tool_calls`:按工具类型计数
|
|
188
|
+
- `total_tool_calls`:所有工具调用之和
|
|
189
|
+
- `total_steps`:主要执行步骤数
|
|
190
|
+
- `files_created`:创建的输出文件列表
|
|
191
|
+
- `errors_encountered`:执行期间的错误数
|
|
192
|
+
- `output_chars`:输出文件的总字符数
|
|
193
|
+
- `transcript_chars`:transcript 的字符数
|
|
194
194
|
|
|
195
195
|
---
|
|
196
196
|
|
|
197
197
|
## timing.json
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
一次运行的墙钟计时。位于 `<run-dir>/timing.json`。
|
|
200
200
|
|
|
201
|
-
|
|
201
|
+
**如何记录:** 当一个子智能体任务结束时,任务通知中会包含 `total_tokens` 与 `duration_ms`。请立即保存——它们不会持久化到其他地方,事后无法恢复。
|
|
202
202
|
|
|
203
203
|
```json
|
|
204
204
|
{
|
|
@@ -218,7 +218,7 @@ Wall clock timing for a run. Located at `<run-dir>/timing.json`.
|
|
|
218
218
|
|
|
219
219
|
## benchmark.json
|
|
220
220
|
|
|
221
|
-
|
|
221
|
+
Benchmark 模式的输出。位于 `benchmarks/<timestamp>/benchmark.json`。
|
|
222
222
|
|
|
223
223
|
```json
|
|
224
224
|
{
|
|
@@ -285,30 +285,30 @@ Output from Benchmark mode. Located at `benchmarks/<timestamp>/benchmark.json`.
|
|
|
285
285
|
}
|
|
286
286
|
```
|
|
287
287
|
|
|
288
|
-
|
|
289
|
-
- `metadata
|
|
290
|
-
- `skill_name
|
|
291
|
-
- `timestamp
|
|
292
|
-
- `evals_run
|
|
293
|
-
- `runs_per_configuration
|
|
294
|
-
- `runs[]
|
|
295
|
-
- `eval_id
|
|
296
|
-
- `eval_name
|
|
297
|
-
- `configuration
|
|
298
|
-
- `run_number
|
|
299
|
-
- `result
|
|
300
|
-
- `run_summary
|
|
301
|
-
- `with_skill` / `without_skill
|
|
302
|
-
- `delta
|
|
303
|
-
- `notes
|
|
304
|
-
|
|
305
|
-
|
|
288
|
+
**字段:**
|
|
289
|
+
- `metadata`:本次 benchmark 运行的信息
|
|
290
|
+
- `skill_name`:技能名
|
|
291
|
+
- `timestamp`:benchmark 运行的时间
|
|
292
|
+
- `evals_run`:评估名或 ID 列表
|
|
293
|
+
- `runs_per_configuration`:每种配置下的运行次数(如 3)
|
|
294
|
+
- `runs[]`:单次运行的结果
|
|
295
|
+
- `eval_id`:评估的数字标识
|
|
296
|
+
- `eval_name`:人类可读的评估名(在 viewer 中作为分节标题)
|
|
297
|
+
- `configuration`:必须为 `"with_skill"` 或 `"without_skill"`(viewer 用该字符串做分组和配色)
|
|
298
|
+
- `run_number`:整数运行编号(1、2、3…)
|
|
299
|
+
- `result`:嵌套对象,含 `pass_rate`、`passed`、`total`、`time_seconds`、`tokens`、`errors`
|
|
300
|
+
- `run_summary`:按配置的统计聚合
|
|
301
|
+
- `with_skill` / `without_skill`:各包含 `pass_rate`、`time_seconds`、`tokens`,每项含 `mean` 与 `stddev`
|
|
302
|
+
- `delta`:差值字符串,如 `"+0.50"`、`"+13.0"`、`"+1700"`
|
|
303
|
+
- `notes`:分析智能体的自由格式观察
|
|
304
|
+
|
|
305
|
+
**重要:** viewer 严格按这些字段名读取。把 `config` 写成 `configuration` 之外的形式,或把 `pass_rate` 放在 run 的顶层而非嵌套于 `result` 之下,都会导致 viewer 显示为空或为零值。在手工生成 benchmark.json 时务必参照此 schema。
|
|
306
306
|
|
|
307
307
|
---
|
|
308
308
|
|
|
309
309
|
## comparison.json
|
|
310
310
|
|
|
311
|
-
|
|
311
|
+
由盲比较器输出。位于 `<grading-dir>/comparison-N.json`。
|
|
312
312
|
|
|
313
313
|
```json
|
|
314
314
|
{
|
|
@@ -383,7 +383,7 @@ Output from blind comparator. Located at `<grading-dir>/comparison-N.json`.
|
|
|
383
383
|
|
|
384
384
|
## analysis.json
|
|
385
385
|
|
|
386
|
-
|
|
386
|
+
由事后分析器输出。位于 `<grading-dir>/analysis.json`。
|
|
387
387
|
|
|
388
388
|
```json
|
|
389
389
|
{
|