本项目是专为临床试验伦理审查与药物警戒工作设计的 SUSAR可疑非预期严重不良反应自动化筛查系统。它不依赖大语言模型而是通过结构化规则引擎协同运作对接 CTC 临床试验报告、HIS 检验数据和护理记录三类真实源数据用关键词正则的轻量 NLP 抽取自由文本中的不良事件依据 CTCAE v5.0 标准自动分级结合 SAE 五项判定条件死亡/危及生命/致残/住院/延长住院、因果关系三级阈值可能有关及以上、预期性比对研究者手册输出「建议上报/暂不上报」待审核清单最终交付 CLI 彩色终端报告与 HTML 可视化看板两种形态。核心能力全部封装在 Python 规则引擎中同时提供 TypeScript/Node.js 双 CLI 入口开箱即用附带完整模拟数据集。定位与能力范围我们不做通用医疗 NLP也不做端到端上报平台。本系统明确服务于伦理委员会定期审查、临床试验机构 SAE/SUSAR 上报辅助、药物警戒部门初筛、以及 CRC临床研究协调员日常核查四类角色。它的边界非常清晰只做「判断前一步」即从原始报告中识别出哪些事件值得进入人工审核流程而非替代伦理委员签字或 GCP 系统直传。这决定了我们放弃 LLM 路线规则可追溯、结果可复现、分级有据可查。所有 CTCAE 分级逻辑如 ALT 升高按 ×ULN 倍数划分 Grade 1–4、SAE 判定条件、因果关系映射表、预期性比对机制全部显式编码在rules/目录下不黑盒、不微调、不联网。你看到的每一条「建议上报」都能回溯到某条 if-else 或某张映射表。这也意味着它不处理电子签名、监管平台对接如国家药品审评中心 E2B 系统、受试者长期随访管理、非 SUSAR 的一般 AE 归因分析。它专注把“该不该报”这件事在分钟级内给出结构化答案。核心功能系统能力由七个垂直模块协同完成各司其职又紧密咬合模块职责输入输出nlp_extractor.py从护理记录等自由文本中抽取不良事件名称护理记录 content 字段「ALT 升高」「血小板减少」「呼吸困难」等标准化术语event_mapper.py将抽取术语映射至 CTCAE 标准编码体系不良事件名称CTCAE 编码如 LAB.00012、所属系统器官分类SOCctcae_engine.py根据检验值与参考范围计算 CTCAE 分级HIS 报告中 test_item result_value reference_rangeGrade 1–5 数值如 ALT 升高 → Grade 3sae_engine.py判定是否构成严重不良事件SAECTC 报告 outcome 字段、护理记录内容关键词、住院相关描述True / Falsecausality_engine.py解析因果关系强度基于 CTC 报告 sae_description 中的医学表述sae_description 文本「肯定有关」「很可能有关」「可能有关」「可能无关」「肯定无关」五档screening_engine.py整合 SAE、因果关系、预期性三项执行 SUSAR 最终判定前述三项结果 研究者手册预期性对照表「建议上报」或「暂不上报」cli_reporter.pyhtml_generator.py渲染终端彩色摘要与浏览器可视化看板筛查结果 JSONCLI 彩色行、susar-report.html 文件整个流程不是单向流水线而是带反馈校验的设计例如当 NLP 抽取到「意识模糊」但未在 CTCAE 映射表中找到对应项则标记为「未映射事件」并保留在报告中供人工确认不丢弃、不强行归类。使用与配置你无需部署服务或配置数据库。系统以命令行工具形态交付支持 Python 和 Node.js 两种运行时按需选用。Python CLI推荐用于规则调试与本地验证pip install -r requirements.txt运行完整筛查python src/cli.py --ctc-path data/ctc_reports.json \ --his-path data/his_lab_reports.json \ --nursing-path data/nursing_records.json \ --output build/susar-results.json查看彩色终端报告含分级颜色标识、SUSAR 判定依据高亮python src/cli.py --verboseNode.js CLI推荐用于团队快速执行与脚本集成npm install运行筛查流程npm run cli -- screening run生成并查看 HTML 看板npm run cli -- screening report列出所有受试者及其 SUSAR 判定汇总npm run cli -- screening listHTML 报告生成后直接双击或拖入浏览器打开susar-report.html即可看到按受试者、按不良事件类型、按 CTCAE 分级分布的交互式图表所有数据均来自本次运行结果无外部依赖。工程结构目录设计严格遵循职责分离原则便于理解、审计与扩展susar-screening-assistant/ ├── data/ # 模拟数据CTC/HIS/护理三类 JSON字段与说明文档完全一致 ├── src/ # Python 引擎核心 │ ├── models.py # 统一数据模型Subject, Event, Report 等 │ ├── adapters/ # 各源数据适配器将不同格式 JSON 映射为统一模型 │ ├── rules/ # 所有规则定义CTCAE 分级阈值表、SAE 条件枚举、因果关系关键词库、预期性白名单 │ ├── ctcae_engine.py # CTCAE 引擎仅读取 rules/ctcae_rules.json不硬编码数值 │ ├── sae_engine.py # SAE 引擎规则条件全部外置为 JSON 配置 │ ├── causality_engine.py # 因果关系基于正则匹配 description 中的医学动词如「考虑」「怀疑」「可能由…引起」 │ ├── nlp_extractor.py # 轻量 NLP内置 200 不良事件同义词典 正则模板不调用外部 API │ ├── event_mapper.py # 映射表驱动CTCAE 编码与中文术语双向映射 │ ├── screening_engine.py # 主控逻辑串接各引擎执行 SUSAR 三重判定 │ ├── cli_reporter.py # CLI 渲染ANSI 颜色控制Grade 3 以上标红SUSAR 建议加粗 │ ├── html_generator.py # HTML 生成Jinja2 模板图表用 Chart.js 渲染 │ └── cli.py # 入口解析参数、调用 screening_engine、分发至 reporter/generator ├── cli/ # TypeScript CLI包装 Python 引擎提供更友好的命令语法 ├── templates/ # HTML 模板文件index.html partials ├── requirements.txt # Python 依赖仅 click, jinja2, python-dateutil 等轻量库 └── package.json # Node.js 依赖仅 commander, shelljs 等 CLI 工具所有规则与映射表均外置于代码逻辑之外修改rules/下 JSON 文件即可调整 CTCAE 分级阈值或新增不良事件映射无需改 Python。数据与扩展系统严格遵循三类输入数据的公开字段规范不假设额外字段也不强制要求数据清洗前置数据源必填字段说明CTC 报告subject_id,report_date,sae_name,sae_description,outcomesae_description是因果关系与预期性判断主依据HIS 检验报告subject_id,test_date,test_item,result_value,unit,reference_rangereference_range支持「10–50」或「10」等灵活格式护理记录subject_id,record_datetime,contentcontent为纯文本NLP 引擎从中抽取事件扩展新不良事件只需两步1. 在rules/event_mapping.json中添加中文术语到 CTCAE 编码的映射2. 在rules/ctcae_rules.json中补充该事件的分级逻辑如血红蛋白单位、阈值。无需修改任何 Python 代码不引入新依赖。限制与说明本系统不解决以下问题我们坦诚说明避免误用不替代人工审核输出仅为「建议上报/暂不上报」所有结论必须经伦理委员复核签字不处理非结构化影像或 PDF 报告当前仅支持 JSON 格式结构化数据PDF 或扫描件需先由人工转录为 JSONCTCAE 分级依赖参考范围完整性若 HIS 报告中reference_range字段为空该条检验不参与 CTCAE 分级仅作为文本线索供 NLP 抽取预期性判断基于静态研究者手册系统内置一份示例手册rules/investigator_brochure.json实际使用时需替换为本试验真实手册的结构化版本不支持多中心时间戳对齐各源数据按subject_id关联不自动校准跨系统时间偏差需确保 CTC/HIS/护理时间字段已由上游系统对齐。这些限制不是缺陷而是我们对「规则驱动」边界的清醒认知宁可少覆盖一点也要让每一条规则可验证、每一步输出可解释。项目地址https://github.com/nexorin9/susar-screening-assistant
[开源] SUSAR 智能筛查与上报辅助系统:面向伦理委员会与药物警戒部门的规则驱动型不良事件初筛工具
本项目是专为临床试验伦理审查与药物警戒工作设计的 SUSAR可疑非预期严重不良反应自动化筛查系统。它不依赖大语言模型而是通过结构化规则引擎协同运作对接 CTC 临床试验报告、HIS 检验数据和护理记录三类真实源数据用关键词正则的轻量 NLP 抽取自由文本中的不良事件依据 CTCAE v5.0 标准自动分级结合 SAE 五项判定条件死亡/危及生命/致残/住院/延长住院、因果关系三级阈值可能有关及以上、预期性比对研究者手册输出「建议上报/暂不上报」待审核清单最终交付 CLI 彩色终端报告与 HTML 可视化看板两种形态。核心能力全部封装在 Python 规则引擎中同时提供 TypeScript/Node.js 双 CLI 入口开箱即用附带完整模拟数据集。定位与能力范围我们不做通用医疗 NLP也不做端到端上报平台。本系统明确服务于伦理委员会定期审查、临床试验机构 SAE/SUSAR 上报辅助、药物警戒部门初筛、以及 CRC临床研究协调员日常核查四类角色。它的边界非常清晰只做「判断前一步」即从原始报告中识别出哪些事件值得进入人工审核流程而非替代伦理委员签字或 GCP 系统直传。这决定了我们放弃 LLM 路线规则可追溯、结果可复现、分级有据可查。所有 CTCAE 分级逻辑如 ALT 升高按 ×ULN 倍数划分 Grade 1–4、SAE 判定条件、因果关系映射表、预期性比对机制全部显式编码在rules/目录下不黑盒、不微调、不联网。你看到的每一条「建议上报」都能回溯到某条 if-else 或某张映射表。这也意味着它不处理电子签名、监管平台对接如国家药品审评中心 E2B 系统、受试者长期随访管理、非 SUSAR 的一般 AE 归因分析。它专注把“该不该报”这件事在分钟级内给出结构化答案。核心功能系统能力由七个垂直模块协同完成各司其职又紧密咬合模块职责输入输出nlp_extractor.py从护理记录等自由文本中抽取不良事件名称护理记录 content 字段「ALT 升高」「血小板减少」「呼吸困难」等标准化术语event_mapper.py将抽取术语映射至 CTCAE 标准编码体系不良事件名称CTCAE 编码如 LAB.00012、所属系统器官分类SOCctcae_engine.py根据检验值与参考范围计算 CTCAE 分级HIS 报告中 test_item result_value reference_rangeGrade 1–5 数值如 ALT 升高 → Grade 3sae_engine.py判定是否构成严重不良事件SAECTC 报告 outcome 字段、护理记录内容关键词、住院相关描述True / Falsecausality_engine.py解析因果关系强度基于 CTC 报告 sae_description 中的医学表述sae_description 文本「肯定有关」「很可能有关」「可能有关」「可能无关」「肯定无关」五档screening_engine.py整合 SAE、因果关系、预期性三项执行 SUSAR 最终判定前述三项结果 研究者手册预期性对照表「建议上报」或「暂不上报」cli_reporter.pyhtml_generator.py渲染终端彩色摘要与浏览器可视化看板筛查结果 JSONCLI 彩色行、susar-report.html 文件整个流程不是单向流水线而是带反馈校验的设计例如当 NLP 抽取到「意识模糊」但未在 CTCAE 映射表中找到对应项则标记为「未映射事件」并保留在报告中供人工确认不丢弃、不强行归类。使用与配置你无需部署服务或配置数据库。系统以命令行工具形态交付支持 Python 和 Node.js 两种运行时按需选用。Python CLI推荐用于规则调试与本地验证pip install -r requirements.txt运行完整筛查python src/cli.py --ctc-path data/ctc_reports.json \ --his-path data/his_lab_reports.json \ --nursing-path data/nursing_records.json \ --output build/susar-results.json查看彩色终端报告含分级颜色标识、SUSAR 判定依据高亮python src/cli.py --verboseNode.js CLI推荐用于团队快速执行与脚本集成npm install运行筛查流程npm run cli -- screening run生成并查看 HTML 看板npm run cli -- screening report列出所有受试者及其 SUSAR 判定汇总npm run cli -- screening listHTML 报告生成后直接双击或拖入浏览器打开susar-report.html即可看到按受试者、按不良事件类型、按 CTCAE 分级分布的交互式图表所有数据均来自本次运行结果无外部依赖。工程结构目录设计严格遵循职责分离原则便于理解、审计与扩展susar-screening-assistant/ ├── data/ # 模拟数据CTC/HIS/护理三类 JSON字段与说明文档完全一致 ├── src/ # Python 引擎核心 │ ├── models.py # 统一数据模型Subject, Event, Report 等 │ ├── adapters/ # 各源数据适配器将不同格式 JSON 映射为统一模型 │ ├── rules/ # 所有规则定义CTCAE 分级阈值表、SAE 条件枚举、因果关系关键词库、预期性白名单 │ ├── ctcae_engine.py # CTCAE 引擎仅读取 rules/ctcae_rules.json不硬编码数值 │ ├── sae_engine.py # SAE 引擎规则条件全部外置为 JSON 配置 │ ├── causality_engine.py # 因果关系基于正则匹配 description 中的医学动词如「考虑」「怀疑」「可能由…引起」 │ ├── nlp_extractor.py # 轻量 NLP内置 200 不良事件同义词典 正则模板不调用外部 API │ ├── event_mapper.py # 映射表驱动CTCAE 编码与中文术语双向映射 │ ├── screening_engine.py # 主控逻辑串接各引擎执行 SUSAR 三重判定 │ ├── cli_reporter.py # CLI 渲染ANSI 颜色控制Grade 3 以上标红SUSAR 建议加粗 │ ├── html_generator.py # HTML 生成Jinja2 模板图表用 Chart.js 渲染 │ └── cli.py # 入口解析参数、调用 screening_engine、分发至 reporter/generator ├── cli/ # TypeScript CLI包装 Python 引擎提供更友好的命令语法 ├── templates/ # HTML 模板文件index.html partials ├── requirements.txt # Python 依赖仅 click, jinja2, python-dateutil 等轻量库 └── package.json # Node.js 依赖仅 commander, shelljs 等 CLI 工具所有规则与映射表均外置于代码逻辑之外修改rules/下 JSON 文件即可调整 CTCAE 分级阈值或新增不良事件映射无需改 Python。数据与扩展系统严格遵循三类输入数据的公开字段规范不假设额外字段也不强制要求数据清洗前置数据源必填字段说明CTC 报告subject_id,report_date,sae_name,sae_description,outcomesae_description是因果关系与预期性判断主依据HIS 检验报告subject_id,test_date,test_item,result_value,unit,reference_rangereference_range支持「10–50」或「10」等灵活格式护理记录subject_id,record_datetime,contentcontent为纯文本NLP 引擎从中抽取事件扩展新不良事件只需两步1. 在rules/event_mapping.json中添加中文术语到 CTCAE 编码的映射2. 在rules/ctcae_rules.json中补充该事件的分级逻辑如血红蛋白单位、阈值。无需修改任何 Python 代码不引入新依赖。限制与说明本系统不解决以下问题我们坦诚说明避免误用不替代人工审核输出仅为「建议上报/暂不上报」所有结论必须经伦理委员复核签字不处理非结构化影像或 PDF 报告当前仅支持 JSON 格式结构化数据PDF 或扫描件需先由人工转录为 JSONCTCAE 分级依赖参考范围完整性若 HIS 报告中reference_range字段为空该条检验不参与 CTCAE 分级仅作为文本线索供 NLP 抽取预期性判断基于静态研究者手册系统内置一份示例手册rules/investigator_brochure.json实际使用时需替换为本试验真实手册的结构化版本不支持多中心时间戳对齐各源数据按subject_id关联不自动校准跨系统时间偏差需确保 CTC/HIS/护理时间字段已由上游系统对齐。这些限制不是缺陷而是我们对「规则驱动」边界的清醒认知宁可少覆盖一点也要让每一条规则可验证、每一步输出可解释。项目地址https://github.com/nexorin9/susar-screening-assistant