611 lines
17 KiB
Markdown
611 lines
17 KiB
Markdown
# 2. 法规完整性检查详细设计
|
||
|
||
## 1. 设计目标
|
||
|
||
本步骤承接“资料包导入与目录汇总”的输出,目标是对照 NMPA 体外诊断试剂注册申报资料要求,检查当前资料包是否齐套、章节点是否匹配、资料是否错放、是否存在需要人工复核的完整性问题。
|
||
|
||
本步骤需要完成以下业务结果:
|
||
|
||
1. 识别当前审核任务适用的法规流程,V1 默认使用 `registration` 注册申报流程。
|
||
2. 装载本地法规规则包,默认以公告附件包为主规则来源。
|
||
3. 将资料包目录结果与法规目录模板进行匹配。
|
||
4. 区分已提供、缺失、疑似提供、错放、待人工复核等状态。
|
||
5. 对缺失、错放和不确定项生成完整性风险等级和处理建议。
|
||
6. 通过 RAG 检索法规原文证据,但不把 RAG 命中结果作为最终裁判。
|
||
7. 输出结构化 `registration_completeness_report`,供 Chat 页面、Audit 和后续风险预警使用。
|
||
|
||
本步骤不负责产品字段抽取,不负责跨文档字段一致性检查,不负责最终综合风险报告。它只产出法规完整性维度的结论和证据。
|
||
|
||
## 2. 所属模块与边界
|
||
|
||
### 2.1 Scenarios
|
||
|
||
`apps.scenarios` 负责定义“法规完整性核查”任务入口。
|
||
|
||
建议配置项:
|
||
|
||
1. `scenario_id`: `registration_completeness_check`
|
||
2. `workflow_type`: `registration`
|
||
3. `required_input`: `registration_overview_report`
|
||
4. `rule_package`: `nmpa_ivd_registration_v1`
|
||
5. `enable_rag_evidence`: `true`
|
||
6. `output_schema`: `registration_completeness_report`
|
||
|
||
### 2.2 Documents
|
||
|
||
`apps.documents` 提供第一步生成的文档主数据和目录汇总结果。
|
||
|
||
本步骤读取:
|
||
|
||
1. 批次信息。
|
||
2. 文件相对路径。
|
||
3. 文件名。
|
||
4. 文件类型。
|
||
5. 页数。
|
||
6. 章节点。
|
||
7. 文档角色。
|
||
8. 处理状态。
|
||
9. 待人工复核标记。
|
||
|
||
### 2.3 Agent Core
|
||
|
||
`agent_core` 是本步骤的执行主体,负责编排规则包加载、流程识别、规则匹配、完整性判定、法规证据检索和报告生成。
|
||
|
||
本步骤建议产生以下中文 Skill:
|
||
|
||
1. `法规完整性检查Skill`
|
||
2. `法规规则包加载Skill`
|
||
3. `法规流程识别Skill`
|
||
4. `资料要求匹配Skill`
|
||
5. `缺失错放判定Skill`
|
||
6. `法规证据检索Skill`
|
||
7. `完整性报告生成Skill`
|
||
|
||
### 2.4 RAG
|
||
|
||
RAG 只负责证据定位和解释引用。
|
||
|
||
RAG 可以回答:
|
||
|
||
1. 当前缺失项对应公告附件中的哪段要求。
|
||
2. 当前章节点属于哪类资料要求。
|
||
3. 当前格式要求来源于哪份附件。
|
||
|
||
RAG 不负责决定:
|
||
|
||
1. 某资料是否必交。
|
||
2. 当前资料是否合规。
|
||
3. 缺失项是否高风险。
|
||
|
||
这些结论必须来自结构化规则。
|
||
|
||
### 2.5 Audit
|
||
|
||
`apps.audit` 记录本次完整性检查的输入、规则版本、匹配结果、缺失项、证据和错误。
|
||
|
||
审计中必须保留:
|
||
|
||
1. `batch_id`
|
||
2. `scenario_id`
|
||
3. `workflow_type`
|
||
4. `rule_package_id`
|
||
5. `rule_version`
|
||
6. `selected_document_ids`
|
||
7. `matched_items`
|
||
8. `missing_items`
|
||
9. `misplaced_items`
|
||
10. `manual_review_items`
|
||
11. `evidence_refs`
|
||
|
||
## 3. 输入输出
|
||
|
||
### 3.1 输入
|
||
|
||
```json
|
||
{
|
||
"batch_id": 1001,
|
||
"scenario_id": "registration_completeness_check",
|
||
"workflow_type": "registration",
|
||
"rule_package_id": "nmpa_ivd_registration_v1",
|
||
"chapter_scope": ["CH1"],
|
||
"selected_document_ids": [1, 2, 3],
|
||
"enable_rag_evidence": true
|
||
}
|
||
```
|
||
|
||
其中 `chapter_scope` 可为空。为空时默认检查当前批次已识别章节点及 V1 默认范围;演示首版建议优先检查 `CH1`,同时保留全六章规则结构。
|
||
|
||
### 3.2 输出
|
||
|
||
本步骤输出 `registration_completeness_report`:
|
||
|
||
```json
|
||
{
|
||
"report_type": "registration_completeness_report",
|
||
"batch_id": 1001,
|
||
"workflow_type": "registration",
|
||
"rule_package_id": "nmpa_ivd_registration_v1",
|
||
"rule_version": "2026-06-03",
|
||
"chapter_scope": ["CH1"],
|
||
"summary": {
|
||
"required_item_count": 8,
|
||
"provided_item_count": 6,
|
||
"missing_item_count": 1,
|
||
"suspected_item_count": 1,
|
||
"misplaced_item_count": 0,
|
||
"manual_review_item_count": 1,
|
||
"highest_risk_level": "high",
|
||
"pass_status": "failed"
|
||
},
|
||
"matched_items": [],
|
||
"missing_items": [],
|
||
"misplaced_items": [],
|
||
"manual_review_items": [],
|
||
"evidence_refs": [],
|
||
"suggestions": []
|
||
}
|
||
```
|
||
|
||
### 3.3 结果状态
|
||
|
||
| 状态 | 含义 |
|
||
|---|---|
|
||
| `provided` | 已提供,命中文档和章节点 |
|
||
| `missing` | 必交资料未找到 |
|
||
| `suspected` | 疑似提供,但命名、章节点或文档角色不确定 |
|
||
| `misplaced` | 文件存在,但章节点或路径位置不匹配 |
|
||
| `manual_review_required` | 规则无法直接判断,需人工复核 |
|
||
| `not_applicable` | 当前流程或适用条件下不要求 |
|
||
|
||
## 4. 主工作流
|
||
|
||
```text
|
||
用户发起法规完整性检查
|
||
-> 读取资料包目录汇总结果
|
||
-> 确认法规流程类型
|
||
-> 装载法规规则包
|
||
-> 展开章节和必交项规则
|
||
-> 将实际文档与规则项匹配
|
||
-> 判定已提供/缺失/疑似/错放/待复核
|
||
-> 映射风险等级与处理建议
|
||
-> 检索法规原文证据
|
||
-> 生成完整性检查报告
|
||
-> 写入审计留痕
|
||
-> 返回 Web/飞书可展示结果
|
||
```
|
||
|
||
## 5. 节点详细设计
|
||
|
||
### 5.1 节点一:读取目录汇总结果
|
||
|
||
业务功能:
|
||
|
||
1. 根据 `batch_id` 读取第一步产出的 `registration_overview_report`。
|
||
2. 校验资料包是否完成目录汇总。
|
||
3. 过滤当前检查范围内的文档。
|
||
4. 收集待人工复核文档,作为完整性检查的不确定性输入。
|
||
|
||
使用技术:
|
||
|
||
1. Django ORM
|
||
2. JSONField
|
||
3. Pydantic 或 dataclass schema 校验
|
||
|
||
产生方法:
|
||
|
||
1. `load_overview_report(batch_id) -> RegistrationOverviewReport`
|
||
2. `select_documents_for_completeness(report, chapter_scope, selected_document_ids) -> list[DocumentFact]`
|
||
3. `collect_document_uncertainties(documents) -> list[DocumentUncertainty]`
|
||
|
||
对应 Skill:
|
||
|
||
1. `法规完整性检查Skill`
|
||
|
||
### 5.2 节点二:法规流程识别
|
||
|
||
业务功能:
|
||
|
||
1. 确认当前任务属于注册申报、变更备案、变更注册还是延续注册。
|
||
2. V1 默认使用 `registration`。
|
||
3. 如果用户选择了不支持流程,返回业务化提示。
|
||
4. 防止把变更或延续规则误用于首次注册申报。
|
||
|
||
使用技术:
|
||
|
||
1. 场景配置 YAML
|
||
2. 批次字段 `workflow_type`
|
||
3. 规则包元数据
|
||
|
||
产生方法:
|
||
|
||
1. `resolve_workflow_type(batch, scenario_config, user_input) -> WorkflowTypeResult`
|
||
2. `validate_workflow_supported(workflow_type, rule_package) -> bool`
|
||
|
||
对应 Skill:
|
||
|
||
1. `法规流程识别Skill`
|
||
|
||
### 5.3 节点三:法规规则包加载
|
||
|
||
业务功能:
|
||
|
||
1. 加载本地结构化法规规则文件。
|
||
2. 校验规则版本、适用流程和章节结构。
|
||
3. 按“章 -> 条 -> 要求项 -> 模板字段”四级结构展开规则。
|
||
4. 区分资料要求层、结构目录层和格式模板层。
|
||
|
||
使用技术:
|
||
|
||
1. YAML 规则文件
|
||
2. Pydantic schema
|
||
3. Django cache 或内存缓存
|
||
4. 规则版本号
|
||
|
||
建议规则目录:
|
||
|
||
```text
|
||
configs/registration/rules/
|
||
nmpa_ivd_registration_v1.yaml
|
||
chapter_catalog.yaml
|
||
risk_mapping.yaml
|
||
```
|
||
|
||
规则项示例:
|
||
|
||
```yaml
|
||
rule_package_id: nmpa_ivd_registration_v1
|
||
workflow_type: registration
|
||
version: "2026-06-03"
|
||
chapters:
|
||
- chapter_code: CH1
|
||
chapter_name: 监管信息
|
||
requirements:
|
||
- requirement_id: CH1.4
|
||
requirement_name: 申请表
|
||
required: true
|
||
expected_document_roles:
|
||
- application_form
|
||
risk_level_if_missing: high
|
||
evidence_query: "体外诊断试剂 注册申报 申请表 监管信息"
|
||
```
|
||
|
||
产生方法:
|
||
|
||
1. `load_rule_package(rule_package_id) -> RulePackage`
|
||
2. `validate_rule_package(rule_package) -> RulePackageValidationResult`
|
||
3. `expand_requirement_items(rule_package, workflow_type, chapter_scope) -> list[RequirementItem]`
|
||
|
||
对应 Skill:
|
||
|
||
1. `法规规则包加载Skill`
|
||
|
||
### 5.4 节点四:资料要求匹配
|
||
|
||
业务功能:
|
||
|
||
1. 将当前资料包文档与法规要求项进行匹配。
|
||
2. 优先使用章节点编码匹配。
|
||
3. 其次使用文档角色匹配。
|
||
4. 再使用文件名和资料名称关键词匹配。
|
||
5. 保留匹配证据和匹配置信度。
|
||
|
||
匹配优先级:
|
||
|
||
1. `document.chapter_code == requirement.requirement_id`
|
||
2. `document.document_role in requirement.expected_document_roles`
|
||
3. 文件名命中规则关键词。
|
||
4. 相对路径命中章节名称。
|
||
5. 人工修正字段命中。
|
||
|
||
使用技术:
|
||
|
||
1. Python 规则匹配
|
||
2. 字符串标准化
|
||
3. 简单中文关键词匹配
|
||
4. 可选 rapidfuzz 模糊匹配,V1 谨慎使用
|
||
|
||
产生方法:
|
||
|
||
1. `match_documents_to_requirements(documents, requirements) -> RequirementMatchSet`
|
||
2. `match_by_chapter_code(document, requirement) -> MatchEvidence | None`
|
||
3. `match_by_document_role(document, requirement) -> MatchEvidence | None`
|
||
4. `match_by_keywords(document, requirement) -> MatchEvidence | None`
|
||
5. `calculate_match_confidence(evidences) -> str`
|
||
|
||
对应 Skill:
|
||
|
||
1. `资料要求匹配Skill`
|
||
|
||
### 5.5 节点五:缺失、错放与待复核判定
|
||
|
||
业务功能:
|
||
|
||
1. 对每个法规要求项生成完整性状态。
|
||
2. 判断必交项是否缺失。
|
||
3. 判断文件是否存在但错放章节。
|
||
4. 判断疑似提供但证据不足的情况。
|
||
5. 将第一步处理失败或页数待复核文件纳入不确定性。
|
||
|
||
判定规则:
|
||
|
||
| 条件 | 状态 |
|
||
|---|---|
|
||
| 必交项有高置信匹配文档 | `provided` |
|
||
| 必交项无任何匹配文档 | `missing` |
|
||
| 有低置信匹配文档 | `suspected` |
|
||
| 文档角色匹配但章节点不匹配 | `misplaced` |
|
||
| 文档本身待人工复核 | `manual_review_required` |
|
||
| 规则项不适用于当前流程 | `not_applicable` |
|
||
|
||
使用技术:
|
||
|
||
1. Python 规则引擎
|
||
2. 风险映射 YAML
|
||
3. dataclass/Pydantic 结果对象
|
||
|
||
产生方法:
|
||
|
||
1. `evaluate_requirement_status(requirement, matches, document_uncertainties) -> CompletenessItemResult`
|
||
2. `detect_missing_items(requirements, matches) -> list[MissingItem]`
|
||
3. `detect_misplaced_items(requirements, matches) -> list[MisplacedItem]`
|
||
4. `detect_manual_review_items(requirements, matches, uncertainties) -> list[ManualReviewItem]`
|
||
|
||
对应 Skill:
|
||
|
||
1. `缺失错放判定Skill`
|
||
|
||
### 5.6 节点六:完整性风险映射
|
||
|
||
业务功能:
|
||
|
||
1. 根据规则项定义映射风险等级。
|
||
2. 缺失高风险必交项时,本维度判定不通过。
|
||
3. 对待复核项不直接判失败,但标记结果可信度下降。
|
||
4. 生成基础处理建议。
|
||
|
||
风险等级:
|
||
|
||
1. `high`
|
||
2. `medium`
|
||
3. `low`
|
||
|
||
准入规则:
|
||
|
||
1. 任一高风险缺失项:`pass_status = failed`
|
||
2. 无高风险但存在中风险缺失项:`pass_status = review_required`
|
||
3. 只有低风险或待复核项:`pass_status = conditional_pass`
|
||
4. 无缺失、无错放、无待复核:`pass_status = passed`
|
||
|
||
使用技术:
|
||
|
||
1. 规则包内风险配置
|
||
2. 本地建议模板
|
||
3. Python 枚举
|
||
|
||
产生方法:
|
||
|
||
1. `map_completeness_risk(item_result, risk_rules) -> RiskMappingResult`
|
||
2. `calculate_pass_status(item_results) -> str`
|
||
3. `build_completeness_suggestion(item_result) -> str`
|
||
|
||
对应 Skill:
|
||
|
||
1. `缺失错放判定Skill`
|
||
|
||
### 5.7 节点七:法规证据检索
|
||
|
||
业务功能:
|
||
|
||
1. 针对缺失项、错放项和待复核项检索法规原文。
|
||
2. 返回法规来源文档、章节、片段和匹配查询。
|
||
3. 将证据附加到完整性结果和审计记录。
|
||
|
||
使用技术:
|
||
|
||
1. Chroma 或 fallback 检索
|
||
2. 本地法规原文切片
|
||
3. metadata 过滤
|
||
4. 关键词查询兜底
|
||
|
||
检索过滤条件:
|
||
|
||
1. `source_role = regulation`
|
||
2. `workflow_type = registration`
|
||
3. `rule_package_id = nmpa_ivd_registration_v1`
|
||
4. `chapter_code` 或 `requirement_id`
|
||
|
||
产生方法:
|
||
|
||
1. `retrieve_regulation_evidence(requirement_item, query_context) -> list[EvidenceRef]`
|
||
2. `build_evidence_query(requirement_item) -> str`
|
||
3. `filter_evidence_by_metadata(results, requirement_item) -> list[EvidenceRef]`
|
||
|
||
对应 Skill:
|
||
|
||
1. `法规证据检索Skill`
|
||
|
||
### 5.8 节点八:完整性报告生成
|
||
|
||
业务功能:
|
||
|
||
1. 汇总完整性检查结果。
|
||
2. 生成结构化报告。
|
||
3. 生成页面展示摘要。
|
||
4. 生成飞书摘要所需的短消息结构。
|
||
5. 写入审计记录。
|
||
|
||
使用技术:
|
||
|
||
1. Pydantic 或 dataclass schema
|
||
2. JSONField
|
||
3. Django template 或页面组件消费 JSON
|
||
4. Audit 服务层
|
||
|
||
产生方法:
|
||
|
||
1. `build_completeness_report(context, item_results, evidence_refs) -> RegistrationCompletenessReport`
|
||
2. `build_completeness_summary(item_results) -> CompletenessSummary`
|
||
3. `build_display_sections(report) -> list[DisplaySection]`
|
||
4. `record_completeness_audit(report, execution_context) -> AuditLog`
|
||
|
||
对应 Skill:
|
||
|
||
1. `完整性报告生成Skill`
|
||
|
||
## 6. Skill 清单
|
||
|
||
本步骤产生以下 Skill 设计文档:
|
||
|
||
1. [法规完整性检查Skill](skill/法规完整性检查Skill.md)
|
||
2. [法规规则包加载Skill](skill/法规规则包加载Skill.md)
|
||
3. [法规流程识别Skill](skill/法规流程识别Skill.md)
|
||
4. [资料要求匹配Skill](skill/资料要求匹配Skill.md)
|
||
5. [缺失错放判定Skill](skill/缺失错放判定Skill.md)
|
||
6. [法规证据检索Skill](skill/法规证据检索Skill.md)
|
||
7. [完整性报告生成Skill](skill/完整性报告生成Skill.md)
|
||
|
||
## 7. 规则数据设计
|
||
|
||
### 7.1 规则包元数据
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `rule_package_id` | 规则包标识 |
|
||
| `version` | 规则版本 |
|
||
| `workflow_type` | 适用流程 |
|
||
| `source_documents` | 法规来源文档 |
|
||
| `effective_scope` | 适用范围 |
|
||
| `chapter_count` | 章节数量 |
|
||
|
||
### 7.2 要求项字段
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `requirement_id` | 要求项编码,如 `CH1.4` |
|
||
| `chapter_code` | 章编码,如 `CH1` |
|
||
| `requirement_name` | 要求项名称 |
|
||
| `required` | 是否必交 |
|
||
| `condition` | 适用条件 |
|
||
| `expected_document_roles` | 期望文档角色 |
|
||
| `keywords` | 匹配关键词 |
|
||
| `risk_level_if_missing` | 缺失风险等级 |
|
||
| `evidence_query` | 法规证据检索查询 |
|
||
| `template_field_refs` | 后续模板字段映射 |
|
||
|
||
### 7.3 匹配结果字段
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `requirement_id` | 要求项编码 |
|
||
| `status` | 完整性状态 |
|
||
| `matched_document_ids` | 命中文档 ID |
|
||
| `match_confidence` | 匹配置信度 |
|
||
| `match_evidence` | 匹配证据 |
|
||
| `risk_level` | 风险等级 |
|
||
| `suggestion` | 处理建议 |
|
||
| `evidence_refs` | 法规证据引用 |
|
||
|
||
## 8. 页面展示
|
||
|
||
Chat/工作台页面建议展示:
|
||
|
||
1. 当前规则包名称和版本。
|
||
2. 当前检查流程类型。
|
||
3. 当前检查章节点范围。
|
||
4. 总体结论。
|
||
5. 缺失项数量。
|
||
6. 错放项数量。
|
||
7. 待人工复核数量。
|
||
8. 高风险缺失项。
|
||
9. 完整性检查明细表。
|
||
10. 法规证据引用。
|
||
11. 审计入口。
|
||
|
||
明细表字段:
|
||
|
||
1. 章节点。
|
||
2. 法规要求项。
|
||
3. 当前状态。
|
||
4. 命中文档。
|
||
5. 风险等级。
|
||
6. 处理建议。
|
||
7. 法规依据。
|
||
|
||
## 9. 异常处理
|
||
|
||
1. 未找到批次:返回“当前资料包不存在或已删除”。
|
||
2. 目录汇总未完成:提示先完成资料包导入与目录汇总。
|
||
3. 规则包不存在:任务不可执行,记录失败审计。
|
||
4. 规则包版本不支持当前流程:提示流程配置错误。
|
||
5. 文档章节点大量缺失:可执行,但报告标记低可信。
|
||
6. RAG 检索失败:不阻断规则判断,报告中标记证据检索不可用。
|
||
7. 所选文档为空:返回空范围检查结果,并提示用户选择资料范围。
|
||
8. 文档仍待人工复核:完整性报告保留不确定状态。
|
||
|
||
## 10. 与后续步骤的接口
|
||
|
||
后续风险预警读取:
|
||
|
||
1. `pass_status`
|
||
2. `highest_risk_level`
|
||
3. `missing_items`
|
||
4. `misplaced_items`
|
||
5. `manual_review_items`
|
||
6. `suggestions`
|
||
7. `evidence_refs`
|
||
|
||
后续字段抽取可读取:
|
||
|
||
1. 已命中的申请表、产品列表、说明书等文档 ID。
|
||
2. 待人工复核文档清单。
|
||
3. 当前规则包中声明的模板字段映射。
|
||
|
||
## 11. 测试设计
|
||
|
||
### 11.1 单元测试
|
||
|
||
1. 规则包加载成功。
|
||
2. 不支持流程被拦截。
|
||
3. 章节点编码匹配成功。
|
||
4. 文档角色匹配成功。
|
||
5. 必交项缺失被识别。
|
||
6. 错放文件被识别。
|
||
7. 风险等级映射正确。
|
||
8. RAG 失败不影响规则判断。
|
||
|
||
### 11.2 服务层测试
|
||
|
||
1. 基于第一步目录汇总执行完整性检查。
|
||
2. 缺失 `CH1.4` 时输出高风险。
|
||
3. `CH1.2` 目录类文档能作为命中文档进入报告。
|
||
4. 待复核文档会进入 `manual_review_items`。
|
||
5. 规则包缺失时写入失败审计。
|
||
|
||
### 11.3 页面测试
|
||
|
||
1. 页面展示规则包版本。
|
||
2. 页面展示缺失项和风险等级。
|
||
3. 页面展示法规证据。
|
||
4. 页面展示审计入口。
|
||
5. RAG 不可用时页面仍显示规则判断结果。
|
||
|
||
## 12. V1 实现建议
|
||
|
||
V1 建议先完成以下最小闭环:
|
||
|
||
1. 基于本地 YAML 规则包实现 `CH1` 完整性检查。
|
||
2. 检查 `CH1.2`、`CH1.4`、`CH1.5`、`CH1.9`、`CH1.11.1`、`CH1.11.5`、`CH1.11.6`。
|
||
3. 基于第一步的 `chapter_code` 和 `document_role` 做规则匹配。
|
||
4. 输出缺失项、疑似项和待复核项。
|
||
5. RAG 证据检索先使用 fallback 检索,后续接 Chroma。
|
||
6. 完整性报告写入审计。
|
||
|
||
增强阶段再补齐:
|
||
|
||
1. 第 2 至第 6 章完整规则。
|
||
2. 资料格式要求层检查。
|
||
3. 安全和性能基本原则清单映射检查。
|
||
4. 后台规则人工校订。
|
||
5. 在线法规更新能力。
|
||
|