Files
cobol-java-v3/docs/detailed-design/04-hina-classification.md
T

417 lines
12 KiB
Markdown

# HINA 程序分类模块 - 详细设计文档
> 模块路径: `hina/`
> 版本: V3 (2026技术大赛)
---
## 1. 模块概述
### 1.1 职责
`hina` 模块是 COBOL 迁移验证平台 V3 的程序分类与质量门禁系统,负责:
1. **程序分类** - 根据 COBOL 源码特征,将程序归类到预定义类型
2. **确信度评估** - 多因子计算分类结果的可信度
3. **质量门禁** - 测试数据生成前检查覆盖率和边界条件
4. **策略匹配** - 根据分类结果选择测试策略模板
5. **gcov 覆盖率收集** - 编译运行后采集动态代码覆盖率
6. **分层重试** - 处理编译/运行错误的自愈和重试机制
### 1.2 依赖关系
```
hina/
__init__.py <- 公开 API 入口
classifier.py <- L1 关键字规则匹配 + 结构性匹配检测
confidence.py <- 4 因子确信度计算
gate.py <- 质量门禁检查
gcov_collector.py <- gcov 覆盖率采集
hina_agent.py <- LLM 混淆组分类代理
retry.py <- 分层重试处理器
strategy.py <- 策略模板 + 必须项补充
pipeline/pipeline.py <- 完整分类管道
rule_engine/confusion_groups.py <- 8 个混淆对解析函数
rule_engine/contradiction.py <- 矛盾检测与解决
rule_engine/backtrack.py <- 多轮回溯判定
```
---
## 2. 文件清单
| 文件 | 行数 | 职责 |
|------|------|------|
| `__init__.py` | 25 | 公开 API 入口,导出 classify_program |
| `classifier.py` | 304 | L1 关键字规则(14条)、注释剥离、KEY比较检测、结构性匹配检测 |
| `confidence.py` | 120 | 4 因子确信度计算 |
| `gate.py` | 106 | 质量门禁检查、双模式质量评分 |
| `gcov_collector.py` | 58 | gcov 覆盖率采集 |
| `hina_agent.py` | 283 | LLM 混淆组分类、规则兜底 |
| `retry.py` | 82 | 分层重试: 自愈修复 + 朴素重试 |
| `strategy.py` | 103 | 策略模板(5个类型) + 补充 |
| `pipeline/pipeline.py` | 698 | 完整分类管道: 3条路径 |
| `rule_engine/confusion_groups.py` | 287 | 8个混淆对解析函数 |
| `rule_engine/contradiction.py` | 163 | 矛盾检测与解决 |
| `rule_engine/backtrack.py` | 96 | 多轮回溯判定 |
---
## 3. 分类算法
### 3.1 分类管道总览
`classify_program()` 流程:
```
COBOL 源码
-> 并行: detect_keyword() + extract_structure()
-> 根据最高关键字确信度选择路径:
>= 90% -> 路径 A: keyword 直接输出
50-89% -> 路径 B: 规则引擎 + 确信度计算
< 50% -> 路径 C: LLM 辅助 + 规则验证
-> 匹配子类型区分(仅对匹配/键中断程序)
-> 输出最终 JSON
```
### 3.2 L1 关键字规则 (classifier.py)
定义在 `L1_RULES` 中,共 14 条规则,格式 `(分类名称, [关键字列表], 置信度阈值)`:
| 分类 | 关键字 | 置信度 |
|------|--------|--------|
| DB操作 | EXEC SQL | 0.95 |
| 子程序调用 | CALL, LINKAGE SECTION | 0.90 |
| IS INITIAL | IS INITIAL | 0.99 |
| SYSIN | ACCEPT ... FROM SYSIN | 0.90 |
| 编码转换 | ALPHABETIC, ASCII, EBCDIC | 0.85 |
| online | DFHCOMMAREA | 0.95 |
| SORT | SORT ... ON ... KEY | 0.95 |
| MERGE | MERGE ... ON ... KEY | 0.95 |
| 替代索引 | ALTERNATE RECORD KEY | 0.99 |
| 编辑输出 | WRITE ... AFTER/BEFORE | 0.80 |
| 文件编成 | ORGANIZATION IS | 0.99 |
| マッチング | WS-[*]KEY* 变量模式(3条) | 0.55-0.65 |
`re:` 前缀表示正则表达式匹配,无前缀表示字面量包含匹配。
### 3.3 结构性匹配检测
`_detect_matching_structure` 不依赖 KEY 变量名,通过 6 个信号判断匹配程序:
| 信号 | 检测内容 |
|------|---------|
| 1 | READ ... AT END |
| 1b | 2+ 个 READ 语句 |
| 2 | PERFORM UNTIL ... = 'Y'/'N' |
| 3 | ELSE ... READ (条件性读取) |
| 4 | IF A = B (跨文件字段比较) |
| 5 | 2+ 个 OPEN INPUT |
信号 >= 5: 0.55, = 4: 0.50, = 3: 0.40, < 3: 0.0
### 3.4 KEY 变量比较检测
`_matches_key_comparison` 确认 KEY 变量在比较上下文中实际使用:
- 模式 1: WS-KEY = / > / < (排除 Figurative Constant)
- 模式 2: 非 WS- 前缀 KEY
- 模式 3: READ INTO ... KEY
---
## 4. 确信度计算 (confidence.py)
### 4.1 4 因子公式
```
confidence = base x context_factor x consistency_factor x structure_factor
```
### 4.2 因子定义
**上下文因子:**
| match_count | 值 |
|-------------|-----|
| >= 3 | 1.0 |
| 2 | 0.95 |
| 1 | 0.90 |
| 0 | 0.50 |
| 共识奖励 | +0.15 (上限 1.0) |
**一致性因子:**
| 矛盾情况 | 值 |
|----------|-----|
| 无矛盾 | 1.0 |
| 全部已解决 | 0.90 |
| 未解决 < 3个 | 0.80 |
| 未解决 >= 3个 | 0.50 |
**结构一致性因子:**
| score | 值 |
|-------|-----|
| 5 | 1.0 |
| >= 3 | 0.7 |
| >= 1 | 0.5 |
| 0 | 0.3 |
### 4.3 判定结果
| 确信度范围 | 判定 | 需人工审核 |
|-----------|------|-----------|
| >= 0.90 | auto | 否 |
| 0.70-0.89 | review | 是 |
| 0.50-0.69 | manual | 是 |
| < 0.50 | impossible | 是 |
---
## 5. 规则引擎 (rule_engine/)
### 5.1 混淆组判定 (confusion_groups.py)
8 个混淆对解析函数:
| 混淆对 | 区分逻辑 | 置信度 |
|--------|---------|--------|
| matching_vs_keybreak | 三路IF+多文件->マッチング; WS-PREV-KEY+累加器->キーブレイク | 0.75-0.90 |
| dedup_vs_nodedup | WS-PREV-KEY存在->含重复; 不存在->不含重复 | 0.50-0.90 |
| validation_vs_keybreak | WS-ERR*字段->校验; WS-*CNT计数器->キーブレイク | 0.55-0.85 |
| csv_merge_vs_split | STRING+逗号->合并; INSPECT REPLACING+逗号->拆分 | 0.85 |
| simple_vs_two_stage | OPEN-CLOSE-再OPEN->二段階; 其他->単純 | 0.50-0.90 |
| pure_vs_mixed | has_switch+has_counter+IF>=3->混合 | 0.70 |
| division_50_25_100 | DIVIDE被除数常量匹配 | 0.95 |
| mn_output_mode | SELECT>=3+分支>=3->M:N | 0.55-0.65 |
### 5.2 特征注入 (pipeline.py)
从 COBOL 源码注入额外特征:
| 特征名 | 检测方式 | 用途 |
|--------|---------|------|
| has_key_var | 正则匹配KEY变量比较 | 防止计数器比较误触发 |
| has_structural_match | IF+跨文件字段比较+循环/读取 | 结构性匹配信号 |
| has_cross_file_cmp | IF A = B | 跨文件比较 |
| has_csv_merge | STRING ... ',' ... INTO | CSV合并信号 |
| has_csv_split | INSPECT ... REPLACING ... ',' | CSV拆分信号 |
### 5.3 矛盾检测与解决 (contradiction.py)
**矛盾对定义** (CONTRADICTION_PAIRS): 10 对可能冲突的分类类型。
**解决策略**:
1. 优先级比较 (TYPE_PRIORITY): マッチング(10) > キーブレイク(9) > 項目チェック(8) > ...
2. 优先级相同时,调用混淆对解析器重判定 (置信度 >= 0.80 则采纳)
3. 最终回退: 取 type_a
### 5.4 多轮回溯 (backtrack.py)
`BacktrackResolver` 封装多轮判定:
- 最大轮次: 3
- 超时: 30 秒
- 超时/超轮次: 标记 `backtrack_degraded = True`,降级返回
---
## 6. LLM 辅助分类 (hina_agent.py)
### 6.1 混淆组分类 Prompt
`CONFUSION_PROMPT` 包含 7 个混淆组定义:
1. simple_sequential - 极少决策点
2. condition_heavy - IF语句占比高
3. evaluate_driven - EVALUATE主导
4. data_file_centric - 文件操作密集
5. search_intensive - SEARCH ALL
6. call_based - CALL语句
7. mixed_complex - 多种复杂特征
### 6.2 规则兜底分类
LLM 失败时 `_fallback_classification` 基于结构特征优先级:
| 优先级 | 条件 | 分类 |
|--------|------|------|
| 1 | total_decisions == 0 | simple_sequential |
| 2 | has_search_all | search_intensive |
| 3 | has_call | call_based |
| 4 | evaluate > if 且 >= 2 | evaluate_driven |
| 5 | file_count >= 2 | data_file_centric |
| 6 | if >= 5 或 decisions >= 8 | condition_heavy/nested_if |
| 7 | if >= 2 | condition_heavy/simple_if |
复杂度升级: >= 3 个复杂度标志 -> mixed_complex
---
## 7. 匹配子类型区分
仅对 マッチング/キーブレイク/項目チェック 执行子类型区分。
### 7.1 分层策略
**第 1 层 - 静态规则:**
| 条件 | 子类型 |
|------|--------|
| 二段階 in category | 二段階 |
| file_count >= 3 + WS-SAVE-KEY | M:N->MxN |
| WS-PREV-KEY | 混合 |
| WS-MAST-KEY + WS-TRAN-KEY | 1:N |
| WS-KEY-M + WS-KEY-T | N:1 |
| WS-KEY-M + WS-KEY-N | M:N |
**第 2 层 - LLM 推理**: 多键变量+多文件时调用 LLM 判断子类型
**第 3 层 - 回退**: 多键+多文件->M:N; 对称键名->1:1
---
## 8. 策略模板 (strategy.py)
### 8.1 策略模板定义
| 分类 | 必须项 | 边界项 |
|------|--------|--------|
| マッチング | COM-N001~A003, MT-N001~N006 | MT-B001, MT-B002 |
| キーブレイク | COM-N001, A002, KB-N001~N005, A001 | KB-B001, KB-B002 |
| 条件分岐 | B-N001, N003, N006, N009 | - |
| 内部表検索 | T-N001, N002, A001, A002 | - |
| 項目チェック | VF-N001, N002, N004, A001 | - |
### 8.2 补充函数
- `supplement()`: 从模板追加全部必须项和边界项
- `supplement_only()`: 增量补充指定必须项
---
## 9. 质量门禁 (gate.py)
### 9.1 门禁检查
| 检查项 | 条件 | 输出 |
|--------|------|------|
| 决策点覆盖率 | branch_rate < 0.90 | decision_gaps |
| 段落覆盖率 | paragraph_rate < 1.0 | paragraph_gaps |
| 测试数据为空 | not complete_tests | no_data |
### 9.2 双模式质量评分
```
gcov 未启用: branch_rate*0.5 + paragraph_rate*0.5 + confidence*0.4
gcov 启用: static_cov*0.3 + gcov_cov*0.4 + confidence*0.3
```
---
## 10. gcov 覆盖率收集 (gcov_collector.py)
### 10.1 采集流程
1. 检查 .gcda 文件是否存在
2. 执行 gcov 命令 (30s 超时)
3. 查找 .gcov 输出文件
4. 解析行覆盖率
### 10.2 降级策略
所有 gcov 失败降级为仅静态分析。
---
## 11. 分层重试 (retry.py)
### 11.1 重试机制
`RetryHandler(max_heal=2, max_simple=3)`:
- PASS/QUALITY_WARN -> 返回结果
- BLOCKED/ERROR -> 自愈修复或朴素重试
- 总次数 >= 5 -> 标记 FATAL
### 11.2 自愈修复
| 错误 | 检测 | 修复 |
|------|------|------|
| compile_error | 日志含 "not found" | 设置 COB_LIBRARY_PATH |
| s0c7 | 日志含 "S0C7" | 记录警告 |
---
## 12. 接口定义
### 12.1 公开 API
```python
def classify_program(cobol_source: str, llm=None) -> dict:
"""返回: {category, confidence, needs_review, method, source,
judgment, matches, contradictions, v2_confidence, structure}"""
```
### 12.2 内部模块 API
- `classifier.detect_keyword(source)` -> list[tuple[str, float, str]]
- `confidence.compute_confidence_v2(keyword_result, structure_features, ...)` -> dict
- `gate.check(complete_tests, hina_result, coverage, ...)` -> dict
- `gate.compute_quality_score(static_coverage, gcov_coverage, confidence)` -> float
- `strategy.get_strategy(hina_type)` -> dict
- `strategy.supplement(base_tests, hina_result)` -> list[dict]
- `gcov_collector.collect_gcov(cobol_src, work_dir)` -> dict
- `RetryHandler(max_heal, max_simple).run(pipeline_fn)` -> VerificationRun
- `hina_agent.classify_with_llm(structure, llm)` -> dict
- `rule_engine.resolve_confusion_pair(features, pair_name)` -> dict
- `rule_engine.detect_contradictions(features)` -> list[dict]
- `rule_engine.resolve_contradiction(features, contradiction)` -> str
- `BacktrackResolver(structure_extractor).resolve(source, features)` -> dict
---
## 13. 错误处理
### 13.1 错误分类
| 类别 | 示例 | 处理 |
|------|------|------|
| L1解析错误 | 正则匹配失败 | 跳过该规则 |
| LLM调用失败 | API超时/网络错误 | 回退到规则引擎 |
| LLM响应解析 | 无效JSON | 返回unknown |
| gcov失败 | 命令未找到/超时 | 降级为静态分析 |
| 回溯超时 | > 30s | 标记降级返回 |
| 矛盾不可解 | 优先级相同 | 取type_a回退 |
| 空源码 | cobol_source为空 | 返回impossible |
### 13.2 日志策略
- `logger.info()`: 关键流程节点
- `logger.debug()`: 规则引擎特征、矛盾详情
- `logger.warning()`: LLM失败、回溯降级、gcov失败
---
## 14. 数据流总结
```
Input: cobol_source (str), llm (optional)
|
v
[Parallel] detect_keyword + extract_structure
|
v
Route by max keyword confidence:
>= 0.90 -> Path A: keyword direct
0.50-0.89 -> Path B: rule engine
< 0.50 -> Path C: LLM assisted / rule fallback
|
v
_resolve_matching_subtype (for matching/keybreak programs)
|
v
Output: {category, confidence, needs_review, method, source,
judgment, matches, contradictions, v2_confidence, structure}
```
下游集成:
1. orchestrator_db.py: 根据category选择测试策略
2. strategy.py: 获取必须项
3. gate.py: 用confidence计算质量评分
4. data_merger.py: 合并策略数据到测试记录