:面向结构化导出的确定性去标识边界)
OpenMed 最小必要字段选择Minimum-Necessary Structured Field Selection面向结构化导出的确定性去标识边界【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed结构化数据导出是临床数据流水线中最容易造成隐私泄漏的环节一条记录往往包含几十个字段而某个具体用途如队列回顾、计费汇总、研究导出可能只需要其中三五个。若不加约束地整行导出等于把去标识工作全部押注在事后删除上。OpenMed 在 openmed/risk/minimum_necessary.py 中提供了一套小型、确定性的最小必要字段选择器以用途映射 策略画像两个声明式注册表为边界把结构化导出严格限定在声明用途所需的字段上。读完本文你将掌握MinimumNecessarySelector的完整用法、决策理由码体系、失败关闭语义与容量上限并了解其源码级防绕过设计与测试保障。一、为什么需要最小必要字段选择OpenMed 的定位是本地优先的医疗 AIclinical NER 与 HIPAA PII 去标识其核心承诺是患者数据不出网络。在去标识流程之外docs/security/minimum-necessary.md明确了一个原则Structured exports should contain only the fields required for their declared use.即结构化导出应只包含其声明用途所必需的字段。这对应隐私工程中的数据最小化data minimization原则——即使某条源记录已经过脱敏也不应把完整记录无差别地导出因为字段越多交叉关联quasi-identifier linkage与重识别风险越高导出物一旦进入下游仓库、BI 工具或第三方系统字段数量直接放大泄漏面用途声明与字段选择应当可审计、可复现而不是靠工程师手动挑选。OpenMed 为此提供的选择器定位是确定性边界工具它不猜用途、不做授权、不给出合规结论只负责根据调用方声明好的两份注册表机械、可重复地计算出该导出哪些字段。它在 1.7.0 版本中随minimum-necessary strength selection等运行时去标识特性一并引入见 docs/release/v1.7.0.md 的 release notes。二、核心模型调用方拥有的两个声明式注册表选择器的设计要点是把策略声明与记录值彻底分离。调用方数据持有方负责维护两个注册表注册表声明内容键名说明用途映射purpose mapping某一用途下允许导出的字段以及必须导出否则整体拒绝的字段fields、required_fieldsrequired_fields可选若声明则必须被fields包含策略画像policy profile某类导出场景下允许与禁止的字段可进一步收窄用途字段allowed_fields、denied_fieldsallowed_fields可为空表示不额外收窄也支持fields作为 allowlist 别名对应源码中的PurposeMapping与FieldPolicyProfile两个冻结数据类frozen dataclass在 openmed/risk/minimum_necessary.py 中定义。PurposeMapping.__post_init__会强制校验required fields 必须是 purpose fields 的子集配置非法在构造期即报错而不是等到选择时。三、选择算法交集 → 拒绝列表 → 失败关闭选择器select()的决策流程对应 openmed/risk/minimum_necessary.py可以概括为解析并规范化用途名与画像名小写、-转_未知用途直接在检查记录之前返回unknown_purpose_mapping的拒绝结果不读取记录未知画像返回unknown_policy_profile拒绝结果取用途字段 ∩ 可用字段得到 eligible 集合若画像声明了allowed_fields则eligible allowed_fields与用途字段求交集再剔除denied_fields应用拒绝列表依次检查三种失败关闭条件必需字段不在可用字段中 →required_fields_unavailable必需字段被策略排除 →required_fields_not_permitted没有任何可用字段 →no_permitted_fields全部通过则返回purpose_and_policy_allowlisted的允许结果字段按排序后的元组输出保证确定性。关键语义是必需字段不可用或被禁止时整个选择被拒绝而不是静默产出部分导出。拒绝结果携带稳定的理由码与元数据不会把部分字段悄悄放行。四、快速上手完整示例与可运行代码以下代码直接来自 docs/security/minimum-necessary.md 的示例并保持原样可运行文中所有值均为合成数据from openmed.risk.minimum_necessary import MinimumNecessarySelector selector MinimumNecessarySelector( purpose_mappings{ cohort_review: { fields: (age_band, condition_code, visit_month), required_fields: (condition_code,), } }, policy_profiles{ research_limited: { allowed_fields: (age_band, condition_code, visit_month), denied_fields: (), } }, ) record { age_band: synthetic-age-band, condition_code: SYNTHETIC-CODE, visit_month: synthetic-month, raw_sensitive_value: SYNTHETIC-SECRET, } selection selector.select( record, purposecohort_review, policy_profileresearch_limited, ) export_row selection.project(record)export_row只包含age_band、condition_code、visit_month三个字段源记录中的raw_sensitive_value不会被拷贝。除完整示例外模块还提供了两个免构造选择器的函数式入口同样从 openmed.risk 包导出from openmed.risk import select_fields, select_minimum_necessary_fields # 两者等价select_minimum_necessary_fields 是带显式语义名的别名 result select_fields( record, # 可用字段记录 / 字段名可迭代对象 / None purposecohort_review, policy_profileresearch_limited, purpose_mappingspurpose_mappings, policy_profilespolicy_profiles, )注意select()的第一个位置参数available_fields有三种形态见源码FieldInput类型别名映射记录本身如示例选择器只读取字段名、不读取值字段名可迭代对象如(condition_code, age_band)None回退为用途映射声明的fields即仅凭用途 schema 即可计算选择结果无需任何记录值——测试test_selection_can_be_computed_from_purpose_schema_without_record_values验证了这一点。五、结果对象FieldSelection 与决策理由码每次select()返回一个FieldSelectionSelectionResult类型别名。其公开 API 包括成员类型语义allowedbool该选择是否可被应用project的前置条件fields/selected_fieldstuple[str, ...]排序后的选中字段名reasonstr稳定的理由码project(record)dict只投影选中字段被拒绝时返回空映射to_dict()/to_json()dict / str值无关value-free的决策元数据适合写入审计轨迹5.1 决策理由码表所有理由码在源码中以_REASON_*常量定义openmed/risk/minimum_necessary.py并通过SelectionExplanation.__post_init__强制校验理由与 allowed 结果一致不允许自相矛盾的元数据理由码allowed触发条件purpose_and_policy_allowlistedtrue字段通过用途与策略双重放行正常选中unknown_purpose_mappingfalse用途映射不存在且不读取记录unknown_policy_profilefalse策略画像不存在required_fields_unavailablefalse必需字段不在可用字段集合中required_fields_not_permittedfalse必需字段被策略拒绝列表排除no_permitted_fieldsfalse没有任何允许字段5.2 审计友好的无值元数据selection.to_dict()/selection.to_json()包含字段名、计数与稳定的理由码但绝不包含记录或单元格的值。以 5.1 中的拒绝结果为例序列化输出大致为{allowed:false,available_field_count:0,omitted_fields:[],policy_profile:null,purpose:null,reason:unknown_purpose_mapping,required_fields:[],schema_version:1,selected_fields:[]}to_json()使用sort_keysTrue保证序列化确定性openmed/risk/minimum_necessary.py因此同样的决策永远产出同样的 JSON——这正是审计轨迹所需要的可复现性。文档明确建议Keep the projected row under the callers normal contenteditable="false">【免费下载链接】openmedLocal-first healthcare AI: clinical NER HIPAA PII de-identification that runs 100% on-device. 2,200 medical models, 21 languages, Apple MLX Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考