# 资料要求匹配Skill 设计

## 1. Skill 定位

`资料要求匹配Skill` 负责把当前资料包中的文档事实与法规要求项进行匹配，生成每个要求项的候选命中文档和匹配证据。

英文实现标识建议使用 `RequirementDocumentMatchSkill`。

本 Skill 只判断“是否可能命中”，不负责最终缺失或风险判定。

## 2. 输入

```python
@dataclass
class RequirementDocumentMatchInput:
    documents: list[DocumentFact]
    requirements: list[RequirementItem]
```

## 3. 输出

```python
@dataclass
class RequirementDocumentMatchOutput:
    matches: list[RequirementDocumentMatch]
    unmatched_documents: list[DocumentFact]
    warnings: list[dict]
```

## 4. 匹配策略

### 4.1 章节点编码匹配

最高优先级。

示例：

1. 文档 `CH1.4 申请表.docx`
2. 要求项 `CH1.4 申请表`
3. 结果：高置信命中

### 4.2 文档角色匹配

使用第一步产生的 `document_role`。

示例：

1. `application_form`
2. `product_list`
3. `regulatory_information_catalog`

### 4.3 关键词匹配

使用法规要求项中的关键词表匹配文件名和相对路径。

### 4.4 人工修正字段匹配

如果用户在后台修正了章节点或资料名称，应优先使用修正结果。

## 5. 核心方法

### 5.1 `run(input) -> RequirementDocumentMatchOutput`

主入口方法。

### 5.2 `match_by_chapter_code(document, requirement) -> MatchEvidence | None`

章节点编码完全相等时返回高置信证据。

### 5.3 `match_by_document_role(document, requirement) -> MatchEvidence | None`

文档角色命中期望角色时返回证据。

### 5.4 `match_by_keywords(document, requirement) -> MatchEvidence | None`

文件名、资料名称或相对路径命中关键词时返回证据。

### 5.5 `calculate_match_confidence(evidences) -> str`

置信度：

1. `high`
2. `medium`
3. `low`
4. `none`

## 6. 技术实现

使用技术：

1. Python 字符串规则
2. `re`
3. 中文空白和标点标准化
4. 可选 `rapidfuzz`

V1 中不建议过度依赖模糊匹配，避免把相似但不等价的资料误判为已提供。

## 7. 异常处理

1. 一个要求项命中多个文档：保留全部候选，交给判定 Skill 处理。
2. 一个文档命中多个要求项：标记潜在错放或重复。
3. 文档待人工复核：仍可参与匹配，但置信度不超过 `medium`。
4. 章节点冲突：输出警告。

## 8. 测试要点

1. 章节点完全匹配返回高置信。
2. 文档角色匹配返回中高置信。
3. 只有关键词匹配返回低或中置信。
4. 待复核文档不会被高置信命中。
5. 多重命中输出警告。

