astron-eval 0.0.1

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.
Files changed (96) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/bin/astron-eval.mjs +111 -0
  4. package/package.json +24 -0
  5. package/skills/astron-eval/SKILL.md +60 -0
  6. package/skills/model-evaluation/SKILL.md +180 -0
  7. package/skills/model-evaluation/assets/dimensions//345/206/205/345/256/271/347/233/270/345/205/263/346/200/247/347/273/264/345/272/246.json +20 -0
  8. package/skills/model-evaluation/assets/dimensions//345/206/205/345/256/271/347/262/276/347/241/256/347/273/264/345/272/246.json +19 -0
  9. package/skills/model-evaluation/assets/dimensions//345/207/206/347/241/256/346/200/247/347/273/264/345/272/246-/344/270/252/346/200/247/345/214/226/350/247/204/345/210/222.json +20 -0
  10. package/skills/model-evaluation/assets/dimensions//345/207/206/347/241/256/346/200/247/347/273/264/345/272/246-/344/277/241/346/201/257/345/210/206/346/236/220.json +20 -0
  11. package/skills/model-evaluation/assets/dimensions//345/207/206/347/241/256/346/200/247/347/273/264/345/272/246-/346/227/205/346/270/270/345/207/272/350/241/214.json +20 -0
  12. package/skills/model-evaluation/assets/dimensions//345/207/206/347/241/256/346/200/247/347/273/264/345/272/246.json +20 -0
  13. package/skills/model-evaluation/assets/dimensions//345/210/233/346/204/217/346/200/247-/345/220/270/345/274/225/346/200/247/347/273/264/345/272/246.json +21 -0
  14. package/skills/model-evaluation/assets/dimensions//345/210/233/346/226/260/346/200/247/347/273/264/345/272/246.json +20 -0
  15. package/skills/model-evaluation/assets/dimensions//345/256/214/346/225/264/346/200/247/347/273/264/345/272/246-/344/277/241/346/201/257/345/210/206/346/236/220.json +20 -0
  16. package/skills/model-evaluation/assets/dimensions//345/256/214/346/225/264/346/200/247/347/273/264/345/272/246.json +20 -0
  17. package/skills/model-evaluation/assets/dimensions//345/275/242/345/274/217/347/233/270/345/205/263/346/200/247/347/273/264/345/272/246.json +20 -0
  18. package/skills/model-evaluation/assets/dimensions//345/277/240/350/257/232/345/272/246/347/273/264/345/272/246.json +20 -0
  19. package/skills/model-evaluation/assets/dimensions//346/214/207/344/273/244/351/201/265/345/276/252/347/273/264/345/272/246.json +20 -0
  20. package/skills/model-evaluation/assets/dimensions//346/226/207/346/234/254/345/267/256/345/274/202/345/272/246-TER/347/273/264/345/272/246.json +20 -0
  21. package/skills/model-evaluation/assets/dimensions//346/234/211/346/225/210/346/200/247/347/273/264/345/272/246-/344/270/252/346/200/247/345/214/226/350/247/204/345/210/222.json +20 -0
  22. package/skills/model-evaluation/assets/dimensions//346/234/211/346/225/210/346/200/247/347/273/264/345/272/246-/344/277/241/346/201/257/345/210/206/346/236/220.json +20 -0
  23. package/skills/model-evaluation/assets/dimensions//346/234/211/346/225/210/346/200/247/347/273/264/345/272/246-/346/265/201/347/250/213/350/207/252/345/212/250/345/214/226.json +20 -0
  24. package/skills/model-evaluation/assets/dimensions//346/234/211/346/225/210/346/200/247/347/273/264/345/272/246.json +21 -0
  25. package/skills/model-evaluation/assets/dimensions//346/240/270/345/277/203/345/205/203/347/264/240/347/273/264/345/272/246.json +20 -0
  26. package/skills/model-evaluation/assets/dimensions//346/240/274/345/274/217/351/201/265/345/276/252/347/273/264/345/272/246.json +19 -0
  27. package/skills/model-evaluation/assets/dimensions//347/211/271/350/211/262/344/272/256/347/202/271/347/273/264/345/272/246.json +20 -0
  28. package/skills/model-evaluation/assets/dimensions//347/224/250/344/276/213/347/272/247/350/257/204/346/265/213/347/273/264/345/272/246/346/250/241/346/235/277.json +25 -0
  29. package/skills/model-evaluation/assets/dimensions//347/233/270/344/274/274/345/272/246-BERTScore/347/273/264/345/272/246.json +20 -0
  30. package/skills/model-evaluation/assets/dimensions//347/233/270/344/274/274/345/272/246-Cosine/347/273/264/345/272/246.json +20 -0
  31. package/skills/model-evaluation/assets/dimensions//347/233/270/344/274/274/345/272/246-ROUGE/347/273/264/345/272/246.json +20 -0
  32. package/skills/model-evaluation/assets/dimensions//347/233/270/345/205/263/346/200/247/347/273/264/345/272/246-/344/270/252/346/200/247/345/214/226/350/247/204/345/210/222.json +20 -0
  33. package/skills/model-evaluation/assets/dimensions//347/233/270/345/205/263/346/200/247/347/273/264/345/272/246.json +21 -0
  34. package/skills/model-evaluation/assets/dimensions//347/262/276/347/241/256/346/200/247-BLUE/347/273/264/345/272/246.json +20 -0
  35. package/skills/model-evaluation/assets/dimensions//347/262/276/347/241/256/346/200/247-COMET/347/273/264/345/272/246.json +20 -0
  36. package/skills/model-evaluation/assets/dimensions//351/200/273/350/276/221/345/220/210/347/220/206/346/200/247/347/273/264/345/272/246.json +20 -0
  37. package/skills/model-evaluation/assets/dimensions//351/200/273/350/276/221/350/277/236/350/264/257/346/200/247/347/273/264/345/272/246-/344/270/252/346/200/247/345/214/226/350/247/204/345/210/222.json +20 -0
  38. package/skills/model-evaluation/assets/dimensions//351/200/273/350/276/221/350/277/236/350/264/257/346/200/247/347/273/264/345/272/246-/344/277/241/346/201/257/345/210/206/346/236/220.json +20 -0
  39. package/skills/model-evaluation/assets/dimensions//351/200/273/350/276/221/350/277/236/350/264/257/346/200/247/347/273/264/345/272/246-/346/265/201/347/250/213/350/207/252/345/212/250/345/214/226.json +20 -0
  40. package/skills/model-evaluation/assets/dimensions//351/200/273/350/276/221/350/277/236/350/264/257/346/200/247/347/273/264/345/272/246.json +21 -0
  41. package/skills/model-evaluation/assets/eval-judge.json +11 -0
  42. package/skills/model-evaluation/assets/experts/business-process-automation.json +71 -0
  43. package/skills/model-evaluation/assets/experts/content-generation.json +75 -0
  44. package/skills/model-evaluation/assets/experts/content-match.json +37 -0
  45. package/skills/model-evaluation/assets/experts/information-analysis.json +87 -0
  46. package/skills/model-evaluation/assets/experts/marketing-digital-human.json +27 -0
  47. package/skills/model-evaluation/assets/experts/personalized-planning.json +87 -0
  48. package/skills/model-evaluation/assets/experts/text-translation.json +103 -0
  49. package/skills/model-evaluation/assets/experts/tourism-travel.json +119 -0
  50. package/skills/model-evaluation/assets/templates/custom-dimension.template.json +30 -0
  51. package/skills/model-evaluation/eval-build.md +281 -0
  52. package/skills/model-evaluation/eval-execute.md +196 -0
  53. package/skills/model-evaluation/eval-init.md +237 -0
  54. package/skills/model-evaluation/processes/dimension-process.md +207 -0
  55. package/skills/model-evaluation/processes/evalset-create-process.md +184 -0
  56. package/skills/model-evaluation/processes/evalset-parse-process.md +171 -0
  57. package/skills/model-evaluation/processes/evalset-supplement-process.md +136 -0
  58. package/skills/model-evaluation/processes/keypoint-process.md +148 -0
  59. package/skills/model-evaluation/processes/python-env-process.md +113 -0
  60. package/skills/model-evaluation/references//344/270/255/351/227/264/344/272/247/347/211/251/350/257/264/346/230/216.md +340 -0
  61. package/skills/model-evaluation/references//345/206/205/347/275/256/346/250/241/346/235/277/350/257/264/346/230/216.md +149 -0
  62. package/skills/model-evaluation/references//350/204/232/346/234/254/345/256/232/344/271/211.md +274 -0
  63. package/skills/model-evaluation/references//350/256/244/350/257/201/346/234/215/345/212/241/346/216/245/345/217/243/350/257/264/346/230/216.md +271 -0
  64. package/skills/model-evaluation/references//350/257/204/346/265/213/346/234/215/345/212/241/346/216/245/345/217/243/350/257/264/346/230/216.md +455 -0
  65. package/skills/model-evaluation/references//350/257/204/346/265/213/347/273/264/345/272/246/350/257/264/346/230/216.md +171 -0
  66. package/skills/model-evaluation/scripts/cfg/eval-auth.cfg +16 -0
  67. package/skills/model-evaluation/scripts/cfg/eval-server.cfg +1 -0
  68. package/skills/model-evaluation/scripts/clients/__init__.py +33 -0
  69. package/skills/model-evaluation/scripts/clients/api_client.py +97 -0
  70. package/skills/model-evaluation/scripts/clients/auth_client.py +96 -0
  71. package/skills/model-evaluation/scripts/clients/http_client.py +199 -0
  72. package/skills/model-evaluation/scripts/clients/oauth_callback.py +397 -0
  73. package/skills/model-evaluation/scripts/clients/token_manager.py +53 -0
  74. package/skills/model-evaluation/scripts/eval_auth.py +588 -0
  75. package/skills/model-evaluation/scripts/eval_dimension.py +240 -0
  76. package/skills/model-evaluation/scripts/eval_set.py +410 -0
  77. package/skills/model-evaluation/scripts/eval_task.py +324 -0
  78. package/skills/model-evaluation/scripts/files/__init__.py +38 -0
  79. package/skills/model-evaluation/scripts/files/file_utils.py +330 -0
  80. package/skills/model-evaluation/scripts/files/streaming.py +245 -0
  81. package/skills/model-evaluation/scripts/utils/__init__.py +128 -0
  82. package/skills/model-evaluation/scripts/utils/constants.py +101 -0
  83. package/skills/model-evaluation/scripts/utils/datetime_utils.py +60 -0
  84. package/skills/model-evaluation/scripts/utils/errors.py +244 -0
  85. package/skills/model-evaluation/scripts/utils/keypoint_prompts.py +73 -0
  86. package/skills/skill-driven-eval/SKILL.md +456 -0
  87. package/skills/skill-driven-eval/agents/grader.md +144 -0
  88. package/skills/skill-driven-eval/eval-viewer/__init__.py +1 -0
  89. package/skills/skill-driven-eval/eval-viewer/generate_report.py +485 -0
  90. package/skills/skill-driven-eval/eval-viewer/viewer.html +767 -0
  91. package/skills/skill-driven-eval/references/schemas.md +282 -0
  92. package/skills/skill-driven-eval/scripts/__init__.py +1 -0
  93. package/skills/skill-driven-eval/scripts/__main__.py +70 -0
  94. package/skills/skill-driven-eval/scripts/aggregate_results.py +681 -0
  95. package/skills/skill-driven-eval/scripts/extract_transcript.py +294 -0
  96. package/skills/skill-driven-eval/scripts/test_aggregate.py +244 -0
