AI PLAY玩法更新持续收录
← 回到更新流

2026-09-29 · 原文发布日

用Gmail、OpenAI和Telegram做献血者暂缓筛查流程

面向血站场景的n8n流程:监听指定Gmail标签下的献血者筛查问卷邮件,提取编号和问卷文本并调取历史暂缓记录,用OpenAI抽取预设的风险标记,再逐条调用子流程按规则表计算暂缓天数。最终按“最长暂缓优先、永久暂缓最高”的规则得出永久、暂缓或可献血结论,决定血液成分隔离还是放行,记录进n8n数据表并Telegram通知主管。AI只做抽取和通知起草,判定走确定性代码。

原文要点

原模板面向血站:Gmail触发器监听DONOR_QUESTIONNAIRE标签问卷邮件,抽取donor_id、component_id、donation_type、问卷文本和筛查时间,调用外部donor registry取历史暂缓;用OpenAI GPT-4.1-mini只抽取预设风险标记,再经Execute Workflow调用“Deferral Days Calculator”子流程逐旗标算天数。汇总按最长暂缓优先且永久暂缓最高得Permanent/Hold/Eligible,成分动作只有quarantine或cleared pending standard testing,写n8n Data Table并Telegram通知主管。网络、AI、子流程、数据库节点称有3次重试和2秒退避;AI限抽取与安抚通知起草,判定走确定代码。

这次做成什么

在隔离n8n实例搭一条演示版暂缓筛查流水线:收到合成问卷邮件后,只让模型输出结构化风险旗标,最终结论由代码规则产生,能写入台账并发测试Telegram提醒;不把AI输出直接当医疗判定。

准备什么

  • 可改写节点与凭证的自托管n8n测试实例,勿接真实血站生产邮箱
  • Gmail测试账号及仅含合成问卷的标签,OpenAI API凭证,Telegram测试机器人与chat_id
  • 可访问的模拟donor registry端点或Mock HTTP响应,以及已导入的Deferral Days Calculator子流程ID
  • n8n Data Table可用权限,字段按donor_id/component_id/deferral_status/component_action/deferral_end_date建立

具体怎么做

  1. 配置入口与凭证

    新建工作流,触发器选Gmail Trigger并限定标签为DONOR_QUESTIONNAIRE_TEST;凭据用测试Gmail。紧随其后加Set节点合成字段:donor_id、component_id、donation_type、questionnaire_text、screening_ts,先用手动测试邮件,不连接真实收件人。

  2. 取历史并抽取旗标

    加HTTP Request“Fetch Prior Deferral History”,URL指向模拟registry,Header放测试token,返回prior_deferrals数组。加OpenAI节点“Extractor Model”,模型按模板写gpt-4.1-mini,temperature设0.1,提示词要求只输出JSON数组,元素含flag_code、evidence_span、confidence。

  3. 逐旗标调子流程

    用Split In Batches遍历extracted_flags,每批调用Execute Workflow“Calculate Flag Deferral Days”,把workflow ID改成你已导入子流程;入参映射flag_code、donation_type、screening_ts、prior_deferrals,子流程返回deferral_days、permanent、rule_ref。

  4. 确定式汇总与成分动作

    用Code节点汇总:若任一permanent=true则deferral_status=Permanent;否则取最大deferral_days,大于0为Hold并算deferral_end_date,全为0且无永久为Eligible。component_action仅二选一:Permanent或Hold给quarantine,Eligible给cleared pending standard testing。

  5. 通知、台账与人工闸口

    第二个OpenAI节点“Notice Drafting Model”temperature设0.3,只起草不含姓名的简短通知。Data Table节点选自建台账写入五个建议字段;Telegram节点发donor_id、component_id、status、action、rule_ref。Permanent/Hold前插入Send and Wait或审批节点,要求医疗负责人确认后才落账。

可直接复制的材料

风险旗标抽取提示词

本站独立编写;institution_flag_catalog_json必须替换为本机构SOP/FDA/AABB适用目录,未核对前不得上线。

你是献血者筛查问卷的信息抽取器,不做医疗结论。只从输入问卷文本中识别机构目录内的风险旗标。输入:donor_id={{ $json.donor_id }};donation_type={{ $json.donation_type }};screening_ts={{ $json.screening_ts }};flag_catalog={{ $json.institution_flag_catalog_json }};questionnaire_text={{ $json.questionnaire_text }}。要求:1) 只能使用flag_catalog中存在的flag_code,不得新造医学名词;2) 输出严格JSON,不要Markdown,不要解释;3) 每个元素字段为flag_code,evidence_span,confidence;evidence_span必须是问卷原文连续片段,最长80字;4) 无匹配则输出[];5) 不输出姓名、电话、身份证号等个人信息。输出Schema:{"flags":[{"flag_code":"string","evidence_span":"string","confidence":0.0}]}。

