kc-beta 0.1.0

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 (141) hide show
  1. package/bin/kc-beta.js +16 -0
  2. package/package.json +32 -0
  3. package/src/agent/confidence-scorer.js +120 -0
  4. package/src/agent/context.js +124 -0
  5. package/src/agent/corner-case-registry.js +119 -0
  6. package/src/agent/engine.js +224 -0
  7. package/src/agent/events.js +27 -0
  8. package/src/agent/history.js +101 -0
  9. package/src/agent/llm-client.js +131 -0
  10. package/src/agent/pipelines/base.js +14 -0
  11. package/src/agent/pipelines/distillation.js +113 -0
  12. package/src/agent/pipelines/extraction.js +92 -0
  13. package/src/agent/pipelines/index.js +23 -0
  14. package/src/agent/pipelines/initializer.js +163 -0
  15. package/src/agent/pipelines/production-qc.js +99 -0
  16. package/src/agent/pipelines/skill-authoring.js +83 -0
  17. package/src/agent/pipelines/skill-testing.js +111 -0
  18. package/src/agent/tools/agent-tool.js +100 -0
  19. package/src/agent/tools/base.js +35 -0
  20. package/src/agent/tools/dashboard-render.js +146 -0
  21. package/src/agent/tools/document-parse.js +184 -0
  22. package/src/agent/tools/document-search.js +111 -0
  23. package/src/agent/tools/evolution-cycle.js +150 -0
  24. package/src/agent/tools/qc-sample.js +94 -0
  25. package/src/agent/tools/registry.js +55 -0
  26. package/src/agent/tools/rule-catalog.js +113 -0
  27. package/src/agent/tools/sandbox-exec.js +106 -0
  28. package/src/agent/tools/tier-downgrade.js +114 -0
  29. package/src/agent/tools/worker-llm-call.js +109 -0
  30. package/src/agent/tools/workflow-run.js +138 -0
  31. package/src/agent/tools/workspace-file.js +122 -0
  32. package/src/agent/version-manager.js +130 -0
  33. package/src/agent/workspace.js +82 -0
  34. package/src/cli/components.js +164 -0
  35. package/src/cli/index.js +329 -0
  36. package/src/cli/init.js +80 -0
  37. package/src/cli/onboard.js +182 -0
  38. package/src/cli/terminal.js +143 -0
  39. package/src/config.js +93 -0
  40. package/template/.env.template +31 -0
  41. package/template/CLAUDE.md +137 -0
  42. package/template/Input/.gitkeep +0 -0
  43. package/template/Output/.gitkeep +0 -0
  44. package/template/Rules/.gitkeep +0 -0
  45. package/template/Samples/.gitkeep +0 -0
  46. package/template/skills/en/meta/compliance-judgment/SKILL.md +114 -0
  47. package/template/skills/en/meta/compliance-judgment/references/output-format.md +151 -0
  48. package/template/skills/en/meta/confidence-system/SKILL.md +117 -0
  49. package/template/skills/en/meta/corner-case-management/SKILL.md +111 -0
  50. package/template/skills/en/meta/cross-document-verification/SKILL.md +131 -0
  51. package/template/skills/en/meta/cross-document-verification/references/contradiction-taxonomy.md +73 -0
  52. package/template/skills/en/meta/data-sensibility/SKILL.md +115 -0
  53. package/template/skills/en/meta/document-parsing/SKILL.md +108 -0
  54. package/template/skills/en/meta/document-parsing/references/parser-catalog.md +40 -0
  55. package/template/skills/en/meta/entity-extraction/SKILL.md +129 -0
  56. package/template/skills/en/meta/tree-processing/SKILL.md +103 -0
  57. package/template/skills/en/meta-meta/bootstrap-workspace/SKILL.md +70 -0
  58. package/template/skills/en/meta-meta/dashboard-reporting/SKILL.md +106 -0
  59. package/template/skills/en/meta-meta/dashboard-reporting/scripts/generate_dashboard.py +178 -0
  60. package/template/skills/en/meta-meta/evolution-loop/SKILL.md +210 -0
  61. package/template/skills/en/meta-meta/evolution-loop/references/convergence-guide.md +62 -0
  62. package/template/skills/en/meta-meta/quality-control/SKILL.md +138 -0
  63. package/template/skills/en/meta-meta/quality-control/references/qa-layers.md +92 -0
  64. package/template/skills/en/meta-meta/quality-control/references/sampling-strategies.md +76 -0
  65. package/template/skills/en/meta-meta/rule-extraction/SKILL.md +100 -0
  66. package/template/skills/en/meta-meta/rule-extraction/references/chunking-strategies.md +80 -0
  67. package/template/skills/en/meta-meta/rule-graph/SKILL.md +118 -0
  68. package/template/skills/en/meta-meta/skill-authoring/SKILL.md +108 -0
  69. package/template/skills/en/meta-meta/skill-authoring/references/skill-format-spec.md +78 -0
  70. package/template/skills/en/meta-meta/skill-to-workflow/SKILL.md +150 -0
  71. package/template/skills/en/meta-meta/skill-to-workflow/references/worker-llm-catalog.md +50 -0
  72. package/template/skills/en/meta-meta/task-decomposition/SKILL.md +129 -0
  73. package/template/skills/en/meta-meta/task-decomposition/references/decision-matrix.md +81 -0
  74. package/template/skills/en/meta-meta/version-control/SKILL.md +152 -0
  75. package/template/skills/en/meta-meta/version-control/references/trace-id-spec.md +79 -0
  76. package/template/skills/en/skill-creator/LICENSE.txt +202 -0
  77. package/template/skills/en/skill-creator/SKILL.md +479 -0
  78. package/template/skills/en/skill-creator/agents/analyzer.md +274 -0
  79. package/template/skills/en/skill-creator/agents/comparator.md +202 -0
  80. package/template/skills/en/skill-creator/agents/grader.md +223 -0
  81. package/template/skills/en/skill-creator/assets/eval_review.html +146 -0
  82. package/template/skills/en/skill-creator/eval-viewer/generate_review.py +471 -0
  83. package/template/skills/en/skill-creator/eval-viewer/viewer.html +1325 -0
  84. package/template/skills/en/skill-creator/references/schemas.md +430 -0
  85. package/template/skills/en/skill-creator/scripts/__init__.py +0 -0
  86. package/template/skills/en/skill-creator/scripts/aggregate_benchmark.py +401 -0
  87. package/template/skills/en/skill-creator/scripts/generate_report.py +326 -0
  88. package/template/skills/en/skill-creator/scripts/improve_description.py +248 -0
  89. package/template/skills/en/skill-creator/scripts/package_skill.py +136 -0
  90. package/template/skills/en/skill-creator/scripts/quick_validate.py +103 -0
  91. package/template/skills/en/skill-creator/scripts/run_eval.py +310 -0
  92. package/template/skills/en/skill-creator/scripts/run_loop.py +332 -0
  93. package/template/skills/en/skill-creator/scripts/utils.py +47 -0
  94. package/template/skills/zh/meta/compliance-judgment/SKILL.md +303 -0
  95. package/template/skills/zh/meta/compliance-judgment/references/output-format.md +151 -0
  96. package/template/skills/zh/meta/confidence-system/SKILL.md +228 -0
  97. package/template/skills/zh/meta/corner-case-management/SKILL.md +235 -0
  98. package/template/skills/zh/meta/cross-document-verification/SKILL.md +241 -0
  99. package/template/skills/zh/meta/cross-document-verification/references/contradiction-taxonomy.md +73 -0
  100. package/template/skills/zh/meta/data-sensibility/SKILL.md +235 -0
  101. package/template/skills/zh/meta/document-parsing/SKILL.md +168 -0
  102. package/template/skills/zh/meta/document-parsing/references/parser-catalog.md +40 -0
  103. package/template/skills/zh/meta/entity-extraction/SKILL.md +276 -0
  104. package/template/skills/zh/meta/tree-processing/SKILL.md +233 -0
  105. package/template/skills/zh/meta-meta/bootstrap-workspace/SKILL.md +147 -0
  106. package/template/skills/zh/meta-meta/dashboard-reporting/SKILL.md +281 -0
  107. package/template/skills/zh/meta-meta/dashboard-reporting/scripts/generate_dashboard.py +178 -0
  108. package/template/skills/zh/meta-meta/evolution-loop/SKILL.md +302 -0
  109. package/template/skills/zh/meta-meta/evolution-loop/references/convergence-guide.md +62 -0
  110. package/template/skills/zh/meta-meta/quality-control/SKILL.md +269 -0
  111. package/template/skills/zh/meta-meta/quality-control/references/qa-layers.md +92 -0
  112. package/template/skills/zh/meta-meta/quality-control/references/sampling-strategies.md +76 -0
  113. package/template/skills/zh/meta-meta/rule-extraction/SKILL.md +208 -0
  114. package/template/skills/zh/meta-meta/rule-extraction/references/chunking-strategies.md +80 -0
  115. package/template/skills/zh/meta-meta/rule-graph/SKILL.md +203 -0
  116. package/template/skills/zh/meta-meta/skill-authoring/SKILL.md +235 -0
  117. package/template/skills/zh/meta-meta/skill-authoring/references/skill-format-spec.md +78 -0
  118. package/template/skills/zh/meta-meta/skill-to-workflow/SKILL.md +275 -0
  119. package/template/skills/zh/meta-meta/skill-to-workflow/references/worker-llm-catalog.md +50 -0
  120. package/template/skills/zh/meta-meta/task-decomposition/SKILL.md +224 -0
  121. package/template/skills/zh/meta-meta/task-decomposition/references/decision-matrix.md +81 -0
  122. package/template/skills/zh/meta-meta/version-control/SKILL.md +284 -0
  123. package/template/skills/zh/meta-meta/version-control/references/trace-id-spec.md +79 -0
  124. package/template/skills/zh/skill-creator/LICENSE.txt +202 -0
  125. package/template/skills/zh/skill-creator/SKILL.md +479 -0
  126. package/template/skills/zh/skill-creator/agents/analyzer.md +274 -0
  127. package/template/skills/zh/skill-creator/agents/comparator.md +202 -0
  128. package/template/skills/zh/skill-creator/agents/grader.md +223 -0
  129. package/template/skills/zh/skill-creator/assets/eval_review.html +146 -0
  130. package/template/skills/zh/skill-creator/eval-viewer/generate_review.py +471 -0
  131. package/template/skills/zh/skill-creator/eval-viewer/viewer.html +1325 -0
  132. package/template/skills/zh/skill-creator/references/schemas.md +430 -0
  133. package/template/skills/zh/skill-creator/scripts/__init__.py +0 -0
  134. package/template/skills/zh/skill-creator/scripts/aggregate_benchmark.py +401 -0
  135. package/template/skills/zh/skill-creator/scripts/generate_report.py +326 -0
  136. package/template/skills/zh/skill-creator/scripts/improve_description.py +248 -0
  137. package/template/skills/zh/skill-creator/scripts/package_skill.py +136 -0
  138. package/template/skills/zh/skill-creator/scripts/quick_validate.py +103 -0
  139. package/template/skills/zh/skill-creator/scripts/run_eval.py +310 -0
  140. package/template/skills/zh/skill-creator/scripts/run_loop.py +332 -0
  141. package/template/skills/zh/skill-creator/scripts/utils.py +47 -0
