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,151 @@
1
+ # Lightweight Output Format Specification
2
+
3
+ This document defines the compact text markup format for verification results, its grammar, JSON conversion rules, and edge case handling.
4
+
5
+ ## Grammar
6
+
7
+ ```
8
+ [RESULT] field_name <- value (constraint) | conf:score | src:location | note:text
9
+ ```
10
+
11
+ | Component | Required | Format | Description | Example |
12
+ |-----------|----------|--------|-------------|---------|
13
+ | `[RESULT]` | Yes | One of: PASS, FAIL, MISSING, ERROR, UNCERTAIN | The judgment outcome. | `[FAIL]` |
14
+ | `field_name` | Yes | snake_case identifier | The rule or field being checked. | `capital_adequacy` |
15
+ | `<- value` | No (omit for MISSING) | Free text, no pipes | The extracted value from the document. | `<- 12.5%` |
16
+ | `(constraint)` | No (omit if no constraint) | Parenthesized expression | The expected value or condition. | `(>= 8.0%)` |
17
+ | `conf:score` | Yes | Decimal 0.00-1.00 | Confidence score of the judgment. | `conf:0.95` |
18
+ | `src:location` | No | Page-section reference or trace ID prefix | Source location in the document. | `src:p3-s2` |
19
+ | `note:text` | No | Free text to end of line | Human-readable comment. | `note:Signing overdue by 45 days` |
20
+
21
+ Components after `field_name` are separated by ` | ` (space-pipe-space). The `<- value` and `(constraint)` components appear before the first pipe, space-separated.
22
+
23
+ ## Field Definitions
24
+
25
+ ### Result Values
26
+
27
+ | Value | Meaning | When to Use |
28
+ |-------|---------|-------------|
29
+ | `PASS` | Entity complies with the rule. | Deterministic or semantic check confirms compliance. |
30
+ | `FAIL` | Entity does not comply. | Clear non-compliance detected. Note is strongly recommended. |
31
+ | `MISSING` | Entity not found in document. | Extraction could not locate the required field. |
32
+ | `ERROR` | Processing failure. | Parsing error, API timeout, unexpected format. |
33
+ | `UNCERTAIN` | Ambiguous judgment. | Borderline values, conflicting evidence, low confidence. |
34
+
35
+ ### Confidence Score
36
+
37
+ A decimal between 0.00 and 1.00 representing the system's confidence in the result. For deterministic Python checks, confidence is typically 0.95-1.00. For LLM semantic judgments, confidence reflects the model's self-assessed certainty. Scores below the configured threshold in `.env` trigger human review.
38
+
39
+ ### Source Location
40
+
41
+ The `src:` component uses a compact reference format: `p{page}-s{section}`. Example: `src:p3-s2` means page 3, section 2. For trace ID integration, use the trace ID prefix: `src:R001-DOC042-P3-S2` (see Integration with Trace IDs below).
42
+
43
+ ## JSON Conversion
44
+
45
+ ### Markup to JSON
46
+
47
+ ```
48
+ Input: [FAIL] sign_date_gap <- 75d (<= 30d) | conf:0.90 | src:p1-s4 | note:Signing overdue by 45 days
49
+
50
+ Output:
51
+ {
52
+ "field": "sign_date_gap",
53
+ "result": "fail",
54
+ "extracted_value": "75d",
55
+ "expected": "<= 30d",
56
+ "confidence": 0.90,
57
+ "source": "p1-s4",
58
+ "comment": "Signing overdue by 45 days"
59
+ }
60
+ ```
61
+
62
+ Pseudocode:
63
+ 1. Parse `[RESULT]` -> lowercase -> `result` field.
64
+ 2. Parse next token -> `field` field.
65
+ 3. If `<-` follows, parse until `(` or `|` -> `extracted_value`.
66
+ 4. If `(...)` follows, parse contents -> `expected`.
67
+ 5. Split remaining by ` | `. For each segment:
68
+ - `conf:X` -> `confidence` (parse as float).
69
+ - `src:X` -> `source`.
70
+ - `note:X` -> `comment`.
71
+
72
+ ### JSON to Markup
73
+
74
+ Pseudocode:
75
+ 1. `[` + uppercase(`result`) + `] ` + `field`.
76
+ 2. If `extracted_value` exists: ` <- ` + `extracted_value`.
77
+ 3. If `expected` exists: ` (` + `expected` + `)`.
78
+ 4. ` | conf:` + format(`confidence`, 2 decimal places).
79
+ 5. If `source` exists: ` | src:` + `source`.
80
+ 6. If `comment` exists: ` | note:` + `comment`.
81
+
82
+ ## Diff Example
83
+
84
+ Comparing two verification runs is where markup shines.
85
+
86
+ **Markup diff** (clean, scannable):
87
+ ```
88
+ [PASS] capital_adequacy <- 12.5% (>= 8.0%) | conf:0.95 | src:p3-s2
89
+ - [PASS] sign_date_gap <- 28d (<= 30d) | conf:0.92 | src:p1-s4
90
+ + [FAIL] sign_date_gap <- 75d (<= 30d) | conf:0.90 | src:p1-s4 | note:Signing overdue by 45 days
91
+ [MISSING] collateral_value | conf:0.60 | note:Collateral valuation not found
92
+ ```
93
+
94
+ **JSON diff** (noisy, hard to scan):
95
+ ```json
96
+ {
97
+ "field": "sign_date_gap",
98
+ - "result": "pass",
99
+ + "result": "fail",
100
+ - "extracted_value": "28d",
101
+ + "extracted_value": "75d",
102
+ "expected": "<= 30d",
103
+ - "confidence": 0.92,
104
+ + "confidence": 0.90,
105
+ "source": "p1-s4",
106
+ - "comment": ""
107
+ + "comment": "Signing overdue by 45 days"
108
+ }
109
+ ```
110
+
111
+ The markup diff communicates the same information in one changed line vs. five changed lines.
112
+
113
+ ## Edge Cases
114
+
115
+ ### Multi-Value Fields
116
+ When a field has multiple extracted values (e.g., the same metric appears in two places with different values), separate values with semicolons:
117
+ ```
118
+ [UNCERTAIN] total_assets <- 1,234,567;1,234,590 | conf:0.50 | src:p3-s1;p7-s2 | note:Conflicting values found
119
+ ```
120
+
121
+ ### Long Notes
122
+ In markup, truncate notes longer than 80 characters with `...`. The full text is preserved in JSON. Example:
123
+ ```
124
+ [FAIL] risk_disclosure <- (see detail) | conf:0.85 | note:Missing discussion of liquidity risk, market risk, and operational ri...
125
+ ```
126
+
127
+ ### Special Characters
128
+ If a value or note contains the pipe character `|`, escape it with a backslash: `\|`. During JSON conversion, unescape back to `|`.
129
+
130
+ ### Fields with No Constraint
131
+ Omit the parenthetical entirely:
132
+ ```
133
+ [MISSING] collateral_value | conf:0.60 | note:Collateral valuation not found in document
134
+ ```
135
+
136
+ ### Fields with No Extracted Value
137
+ Omit the `<-` component (common for MISSING and ERROR results):
138
+ ```
139
+ [ERROR] capital_adequacy | conf:0.00 | note:PDF parsing failed on page 3
140
+ ```
141
+
142
+ ## Integration with Trace IDs
143
+
144
+ The `src:` component can encode trace ID prefixes, linking each result line to the full trace ID defined by `version-control`. Use the trace ID format directly:
145
+
146
+ ```
147
+ [PASS] capital_adequacy <- 12.5% (>= 8.0%) | conf:0.95 | src:R001-DOC042-P3-S2
148
+ [FAIL] sign_date_gap <- 75d (<= 30d) | conf:0.90 | src:R003-DOC042-P1-S4 | note:Signing overdue by 45 days
149
+ ```
150
+
151
+ When converting to JSON, the `src:` value maps to the `trace_id` field in the full result object. The character range (`C{start}:{end}`) can be appended when full precision is needed: `src:R001-DOC042-P3-S2-C120:180`.
@@ -0,0 +1,228 @@
1
+ ---
2
+ name: confidence-system
3
+ description: Design and calibrate confidence scoring for extraction and verification results. Use when building any workflow that needs to quantify trust in its output, when setting up quality control sampling thresholds, or when calibrating existing confidence scores against actual accuracy. Confidence is the bridge between workflows and quality control. Also use when the quality control skill reports that confidence scores do not correlate with actual correctness.
4
+ ---
5
+
6
+ # 置信度系统
7
+
8
+ 置信度不是模型的自信程度,而是系统准确率的预测值。一个置信度分数应该回答这个问题:"当系统给出这个分数时,结果正确的概率是多少?"如果你的 0.90 置信度结果实际准确率为 90%,说明系统校准良好。
9
+
10
+ ## 为什么需要置信度
11
+
12
+ 没有置信度,你只有两个选择:
13
+ 1. **全量审查**——成本高昂,自动化的意义荡然无存。
14
+ 2. **不审查**——风险高,错误会漏过。
15
+
16
+ 有了置信度,你可以**智能审查**:把有限的审查资源投入到最可能出错的地方。高置信度的结果抽样审查,低置信度的结果全量审查。这是自动化与质量之间的桥梁。
17
+
18
+ ### 经济账
19
+
20
+ 假设一批 1000 份文档,每份人工审查成本 50 元:
21
+ - 全量审查:50,000 元
22
+ - 有置信度系统:高置信度 700 份(抽样 10%)+ 中置信度 200 份(抽样 50%)+ 低置信度 100 份(全量审查)= 70×50 + 100×50 + 100×50 = 13,500 元
23
+ - 节省 73%,同时覆盖了所有高风险结果。
24
+
25
+ ## 复合评分信号
26
+
27
+ 单一信号不足以可靠预测准确率。置信度应该综合多个信号。
28
+
29
+ ### 信号一:提取方法先验
30
+
31
+ 提取方法本身的固有可靠性。
32
+
33
+ | 提取方法 | 先验置信度 | 理由 |
34
+ |---------|-----------|------|
35
+ | 正则匹配 + 格式验证通过 | 0.90-0.95 | 格式正确的结构化数据,正则提取几乎不会出错 |
36
+ | LLM 结构化输出 | 0.75-0.85 | LLM 理解上下文后提取,有一定幻觉风险 |
37
+ | LLM 自由格式输出 | 0.60-0.75 | 输出格式不受约束,解析可能出错 |
38
+ | 回退/推断值 | 0.40-0.50 | 非直接提取,有猜测成分 |
39
+
40
+ 这是一个先验值——反映方法的一般可靠性,不是这次提取的具体可靠性。
41
+
42
+ ### 信号二:源文本匹配
43
+
44
+ 提取的值是否能在源文本中找到?
45
+
46
+ - **精确字符串匹配**:提取值 "12.5%" 在源文本中以 "12.5%" 形式出现 → 高信号。
47
+ - **近似匹配**:提取值 "12.5%" 在源文本中以 "12.50%" 或 "一二点五" 形式出现 → 中信号。
48
+ - **无匹配**:源文本中找不到 "12.5" 这个数字 → 低信号,可能是幻觉。
49
+
50
+ 这个信号专门用于捕获幻觉。如果 LLM 声称"资本充足率为 12.5%",但 "12.5" 在源文档章节中根本不存在,这是一个严重的红旗。
51
+
52
+ ### 信号三:历史准确率
53
+
54
+ 该规则、该文档类型、该提取方法的历史正确率。
55
+
56
+ - **首轮迭代**(无历史数据):仅使用方法先验。
57
+ - **经过质控审查后**:计算实际准确率,纳入评分。
58
+
59
+ 这是最有价值的长期信号。它反映的是真实表现,而非假设。随着质控数据积累,历史准确率应逐渐成为主导信号。
60
+
61
+ ### 信号四:边缘案例距离
62
+
63
+ 文档是否匹配已知的边缘案例模式?
64
+
65
+ - **精确匹配**:文档触发了已知边缘案例 → 降低置信度(标准工作流可能不适用)。
66
+ - **近似匹配**:文档与某个边缘案例有相似特征但未完全匹配 → 略微降低置信度。
67
+ - **无匹配**:正常文档 → 不调整。
68
+
69
+ ## 信号组合
70
+
71
+ 用加权平均组合多个信号:
72
+
73
+ ```
74
+ confidence = w1 × method_prior + w2 × source_match + w3 × historical_accuracy + w4 × corner_case_adj
75
+ ```
76
+
77
+ ### 初始权重建议
78
+
79
+ | 信号 | 权重 | 说明 |
80
+ |-----|------|------|
81
+ | w1(方法先验) | 0.25 | 基础信号,始终可用 |
82
+ | w2(源文本匹配) | 0.25 | 反幻觉信号,始终可用 |
83
+ | w3(历史准确率) | 0.35 | 最重要的信号,但需要数据积累 |
84
+ | w4(边缘案例距离) | 0.15 | 辅助信号 |
85
+
86
+ ### 历史数据不可用时的处理
87
+
88
+ 在系统运行初期,没有历史准确率数据。此时将 w3 的权重重新分配给其他信号:
89
+
90
+ ```
91
+ # 初期(无历史数据)
92
+ confidence = 0.40 × method_prior + 0.40 × source_match + 0.20 × corner_case_adj
93
+
94
+ # 中期(有部分历史数据)
95
+ confidence = 0.30 × method_prior + 0.30 × source_match + 0.25 × historical_accuracy + 0.15 × corner_case_adj
96
+
97
+ # 成熟期(充足历史数据)
98
+ confidence = 0.25 × method_prior + 0.25 × source_match + 0.35 × historical_accuracy + 0.15 × corner_case_adj
99
+ ```
100
+
101
+ 随着历史数据积累,逐步过渡到完整权重。不要一开始就把权重给到没有数据支撑的信号上。
102
+
103
+ ## 阈值分带
104
+
105
+ 将连续的置信度分数映射为离散的审查行动:
106
+
107
+ | 分带 | 置信度范围 | 审查行动 | 典型比例 |
108
+ |-----|-----------|---------|---------|
109
+ | 高置信度 | > 0.85(自动接受阈值) | 仅抽样审查(5-10% 随机抽样) | ~70% |
110
+ | 中置信度 | 0.60 - 0.85 | 按 MONITOR_FREQUENCY 频率抽样 | ~20% |
111
+ | 低置信度 | < 0.60(全量审查阈值) | 每条结果都审查 | ~10% |
112
+
113
+ 起始阈值:自动接受 = 0.85,全量审查 = 0.60。这些是默认值,每条规则可以有不同的阈值。
114
+
115
+ ### 阈值调整原则
116
+
117
+ - **高风险规则**(如资本充足率、不良贷款率等核心监管指标):提高自动接受阈值到 0.90 或 0.95。宁可多审查,不可漏判。
118
+ - **低风险规则**(如格式检查、日期格式):可降低自动接受阈值到 0.80。
119
+ - **初期保守**:系统刚上线时,建议将自动接受阈值设为 0.90,全量审查阈值设为 0.70。随着校准数据积累再逐步放宽。
120
+
121
+ ## 校准
122
+
123
+ 校准是验证置信度分数是否真正预测准确率的过程。
124
+
125
+ ### 校准方法
126
+
127
+ 每次质控审查周期结束后:
128
+
129
+ 1. **分组**:按置信度区间(如 0.0-0.2、0.2-0.4、0.4-0.6、0.6-0.8、0.8-1.0)对已审查结果分组。
130
+ 2. **统计**:对每个区间,计算实际准确率(质控确认正确的比例)。
131
+ 3. **比较**:将实际准确率与置信度区间中点进行对比。
132
+
133
+ ```
134
+ 区间 样本数 实际准确率 期望准确率 偏差
135
+ 0.8-1.0 150 92% 90% +2% ✓ 校准良好
136
+ 0.6-0.8 80 73% 70% +3% ✓ 校准良好
137
+ 0.4-0.6 30 35% 50% -15% ✗ 置信度偏高
138
+ 0.2-0.4 10 40% 30% +10% ✗ 置信度偏低
139
+ 0.0-0.2 5 0% 10% -10% ✓ 样本太少
140
+ ```
141
+
142
+ ### 校准偏差的处理
143
+
144
+ - **置信度偏高**(实际准确率低于置信度区间):系统过于乐观。增加 w2(源文本匹配)的权重,或降低方法先验值。
145
+ - **置信度偏低**(实际准确率高于置信度区间):系统过于保守。可以适当提高先验值,但保守偏差的危害小于乐观偏差——多审查几条比漏掉错误好。
146
+ - **样本不足**:某个区间的样本太少(<20),不具有统计意义。等待更多数据。
147
+
148
+ ### 何时重新校准
149
+
150
+ - 首次质控审查完成后(建立初始校准基线)。
151
+ - 工作流版本变更后(新代码可能有不同的可靠性特征)。
152
+ - 调整置信度阈值后。
153
+ - 质控报告显示置信度与正确率不相关时。
154
+
155
+ ## 集成点
156
+
157
+ 置信度系统不是孤立运行的,它与核查流程的每个环节对接:
158
+
159
+ ### 实体提取阶段
160
+
161
+ 提取完成后立即分配初始置信度,基于方法先验和源文本匹配两个信号。
162
+
163
+ ```json
164
+ {
165
+ "value": 12.5,
166
+ "confidence": 0.92,
167
+ "confidence_signals": {
168
+ "method_prior": 0.95,
169
+ "source_match": 0.90
170
+ }
171
+ }
172
+ ```
173
+
174
+ ### 合规判定阶段
175
+
176
+ 判定可能调整置信度:
177
+ - 确定性判定(Python 阈值比较)→ 不改变置信度。
178
+ - 语义判定(LLM)→ 根据 LLM 的判定确定性调整。
179
+ - 值在阈值边界附近 → 降低置信度(即使提取很可靠,边界值的判定本身不确定)。
180
+
181
+ ### 质量控制阶段
182
+
183
+ 质控使用置信度分带决定审查策略:
184
+ - 高置信度 → 低采样率。
185
+ - 低置信度 → 全量审查。
186
+ - 审查结果反馈到校准流程。
187
+
188
+ ### 演进循环
189
+
190
+ 演进循环监控置信度趋势:
191
+ - 平均置信度持续下降 → 可能有系统性退化。
192
+ - 某条规则的置信度突然下降 → 可能文档格式发生变化。
193
+ - 置信度与准确率的相关性下降 → 需要重新校准。
194
+
195
+ ### 仪表板展示
196
+
197
+ 在开发者用户的仪表板中展示:
198
+ - 置信度分布直方图(当前批次)。
199
+ - 各规则的平均置信度。
200
+ - 校准曲线(置信度 vs 实际准确率)。
201
+ - 低置信度结果列表(需要优先关注的项目)。
202
+
203
+ ## 保持简单
204
+
205
+ 不要在一开始就构建复杂的置信度系统。遵循渐进式复杂度:
206
+
207
+ ### 第一阶段:方法先验
208
+
209
+ 只用提取方法分配置信度:
210
+ - 正则:0.90
211
+ - LLM:0.75
212
+ - 回退:0.50
213
+
214
+ 跑质控,看这些分数是否预测准确率。如果预测得不错,先维持不变。
215
+
216
+ ### 第二阶段:加入源文本匹配
217
+
218
+ 当发现 LLM 幻觉是一个实际问题时(质控发现 LLM 提取的值在原文中找不到),加入源文本匹配信号。
219
+
220
+ ### 第三阶段:加入历史准确率
221
+
222
+ 积累了 3-5 轮质控数据后,有足够的样本计算历史准确率。此时纳入这个信号。
223
+
224
+ ### 第四阶段:加入边缘案例距离
225
+
226
+ 当边缘案例注册表有了一定规模后(>10 条活跃记录),加入边缘案例距离信号。
227
+
228
+ 每一步都要验证:新信号的加入是否确实提高了置信度与准确率的相关性。如果没有,不要加。**置信度系统应该挣得自己的复杂度,而不是一开始就复杂。**
@@ -0,0 +1,235 @@
1
+ ---
2
+ name: corner-case-management
3
+ description: Identify, catalog, and handle corner cases that do not fit the mainstream verification workflow. Use when the evolution loop classifies a failure as a corner case (affecting less than ~10% of documents), when adding a new edge case to the registry, or when deciding whether a corner case should be promoted to a systemic fix. Also use when designing the corner case detection mechanism for a workflow.
4
+ ---
5
+
6
+ # 边缘案例管理
7
+
8
+ 好的工作流处理 90% 的文档。边缘案例处理剩下的 10%。它们单独看出现率低,但累积起来影响显著。关键认知:**不要为了边缘案例给主工作流打补丁**。补丁导致逻辑混乱、代码脆弱、回归风险。
9
+
10
+ 正确做法:把边缘案例从主流程中分离出来,单独管理。
11
+
12
+ ## 理念
13
+
14
+ 文档核查中边缘案例是必然存在的。金融文档由数千家不同机构出具,每家都有自己的排版习惯、模板风格、对法规的不同理解。没有任何工作流能覆盖所有变体。
15
+
16
+ 问题不是"怎么消灭边缘案例",而是"怎么高效管理它们"。
17
+
18
+ 答案是:**分离它们,保持主工作流干净,保持边缘案例可追踪、可检测、可解决**。
19
+
20
+ ### 主工作流 vs 边缘案例处理的分工
21
+
22
+ ```
23
+ 文档进入
24
+
25
+ ├─ 检查边缘案例注册表 → 匹配?→ 执行特定解决方案
26
+ │ │
27
+ │ 不匹配
28
+ │ │
29
+ └───────────────────────────┤
30
+
31
+ 执行标准工作流
32
+ ```
33
+
34
+ 标准工作流保持简洁、通用、可维护。边缘案例有自己的管理体系。两者独立演进。
35
+
36
+ ## 边缘案例注册表
37
+
38
+ 每条规则技能的 `assets/` 目录下维护一个结构化文件 `corner_cases.json`:
39
+
40
+ ```json
41
+ [
42
+ {
43
+ "id": "CC001",
44
+ "rule_id": "R001",
45
+ "description": "部分银行年报将资本充足率以小数形式(0.125)而非百分比(12.5%)表示",
46
+ "affected_documents": ["bank_xyz_annual_2024.pdf"],
47
+ "detection_pattern": {
48
+ "type": "regex",
49
+ "pattern": "资本充足率[::]*\\s*0\\.\\d+",
50
+ "confidence_threshold": 0.8
51
+ },
52
+ "resolution": {
53
+ "type": "code",
54
+ "action": "在阈值比较前将提取值乘以100",
55
+ "code_snippet": "if value < 1.0: value *= 100"
56
+ },
57
+ "discovered_at": "2026-04-01",
58
+ "iteration": 3,
59
+ "status": "active"
60
+ },
61
+ {
62
+ "id": "CC002",
63
+ "rule_id": "R005",
64
+ "description": "2020年以前出具的公募基金年报使用旧版信息披露格式,风险指标表格结构与现行模板不同",
65
+ "affected_documents": ["fund_abc_annual_2019.pdf", "fund_abc_annual_2018.pdf"],
66
+ "detection_pattern": {
67
+ "type": "keyword",
68
+ "keywords": ["基金年度报告", "2019年", "2018年"],
69
+ "additional_check": "报告日期早于2020-07-01"
70
+ },
71
+ "resolution": {
72
+ "type": "prompt",
73
+ "action": "使用旧版模板的提取提示词",
74
+ "prompt_variant": "extraction_prompt_legacy_format"
75
+ },
76
+ "discovered_at": "2026-04-01",
77
+ "iteration": 5,
78
+ "status": "active"
79
+ },
80
+ {
81
+ "id": "CC003",
82
+ "rule_id": "R012",
83
+ "description": "某省农商行贷款合同使用方言化表述,'借款期限'写作'借期'",
84
+ "affected_documents": ["loan_contract_rural_bank_001.pdf"],
85
+ "detection_pattern": {
86
+ "type": "regex",
87
+ "pattern": "借期[::]\\s*\\d+",
88
+ "confidence_threshold": 0.7
89
+ },
90
+ "resolution": {
91
+ "type": "regex",
92
+ "action": "在提取时将'借期'等同于'借款期限'",
93
+ "alias_map": {"借期": "借款期限", "借额": "借款金额"}
94
+ },
95
+ "discovered_at": "2026-04-01",
96
+ "iteration": 7,
97
+ "status": "active"
98
+ }
99
+ ]
100
+ ```
101
+
102
+ 每条记录应包含:
103
+ - **描述(description)**:用人话说清楚这是什么情况。开发者用户需要能看懂。
104
+ - **检测模式(detection_pattern)**:如何在执行前识别此类文档。类型可以是:
105
+ - `regex`:正则匹配文档内容。
106
+ - `keyword`:关键词组合匹配。
107
+ - `structural`:文档结构特征(如缺少某个章节、表格格式异常)。
108
+ - `model`:需要 LLM 判断(成本高,仅在无法用简单方法检测时使用)。
109
+ - **解决方案(resolution)**:如何处理匹配的文档。类型可以是:
110
+ - `code`:Python 代码修正(如单位转换)。
111
+ - `regex`:正则替换或别名映射。
112
+ - `prompt`:使用不同的 LLM 提示词。
113
+ - `parser`:使用不同级别的解析器。
114
+ - `manual`:标记为需人工处理,不自动判定。
115
+ - **发现时间和迭代轮次**:什么时候发现的,在哪轮演进中。
116
+ - **状态(status)**:`active`(使用中)、`promoted`(已提升到主工作流)、`deprecated`(已废弃)。
117
+
118
+ ## 检测机制
119
+
120
+ 在标准工作流执行**之前**,对每份文档运行边缘案例检测:
121
+
122
+ 1. 加载当前规则对应的边缘案例注册表。
123
+ 2. 对每个 `active` 状态的边缘案例,检查文档是否匹配其检测模式。
124
+ 3. 如果匹配置信度超过阈值,执行该边缘案例的特定解决方案(替代或补充标准工作流)。
125
+ 4. 记录触发了哪个边缘案例。
126
+
127
+ 这个流程类似 RAG 的渐进式披露:
128
+ - 注册表是知识库。
129
+ - 检测模式是检索查询。
130
+ - 置信度阈值防止误匹配。
131
+ - 只有相关的边缘案例被加载到执行上下文中。
132
+
133
+ ### 检测效率
134
+
135
+ 检测必须轻量。对每份文档跑 50 个正则匹配的成本可以忽略不计,但跑 50 个 LLM 调用就不可接受了。
136
+
137
+ 优先级排序:
138
+ 1. 正则/关键词检测(毫秒级)→ 优先使用。
139
+ 2. 结构检测(秒级,需解析)→ 在解析完成后顺带检查。
140
+ 3. LLM 检测(秒级+成本)→ 仅在无法用上述方法时使用。
141
+
142
+ ## 何时添加边缘案例
143
+
144
+ 在演进循环中,当一个失败案例被分析后,需要决定它是系统性问题还是边缘案例。
145
+
146
+ **添加为边缘案例的条件**(三个条件同时满足):
147
+
148
+ 1. **非系统性**:影响不到 10% 的文档。如果影响面更广,那是工作流本身的问题,应该修复工作流。
149
+ 2. **有可辨识模式**:能描述出这类文档的共同特征,能写出检测规则。如果失败看起来是随机的、无规律的,那可能是数据质量问题,需要升级给开发者用户。
150
+ 3. **有明确解决方案**:知道怎么处理。不是"不确定"或"需要更多调查"。
151
+
152
+ **不应添加为边缘案例的情况**:
153
+
154
+ - 失败影响大量文档(系统性问题,修工作流)。
155
+ - 失败无可辨识模式(数据质量问题,报告给开发者用户)。
156
+ - 解决方案需要改变核心判定逻辑(属于主工作流的范畴)。
157
+
158
+ ## 何时提升边缘案例
159
+
160
+ 边缘案例不应该永远是边缘案例。当它变得普遍时,应该被提升为主工作流的一部分。
161
+
162
+ **提升条件**:
163
+
164
+ - **出现率超过 10%**:在最近的文档批次中,超过 10% 的文档触发了该边缘案例。它已经不是"边缘"了,而是一种常见模式。
165
+ - **模式聚类**:多个相似的边缘案例指向同一个底层问题。与其维护 5 个类似的边缘案例,不如合并为一个通用的工作流改进。
166
+ - **开发者用户确认**:"这就是常态,所有XX类型的文档都是这样"——开发者用户的领域知识是最权威的提升依据。
167
+
168
+ **提升操作**:
169
+ 1. 将解决方案整合到主工作流中。
170
+ 2. 在注册表中将状态改为 `promoted`。
171
+ 3. 对两个变更做版本记录。
172
+ 4. 在下一批文档上验证提升后的工作流仍然正确。
173
+
174
+ ## 人类可见性
175
+
176
+ 边缘案例注册表必须对开发者用户透明可读:
177
+
178
+ ### 可读性要求
179
+
180
+ - **格式清晰**:JSON 或 markdown 表格,人可读。
181
+ - **上下文充分**:领域专家无需阅读代码就能理解每条记录。
182
+ - **在仪表板中展示**:新发现的边缘案例应出现在报告中。
183
+
184
+ ### 开发者用户可添加
185
+
186
+ 开发者用户往往掌握编程智能体尚未遇到的边缘案例知识。他们应该能够添加类似这样的条目:
187
+
188
+ - "XX银行的 Q4 报告总是使用不同的模板。"
189
+ - "2020年以前的公募基金文档遵循旧版信息披露规定。"
190
+ - "小型农商行的贷款合同经常缺少标准条款编号。"
191
+ - "境外分行的报告中金额以美元计,不是人民币。"
192
+
193
+ 这些输入是宝贵的预防性信息,能避免未来的核查失败。在注册表中为手动添加的条目标注来源为"开发者用户"。
194
+
195
+ ## 成本控制
196
+
197
+ 每个边缘案例都有运行时成本:检测逻辑在每份文档上都要执行。保持注册表精简:
198
+
199
+ ### 精简原则
200
+
201
+ - **清理废弃条目**:已提升或不再出现的边缘案例,将状态改为 `deprecated`。定期清理。
202
+ - **合并相似条目**:如果有 5 个边缘案例都在处理"日期格式变体",合并为一个带更广泛检测模式的条目。
203
+ - **检测模式高效化**:优先用正则而非 LLM 检测。一个正则匹配耗时微秒,一个 LLM 调用耗时秒级。
204
+ - **监控规模**:如果单条规则的边缘案例超过 50 个,这说明工作流本身需要改进。大量边缘案例是工作流不够健壮的信号。
205
+
206
+ ### 定期审查
207
+
208
+ 每隔若干个演进周期,审查一次边缘案例注册表:
209
+ - 还有哪些是活跃的?
210
+ - 有没有可以合并的?
211
+ - 有没有应该提升的?
212
+ - 有没有已经过时的?
213
+
214
+ 保持注册表的"新陈代谢"。一个不断膨胀的注册表和一个从不更新的注册表一样有害。
215
+
216
+ ## 与演进循环的协作
217
+
218
+ 边缘案例管理是演进循环的重要输出之一:
219
+
220
+ ```
221
+ 演进循环分析失败
222
+
223
+ ├─ 系统性失败 → 修改工作流
224
+
225
+ ├─ 边缘案例 → 添加到注册表
226
+
227
+ └─ 数据质量问题 → 报告给开发者用户
228
+ ```
229
+
230
+ 每次演进循环运行后,检查是否有新的边缘案例需要添加,以及现有边缘案例是否需要状态变更。
231
+
232
+ 边缘案例注册表的增长曲线本身就是系统健康度的指标:
233
+ - 初期快速增长是正常的(你在发现文档的多样性)。
234
+ - 中期增速放缓说明工作流趋于稳定。
235
+ - 后期仍在快速增长则说明工作流可能存在根本性设计问题。