汇总Code节点示例逻辑

仅演示最长暂缓优先与永久最高;日期边界、时区和永久规则要在原模板与SOP核对。

const flags = $input.all().map(i => i.json);
const anyPermanent = flags.some(f => f.permanent === true);
const days = flags.map(f => Number(f.deferral_days || 0));
const maxDays = days.length ? Math.max(...days) : 0;
let deferral_status = 'Eligible';
if (anyPermanent) deferral_status = 'Permanent';
else if (maxDays > 0) deferral_status = 'Hold';
const ts = new Date($json.screening_ts || Date.now());
const end = new Date(ts); end.setDate(end.getDate() + maxDays);
return [{ json: { deferral_status, component_action: deferral_status === 'Eligible' ? 'cleared pending standard testing' : 'quarantine', deferral_end_date: deferral_status === 'Hold' ? end.toISOString().slice(0,10) : null, longest_rule_ref: (flags.find(f => Number(f.deferral_days||0) === maxDays) || {}).rule_ref || null } }];

合成台账与旗标目录

全部为合成演示值,非AABB/FDA正式表;真实规则表要由机构维护并版本化。

institution_flag_catalog_json={"flags":[{"flag_code":"TRAVEL_RISK_DEMO","deferral_days":30,"permanent":false},{"flag_code":"TEST_ONLY_PERMANENT_DEMO","deferral_days":0,"permanent":true}]}
ledger_csv=donor_id,component_id,deferral_status,component_action,deferral_end_date
D-1001,C-9001,Hold,quarantine,2026-10-29
D-1002,C-9002,Permanent,quarantine,
D-1003,C-9003,Eligible,cleared pending standard testing,

输入与输出示例

本站虚构演示,非原作者结果,未运行;模型抽取可能不稳定,最终由代码和人工审批决定。

输入

测试邮件到DONOR_QUESTIONNAIRE_TEST:donor_id=D-1042,component_id=C-7740,donation_type=whole_blood,screening_ts=2026-09-29T08:30:00Z;questionnaire_text="过去一个月曾到演示疫区旅行,无发热;三年前无手术。";模拟registry返回prior_deferrals=[]。

对应输出

抽取:{"flags":[{"flag_code":"TRAVEL_RISK_DEMO","evidence_span":"过去一个月曾到演示疫区旅行","confidence":0.91}]}。子流程返回deferral_days=30,permanent=false,rule_ref="DEMO-TRAVEL-30"。汇总:deferral_status=Hold,component_action=quarantine,deferral_end_date=2026-10-29;Telegram测试消息:"D-1042/C-7740 Hold quarantine end 2026-10-29 ref DEMO-TRAVEL-30"。

做完检查这些

  • 只有带DONOR_QUESTIONNAIRE_TEST标签的邮件会触发,其他标签在n8n执行日志中不出现执行记录
  • Extractor输出能被JSON解析且flag_code全部存在于测试目录,未知旗标会被丢弃并记入错误分支
  • 构造一永久一30天两旗标时,结果必须是Permanent且component_action=quarantine
  • 构造仅30天旗标时,deferral_end_date等于screening_ts加30天且台账五字段齐全
  • Telegram测试消息不含姓名电话,只含内部编号、状态、成分动作和rule_ref

容易卡住的地方

  • 这是医疗合规场景,演示通过不等于可临床使用;Permanent/Hold应强制医疗负责人签核
  • 不要把问卷原文含姓名电话塞进模型提示,先在Set节点脱敏并只用内部编号
  • 作者写的3次重试/2秒退避不能证明外部registry或Telegram一定可用,仍需失败告警
  • 子流程workflow ID、Data Table ID、Telegram chat_id导入后都会变,必须逐一重连
  • GPT-4.1-mini可用性和费用以你的OpenAI账户为准,不要因模板写明就假设额度充足

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Triage blood donor deferrals and component release with Gmail, OpenAI, and Telegram
原作者
Swapnil Mandloi
原始发布日期
2026-09-29T04:51:29.206Z
来源
https://n8n.io/workflows/20116