@@ -0,0 +1,275 @@
1
+ ---
2
+ name: skill-to-workflow
3
+ description: Distill a proven verification skill into a Python workflow with worker LLM prompts. Use when a rule skill has been tested and reaches the SKILL_ACCURACY threshold defined in .env. Covers the decision of what to implement as code vs LLM calls, prompt engineering for small context windows, model tier selection and progressive downgrade, and testing workflows against the coding agent's own results as ground truth. Also use when optimizing existing workflows for cost or speed.
4
+ ---
5
+
6
+ # 技能到工作流的蒸馏
7
+
8
+ ## 蒸馏的本质
9
+
10
+ 技能(Skill)是标准答案。它由你这个编程智能体直接执行,调用最强的模型、拥有完整的上下文、不计成本地追求准确率。
11
+
12
+ 工作流(Workflow)是技能的廉价近似。它由 Python 代码驱动,调用更小、更便宜的Worker LLM(执行模型),在有限的上下文窗口内完成核查。
13
+
14
+ 蒸馏的目标:**在成本大幅降低的前提下,尽可能逼近技能的准确率。**
15
+
16
+ 这不是翻译。你不是把 SKILL.md 翻译成 Python。你是在重新设计核查流程,让一个能力更弱的执行者也能做对。
17
+
18
+ ## 启动蒸馏的前提条件
19
+
20
+ 必须同时满足以下条件才能启动蒸馏:
21
+
22
+ 1. **技能测试准确率达标**:在 `assets/samples.json` 和 `assets/corner_cases.json` 上的准确率 ≥ `.env` 中的 `SKILL_ACCURACY` 阈值
23
+ 2. **边界案例已充分记录**:至少覆盖了已知的主要例外情形
24
+ 3. **判定逻辑已稳定**:最近两轮迭代没有对核心判定逻辑做出修改
25
+
26
+ 如果技能本身还在频繁迭代,不要急于蒸馏。等它稳定下来。
27
+
28
+ ## 蒸馏决策:代码还是模型调用
29
+
30
+ 这是蒸馏过程中最关键的决策。原则很简单:
31
+
32
+ ### 用 Python 代码实现(零成本)
33
+
34
+ - 日期比较、金额计算、税率换算
35
+ - 正则匹配(发票号码格式、统一社会信用代码校验)
36
+ - 字段存在性检查
37
+ - 格式标准化(大小写、日期格式转换)
38
+ - 枚举值校验(货币代码、国别代码)
39
+ - 数学运算(价税合计 = 不含税金额 × (1 + 税率))
40
+
41
+ ### 用Worker LLM调用实现(有成本)
42
+
43
+ - 从非结构化文本中提取关键信息
44
+ - 理解自然语言描述的业务含义
45
+ - 判断两段文字的语义是否一致
46
+ - 识别和解析复杂的表格结构
47
+ - 分类判断(如:该笔费用属于哪个科目)
48
+
49
+ ### 混合方案(推荐)
50
+
51
+ 大多数核查规则的最优实现是混合方案:
52
+
53
+ ```
54
+ 1. Python 预处理(格式化、提取结构化字段)
55
+ 2. LLM 调用(语义理解、非结构化信息提取)
56
+ 3. Python 后处理(逻辑判断、计算、格式化输出)
57
+ ```
58
+
59
+ 把 LLM 调用夹在中间,用代码限制它的输入范围和输出格式。这样既能利用 LLM 的语义能力,又能用代码保证确定性。
60
+
61
+ ## 工作流文件结构
62
+
63
+ ```
64
+ workflows/R001-invoice-date-validity/
65
+ ├── workflow_v1.py # 主流程代码
66
+ ├── prompts/ # Worker LLM的提示词模板
67
+ │ ├── extract_dates.md # 日期提取提示词
68
+ │ └── judge_validity.md # 有效性判断提示词
69
+ ├── config.json # 配置(模型层级、参数)
70
+ └── CHANGELOG.md # 变更记录
71
+ ```
72
+
73
+ ### workflow_v1.py 的结构要求
74
+
75
+ ```python
76
+ """
77
+ R001 - 发票日期有效性核查工作流
78
+ 蒸馏自: rule-skills/R001-invoice-date-validity/
79
+ 技能准确率: 95%
80
+ 蒸馏日期: 2025-04-01
81
+ """
82
+
83
+ import json
84
+ import os
85
+ from pathlib import Path
86
+
87
+ def run_verification(document_data: dict, config: dict) -> dict:
88
+ """
89
+ 工作流入口函数。
90
+
91
+ Args:
92
+ document_data: 待核查的单据数据
93
+ config: 运行时配置(模型选择、API地址等)
94
+
95
+ Returns:
96
+ 标准核查结果字典
97
+ """
98
+ # 步骤1: 预处理(纯代码)
99
+ # 步骤2: LLM提取(如需要)
100
+ # 步骤3: 逻辑判断(纯代码)
101
+ # 步骤4: 格式化输出
102
+ pass
103
+ ```
104
+
105
+ 入口函数必须是 `run_verification`,签名固定。这样质量监控和批量处理可以统一调度。
106
+
107
+ ### config.json
108
+
109
+ ```json
110
+ {
111
+ "rule_id": "R001",
112
+ "rule_name": "发票日期有效性",
113
+ "distilled_from": "rule-skills/R001-invoice-date-validity/",
114
+ "version": "v1",
115
+ "model_tier": "TIER3",
116
+ "llm_steps": ["extract_dates"],
117
+ "code_steps": ["normalize_format", "compare_dates", "format_output"],
118
+ "estimated_cost_per_doc": 0.002,
119
+ "api_base_url": "${API_BASE_URL}",
120
+ "api_key": "${API_KEY}"
121
+ }
122
+ ```
123
+
124
+ ## Worker LLM的提示词工程
125
+
126
+ Worker LLM不是你。它的上下文窗口更小,推理能力更弱,对业务背景一无所知。提示词必须为它的局限性做设计。
127
+
128
+ ### 自包含原则
129
+
130
+ 提示词不能假设Worker LLM知道任何背景信息。所有必要的上下文都要在提示词中显式提供:
131
+
132
+ ```markdown
133
+ 你是一个单据信息提取助手。你的任务是从以下发票文本中提取开票日期。
134
+
135
+ 提取规则:
136
+ - 查找「开票日期」或「Date of Issue」字段
137
+ - 日期格式统一输出为 YYYY-MM-DD
138
+ - 如果找不到日期,输出 null
139
+ - 只提取日期,不要做任何判断
140
+
141
+ 发票文本:
142
+ {invoice_text}
143
+ ```
144
+
145
+ ### 结构化输出强制
146
+
147
+ Worker LLM的输出必须是可解析的。在提示词中明确要求 JSON 格式输出:
148
+
149
+ ```markdown
150
+ 请严格按照以下 JSON 格式输出,不要输出任何其他内容:
151
+
152
+ {
153
+ "invoice_date": "YYYY-MM-DD 或 null",
154
+ "extraction_confidence": "high / medium / low"
155
+ }
156
+ ```
157
+
158
+ ### 收窄上下文
159
+
160
+ 不要把整篇文档丢给Worker LLM。只传入它需要处理的那部分内容:
161
+
162
+ - 如果只需要提取发票日期,只传发票头部区域的文本
163
+ - 如果需要比对合同信息,只传合同中的相关条款段落
164
+ - 上下文越窄,提取越准,成本越低
165
+
166
+ ### 使用单据语言
167
+
168
+ 提示词的指令语言应该与单据语言一致。核查中文单据时,提示词用中文写。这样可以避免Worker LLM在语言切换中引入错误。
169
+
170
+ ### 少量示例策略
171
+
172
+ 在提示词中提供 1-2 个精简的输入输出示例,但不要过多:
173
+
174
+ - Worker LLM的上下文窗口有限,示例太多会挤占正文空间
175
+ - 选择最典型的正例和一个常见的异常例
176
+ - 示例要简短,只展示关键特征
177
+
178
+ ## 模型层级选择与逐级降级
179
+
180
+ ### 选择策略
181
+
182
+ 从 TIER1 开始,逐步尝试更低层级。`.env` 中定义了四个层级:
183
+
184
+ - `TIER1`:最强,适合复杂的语义理解和多步推理
185
+ - `TIER2`:中等,适合需要一定推理的提取和判断
186
+ - `TIER3`:轻量,适合结构化信息提取
187
+ - `TIER4`:最便宜,适合简单的格式提取和分类
188
+
189
+ ### 降级流程
190
+
191
+ ```
192
+ 1. 用 TIER1 运行全部测试样本,确立准确率天花板
193
+ 2. 用 TIER2 运行同一批测试样本,与 TIER1 结果对比
194
+ 3. 如果 TIER2 准确率接近 TIER1 → 继续尝试 TIER3
195
+ 4. 如果 TIER3 仍然接近 → 继续尝试 TIER4
196
+ 5. 选择满足 WORKFLOW_ACCURACY 阈值的最低层级
197
+ 6. 如果 TIER1 本身都不达标 → 回到技能层面检查提示词设计
198
+ ```
199
+
200
+ 注意:不同步骤可以使用不同层级。比如日期提取用 TIER4,语义判断用 TIER2。在 config.json 中按步骤记录最优层级。
201
+
202
+ ### 正式降级协议
203
+
204
+ 以下数值和流程是推荐起点,编程智能体和开发者用户应根据实际情况自由调整。重要的是模式本身(测试 → 对比 → 记录 → 退化时重评),而非具体数字。
205
+
206
+ **方向**:自上而下。先用 TIER1 建立准确率天花板,再逐级尝试更低层级,找到成本与准确率的最优平衡点。
207
+
208
+ **最低测试量**:每个候选层级至少运行 min(10, total_samples) 篇文档。样本量太少则结论不可靠。
209
+
210
+ **准确率差值判定**:若低一级模型的准确率显著低于上一级(建议阈值:>5个百分点),则停留在较高层级。例如 TIER1 达到 96%、TIER2 只有 89%,则该步骤选定 TIER1。
211
+
212
+ **逐步骤独立评估**:工作流中每个 LLM 调用步骤独立评估模型层级。步骤 A 可能用 TIER3,步骤 B 可能需要 TIER1。最终结果按步骤分别记录在 config.json 的 `llm_steps` 配置中。
213
+
214
+ **退化触发重评**:生产环境质控发现准确率下降时(如 `quality-control` 技能检测到的退化信号),应对相关步骤重新执行降级评估。模型供应商更新、数据分布漂移都可能导致原有选择失效。
215
+
216
+ **模型-任务推荐表**:在项目级别维护 task_type → tier 的映射表,积累经验数据。例如「中文发票日期提取 → TIER4」「合同语义比对 → TIER1」。随着测试轮次增多,这张表会成为新规则蒸馏的起点参考。
217
+
218
+ **与文档解析的一致性**:此降级框架与 `document-parsing` 技能中解析器逐级升级的机制同构——都是在层级间做测试、对比、选择。两者可复用相同的评估脚本和判定逻辑。
219
+
220
+ ## 对照真值测试
221
+
222
+ 技能的核查结果就是真值(Ground Truth)。工作流的测试方法是与技能结果逐字段对比。
223
+
224
+ ### 对比维度
225
+
226
+ - **判定一致性**:工作流的 verdict 是否与技能的 verdict 一致
227
+ - **字段提取准确性**:工作流提取的字段值是否与技能提取的一致
228
+ - **置信度校准**:工作流报告高置信度的案例,是否确实准确率更高
229
+
230
+ ### 准确率计算
231
+
232
+ ```
233
+ 工作流准确率 = 与技能判定一致的案例数 / 总案例数
234
+ ```
235
+
236
+ 分别计算总体准确率和分类准确率(通过、不通过、无法核查各自的准确率),避免类别不均衡导致的误判。
237
+
238
+ ## 版本管理
239
+
240
+ 工作流的迭代以文件版本号标识:
241
+
242
+ - `workflow_v1.py` → 初始蒸馏版本
243
+ - `workflow_v2.py` → 优化提示词后的版本
244
+ - `workflow_v3.py` → 更换模型层级后的版本
245
+
246
+ 不要覆盖旧版本文件。保留完整的版本历史,便于回退和对比。
247
+
248
+ ## 成本追踪
249
+
250
+ 每次工作流运行都记录成本数据:
251
+
252
+ ```json
253
+ {
254
+ "rule_id": "R001",
255
+ "workflow_version": "v2",
256
+ "document_id": "DOC-001",
257
+ "llm_calls": 2,
258
+ "total_tokens": 1850,
259
+ "estimated_cost_usd": 0.003,
260
+ "model_used": "TIER3",
261
+ "timestamp": "2025-04-01T10:30:00Z"
262
+ }
263
+ ```
264
+
265
+ 汇总后用于评估单据平均核查成本,指导模型层级优化方向。
266
+
267
+ ## SiliconFlow API 配置说明
268
+
269
+ 工作流中调用Worker LLM时,通过 `.env` 中配置的 `API_BASE_URL` 和 `API_KEY` 连接到 SiliconFlow 或其他兼容的 API 服务。
270
+
271
+ 调用时注意:
272
+ - 使用标准的 OpenAI 兼容接口格式
273
+ - 设置合理的超时和重试机制
274
+ - 对 API 错误做好降级处理(如某模型不可用时切换到备选模型)
275
+ - 记录每次调用的 token 用量和响应时间
@@ -0,0 +1,50 @@
1
+ # Worker LLM Catalog
2
+
3
+ Models available via SiliconFlow API for worker LLM tasks. Update this catalog as models change.
4
+
5
+ ## Text Models
6
+
7
+ | Tier | Model | Context Window | Strengths | Notes |
8
+ |------|-------|---------------|-----------|-------|
9
+ | TIER1 | Pro/zai-org/GLM-5 | 128K | Strong reasoning, Chinese language | Top tier for complex judgment |
10
+ | TIER1 | Pro/moonshotai/Kimi-K2.5 | 128K | Long context, strong extraction | Good for full-document processing |
11
+ | TIER2 | Pro/deepseek-ai/DeepSeek-V3.2 | 64K | Balanced capability/cost | Good general purpose |
12
+ | TIER2 | Pro/MiniMaxAI/MiniMax-M2.5 | 64K | Strong Chinese, fast | Good for Chinese documents |
13
+ | TIER2 | Qwen/Qwen3.5-397B-A17B | 32K | Large MoE, strong reasoning | Cost-effective for complex tasks |
14
+ | TIER3 | Qwen/Qwen3.5-122B-A10B | 32K | Good accuracy, lower cost | Sweet spot for many tasks |
15
+ | TIER4 | Qwen/Qwen3.5-35B-A3B | 16K | Fast, cheap | Best for simple extraction |
16
+
17
+ ## Vision/OCR Models
18
+
19
+ | Tier | Model | Strengths | Notes |
20
+ |------|-------|-----------|-------|
21
+ | OCR_TIER1 | zai-org/GLM-4.6V | Best OCR accuracy | Use for complex tables/charts |
22
+ | OCR_TIER2 | Qwen/Qwen3.5-397B-A17B | Good general vision | Multimodal version |
23
+ | OCR_TIER3 | PaddlePaddle/PaddleOCR-VL-1.5 | Fast, lightweight OCR | Best for standard text |
24
+
25
+ ## Selection Guidelines
26
+
27
+ - Start with the highest tier that fits your context window needs.
28
+ - For extraction of simple entities (dates, amounts, names): TIER3-4 often sufficient.
29
+ - For semantic judgment (adequacy, compliance): TIER1-2 usually needed.
30
+ - For Chinese financial documents: prefer GLM and Qwen models over DeepSeek for domain terminology.
31
+ - Context window constraint: if the section to process exceeds the model's window, either narrow the context further (tree processing) or use a model with a larger window.
32
+
33
+ ## API Configuration
34
+
35
+ ```python
36
+ import openai
37
+
38
+ client = openai.OpenAI(
39
+ api_key=os.getenv("SILICONFLOW_API_KEY"),
40
+ base_url=os.getenv("SILICONFLOW_BASE_URL")
41
+ )
42
+
43
+ response = client.chat.completions.create(
44
+ model="Qwen/Qwen3.5-122B-A10B", # Use the model name from the table
45
+ messages=[{"role": "user", "content": prompt}],
46
+ temperature=0.1 # Low temperature for deterministic extraction
47
+ )
48
+ ```
49
+
50
+ This catalog should be maintained by the coding agent. Add new models as they become available, remove deprecated models, and update capability assessments based on testing experience.
@@ -0,0 +1,224 @@
1
+ ---
2
+ name: task-decomposition
3
+ description: Decompose each verification rule into independent sub-tasks and assign the optimal method (rule, code, LLM, manual) to each. Use when converting extracted rules into implementation plans, when a rule skill is too expensive or inaccurate and needs restructuring, or when designing a multi-step verification pipeline. Covers MECE decomposition, method selection via the four-dimension decision matrix, cost-benefit analysis, and source tagging. Also use when auditing an existing workflow for cost optimization opportunities.
4
+ ---
5
+
6
+ # 任务分解与方法分配——柳叶刀方法
7
+
8
+ ## 为什么叫「柳叶刀」
9
+
10
+ 外科手术用柳叶刀,不用斧头。核查任务的分解也是如此——每一刀都要精准,切在方法论的边界上,而不是随意劈开。
11
+
12
+ 每条核查规则看起来是一个动作,实际上是一条操作链。以「核查发票日期是否在合同有效期内」为例,实际包含:定位发票日期字段 → 提取日期值 → 标准化日期格式 → 与合同日期比对 → 生成批注。这五个步骤各自需要不同的处理方法。
13
+
14
+ 把整条链丢给 LLM 处理当然能跑通。但成本是精细分解方案的 100 倍,出了问题也无法定位是哪个环节错了。柳叶刀方法的核心:把每条规则切到方法论上同质的最小单元,然后为每个单元分配最便宜且能胜任的方法。
15
+
16
+ ## MECE 分解原则
17
+
18
+ 将核查规则分解为子任务时,必须满足 MECE(互斥穷尽)原则:
19
+
20
+ **互斥**——任意两个子任务不做重复的事。如果子任务A提取了发票日期,子任务B就不应再提取发票日期。重复意味着浪费和潜在的不一致。
21
+
22
+ **穷尽**——所有子任务合在一起覆盖整条规则。不能有遗漏。如果依次执行所有子任务,规则应当被完整核查。
23
+
24
+ 每个子任务有且仅有一个输入和一个输出。上一个子任务的输出是下一个子任务的输入。这形成了一条接口清晰的流水线。
25
+
26
+ ### 何时停止分解
27
+
28
+ 当子任务在方法论上是**同质的**——即只需一种方法就能完成——就停止分解。如果一个子任务仍然需要两种不同的方法(比如先用正则提取,再用 LLM 判断),说明它还不是原子级别,需要继续切分。
29
+
30
+ ### 标准分解链
31
+
32
+ 大多数文档核查规则的分解遵循这条链路:
33
+
34
+ ```
35
+ 定位 → 提取 → 标准化 → 判定 → 批注
36
+ ```
37
+
38
+ 不是每条规则都有全部五个阶段。有些规则不需要标准化(提取值已经是目标格式),有些通过时不需要批注。但这条链路是可靠的起始框架。
39
+
40
+ ### 流水线拓扑
41
+
42
+ 根据规则类型不同,流水线有三种典型拓扑:
43
+
44
+ - **线性**:单文档、单字段。`定位 → 提取 → 标准化 → 判定 → 批注`。大多数阈值检查属于此类,如资本充足率核查。
45
+ - **汇聚**:来自不同文档或不同章节的两个字段。两条平行的定位-提取链在判定步骤汇合。发票金额与合同金额的交叉验证属于此类。
46
+ - **扇出**:一条规则应用于文档内的多个条目(如验证发票中的每一行项目)。定位步骤产出 N 个条目,每个条目独立流过后续链路。此时规模维度至关重要——如果 N 很大,方法分配必须考虑单条目成本。
47
+
48
+ ### 分解示例:发票核查
49
+
50
+ 以「核查发票金额是否与合同约定一致」为例,完整分解如下:
51
+
52
+ | 序号 | 子任务 | 输入 | 输出 | 分配方法 | 依据 |
53
+ |---|---|---|---|---|---|
54
+ | 1 | 定位发票金额字段 | 发票全文 | 字段位置 | 正则 | 增值税发票金额字段位置固定,标记明确 |
55
+ | 2 | 提取发票金额 | 定位到的区域 | 数值(浮点数) | 正则 | 格式可预测:¥xxx,xxx.xx |
56
+ | 3 | 大写金额交叉校验 | 小写金额 + 大写金额文本 | 一致/不一致 | Python | 中文大写转数字后比对 |
57
+ | 4 | 定位合同金额条款 | 合同全文 | 段落文本 | LLM (Tier 3) | 合同格式多样,金额条款位置不固定 |
58
+ | 5 | 提取合同金额 | 定位到的段落 | 数值(浮点数) | 正则 + Python | 正则提取数字,Python 处理万/亿单位换算 |
59
+ | 6 | 金额比对 | 发票金额, 合同金额 | 通过/不通过 | Python | 纯算术比较(允许配置容差范围) |
60
+ | 7 | 生成批注 | 所有提取值 | 批注字符串 | 模板 | 「发票金额 {X} 元与合同约定 {Y} 元不一致,差异 {Z} 元」 |
61
+
62
+ 七个子任务中只有一个需要 LLM 调用。其余全部由正则或 Python 代码完成,成本为零。
63
+
64
+ ## 决策矩阵
65
+
66
+ 分解完成后,为每个子任务分配处理方法。分配依据四个维度的综合评估。完整的决策矩阵及详细用例参见 `references/decision-matrix.md`。
67
+
68
+ ### 四维度定义
69
+
70
+ | 维度 | 含义 | 低(1-2) | 中(3) | 高(4-5) |
71
+ |---|---|---|---|---|
72
+ | **确定性** | 输入格式的可预测程度 | 自由文本,无固定格式 | 半结构化,已知章节但格式多变 | 固定模板,字段位置精确 |
73
+ | **规模** | 每份文档需处理的条目数量 | 1-5 个 | 10-100 个 | 1,000 个以上 |
74
+ | **语义深度** | 需要的语言理解程度 | 零——纯模式或数值 | 中等——实体识别、简单上下文 | 深度——判断、充分性评估、意图推理 |
75
+ | **成本敏感度** | 单文档预算约束 | 不限(一次性审计) | 中等(每月数百份) | 紧张(每日数千份) |
76
+
77
+ ### 方法优先级
78
+
79
+ 始终优先选择最便宜的能达到准确率要求的方法:
80
+
81
+ ```
82
+ 规则/正则 → Python 代码 → LLM 调用 → 人工审核
83
+ ```
84
+
85
+ 不允许跳级。先试正则,不行再试代码,代码不行再试 LLM,LLM 不行才上人工。每次升级必须有下级方法失败的证据。
86
+
87
+ 注意四个维度之间存在交互作用。高规模加高成本敏感度会强力推动选择代码方案,即使中等语义深度在正常情况下指向 LLM。相反,低规模可以放松成本压力,使得 LLM 在理论上可以用复杂正则解决的任务上也成为可行选项。让维度的组合引导你,不要被任何单一维度绑架。
88
+
89
+ ### 决策速查表
90
+
91
+ | 确定性 | 规模 | 语义深度 | 成本敏感度 | 推荐方法 |
92
+ |---|---|---|---|---|
93
+ | 高 | 任意 | 低 | 任意 | **正则 / 规则** |
94
+ | 高 | 任意 | 低 | 任意 | **Python 代码** |
95
+ | 中 | 高 | 低 | 高 | **代码 + 正则** |
96
+ | 中 | 低 | 中 | 低 | **LLM** |
97
+ | 低 | 任意 | 高 | 任意 | **LLM** |
98
+ | 低 | 高 | 高 | 高 | **低层级 LLM + 抽样校验** |
99
+ | 任意 | 任意 | 任意 | — | **人工**(兜底) |
100
+
101
+ ## 成本效益意识
102
+
103
+ 方法分配不是纸上谈兵,它直接决定了生产环境的单文档成本。
104
+
105
+ ### 实战案例:发票匹配合同
106
+
107
+ 某企业需要将 31,800 张发票与 15,940 份合同进行匹配。暴力方案:对 5.07 亿个配对全部调用 LLM 比对。
108
+
109
+ 按 SiliconFlow API 定价(以 Qwen2.5-7B 为例,输入 ¥0.35/百万 token,输出 ¥0.35/百万 token),每次比对按 500 token 输入 + 100 token 输出计算:
110
+
111
+ - 单次调用成本:约 ¥0.00021
112
+ - 5.07 亿次调用:约 ¥106,470
113
+
114
+ 十万元人民币只为了做配对匹配,这在任何业务场景下都不可接受。
115
+
116
+ 柳叶刀方法的分层方案:
117
+
118
+ | 层级 | 方法 | 输入规模 | 输出规模 | 消减率 | 成本 |
119
+ |---|---|---|---|---|---|
120
+ | 1. 供应商名称 + 合同编号精确匹配 | 正则 | 5.07 亿对 | 25,200 匹配 | 99.5% | ≈ ¥0 |
121
+ | 2. 金额区间(±5%)+ 日期重叠 | Python | 剩余未匹配 | 12,400 候选 | 97.6% | ≈ ¥0 |
122
+ | 3. 行项目描述语义比对 | LLM (Tier 3) | 12,400 候选 | 7,652 确认 | 精准过滤 | ≈ ¥170 |
123
+ | 4. 低置信度匹配人工审核 | 人工 | ~200 不确定 | ~200 解决 | 兜底 | ≈ ¥700 |
124
+
125
+ 总成本:约 ¥870。是暴力方案的 **1/122**。准确率相同,可调试性更强。
126
+
127
+ ### 成本计算模板
128
+
129
+ 在分解阶段就估算单文档成本:
130
+
131
+ | 子任务 | 方法 | 单次成本 | 每文档调用次数 | 小计 |
132
+ |---|---|---|---|---|
133
+ | 定位章节 | LLM Tier 3 | ¥0.001 | 2 | ¥0.002 |
134
+ | 提取字段 | 正则 | ¥0.000 | 5 | ¥0.000 |
135
+ | 标准化 | Python | ¥0.000 | 5 | ¥0.000 |
136
+ | 交叉比对 | Python | ¥0.000 | 1 | ¥0.000 |
137
+ | 语义判定 | LLM Tier 2 | ¥0.003 | 1 | ¥0.003 |
138
+ | 批注生成 | 模板 | ¥0.000 | 1 | ¥0.000 |
139
+ | **单文档合计** | | | | **¥0.005** |
140
+
141
+ 将单文档成本乘以预期文档量,与开发者用户确认预算是否可接受。如果超预算,优先优化成本最高的子任务——通常是单次调用最贵或调用次数最多的 LLM 步骤。
142
+
143
+ ### 核心原则:先廉后贵
144
+
145
+ 永远把便宜的过滤器放在前面。让正则和代码先消减 90%+ 的工作量,只把剩余的疑难部分交给 LLM。这不仅降低成本,还提升了调试能力——因为到达 LLM 步骤的数据已经被前序步骤严格筛选过。
146
+
147
+ ## 来源标记
148
+
149
+ 每个子任务的输出必须携带 `extraction_method` 字段。这不是可选的元数据——这是核查系统的承重结构。
150
+
151
+ 来源标记支撑三项不可或缺的能力:
152
+
153
+ **调试定位**——当核查结论出错时,标记告诉你是哪个子任务、哪种方法产生了错误。没有标记,你面对的是一个黑盒。例如:金额比对失败,标记显示 `extraction_method: regex`,说明是正则提取阶段出了问题,而非判定逻辑有误。
154
+
155
+ **成本归因**——标记让你精确计算每种方法的实际成本贡献。哪些 LLM 调用在消耗预算?哪些正则步骤在免费贡献准确率?这些数据驱动优化决策。
156
+
157
+ **置信度校准**——不同方法有不同的可靠性特征。正则提取的结果非对即错,没有中间地带。LLM 提取的结果有置信度分布。来源标记直接输入 `confidence-system` 的方法先验(method prior),使置信度分数具备校准基础。
158
+
159
+ ### 标记规范
160
+
161
+ 在项目范围内保持一致的标记值:
162
+
163
+ | 标记值 | 含义 |
164
+ |---|---|
165
+ | `regex` | 正则表达式提取 |
166
+ | `python_calc` | Python 计算或转换 |
167
+ | `llm_tier1` ~ `llm_tier4` | 对应层级的 LLM 调用 |
168
+ | `template` | 模板填充(批注生成等) |
169
+ | `manual_review` | 人工审核 |
170
+
171
+ ## 反模式
172
+
173
+ ### LLM 万能论
174
+
175
+ 把整份文档丢给 LLM,提示词写「请检查是否符合规则X」。演示时效果漂亮,生产中成本灾难。
176
+
177
+ 典型案例:某项目将发票号码格式校验交给 LLM 处理。发票号码是固定的 20 位数字,一条正则 `^\d{20}$` 就能搞定。LLM 每次调用消耗 2000 token,准确率反而低于正则(LLM 偶尔会「理解」出不存在的格式问题)。成本差异:正则 ¥0 vs LLM ¥0.001/次 × 10 万张 = ¥100。
178
+
179
+ **诊断信号**:如果一个子任务的输入格式完全可预测,且不需要语义理解,它不应该用 LLM。
180
+
181
+ ### 正则过度工程
182
+
183
+ 为了覆盖所有可能的日期格式写了 500 行正则,结果维护成本极高,遇到新格式就崩溃。
184
+
185
+ **诊断信号**:如果正则需要频繁修补或超过 3 行,考虑这个子任务是否应该升级到 LLM 处理。
186
+
187
+ ### 黑盒流水线
188
+
189
+ 子任务之间没有中间输出,只有最终结论。出错时无法定位是哪个环节的问题。
190
+
191
+ 典型案例:资本充足率核查流水线输出「不通过」,但无法区分是提取的资本充足率数值有误、还是比较逻辑有 bug、还是文档中根本没有这个字段。
192
+
193
+ **诊断信号**:如果调试一条规则需要从头到尾重新跑一遍,说明缺少中间检查点。
194
+
195
+ ### 巨石端到端
196
+
197
+ 不分层,每个子任务都对每份文档执行,即使前序步骤已经可以短路。
198
+
199
+ 典型案例:贷款申请交叉验证流水线对每份申请执行完整的七步核查,即使第一步「定位」就发现文档中缺少相关章节。合理做法:定位失败 → 直接输出「字段缺失」→ 跳过后续步骤。
200
+
201
+ **诊断信号**:如果流水线对明显不适用的文档也消耗完整的处理资源,说明缺少短路逻辑。
202
+
203
+ ### 过早优化
204
+
205
+ 在核查逻辑还没验证正确之前就花大量时间优化方法分配。
206
+
207
+ **正确顺序**:先全部用 LLM 跑通 → 在 Samples/ 上证明核查逻辑正确 → 再逐个子任务尝试推向更便宜的方法,每次替换后验证准确率保持不变。先对再便宜,不能反过来。分解本身是最难的部分,方法分配随时可以调整。
208
+
209
+ ## 与其他技能的衔接
210
+
211
+ 任务分解在 KC Reborn 生命周期中处于规则提取和技能编写之间。
212
+
213
+ **输入**:来自 `rule-extraction` 的规则目录。每条规则是一个原子级、可测试的核查要求。如果规则尚未达到原子级别,先退回给规则提取环节做进一步分解,再进入任务分解。
214
+
215
+ **输出**:每条规则的子任务分解清单——每个子任务包含定义好的输入、输出和分配方法。这份分解清单直接输入 `skill-authoring`,成为技能文件夹的实现蓝图。分解清单同时也是测试契约:每个子任务的输出都可以独立测试和验证。
216
+
217
+ 方法分配同时指导 `skill-to-workflow` 中的层级选择。当技能被蒸馏为工作流时:
218
+ - 正则/代码子任务 → `scripts/` 中的代码
219
+ - LLM 子任务 → `prompts/` 中的提示词
220
+ - 人工子任务 → 质量控制层的升级路径
221
+
222
+ 分解方案不是一成不变的。通过 `evolution-loop` 的测试迭代,你会发现某些方法分配需要调整——以为是确定性的子任务出现了需要 LLM 处理的边界情况,以为需要 LLM 的子任务其实一条正则就能解决。更新分解方案,用 `version-control` 记录变更。
223
+
224
+ 如果你发现一条规则很难分解为干净的子任务,这通常意味着你还没有充分理解这条规则。回到开发者用户那里去。问他们人工核查这条规则时的实际操作步骤。他们的人工流程往往就是最佳的分解蓝图——它揭示了再多抽象分析也无法发现的自然子任务边界。
@@ -0,0 +1,81 @@
1
+ # Decision Matrix for Method Selection
2
+
3
+ This reference provides the detailed decision matrix for assigning methods to sub-tasks during task decomposition. Read `task-decomposition` SKILL.md first for the philosophy; this document is the operational reference.
4
+
5
+ ## The Four Dimensions
6
+
7
+ | Dimension | Definition | 1 (Low) | 3 (Medium) | 5 (High) |
8
+ |---|---|---|---|---|
9
+ | **Certainty** | Predictability of input format and location | Free-form prose, no fixed structure | Semi-structured with known sections but variable formatting | Fixed template, exact field positions |
10
+ | **Scale** | Number of items to process per document | 1-5 items | 10-100 items | 1,000+ items |
11
+ | **Semantic Depth** | Language understanding required | None — pure pattern or numeric | Moderate — entity recognition, simple context | Deep — judgment, adequacy assessment, intent interpretation |
12
+ | **Cost Sensitivity** | Budget constraint per document | Unlimited (one-off audit) | Moderate (monthly batch of hundreds) | Tight (daily batch of thousands) |
13
+
14
+ ## Method Assignment Rules
15
+
16
+ Use the highest-priority method whose requirements are met. Priority order: Rule/Regex > Code > LLM > Manual.
17
+
18
+ | Certainty | Scale | Semantic Depth | Cost Sensitivity | Assigned Method | Rationale |
19
+ |---|---|---|---|---|---|
20
+ | High (4-5) | Any | Low (1-2) | Any | **Rule / Regex** | Predictable input + no language understanding = deterministic pattern matching |
21
+ | High (4-5) | Any | Low (1-2) | Any | **Code / Python** | Calculations, comparisons, transformations on structured data |
22
+ | Medium (3) | High (4-5) | Low (1-2) | High (4-5) | **Code + Regex** | Volume demands speed; invest in parsing code to avoid per-item LLM cost |
23
+ | Medium (3) | Low (1-2) | Medium (3) | Low (1-2) | **LLM** | Moderate understanding needed, low volume makes LLM cost acceptable |
24
+ | Low (1-2) | Any | High (4-5) | Any | **LLM** | Deep semantic understanding has no cheaper alternative |
25
+ | Low (1-2) | High (4-5) | High (4-5) | High (4-5) | **LLM (low tier) + sampling** | Volume + semantics + budget = use cheapest LLM, sample-verify with higher tier |
26
+ | Any | Any | Any | — | **Manual** | Last resort when automated methods fail accuracy threshold |
27
+
28
+ The table covers common patterns, not every combination. When a sub-task falls between categories, test both candidate methods on a sample and measure accuracy and cost. Let data decide.
29
+
30
+ ## Worked Example: Cross-Field Validation
31
+
32
+ **Rule**: "The loan amount must not exceed 70% of the appraised collateral value."
33
+
34
+ Decomposition into sub-tasks with method assignments:
35
+
36
+ | # | Sub-task | Input | Output | Method | Rationale |
37
+ |---|---|---|---|---|---|
38
+ | 1 | Locate loan amount field | Full document text | Page/section reference | LLM (Tier 3) | Field position varies across document types |
39
+ | 2 | Extract loan amount | Located section text | Numeric value (float) | Regex | Amount follows pattern: ¥/$/digits with commas |
40
+ | 3 | Locate collateral section | Full document text | Page/section reference | LLM (Tier 3) | Section name varies: "Collateral", "Security", "Pledged Assets" |
41
+ | 4 | Extract appraised value | Located section text | Numeric value (float) | Regex + Code | Regex extracts; code handles unit conversion (万/亿) |
42
+ | 5 | Calculate threshold | Loan amount, collateral value | 70% threshold value | Code | Pure arithmetic: `collateral * 0.70` |
43
+ | 6 | Compare | Loan amount, threshold | Pass/Fail | Code | Simple comparison: `loan_amount <= threshold` |
44
+ | 7 | Generate comment | All extracted values | Comment string | Code (template) | Template: "Loan amount {X} is {above/within} 70% of collateral value {Y} (threshold: {Z})" |
45
+
46
+ LLM calls: 2 (locate steps only). Everything else is regex or code. Total LLM cost per document: ~0.002 USD at Tier 3 pricing.
47
+
48
+ ## Worked Example: Large-Scale Filtering
49
+
50
+ **Task**: Match 31,800 invoices against 15,940 contracts to find which invoices belong to which contracts.
51
+
52
+ Naive approach: 507M pairwise LLM comparisons. Estimated cost: $50,000+. Time: weeks.
53
+
54
+ Layered decomposition:
55
+
56
+ | Layer | Method | Input Size | Output Size | Reduction | Cost |
57
+ |---|---|---|---|---|---|
58
+ | 1. Exact match on supplier name + contract number | Rule/Regex | 507M pairs | 25,200 matches | 99.5% eliminated | ~$0 |
59
+ | 2. Fuzzy match on amount range (±5%) + date overlap | Code | Remaining unmatched pairs | 12,400 candidates | 97.6% of remainder eliminated | ~$0 |
60
+ | 3. Semantic comparison of line-item descriptions | LLM (Tier 3) | 12,400 candidates | 7,652 confirmed | Final precision filter | ~$25 |
61
+ | 4. Manual review of low-confidence matches | Manual | ~200 uncertain | ~200 resolved | Edge cases | ~$100 (labor) |
62
+
63
+ Total cost: ~$125. Time: hours. Same accuracy as the naive approach.
64
+
65
+ The key insight: each layer's method is chosen because it is the cheapest method that can reliably make the distinctions required at that stage.
66
+
67
+ ## Cost Estimation Template
68
+
69
+ Use this template during decomposition planning to estimate per-document cost.
70
+
71
+ | Sub-task | Method | Est. Cost/Call | Calls/Document | Subtotal |
72
+ |---|---|---|---|---|
73
+ | Locate section | LLM Tier 3 | $0.001 | 2 | $0.002 |
74
+ | Extract fields | Regex | $0.000 | 5 | $0.000 |
75
+ | Normalize values | Python | $0.000 | 5 | $0.000 |
76
+ | Cross-field comparison | Python | $0.000 | 1 | $0.000 |
77
+ | Semantic judgment | LLM Tier 2 | $0.003 | 1 | $0.003 |
78
+ | Comment generation | Template | $0.000 | 1 | $0.000 |
79
+ | **Total per document** | | | | **$0.005** |
80
+
81
+ Multiply by expected document volume to get batch cost. Compare against the developer user's budget. If total exceeds budget, optimize the most expensive sub-tasks first — usually the LLM calls with the highest per-call cost or the highest call count.