# NMPA 注册资料法规核查与整改闭环工作流功能设计 ## 文档信息 | 项目 | 内容 | | --- | --- | | 需求分析文档 | docs/1.需求分析/2.NMPA注册资料法规核查与整改闭环.md | | 依赖功能设计 | docs/2.功能设计/1.自动汇总.md | | 功能名称 | NMPA 注册资料法规核查与整改闭环 | | 所属模块 | 审核智能体 review_agent | | 设计日期 | 2026-06-06 | | 设计版本 | V1.0 | --- ## 一、设计目标 本功能在“自动汇总文件夹文件目录与页数流程”基础上扩展,不重复实现上传、解压、文件扫描、页数统计、基础导出和 SSE 推送能力。法规核查工作流复用已有 `FileSummaryBatch` 和 `FileSummaryItem` 作为资料清单输入,新增法规规则库、RAG 法规依据索引、法规核查批次、风险问题、过程产物、飞书通知和整改复核能力。 工作流支持两种启动方式:用户可以在已有文件汇总批次完成后发起法规核查;也可以直接在上传资料后发起法规核查,系统内部先执行自动汇总,再串联执行法规核查。若同一对话已存在最近一次成功的文件汇总批次,默认复用该批次。 前端需要新增独立的法规核查工作流卡片。一个对话内可能同时存在“文件汇总”和“法规核查”等多个工作流卡片,卡片区域采用类似轮播图的切换方式展示当前活跃卡片和历史卡片。底层 SSE 事件机制复用现有 `workflow` 事件,通过 `workflow_type` 区分 `file_summary` 与 `regulatory_review`。 --- ## 二、与自动汇总功能的关系 ### 2.1 复用边界 | 能力 | 处理方式 | 说明 | | --- | --- | --- | | 上传接收 | 复用 | 沿用 `FileAttachment`、`FileSummaryBatchAttachment` 和上传接收接口 | | 压缩包解压 | 复用 | 沿用自动汇总的解压 Skill 和工作目录规则 | | 文件清单扫描 | 复用 | 以 `FileSummaryItem` 作为法规核查文件清单 | | 页数统计 | 复用 | 法规核查直接读取页数和解析状态 | | 基础节点状态 | 复用 | 沿用 `WorkflowNodeRun` 事件模型,新增 workflow_type | | Markdown/Excel 下载 | 部分复用 | 最终报告进入 `ExportedSummaryFile`,过程产物进入 `RegulatoryArtifact` | | 产品名识别 | 不扩展 | 原 `产品信息识别 Skill` 继续只服务自动汇总标题识别 | ### 2.2 新增边界 | 能力 | 说明 | | --- | --- | | 法规适用信息抽取 | 新增 `RegulatoryInfoExtract Skill`,抽取注册类型、临床评价路径、产品关键信息 | | 适用条件确认 | 通过 AI 对话选择框让用户确认或自由补充 | | 规则文件与 RAG | 结构化规则文件负责判断,RAG 负责法规依据引用和解释 | | 法规核查批次 | 新增 `RegulatoryReviewBatch`,关联 `FileSummaryBatch` | | 风险问题与整改状态 | 新增 `RegulatoryIssue`,记录问题、风险、证据、责任人、状态 | | 过程产物留底 | 新增 `RegulatoryArtifact`,保存条件确认、核查矩阵、风险清单、复核记录等 | | 飞书通知 | 新增 `FeishuNotifier` 抽象接口,Demo 实现接飞书 CLI | --- ## 三、总体架构 ### 3.1 架构原则 | 原则 | 说明 | | --- | --- | | 依赖汇总批次 | 法规核查必须绑定一个 `FileSummaryBatch`,不能跨对话读取文件 | | 工作流独立 | 法规核查拥有独立卡片、批次和节点,但事件通道可复用 | | 规则优先 | 合规判断以结构化规则文件为准,RAG 只做法规依据检索和解释增强 | | 人工确认 | 适用条件缺失时停在待确认,复核通过关闭前需要人工确认 | | 过程留底 | 所有关键过程文档都要留底,便于复核和 Demo 展示 | | 通知可替换 | 飞书发送通过接口抽象,Demo 接 CLI,后续可替换为 Webhook/API | ### 3.2 逻辑架构 ```mermaid flowchart TD A["AI 对话页"] --> B["工作流卡片轮播区"] A --> C["法规核查启动接口"] C --> D{"是否已有成功 FileSummaryBatch"} D -->|"有"| E["复用最近成功汇总批次"] D -->|"无"| F["串联执行自动汇总工作流"] F --> E E --> G["RegulatoryReviewBatch"] G --> H["RegulatoryWorkflowExecutor"] H --> I["SkillRegistry"] I --> I1["RegulatoryInfoExtract Skill"] I --> I2["TextExtract Skill"] I --> I3["CompletenessCheck Skill"] I --> I4["StructureCheck Skill"] I --> I5["ConsistencyCheck Skill"] I --> I6["RiskAssess Skill"] I --> I7["RegulatoryReportExport Skill"] H --> J["结构化规则文件"] H --> K["本地法规 RAG 索引"] H --> L["RegulatoryIssue"] H --> M["RegulatoryArtifact"] H --> N["FeishuNotifier CLI"] H --> O["workflow SSE 事件"] O --> B ``` ### 3.3 技术选型 | 设计项 | Demo 方案 | 后续演进 | | --- | --- | --- | | 工作流编排 | 复用轻量 WorkflowExecutor 思路,新增 RegulatoryWorkflowExecutor | 接入 LangGraph 子图 | | 事件机制 | 复用 `workflow` SSE,新增 `workflow_type=regulatory_review` | 独立工作流事件中心 | | 规则存储 | 项目内 JSON/YAML 规则文件 | 规则管理后台 + 数据库版本表 | | 法规依据检索 | 本地 CMDE 文档构建 RAG 索引 | 法规资料定期更新和重建索引 | | 文本抽取 | 新增统一 TextExtract Skill | 建立文档文本缓存和 OCR 能力 | | 飞书通知 | `FeishuNotifier` 接飞书 CLI,可直接测试发送 | 飞书开放平台 Webhook/API | | 过程产物 | Markdown、Excel、JSON 留底 | 对象存储 + 证据快照管理 | --- ## 四、工作流设计 ### 4.1 启动方式 | 场景 | 处理方式 | | --- | --- | | 已有成功文件汇总批次 | 默认复用当前对话最近一次成功 `FileSummaryBatch` | | 无成功文件汇总批次 | 系统先串联执行自动汇总,再执行法规核查 | | 用户修改适用条件后重核 | 创建新的 `RegulatoryReviewBatch`,保留旧批次记录 | | 用户补充缺失文件复核 | 通过对话指令上传补充文件,合并到原问题上下文后复核 | ### 4.2 节点图 ```mermaid flowchart LR N1["准备资料"] --> N2["识别信息"] N2 --> N3{"适用条件是否完整"} N3 -->|"否"| W["待用户确认"] W --> N4["裁剪规则"] N3 -->|"是"| N4 N4 --> N5["完整性核查"] N5 --> N6["文本抽取"] N6 --> N7["章节核查"] N6 --> N8["一致性核查"] N7 --> N9["风险分级"] N8 --> N9 N9 --> N10["报告导出"] N10 --> N11["飞书通知"] N11 --> N12["待整改复核"] N12 --> N13["完成"] N4 -->|"规则加载失败"| R["RAG 辅助核查"] R --> N9 ``` ### 4.3 主节点与子节点 法规核查卡片展示主节点,主节点可展开查看子节点。 | 主节点 | 子节点 | 说明 | | --- | --- | --- | | 准备资料 | 复用批次、检查文件清单、读取规则版本 | 绑定 `FileSummaryBatch` | | 识别信息 | 产品信息抽取、适用条件识别 | 生成用户确认项 | | 确认条件 | 对话选择框确认、自由补充 | 卡片只展示等待状态 | | 法规核查 | 规则裁剪、完整性核查、文本抽取、章节核查、一致性核查 | 完整性先跑,章节和一致性并行 | | 风险输出 | 风险分级、建议生成、RAG 依据引用、报告导出 | 生成问题和过程产物 | | 通知复核 | 飞书通知、补充资料、整改复核、关闭确认 | 支持后续闭环 | ### 4.4 节点定义 | 节点编码 | 节点名称 | 触发 Skill/服务 | 成功条件 | 失败或暂停处理 | | --- | --- | --- | --- | --- | | prepare | 准备资料 | RegulatoryWorkflowExecutor | 绑定成功的 `FileSummaryBatch` | 无汇总批次则串联自动汇总 | | info_extract | 识别信息 | RegulatoryInfoExtract Skill | 输出适用条件候选值 | 缺少关键条件则进入待确认 | | condition_confirm | 确认条件 | Conversation Interaction | 用户确认产品类别、注册类型、临床路径等 | 暂停等待用户输入 | | rule_scope | 裁剪规则 | RuleLoader | 生成本次适用规则清单 | 规则加载失败则降级 RAG 辅助核查 | | completeness_check | 完整性核查 | CompletenessCheck Skill | 输出缺失文件和文件项问题 | 单项失败记录待确认 | | text_extract | 文本抽取 | TextExtract Skill | 抽取关键文件文本和首页内容 | 单文件失败记录问题并继续 | | structure_check | 章节核查 | StructureCheck Skill | 输出章节缺失和格式问题 | 与一致性核查并行 | | consistency_check | 一致性核查 | ConsistencyCheck Skill | 输出字段冲突问题 | 低置信度字段可用 LLM 辅助 | | risk_assess | 风险分级 | RiskAssess Skill | 归并问题、生成风险等级和建议 | 无 RAG 依据时仍输出规则问题 | | report_export | 报告导出 | RegulatoryReportExport Skill | 生成 Markdown、Excel、JSON 产物 | 导出失败记录批次失败 | | notify | 飞书通知 | FeishuNotifier | 阻断项、高风险、中风险完成通知 | CLI 失败写入通知失败记录 | | rectify_review | 整改复核 | RectificationReview Skill | 输出复核通过/不通过 | 关闭前等待人工确认 | --- ## 五、规则库与 RAG 设计 ### 5.1 双层法规能力 | 层级 | 职责 | 不承担的职责 | | --- | --- | --- | | 结构化规则库 | 判断文件项、章节项、关键字段、一致性字段、风险等级和整改模板 | 不负责自由解释法规 | | RAG 法规依据索引 | 从本地 CMDE 原文材料检索法规依据片段、来源文件和引用说明 | 不直接决定合规结论 | ### 5.2 规则文件结构 Demo 阶段规则采用项目内 JSON/YAML 文件维护,建议路径: ```text review_agent/rules/nmpa_ivd_registration_v1.yaml ``` 规则文件需要包含版本信息: | 字段 | 说明 | | --- | --- | | version | 规则版本,如 nmpa_ivd_2021_v1 | | source_url | https://www.cmde.org.cn/xwdt/zxyw/20210930163300622.html | | source_path | 本地 CMDE 法规材料路径 | | effective_date | 规则生效日期或公告发布日期 | | rag_index_version | 对应 RAG 索引版本 | 规则项最小结构: ```yaml version: nmpa_ivd_2021_v1 source_url: https://www.cmde.org.cn/xwdt/zxyw/20210930163300622.html source_path: docs/0.原始材料/关于公布体外诊断试剂注册申报资料要求和批准证明文件格式的公告 effective_date: "2021-09-30" file_items: - rule_id: ivd_registration_test_report title: 注册检验报告 required_type: required applies_when: product_category: in_vitro_diagnostic registration_type: initial_registration match_keywords: file_name: ["注册检验报告", "检验报告"] directory: ["注册检验", "检测报告"] first_pages: ["医疗器械注册检验报告", "检验结论"] required_sections: ["样品信息", "检验依据", "检验项目", "检验结论", "签章"] required_fields: ["产品名称", "型号规格", "样本类型"] consistency_fields: ["产品名称", "型号规格"] default_risk_level: blocking suggestion_template: 请补充与本产品一致的注册检验报告,并确保报告包含样品信息、检验依据、检验项目、检验结论和签章页。 ``` ### 5.3 规则加载策略 | 场景 | 处理方式 | | --- | --- | | 规则文件正常加载 | 按结构化规则执行核查,RAG 补充法规依据 | | 规则文件加载失败 | 降级为 RAG 辅助核查,报告明确标记“仅供参考,不输出正式合规结论” | | 规则命中但 RAG 无依据 | 仍输出问题,法规依据标记“规则库依据,原文待补充” | | 规则版本与 RAG 版本不一致 | 批次标记提示项,允许继续但报告记录版本差异 | ### 5.4 RAG 索引设计 | 项目 | 说明 | | --- | --- | | 资料来源 | 本地 CMDE 公告目录下的 doc/docx 文档 | | 索引粒度 | 按标题、段落、表格行或文件项说明切分 | | 元数据 | source_file、section_title、page_or_row、rule_version、source_url | | 输出 | matched_snippets、source_file、score、citation_text | | 用途 | 风险报告中的法规依据、AI 对话解释、飞书通知简要依据 | --- ## 六、Skill 设计 ### 6.1 RegulatoryInfoExtract Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 法规适用信息抽取 Skill | | 职责 | 从 `FileSummaryItem`、文件名、目录名和文本片段中抽取法规适用条件 | | 输入 | regulatory_batch_id、file_summary_batch_id、file_items | | 输出 | 产品类别、注册类型、临床评价路径、产品名称、型号规格、预期用途、置信度、证据 | | 关键规则 | 不修改自动汇总的产品名识别 Skill;缺少关键条件时暂停等待用户确认 | 用户确认字段: | 字段 | 是否必填 | 说明 | | --- | --- | --- | | 产品类别 | 是 | 医疗器械/体外诊断试剂等 | | 注册类型 | 是 | 首次注册、变更注册、延续注册等 | | 临床评价路径 | 是 | 临床试验、免临床、同品种比对等 | | 产品名称 | 是 | 用于一致性核查 | | 型号规格 | 是 | 用于一致性核查 | | 预期用途 | 是 | 用于规则裁剪和一致性核查 | ### 6.2 TextExtract Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 文本抽取 Skill | | 职责 | 按需抽取关键文件首页、前几页、章节文本和字段候选值 | | 输入 | regulatory_batch_id、file_item_ids、extract_scope | | 输出 | text_blocks、first_page_text、section_candidates、field_candidates | | 数据写入 | RegulatoryArtifact,artifact_type=text_extract_json | | 关键规则 | 统一抽取,避免完整性、章节、一致性节点重复读取文件 | ### 6.3 CompletenessCheck Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 法规资料完整性核查 Skill | | 职责 | 对照适用规则清单检查文件项和文件项子项是否存在 | | 输入 | regulatory_batch_id、file_summary_items、scoped_rules | | 输出 | missing_items、matched_items、pending_confirm_items | | 关键规则 | 文件匹配采用文件名、目录名、首页内容三层匹配,记录命中证据 | ### 6.4 StructureCheck Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 章节结构核查 Skill | | 职责 | 检查关键文件是否包含规则要求章节 | | 输入 | regulatory_batch_id、text_blocks、required_sections | | 输出 | missing_sections、abnormal_sections、evidence | | 关键规则 | 章节缺失按规则初始等级输出,由 RiskAssess 统一归并 | ### 6.5 ConsistencyCheck Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 跨文件一致性核查 Skill | | 职责 | 抽取并比对产品名称、型号规格、预期用途等核心字段 | | 输入 | regulatory_batch_id、text_blocks、consistency_fields | | 输出 | field_values、conflicts、confidence | | 关键规则 | 规则/正则优先,失败或置信度低时调用 LLM 辅助抽取结构化 JSON | ### 6.6 RiskAssess Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 风险分级与整改建议 Skill | | 职责 | 归并核查问题,统一风险等级,生成整改建议和法规依据 | | 输入 | all_check_findings、rules、rag_results | | 输出 | RegulatoryIssue 列表、risk_summary、suggestions | | 关键规则 | 核查节点提供初始等级,RiskAssess 负责去重、合并、升级或降级 | ### 6.7 RegulatoryReportExport Skill | 项目 | 说明 | | --- | --- | | 中文名称 | 法规核查报告导出 Skill | | 职责 | 生成最终报告和过程产物 | | 输入 | regulatory_batch_id、issues、artifacts、notification_records | | 输出 | Markdown 报告、Excel 清单、JSON 产物、下载链接 | | 关键规则 | 最终报告进入 `ExportedSummaryFile`,过程产物进入 `RegulatoryArtifact` | ### 6.8 FeishuNotifier | 项目 | 说明 | | --- | --- | | 中文名称 | 飞书通知适配器 | | 职责 | 对阻断项、高风险、中风险发送飞书通知并 @ 上传人 | | 输入 | recipient、risk_summary、message_markdown | | 输出 | send_status、external_message_id、error_message | | Demo 实现 | 抽象接口接飞书 CLI,并支持直接测试发送 | | 后续演进 | 替换为飞书 Webhook/API | --- ## 七、数据模型设计 ### 7.1 RegulatoryReviewBatch 法规核查批次,表示一次法规核查工作流执行。 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BigAutoField | 主键 | | conversation | ForeignKey(Conversation) | 绑定对话 | | user | ForeignKey(User) | 发起用户 | | file_summary_batch | ForeignKey(FileSummaryBatch) | 关联文件汇总批次 | | batch_no | CharField | 法规核查批次编号 | | status | CharField | pending、running、waiting_user、success、failed、reference_only、partial_success、cancelled | | rule_version | CharField | 使用的结构化规则版本 | | rule_source_url | URLField | 法规来源 URL | | rule_source_path | CharField | 本地法规资料路径 | | rag_index_version | CharField | RAG 索引版本 | | product_category | CharField | 用户确认后的产品类别 | | registration_type | CharField | 用户确认后的注册类型 | | clinical_evaluation_path | CharField | 用户确认后的临床评价路径 | | product_name | CharField | 产品名称 | | model_specification | CharField | 型号规格 | | intended_use | TextField | 预期用途 | | risk_summary_json | JSONField | 风险数量摘要 | | error_message | TextField | 异常说明 | | created_at | DateTimeField | 创建时间 | | started_at | DateTimeField | 开始时间 | | finished_at | DateTimeField | 完成时间 | ### 7.2 RegulatoryIssue 法规核查问题和整改状态实体。 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BigAutoField | 主键 | | batch | ForeignKey(RegulatoryReviewBatch) | 所属法规核查批次 | | issue_code | CharField | 问题编码 | | issue_type | CharField | completeness、structure、consistency、notification、review | | risk_level | CharField | blocking、high、medium、low、info | | title | CharField | 问题标题 | | description | TextField | 问题描述 | | rule_id | CharField | 命中的规则 ID | | regulation_basis | TextField | 法规依据或规则依据 | | evidence_json | JSONField | 文件路径、页码、文本片段、字段值等证据 | | suggestion | TextField | 整改建议 | | owner | ForeignKey(User) | 默认上传人 | | status | CharField | 待确认、待处理、已补充、复核通过、复核不通过、已关闭 | | confirmed_by | ForeignKey(User) | 确认人,可为空 | | closed_by | ForeignKey(User) | 关闭人,可为空 | | created_at | DateTimeField | 创建时间 | | updated_at | DateTimeField | 更新时间 | ### 7.3 RegulatoryArtifact 法规核查过程产物留底实体。 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BigAutoField | 主键 | | batch | ForeignKey(RegulatoryReviewBatch) | 所属法规核查批次 | | artifact_type | CharField | condition_record、rule_matrix、risk_list、text_extract_json、rag_result_json、notification_record、review_record | | file_format | CharField | markdown、excel、json | | file_name | CharField | 文件名 | | storage_path | CharField | 存储路径 | | summary | TextField | 产物摘要 | | created_at | DateTimeField | 创建时间 | ### 7.4 RegulatoryNotificationRecord 飞书通知记录。 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BigAutoField | 主键 | | batch | ForeignKey(RegulatoryReviewBatch) | 所属法规核查批次 | | recipient | ForeignKey(User) | 通知对象 | | channel | CharField | feishu_cli、feishu_api、mock | | risk_levels | JSONField | 本次通知包含的风险等级 | | message_summary | TextField | 通知摘要 | | send_status | CharField | pending、success、failed | | external_message_id | CharField | 外部消息 ID,可为空 | | error_message | TextField | 失败原因 | | sent_at | DateTimeField | 发送时间 | ### 7.5 与既有模型关系 ```text Conversation 1:N FileSummaryBatch FileSummaryBatch 1:N FileSummaryItem FileSummaryBatch 1:N RegulatoryReviewBatch RegulatoryReviewBatch 1:N RegulatoryIssue RegulatoryReviewBatch 1:N RegulatoryArtifact RegulatoryReviewBatch 1:N RegulatoryNotificationRecord RegulatoryReviewBatch 1:N ExportedSummaryFile ``` --- ## 八、接口设计 ### 8.1 发起法规核查 | 项目 | 内容 | | --- | --- | | URL | POST /api/review-agent/regulatory-review/start/ | | 认证 | 登录用户 | | 请求 | conversation_id、file_summary_batch_id 可选、force_resummary 可选 | | 响应 | regulatory_batch_id、workflow_type、status | 处理规则: | 场景 | 说明 | | --- | --- | | 传入 file_summary_batch_id | 校验该批次属于当前对话和用户 | | 未传入 file_summary_batch_id | 默认查找当前对话最近一次成功汇总批次 | | 无成功汇总批次 | 自动启动文件汇总工作流,完成后继续法规核查 | ### 8.2 提交适用条件确认 | 项目 | 内容 | | --- | --- | | URL | POST /api/review-agent/regulatory-review/{batch_id}/confirm-condition/ | | 认证 | 登录用户 | | 请求 | product_category、registration_type、clinical_evaluation_path、product_name、model_specification、intended_use | | 响应 | batch_id、status、next_node | 说明:对话选择框负责收集用户确认结果,接口只接收结构化确认值。用户修改已确认条件时创建新的 `RegulatoryReviewBatch`。 ### 8.3 查询法规核查状态 | 项目 | 内容 | | --- | --- | | URL | GET /api/review-agent/regulatory-review/{batch_id}/ | | 认证 | 登录用户 | | 响应 | 批次状态、主节点状态、风险摘要、导出文件、过程产物 | 用途: | 场景 | 说明 | | --- | --- | | 页面刷新恢复 | 恢复法规核查卡片状态 | | 卡片轮播切换 | 切换历史工作流卡片时加载详情 | | 整改复核 | 查看待处理和待确认问题 | ### 8.4 发起整改复核 | 项目 | 内容 | | --- | --- | | URL | POST /api/review-agent/regulatory-review/{batch_id}/rectify-review/ | | 认证 | 登录用户 | | 请求 | issue_ids、uploaded_files 可选、review_mode | | 响应 | review_record_id、status、updated_issues | Demo 阶段主要通过对话指令触发,卡片入口作为设计预留。 ### 8.5 下载法规核查文件 | 项目 | 内容 | | --- | --- | | URL | GET /api/review-agent/regulatory-review/artifacts/{artifact_id}/download/ | | 认证 | 登录用户 | | 响应 | 文件流 | 权限规则: ```text artifact_id -> regulatory_batch -> conversation -> user 必须等于当前登录用户,才允许下载。 ``` --- ## 九、前端设计 ### 9.1 多工作流卡片轮播 AI 对话页顶部或对话流内的工作流区域支持多个工作流卡片。 | 设计点 | 说明 | | --- | --- | | 展示方式 | 顶部只显示当前活跃卡片,通过左右箭头或点位切换历史卡片 | | 卡片类型 | file_summary、regulatory_review | | 事件更新 | 统一监听 `workflow` SSE,根据 workflow_type 和 batch_id 更新对应卡片 | | 卡片职责 | 展示工作流状态,不承载适用条件编辑表单 | | 历史恢复 | 页面刷新后按对话查询工作流批次并恢复卡片列表 | ### 9.2 法规核查卡片 卡片主节点: | 主节点 | 展示文案 | | --- | --- | | prepare | 准备资料 | | info_extract | 识别信息 | | condition_confirm | 确认条件 | | regulatory_check | 法规核查 | | risk_output | 风险输出 | | notify_review | 通知复核 | | completed | 已完成 | 节点可展开展示子节点,例如法规核查下展开“规则裁剪、完整性核查、文本抽取、章节核查、一致性核查”。 ### 9.3 适用条件确认交互 适用条件确认采用 AI 对话选择框,不放在卡片内。交互形式参考计划模式:系统给出识别结果、推荐选项和自由输入能力。 确认字段: | 字段 | 交互方式 | | --- | --- | | 产品类别 | 选项 + 自由输入 | | 注册类型 | 选项 + 自由输入 | | 临床评价路径 | 选项 + 自由输入 | | 产品名称 | 文本确认 | | 型号规格 | 文本确认 | | 预期用途 | 文本确认 | ### 9.4 对话框结果展示 工作流完成后新增助手消息,优先展示风险摘要、待处理问题和下载链接。 ```markdown 已完成 NMPA 注册资料法规核查。 | 风险等级 | 数量 | | --- | --- | | 阻断项 | 2 | | 高风险 | 1 | | 中风险 | 3 | | 低风险 | 4 | | 提示项 | 2 | | 等级 | 问题 | 状态 | 建议 | | --- | --- | --- | --- | | 阻断项 | 缺少注册检验报告 | 待处理 | 请补充注册检验报告并发起复核 | [下载 Markdown 核查报告](download-url) [下载 Excel 缺失清单](download-url) [下载过程产物 JSON](download-url) ``` --- ## 十、事件设计 ### 10.1 SSE 事件结构 复用现有 `workflow` 事件,新增字段区分工作流。 ```json { "event": "workflow", "workflow_type": "regulatory_review", "batch_id": 2001, "conversation_id": 1001, "node_code": "structure_check", "node_group": "regulatory_check", "status": "running", "message": "正在核查关键文件章节结构", "progress": 62, "payload": { "risk_summary": { "blocking": 1, "high": 2 } } } ``` ### 10.2 状态扩展 | 状态 | 含义 | | --- | --- | | pending | 已创建,等待执行 | | running | 执行中 | | waiting_user | 等待用户确认适用条件 | | success | 节点成功 | | failed | 节点失败 | | reference_only | 规则库不可用,降级为 RAG 辅助核查 | | partial_success | 部分节点、通知或非关键过程产物失败,但已输出主要结果 | | cancelled | 用户或系统取消执行 | | skipped | 当前节点跳过 | --- ## 十一、输出与留底设计 ### 11.1 最终下载文件 最终面向用户下载的报告沿用 `ExportedSummaryFile`。 | 文件 | 说明 | | --- | --- | | Markdown 核查报告 | 面向人工阅读的完整法规核查报告 | | Excel 缺失清单 | 面向整改跟踪的风险和缺失清单 | | JSON 结果包 | 面向后续复核和系统处理的结构化结果 | ### 11.2 过程产物 过程产物进入 `RegulatoryArtifact`。 | 产物类型 | 格式 | 说明 | | --- | --- | --- | | condition_record | markdown/json | 适用条件识别和用户确认记录 | | rule_matrix | excel/json | 法规核查矩阵 | | risk_list | markdown/json | 风险清单和等级归并结果 | | text_extract_json | json | 关键文件文本抽取结果 | | rag_result_json | json | RAG 检索依据和引用片段 | | notification_record | markdown/json | 飞书通知记录 | | review_record | markdown/json | 整改复核记录 | --- ## 十二、异常与降级设计 | 场景 | 处理 | | --- | --- | | 无成功文件汇总批次 | 自动串联执行文件汇总;汇总失败则法规核查不启动 | | 规则文件加载失败 | 降级为 RAG 辅助核查,标记 `reference_only`,报告声明仅供参考 | | RAG 检索不到依据 | 规则命中的问题仍输出,依据标记“规则库依据,原文待补充” | | 关键适用条件缺失 | 工作流进入 `waiting_user`,用户确认后继续 | | 文本抽取失败 | 记录文件级问题,相关章节或一致性结果标记待确认 | | LLM 字段抽取失败 | 回退规则/正则结果,低置信度字段进入待确认 | | 飞书 CLI 发送失败 | 记录通知失败,不阻断报告生成 | | 过程产物导出失败 | 批次标记失败或部分失败,错误信息写入批次 | --- ## 十三、安全设计 | 设计点 | 说明 | | --- | --- | | 对话隔离 | RegulatoryReviewBatch 必须绑定当前 Conversation | | 文件访问 | 只能读取关联 FileSummaryBatch 下的 FileSummaryItem | | 下载权限 | 导出文件和过程产物下载必须校验 conversation.user | | 飞书脱敏 | 飞书通知只展示风险摘要和必要文件名,不直接发送敏感全文 | | 证据留痕 | 证据片段写入受控存储,不暴露给无权限用户 | | CLI 安全 | 飞书 CLI 参数使用结构化调用,避免拼接执行用户输入 | --- ## 十四、验收设计 | 序号 | 验收项 | 验收标准 | | --- | --- | --- | | 1 | 汇总复用 | 已有成功文件汇总批次时,法规核查默认复用最近批次 | | 2 | 串联启动 | 无成功汇总批次时,可先自动汇总再执行法规核查 | | 3 | 多卡片切换 | 同一对话存在多个工作流时,可通过轮播切换卡片 | | 4 | 适用条件确认 | 系统能识别条件并通过对话选择框让用户确认 | | 5 | 规则与 RAG | 结构化规则负责判断,RAG 能补充法规依据 | | 6 | 完整性核查 | 能识别缺失文件和文件项级缺失 | | 7 | 章节核查 | 能识别关键文件章节缺失或异常 | | 8 | 一致性核查 | 能识别产品名称、型号规格、预期用途等字段冲突 | | 9 | 风险分级 | 问题能归并为阻断项、高、中、低、提示项 | | 10 | 飞书通知 | 阻断项、高风险、中风险能通过飞书 CLI @ 上传人 | | 11 | 过程留底 | 条件确认、核查矩阵、风险清单、RAG 结果、通知记录、复核记录均有产物 | | 12 | 整改复核 | 用户通过对话指令上传补充资料后,可重新复核问题状态 | | 13 | 权限隔离 | A 对话的法规核查结果和过程产物不能被 B 对话访问 | --- ## 十五、实施建议 1. 先实现 `RegulatoryReviewBatch`、`RegulatoryIssue`、`RegulatoryArtifact`、`RegulatoryNotificationRecord` 数据模型。 2. 增加规则文件加载器和一版 `nmpa_ivd_registration_v1` 结构化规则。 3. 构建本地 CMDE 法规材料 RAG 索引,确保能按规则项检索依据。 4. 实现法规核查工作流主链路:准备资料、信息抽取、条件确认、规则裁剪、完整性核查。 5. 补齐 `TextExtract`、章节核查、一致性核查、风险归并和报告导出。 6. 接入 `FeishuNotifier` CLI 实现并提供直接测试命令。 7. 改造前端工作流卡片,支持 `workflow_type` 和轮播切换。 8. 最后完善整改复核、过程产物下载和权限校验。 --- ## 十六、待确认事项 | 序号 | 问题 | 当前建议 | 状态 | | --- | --- | --- | --- | | 1 | 规则文件格式使用 YAML 还是 JSON | 建议 YAML,便于人工维护和注释 | 待确认 | | 2 | 本地 RAG 使用哪种向量库 | 可复用项目依赖中的 ChromaDB | 待技术验证 | | 3 | 飞书 CLI 具体命令格式 | 需要结合本机飞书 CLI 或企业内部工具确认 | 待确认 | | 4 | 对话选择框前端能力 | 参考计划模式实现选项 + 自由输入 | 待技术验证 | | 5 | LLM 抽取是否需要人工确认阈值 | 建议低于置信度阈值进入待确认 | 待确认 |