@@ -0,0 +1,456 @@
1
+ ---
2
+ name: skill-driven-eval
3
+ description: 评估和比较不同 Claude 模型在执行技能时的表现。当用户询问哪个模型最适合执行特定技能、想要比较模型在技能任务上的表现,或需要在效果与成本之间取得平衡时,使用此技能。该技能使用不同模型运行测试用例,收集时间和 token 指标,通过盲评估对输出进行评分,并提供全面的比较报告。
4
+ user-invocable: false
5
+ ---
6
+
7
+ # 技能驱动评估
8
+
9
+ 一个用于评估不同 Claude 模型在执行另一个技能时表现如何的技能。
10
+
11
+ ## 概述
12
+
13
+ 当用户问"我应该在 X 技能中使用哪个模型?"或"对于 Y 任务,opus 值得多花那些成本吗?"时,此技能通过以下方式帮助回答:
14
+
15
+ 1. 理解目标技能的目的和要求
16
+ 2. 生成具有可验证断言的适当测试用例
17
+ 3. 使用多个模型运行每个测试用例
18
+ 4. 通过盲评估对输出进行评分(评分者不知道哪个模型产生了哪个输出)
19
+ 5. 收集时间和 token 使用指标
20
+ 6. 将结果汇总成带有数据驱动建议的比较报告
21
+
22
+ ## 关键:盲评估
23
+
24
+ 为了防止评分者偏见,评估必须是**盲**的:
25
+
26
+ - **执行子智能体**不应该知道它们代表哪个模型——它们只是执行任务
27
+ - **评分子智能体**不应该知道它们评分的输出是由哪个模型产生的
28
+ - 只有 **MainAgent** 知道匿名标识符与实际模型名称之间的映射
29
+
30
+ 有关实现细节,请参阅下面的"信息隔离"部分。
31
+
32
+ ## 何时使用此技能
33
+
34
+ 在以下情况下使用此技能:
35
+ - 用户询问哪个模型最适合执行特定技能
36
+ - 用户想要比较模型表现(效果、速度、成本)
37
+ - 用户提到"模型比较"、"哪个模型"、"opus vs sonnet"或类似内容
38
+ - 用户想要评估对于特定技能,更昂贵的模型是否值得其成本
39
+
40
+ ---
41
+
42
+ ## 阶段 0:开始之前
43
+
44
+ **检查现有工作区。** 如果找到,询问用户如何继续。
45
+
46
+ ---
47
+
48
+ ## 阶段 1:理解目标技能
49
+
50
+ 1. **阅读目标技能的 SKILL.md** 以了解:
51
+ - 技能做什么
52
+ - 它期望什么输入
53
+ - 它产生什么输出
54
+ - 任何特殊要求或约束
55
+
56
+ 2. **与用户确认**:
57
+ - 要评估哪个技能
58
+ - 要比较哪些模型(用户可能配置了自定义模型映射)
59
+ - 运行多少个测试用例(默认:3)
60
+ - 任何要测试的特定场景
61
+
62
+ ---
63
+
64
+ ## 阶段 2:生成测试用例
65
+
66
+ 生成 2-4 个测试用例,这些用例:
67
+ - 覆盖技能功能的不同方面
68
+ - 有清晰、可验证的成功标准
69
+ - 是现实的(真实用户会问的内容)
70
+ - 范围从简单到复杂
71
+
72
+ 对于每个测试用例,定义:
73
+ - **prompt**:任务描述
74
+ - **expected_output**:成功是什么样子
75
+ - **assertions**:关于输出的具体、可验证的陈述
76
+
77
+ 将测试用例作为 `evals.json` 保存到工作区:
78
+
79
+ ```json
80
+ {
81
+ "target_skill": "skill-name",
82
+ "target_skill_path": "/path/to/skill",
83
+ "models_to_compare": ["model-a", "model-b"],
84
+ "evals": [
85
+ {
86
+ "id": 1,
87
+ "name": "descriptive-name",
88
+ "prompt": "用户的任务提示词",
89
+ "expected_output": "预期结果的描述",
90
+ "assertions": [
91
+ "输出包含 X",
92
+ "技能完成了 Y",
93
+ "没有发生错误"
94
+ ]
95
+ }
96
+ ]
97
+ }
98
+ ```
99
+
100
+ ---
101
+
102
+ ## 阶段 3:执行测试用例
103
+
104
+ ### 信息隔离策略
105
+
106
+ **MainAgent 维护一个秘密映射**(永不与子智能体共享):
107
+ ```json
108
+ {
109
+ "run-001": {"model": "opus", "eval_id": 1},
110
+ "run-002": {"model": "sonnet", "eval_id": 1},
111
+ "run-003": {"model": "opus", "eval_id": 2},
112
+ "run-004": {"model": "sonnet", "eval_id": 2}
113
+ }
114
+ ```
115
+
116
+ **目录结构使用匿名运行 ID**:
117
+ ```
118
+ workspace/
119
+ ├── run-001/
120
+ │ └── outputs/
121
+ ├── run-002/
122
+ │ └── outputs/
123
+ └── mapping.json (由 MainAgent 在评分完成后创建)
124
+ ```
125
+
126
+ **永远不要在以下位置包含模型名称:**
127
+ - 目录名称
128
+ - 文件名称
129
+ - 传递给执行或评分子智能体的内容
130
+
131
+ ### 步骤 1:生成执行子智能体
132
+
133
+ **重要:** 不要同时生成超过 3 个子智能体。同时生成超过 3 个子智能体可能导致稳定性问题。
134
+
135
+ 如果你有超过 3 次总运行(例如,3 个测试用例 × 2 个模型 = 6 次运行):
136
+ - 将它们分成 3 个一组
137
+ - 等待每批完成后再生成下一批
138
+ - 在内部映射中跟踪哪些运行在哪个批次中
139
+
140
+ 对于每个测试用例和每个模型,生成一个子智能体:
141
+
142
+ ```
143
+ 执行此任务:
144
+ - 技能路径:<target-skill-path>
145
+ - 任务:<eval prompt>
146
+ - 将输出保存到:<workspace>/run-<ID>/outputs/
147
+ ```
148
+
149
+ **重要:** 不要在提示词的任何地方提及模型名称。模型参数是通过子智能体的 `model` 配置设置的,而不是在任务描述中。
150
+
151
+ ### 步骤 2:当运行进行中时,与用户沟通
152
+
153
+ 不要只是静默等待。利用这段时间:
154
+ 1. 向用户解释正在发生什么
155
+ 2. 审查和完善断言
156
+ 3. 准备评分上下文
157
+
158
+ ### 步骤 3:为每个完成的运行提取执行记录和时间数据(必需 - 不要跳过)
159
+
160
+ **这是一个阻塞门。你必须在进入阶段 4(评分)之前为每次运行完成此操作。** 没有 transcript.md,评分者无法评估执行质量。
161
+
162
+ 对于每个完成的运行:
163
+
164
+ 1. **找到会话文件** - 定位子智能体的 `.jsonl` 会话文件。如果使用 `claude -p` CLI,找到最近修改的会话:
165
+ ```bash
166
+ # 按修改时间找到最新的会话文件
167
+ ls -lt ~/.claude/projects/<project-name>/*.jsonl | head -1
168
+ ```
169
+ 通过检查会话的第一条消息内容(它应该包含评估提示词)将 会话与运行匹配。
170
+
171
+ 2. **提取执行记录**(必需):
172
+ ```bash
173
+ python <skill-driven-eval-path>/scripts/extract_transcript.py <session.jsonl> --output <workspace>/run-<ID>/transcript.md
174
+ ```
175
+
176
+ 3. **提取时间数据** - 解析会话文件以提取 `duration_ms` 和 `total_tokens`:
177
+ - **duration_ms**:从会话中的第一个和最后一个时间戳计算
178
+ - **total_tokens**:从使用字段中汇总所有 `input_tokens` 和 `output_tokens`
179
+
180
+ **timing.json 格式:**
181
+ ```json
182
+ {
183
+ "run_id": "run-001",
184
+ "total_tokens": 84852,
185
+ "duration_ms": 23332
186
+ }
187
+ ```
188
+
189
+ **验证:** 在生成任何评分者之前,确认每次运行都存在 `<workspace>/run-<ID>/transcript.md`。如果缺少任何执行记录,停止并先提取它。
190
+
191
+ ---
192
+
193
+ ## 阶段 4:评分输出(盲评估)
194
+
195
+ ### 步骤 0:验证所有执行记录存在(必需)
196
+
197
+ 在生成任何评分者之前,验证每次运行都有执行记录:
198
+
199
+ ```bash
200
+ for dir in <workspace>/run-*/; do
201
+ if [ ! -f "$dir/transcript.md" ]; then
202
+ echo "缺少:$dir/transcript.md — 在评分前提取它!"
203
+ exit 1
204
+ fi
205
+ done
206
+ echo "所有执行记录已验证。"
207
+ ```
208
+
209
+ **如果缺少任何 transcript.md,返回阶段 3 步骤 3 并提取它。不要在没有执行记录的情况下继续评分。**
210
+
211
+ ### 步骤 1:生成评分子智能体
212
+
213
+ **重要:** 与执行子智能体相同的限制。对于每次运行,生成一个评分子智能体:
214
+
215
+ ```
216
+ 对此输出进行评分:
217
+ - 预期:<assertions 列表>
218
+ - 输出目录:<workspace>/run-<ID>/outputs/
219
+ - 执行记录:<workspace>/run-<ID>/transcript.md
220
+ - 将评分结果保存到:<workspace>/run-<ID>/grading.json
221
+
222
+ 不要推测是哪个模型或配置产生了此输出。
223
+ 仅根据每个预期是否被满足来进行评估。
224
+ ```
225
+
226
+ **重要:** 评分者提示词不能包含:
227
+ - 模型名称
228
+ - 关于此运行代表哪个配置的任何提示
229
+ - 比较性语言如"这是 opus 运行"
230
+
231
+ ### 步骤 2:评分输出格式
232
+
233
+ 每个评分者产生 `grading.json`:
234
+
235
+ ```json
236
+ {
237
+ "run_id": "run-001",
238
+ "expectations": [
239
+ {
240
+ "text": "输出包含 X",
241
+ "passed": true,
242
+ "evidence": "在 output.txt 第 5 行找到 X"
243
+ }
244
+ ],
245
+ "summary": {
246
+ "passed": 3,
247
+ "failed": 1,
248
+ "total": 4,
249
+ "pass_rate": 0.75
250
+ }
251
+ }
252
+ ```
253
+
254
+ ---
255
+
256
+ ## 阶段 5:汇总和报告
257
+
258
+ **重要:脚本执行路径**
259
+
260
+ 此技能的脚本位于技能目录本身。执行脚本时,使用技能目录的**绝对路径**:
261
+
262
+ ```
263
+ <skill-driven-eval-path>/
264
+ ├── SKILL.md
265
+ ├── scripts/
266
+ │ └── aggregate_results.py
267
+ └── eval-viewer/
268
+ └── generate_report.py
269
+ ```
270
+
271
+ 将 `<skill-driven-eval-path>` 替换为此技能的实际路径(例如 `~/.claude/skills/skill-driven-eval` 或技能安装的路径)。
272
+
273
+ ### 步骤 1:创建模型映射
274
+
275
+ 现在评分已完成,MainAgent 创建 `mapping.json`:
276
+
277
+ ```json
278
+ {
279
+ "run-001": {"model": "opus", "eval_id": 1, "eval_name": "表单填写"},
280
+ "run-002": {"model": "sonnet", "eval_id": 1, "eval_name": "表单填写"}
281
+ }
282
+ ```
283
+
284
+ ### 步骤 2:汇总结果
285
+
286
+ 使用**绝对路径**运行汇总脚本:
287
+
288
+ ```bash
289
+ # 使用技能脚本目录的绝对路径
290
+ python <skill-driven-eval-path>/scripts/aggregate_results.py <workspace> --mapping <workspace>/mapping.json
291
+ ```
292
+
293
+ 示例:
294
+ ```bash
295
+ python /home/user/.claude/skills/skill-driven-eval/scripts/aggregate_results.py article-writing-eval-workspace --mapping article-writing-eval-workspace/mapping.json
296
+ ```
297
+
298
+ 这会在工作区目录中生成 `benchmark.json` 和 `benchmark.md`。
299
+
300
+ ### 步骤 3:分析结果
301
+
302
+ 阅读基准数据并展示模式:
303
+
304
+ - 哪个模型整体表现最好?
305
+ - 是否有特定测试用例中某个模型表现出色或遇到困难?
306
+ - 质量、速度和成本之间的权衡是什么?
307
+ - 是否有任何异常(高方差、意外结果)?
308
+
309
+ ### 步骤 4:生成并提供可视化报告
310
+
311
+ **这是一个必需步骤。** 生成 HTML 报告并通过 HTTP 提供服务,以便用户可以查看详细结果:
312
+
313
+ ```bash
314
+ # 使用绝对路径生成并提供报告
315
+ nohup python <skill-driven-eval-path>/eval-viewer/generate_report.py <workspace> \
316
+ --serve \
317
+ --port 3118 \
318
+ > /dev/null 2>&1 &
319
+ REPORT_PID=$!
320
+ ```
321
+
322
+ 或者如果无法提供服务,生成静态文件:
323
+
324
+ ```bash
325
+ python -m eval-viewer.generate_report <workspace> --output <workspace>/report.html
326
+ ```
327
+
328
+ 然后告诉用户类似这样的内容:
329
+ > "我已在你的浏览器中打开了详细比较报告。你可以查看:
330
+ > - **摘要标签页**:整体模型表现比较
331
+ > - **详情标签页**:每次评估的细分和单次运行输出
332
+ >
333
+ > 查看完成后,请回到这里告诉我你的想法。"
334
+
335
+ ### 步骤 5:向用户展示发现
336
+
337
+ 提供关键发现的**简短口头摘要**:
338
+
339
+ - 哪个模型获得了最高的通过率
340
+ - 值得注意的时间和 token 差异
341
+ - 基于数据的关键建议
342
+
343
+ **然后引导用户查看网络报告以获取完整详情:**
344
+
345
+ > "如需详细统计、每次评估的细分和单次运行输出,请在浏览器中查看报告。"
346
+
347
+ **重要:**
348
+ - 不要使用预设结论
349
+ - 客观分析实际数据
350
+ - 建议必须来自测量结果,而不是对模型能力的假设
351
+ - 网络报告包含完整数据——口头摘要只是重点
352
+
353
+ ---
354
+
355
+ ## 工作区结构
356
+
357
+ ```
358
+ <skill-name>-eval-workspace/
359
+ ├── evals.json # 测试用例定义
360
+ ├── mapping.json # 模型映射(评分后创建)
361
+ ├── run-001/ # 匿名运行 ID
362
+ │ ├── outputs/ # 模型的输出
363
+ │ ├── transcript.md # 人类可读的会话记录
364
+ │ ├── grading.json # 评分结果
365
+ │ └── timing.json # 时间数据
366
+ ├── run-002/
367
+ │ └── ...
368
+ ├── benchmark.json # 汇总结果(含模型名称)
369
+ ├── benchmark.md # 人类可读摘要
370
+ └── report.html # 可视化比较报告
371
+ ```
372
+
373
+ ---
374
+
375
+ ## 成本分析
376
+
377
+ 比较模型时,考虑以下指标:
378
+
379
+ 1. **通过率**:越高越好(质量)
380
+ 2. **Token 使用量**:越低越好(成本)
381
+ 3. **时间**:越低越好(速度)
382
+ 4. **成本效益**:`pass_rate * 1000 / (tokens / 1000)` — 越高越好
383
+
384
+ **重要:** 这些是要报告的指标,但不要假设哪个模型会在哪个指标上表现出色。让数据说话。
385
+
386
+ ---
387
+
388
+ ## 处理子智能体限制
389
+
390
+ 由于子智能体无法生成进一步的子智能体:
391
+
392
+ 1. **以 3 个为一批生成执行子智能体**(最多 3 个并行以避免稳定性问题)
393
+ 2. **等待每批完成**,然后对于每次运行:找到会话文件,提取 transcript.md,捕获时间数据
394
+ 3. **在继续之前验证所有执行记录存在**
395
+ 4. **以 3 个为一批生成评分子智能体**(在所有执行完成且执行记录准备好之后)
396
+ 5. **等待评分完成**
397
+ 6. **汇总和报告**(MainAgent 直接执行此操作)
398
+
399
+ **最大并行度:** 永远不要同时生成超过 3 个子智能体。如果你有 6 次运行(3 次评估 × 2 个模型),分 2 批每批 3 个生成。
400
+
401
+ ---
402
+
403
+ ## 参考文件
404
+
405
+ 所有路径都相对于技能目录(`<skill-driven-eval-path>`):
406
+
407
+ - `agents/grader.md` — 如何根据输出评估断言(盲评估)
408
+ - `references/schemas.md` — evals、grading、benchmark 的 JSON 结构
409
+ - `scripts/aggregate_results.py` — 将结果汇总到 benchmark.json
410
+ - `scripts/extract_transcript.py` — 从会话文件中提取人类可读的执行记录
411
+ - `eval-viewer/generate_report.py` — 生成 HTML 报告并通过 HTTP 提供
412
+
413
+ **执行脚本:**
414
+
415
+ ```bash
416
+ # 为运行提取执行记录(每次运行完成后执行此操作)
417
+ python <skill-driven-eval-path>/scripts/extract_transcript.py <session.jsonl> --output <workspace>/run-<ID>/transcript.md
418
+
419
+ # 汇总结果(使用绝对路径)
420
+ python <skill-driven-eval-path>/scripts/aggregate_results.py <workspace> --mapping <workspace>/mapping.json
421
+
422
+ # 生成并提供报告(使用绝对路径)
423
+ python <skill-driven-eval-path>/eval-viewer/generate_report.py <workspace> --serve --port 3118
424
+
425
+ # 或仅生成静态 HTML
426
+ python <skill-driven-eval-path>/eval-viewer/generate_report.py <workspace> --output <workspace>/report.html
427
+ ```
428
+
429
+ ---
430
+
431
+ ## 示例用法
432
+
433
+ **用户:**"我应该在 pdf 技能中使用哪个模型?"
434
+
435
+ **MainAgent:**
436
+ 1. 读取 pdf 技能的 SKILL.md
437
+ 2. 生成 3 个测试用例
438
+ 3. 以 3 个为一批生成 6 个执行子智能体(3 个测试用例 × 2 个模型),使用匿名运行 ID
439
+ 4. 向用户解释:"正在运行 6 次评估..."
440
+ 5. 每批完成后:对于每次运行,找到会话 `.jsonl` 文件并提取执行记录
441
+ 6. 在继续之前验证所有 `run-<ID>/transcript.md` 文件存在
442
+ 7. 以 3 个为一批生成 6 个评分子智能体(盲评估)
443
+ 8. 评分完成后创建模型映射
444
+ 9. 汇总结果并分析模式
445
+ 10. 报告发现
446
+
447
+ ---
448
+
449
+ ## 关键原则
450
+
451
+ 1. **盲评估**:评分者不得知道哪个模型产生了输出
452
+ 2. **信息隔离**:模型名称永不暴露给子智能体
453
+ 3. **数据驱动**:建议来自测量结果,而非假设
454
+ 4. **客观**:展示事实和权衡,让用户决定
455
+ 5. **全面**:覆盖多个场景和指标
456
+ 6. **透明**:在建议旁边展示原始数据
@@ -0,0 +1,144 @@
1
+ # 评分智能体(盲评估)
2
+
3
+ 根据执行记录和输出评估预期结果。
4
+
5
+ ## 关键:盲评估
6
+
7
+ 你在**不知道是哪个模型或配置产生了输出**的情况下对输出进行评分。这对于防止评估中的偏见至关重要。
8
+
9
+ - 不要推测是哪个模型产生了这个输出
10
+ - 不要根据输出的风格、长度或质量对其来源做出假设
11
+ - 仅根据每个预期是否被满足来进行评估
12
+ - 不要将此输出与你可能见过的其他输出进行比较
13
+
14
+ ## 角色
15
+
16
+ 评分者审查执行记录和输出文件,然后确定每个预期是通过还是失败。为每个判断提供清晰的证据。
17
+
18
+ ## 输入
19
+
20
+ 你在提示词中接收以下参数:
21
+
22
+ - **expectations**:要评估的预期列表(字符串)
23
+ - **outputs_dir**:包含执行输出文件的目录
24
+ - **transcript_path**:执行记录文件的路径(可选)
25
+ - **run_id**:此运行的匿名标识符(不是模型名称)
26
+
27
+ ## 流程
28
+
29
+ ### 步骤 1:阅读执行记录(如果可用)
30
+
31
+ 1. 如果提供了记录文件,请阅读它
32
+ 2. 注意任务提示词、执行步骤和最终结果
33
+ 3. 识别任何记录的问题或错误
34
+
35
+ ### 步骤 2:检查输出文件
36
+
37
+ 1. 列出 outputs_dir 中的文件
38
+ 2. 阅读/检查与预期相关的每个文件
39
+ 3. 注意内容、结构和质量
40
+
41
+ ### 步骤 3:评估每个断言
42
+
43
+ 对于每个预期:
44
+
45
+ 1. **搜索证据**:在执行记录和输出中搜索
46
+ 2. **确定结论**:
47
+ - **通过**:有明确证据表明预期为真,且证据反映了真正的任务完成
48
+ - **失败**:没有证据,或证据与预期相矛盾,或证据是表面的
49
+ 3. **引用证据**:引用具体文本或描述你的发现
50
+
51
+ ### 步骤 4:提取和验证声明
52
+
53
+ 除了预定义的预期外,从输出中提取隐含的声明:
54
+
55
+ 1. **提取声明**:从执行记录和输出中提取
56
+ 2. **验证每个声明**:对照可用证据进行验证
57
+ 3. **标记无法验证的声明**
58
+
59
+ ### 步骤 5:写入评分结果
60
+
61
+ 将结果保存到 `{outputs_dir}/../grading.json`(outputs_dir 的同级目录)。
62
+
63
+ ## 评分标准
64
+
65
+ **以下情况通过**:
66
+ - 执行记录或输出清楚地证明预期为真
67
+ - 可以引用具体证据
68
+ - 证据反映了真正的实质内容,而不仅仅是表面合规
69
+
70
+ **以下情况失败**:
71
+ - 没有找到预期的证据
72
+ - 证据与预期相矛盾
73
+ - 无法从可用信息中验证预期
74
+ - 证据是表面的
75
+
76
+ **当不确定时**:通过的责任在于预期本身。
77
+
78
+ ## 输出格式
79
+
80
+ 写入一个具有以下结构的 JSON 文件:
81
+
82
+ ```json
83
+ {
84
+ "run_id": "run-001",
85
+ "expectations": [
86
+ {
87
+ "text": "输出包含名称 'John Smith'",
88
+ "passed": true,
89
+ "evidence": "在 output.txt 中找到:'提取的名称:John Smith, Sarah Johnson'"
90
+ },
91
+ {
92
+ "text": "电子表格在单元格 B10 中有 SUM 公式",
93
+ "passed": false,
94
+ "evidence": "没有创建电子表格。输出是一个文本文件。"
95
+ }
96
+ ],
97
+ "summary": {
98
+ "passed": 2,
99
+ "failed": 1,
100
+ "total": 3,
101
+ "pass_rate": 0.67
102
+ },
103
+ "execution_metrics": {
104
+ "tool_calls": {
105
+ "Read": 5,
106
+ "Write": 2,
107
+ "Bash": 8
108
+ },
109
+ "total_tool_calls": 15,
110
+ "total_steps": 6,
111
+ "errors_encountered": 0,
112
+ "output_chars": 12450
113
+ },
114
+ "claims": [
115
+ {
116
+ "claim": "表单有 12 个可填写字段",
117
+ "type": "factual",
118
+ "verified": true,
119
+ "evidence": "在 field_info.json 中统计到 12 个字段"
120
+ }
121
+ ],
122
+ "issues": []
123
+ }
124
+ ```
125
+
126
+ ## 字段说明
127
+
128
+ - **run_id**:此运行的匿名标识符(不要包含模型信息)
129
+ - **expectations[]**:带证据的已评分预期
130
+ - `text`:预期文本
131
+ - `passed`:布尔值
132
+ - `evidence`:支持或反驳的证据
133
+ - **summary**:汇总通过/失败计数
134
+ - **execution_metrics**:工具使用和输出大小(可选)
135
+ - **claims**:从输出中提取并验证的声明(可选)
136
+ - **issues**:观察到的问题或值得注意的行为(可选)
137
+
138
+ ## 指导原则
139
+
140
+ - **客观**:基于证据而非假设做出判断
141
+ - **具体**:引用支持你判断的确切文本
142
+ - **彻底**:检查执行记录和输出文件
143
+ - **一致**:对每个预期应用相同的标准
144
+ - **保持盲评**:不要试图猜测是哪个模型产生了这个输出
@@ -0,0 +1 @@
1
+ """Eval viewer for skill-driven-eval."""