본문으로 건너뛰기

검증: 출하 게이트와 SHACL

📍 현재 위치: 제6부 · 검증 — 모델이 책임을 지게 되는 수명주기 단계입니다. SAMOD의 테스트 우선 루프와 NeOn의 평가 시나리오를 따라, 이 장은 출하 규격, 완료 기준, 세포 은행 요건, 그리고 상위 척추의 disjointness를 그래프가 강제하는 닫힌 세계 게이트로 바꾸고 — 세포 은행 이후 계속 쌓여 온 캠페인에 대해 그것을 실행합니다.

단일클론항체 캠페인은 단 하나의 결정을 향해 몇 달을 수렴해 갑니다. mAb-A 로트가 환자의 정맥으로 들어가도 되는가? 이 책이 모델링한 모든 것이 그 결정으로 모입니다. DS-001의 SEC 단량체 순도(monomer purity)는 로트의 얼마만큼이 단편이나 응집체가 아니라 온전한 항체인지를 말합니다. HMW 응집체(HMW aggregate) 수준은 얼마만큼이 면역원성을 유발하는 고분자량 화학종으로 뭉쳤는지를 말합니다 — 응집된 항체는 환자에게서 항약물항체를 일으킬 수 있으므로, 이는 미관 문제가 아니라 안전성 속성입니다. CEX 주 피크(CEX main peak)는 전하 프로파일이 얼마나 균질한지를 — 항체 분자들에 걸친 약간씩 다른 전하의 분포를 — 말하며, 효능을 바꾸는 번역 후 변형(세포가 단백질을 만든 뒤에 일으키는 화학적 변화)의 대리 지표입니다. 숙주세포 단백질(host-cell protein) 수치는 얼마만큼의 CHO 세포(항체를 생산한 조작된 햄스터 세포주) 잔해가 정제를 통과해 남았는지를 말합니다. 그리고 직교하는(독립적이고 서로 다르게 작용하는) 하류 정제 단계들에 걸쳐 합산된 바이러스 제거(viral clearance)는 로트가 외래 인자 — 우발적 바이러스 오염물 — 로부터 안전함을 말합니다. 이 시험들 각각이 무엇을 측정하고 정제가 그것을 어떻게 제거하는지는 제1권의 주제입니다 — 분석 출하 시험과 제제화QC와 로트 출하를 보십시오. 이 장은 분석을 주어진 것으로 삼고 그것들이 공급하는 결정을 모델링합니다. 검증(validation)은 온톨로지가 이 속성들을 기술하기를 멈추고 그것들에 대해 결정하기 시작하는 지점입니다. 상위 척추공리 장에서 확립한 사실은 OWL(웹 온톨로지 언어 — 클래스를 기술하고 어떤 사실이 따라 나오는지 추론하는 논리)과 SHACL(형상 제약 언어 — 그래프 데이터가 요구된 구조를 갖췄는지 검증하는 언어)이 서로 다른 일을 한다는 것입니다. OWL은 열린 세계에서 추론(reasons in an open world)하여, 누락된 필수 결과는 그저 "알 수 없음"일 뿐입니다. SHACL은 닫힌 세계에서 검증(validates in a closed world)하여, 누락된 필수 결과는 지금 당장의 실패입니다. 출하 결정은 "알 수 없음"을 용납할 수 없습니다 — 누락된 무균 시험은 미결 질문이 아니라 실패한 로트입니다 — 그래서 출하 규격은 자연스럽게 SHACL 형상(shapes)의 집합이 됩니다. 로트의 데이터가 출하를 주장하려면 통과해야 하는 게이트입니다 [1].

쉽게 말하면

비행기가 이륙하기 전, 체크리스트는 완전해야 합니다 — 모든 항목이 존재하고, 확인되고, 서명이 되어 있어야 합니다. 빈칸 하나나 누락된 서명 하나면, 비행기가 아무리 멀쩡해 보여도 비행이 멈춥니다. 추론기는 새로운 사실을 연역할 수 있지만 빈 줄에는 어깨를 으쓱하는 엔지니어입니다("괜찮을지도, 따로 듣지 못했으니까"). SHACL은 체크리스트를 든 검사관으로, 모든 줄이 진짜로 채워지기 전에는 비행 허가를 거부합니다. 이 장은 항체 로트를 위한 그 검사관을 만듭니다 — 출하 게이트, 완료 게이트, 세포 은행 게이트, 그리고 불가능한 유형을 잡아내는 두 가드 — 그리고 완전한 체크리스트가 좋은 비행과 같지는 않다는 사실에 정직합니다.

질문에서 출발하라

이 장은 규격 장에서 정의한, 이 책의 닫힌 세계(closed-world) 역량 질문들이 머무는 곳이며, 각각은 QC 그룹이 모든 배치에 던지는 실제 출하 질문입니다. CQ-08은 출하된 원료의약품 로트가 모든 필수 CQA(중요 품질 속성 — 제품의 안전성이나 효능에 관계되기에 출하 한계 안에 머물러야 하는 측정 가능한 제품 속성) — 단량체, HMW, CEX-주, HCP, 단백질 농도 — 에 대해 규격 내 값을 정확히 하나씩 지니는지를 묻습니다. DS-001이 자신이 주장하는 그 항체가 맞는지를 결정하는 패널입니다. CQ-10은 완제의약품 로트가 벌크에는 없던 완료 고유 기준 — 무균성, 외관, 충전량 — 을 충족하는지를 묻습니다. CQ-11은 규격 이탈 로트가 정확히 실패한 경로에서만, 그 외 어디에서도 아니게 표시되어, 조사가 진짜 결함을 겨냥하도록 하는지를 묻습니다. 그리고 CQ-17은 워킹 세포 은행 WCB-CHO-001 — 전체 계보의 뿌리 — 이 단 하나의 시드 배양이 그것으로부터 자라기 전에 완전히 특성 규명되었는지를 묻습니다. 이 질문은 cq-catalog.json에서 SHACL 시나리오로 실행됩니다. 어떤 SPARQL(RDF 그래프를 위한 표준 질의 언어로, 표에 대한 SQL과 같은 역할) SELECT(일치하는 행들을 반환하는 질의 형식)로도 표현할 수 없는 형상을 공유하기 때문입니다. "필수 시험이 누락되었는가?"는 존재하는 트리플(그래프를 이루는 주어-술어-목적어 사실)에 관한 질문이 아니라, 존재해야 하는데 존재하지 않는 트리플에 관한 질문이기 때문입니다. 그것이 바로 SHACL의 존재 이유입니다 [1]. 다섯 번째 출하 질문 CQ-09 — 출하된 로트가 통제된 집합에서 가져온 상태로 귀속 가능하게 서명되었는가, GMP(우수 제조 관리 기준 — 허가받은 모든 의약품이 그 아래에서 제조되는 규제된 품질 시스템) 하에서 서명 없는 출하는 출하가 아니기 때문에 — 는 진정으로 두 방식 모두로 답할 수 있습니다. 카탈로그는 그것을 SPARQL ASK(행이 아니라 단일 참/거짓을 반환하는 질의 형식)로 실행하고, bp:ReleaseShape 또한 모든 출하 로트에 같은 조건을 닫힌 세계로 강제합니다. 곧 보게 될 것입니다.

출하 게이트: 규격은 형상이고, 출하는 적합성이다

출하 규격(release specification)원료의약품과 완제의약품에 대해 필수 시험과 그 합격 기준 — 단량체 순도, 응집체 수준, 전하 변이체 주 피크, 숙주세포 단백질, 단백질 농도 — 을 나열하며, 생명공학 제품에 대한 ICH Q6B(의약품 규제 요건을 조화시키는 국제 기구인 ICH의 규격 지침) 같은 지침에 따라 구조화됩니다 [2]. 각 한계는 실제 mAb 위험을 부호화합니다. 95 % 단량체는 그 분율 미만의 단편과 응집체가 분해된 제품을 신호하기 때문이고, 2.0 % HMW 상한은 그 이상의 응집체가 면역원성 위험을 높이기 때문이며, 60–80 % CEX-주 창은 그 밖으로 표류한 전하 프로파일이 항체의 변형이 더 이상 검증된 것이 아님을 뜻하기 때문이고, 100 ppm HCP 상한은 잔류 CHO 단백질 자체가 면역원이기 때문이며, 45–55 mg/mL 단백질 농도 창은 바이알당 전달되는 용량이 항체가 검증된 제제 강도로 충전되는 데 달려 있기 때문입니다.

그 한계들 하나하나는 검토자가 추적할 수 있는 어딘가에서 옵니다. 95 % 단량체 바닥값과 2.0 % HMW 상한은 크로마토그래피 데이터 시스템(Empower나 Chromeleon 내보내기)에서 읽어 낸 SEC-HPLC 수치이고, 60–80 % CEX-주 창은 CEX-HPLC나 iCIEF 실행에서 나온 주 전하 피크의 면적 백분율이며, 100 ppm HCP 상한은 항-CHO ELISA 결과를 단백질 농도로 나눈 비율이고, 단백질 농도 자체는 UV A280 측정값입니다. 실제 공장에서 그 숫자들은 마법처럼 그래프에 나타나지 않습니다 — LIMS(실험실 정보 관리 시스템)가 분석 결과를, MES(제조 실행 시스템 — 생산을 운영하고 기록하는 현장 소프트웨어)가 배치 기록과 처분을, 히스토리언(인프로세스 신호를 위한 시계열 데이터 저장소)이 인프로세스 추세를 보유합니다 — 그리고 게이트가 던지는 닫힌 세계 질문("단량체 결과가 존재하고 단 하나인가?")은 LIMS 연동이 한 행을 누락하거나 반복 측정을 두 번째 IRI 아래 철할 때 정확히 실패하는 바로 그 질문입니다. SHACL은 그 시스템들 사이의 이음매를 지키며, 그곳이 바로 필수 결과가 사라지는 자리입니다.

모델링하면, 그 규격은 bp:ReleaseShape이며, shapes.ttl의 실제 형상으로, 두 로트 수준 출하 물질 — 벌크 원료의약품과 충전된 완제의약품 — 을 한꺼번에 표적합니다. 아래 Turtle을 읽는 법: bp:sh: 같은 접두사는 긴 네임스페이스의 짧은 별칭입니다(bp:는 우리의 바이오공정 어휘, sh:는 표준 SHACL 어휘). 홀로 쓰인 a는 "~이다"(rdf:type)를 뜻하고, sh:path는 제약이 점검하는 속성을 명명하며, 대괄호 [ … ]는 한 속성에 대한 제약들을 묶는 익명(공백) 노드입니다:

# shapes.ttl — the release gate (excerpt): every released lot's full CQA panel, complete and in spec.
bp:ReleaseShape a sh:NodeShape ;
sh:targetClass bp:DrugSubstance , bp:DrugProduct ;

# Exactly one monomer result, a float, at or above the spec floor.
sh:property [
sh:path bp:monomerPct ;
sh:name "SEC %monomer" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 95.0 ;
sh:message "Monomer purity is missing, duplicated, or below the 95.0 % release limit." ] ;

# HMW aggregate at or below its upper limit — the criterion DS-004/DP-004 trip.
sh:property [
sh:path bp:hmwPct ;
sh:name "SEC %HMW aggregate" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:maxInclusive 2.0 ;
sh:message "HMW aggregate is missing or above the 2.0 % release limit." ] ;

# CEX main charge-variant peak within its window.
sh:property [
sh:path bp:cexMainPct ;
sh:name "CEX %main (charge variant)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 60.0 ; sh:maxInclusive 80.0 ;
sh:message "CEX main peak is missing or outside the 60.0-80.0 % window." ] ;

# Host-cell protein at or below its upper limit.
sh:property [
sh:path bp:hcpPpm ;
sh:name "host-cell protein (ppm)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:maxInclusive 100.0 ;
sh:message "HCP is missing or above the 100 ppm release limit." ] ;

# Protein concentration within the formulation window.
sh:property [
sh:path bp:proteinConcMgPerMl ;
sh:name "protein concentration (mg/mL)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 45.0 ; sh:maxInclusive 55.0 ;
sh:message "Protein concentration is missing or outside the 45-55 mg/mL window." ] ;

# Release status drawn from a controlled set.
sh:property [
sh:path bp:releaseStatus ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:in ( "PASS" "OOS" "PENDING" ) ] ;

# An attributable signature (21 CFR Part 11 / Annex 11).
sh:property [
sh:path bp:approvedBy ;
sh:minCount 1 ;
sh:message "Release record is unsigned." ] .

출하 형상은 어떻게 작성되었는가. 제1부가 각 역량 질문을 고정된 규율로 도출했듯, 여기의 각 제약도 같은 종류의 짧고 반복 가능한 절차로 출하 규칙에서 도출되었습니다 — 실패하는 캠페인이 실제로 걸리는 한 행, 즉 HMW 응집체 기준으로 공개적으로 한번 해 볼 가치가 있습니다:

  1. 닫힌 세계 요건을 말로 진술한다. 규칙을 로트 처분에서의 출하 규격에서 곧장 읽어 냅니다. 모든 출하 로트는 정확히 하나의 SEC %HMW 응집체 결과를 지녀야 하고, 그것은 2.0 % 이하여야 한다. "정확히 하나"와 "지녀야 한다"는 추론기가 공급할 수 없는 닫힌 세계 절반입니다 — 그것들은 단지 일관된 것이 아니라 존재해야 하는 결과에 관한 주장입니다.
  2. 그것을 부호화하는 형상 구성을 고른다. 존재와 단일성은 sh:minCount 1sh:maxCount 1이 되고, 값이 실수라는 것은 sh:datatype xsd:float이 되며, 상한은 sh:maxInclusive 2.0이 됩니다. (규칙이 "고정된 목록에서 가져옴" — 출하 상태 — 이었다면 구성은 대신 sh:in ( … )이 되었을 것이고, 단일 경로가 표현할 수 없는 속성 간 관계였다면 sh:sparql 제약이 되었을 것입니다.) 속성 경로 sh:path bp:hmwPct는 제약이 걷는 인스턴스 그래프 속 간선을 명명합니다.
  3. 그것을 shapes.ttl에 표적 노드-형상의 한 sh:property로 써 넣는다. 그것은 bp:ReleaseShape(sh:targetClass bp:DrugSubstance , bp:DrugProduct)에 매달리고, 그 sh:message는 실패를 검토자 자신의 말로 진술합니다 — "HMW aggregate is missing or above the 2.0 % release limit." — 그래서 검증 보고서는 온톨로지스트만이 아니라 현장에서도 읽힙니다.
  4. 그것이 강제하는 CQ와 비적합이 보고되는 방식을 명명한다. 이 행은 CQ-08(완전하고 규격 내인 패널)의 일부이며, cq-catalog.json은 CQ-08을 validate.py가 실행하는 substance_release_conforms 시나리오에 묶습니다. DS-004/DP-004가 2.41 %를 지닐 때, 같은 행이 뒤에서 CQ-11의 고립된 실패로 보이는 MaxInclusiveConstraintComponent 위반을 발화시킵니다. 규칙, 제약, 시험은 하나의 산출물입니다.

그 루프를 출하 기준마다 한 번씩 돌리면 전체 bp:ReleaseShape이 규격에서 기계적으로 떨어져 나옵니다 — 그래서 그 형상이 규격의 재해석이 아니라 곧 체크리스트로 읽히는 것입니다.

체크리스트를 실행 가능하게 만든 것으로 읽으면, 이것이 두 역량 질문을 한꺼번에 답한다는 점을 알 수 있습니다. CQ-08은 패널 행들입니다. 로트는 바닥값 이상(minInclusive 95.0)의 단량체 결과를 정확히 하나(minCount/maxCount — 분석을 두 번 돌렸을 때 유리한 반복을 골라 담는 일을 금합니다) 지녀야 하고, 자기 한계 이하(maxInclusive 2.0)의 HMW 결과를, 그리고 CEX-주, HCP, 단백질 농도를 각각 선언된 창 안에 지녀야 합니다. 같은 bp:ReleaseShapebp:DrugSubstance bp:DrugProduct 둘 다를 표적하는 것은 편의상의 우연이 아닙니다. 패널 속성은 계보를 따라 상속됩니다. 출하 monomerPct는 원료의약품 로트 DS-001 — 상류 계통의 열한 조상이 만나는 수렴 노드 — 위에 자리하고, 거기서 충전된 완제의약품 로트들은 같은 항체를 단지 바이알에 담은 것이므로 같은 패널을 지닙니다. CQ-09는 마지막 두 행입니다. releaseStatus는 통제된 집합 ("PASS" "OOS" "PENDING")에서 가져와야 하고 — 작업자가 "released?"라고 입력할 수 있는 자유 텍스트 플래그가 아니며 — 로트는 귀속 가능한 approvedBy 서명귀속 가능이란 특정한 책임 있는 사람에게 묶인다는 뜻입니다 — 즉 디지털 승인을 잉크 서명과 법적으로 동등하게 만드는 규정인 21 CFR Part 11(미국)과 EU Annex 11(EU)의 전자 기록·서명 요건을 지녀야 합니다 [3]. 게이트는 사람이 적용하기를 기억해야 하는 SOP 속 산문이 아닙니다. 그것은 그래프가 모든 로트에 자동으로, 동일하게 강제하는 규칙입니다 — 몇 달에 걸친 품질 실타래가 기록이 아니라 통제가 되는 지점입니다.

완료 게이트: 벌크 원료의약품이 지니지 않는 완제의약품 기준

원료의약품은 농도로 측정되는 벌크 액체이고, 완제의약품은 무균으로 충전·밀봉되어 세는 단위이며, 그 종류의 변화는 벌크에는 없던 기준을 가져옵니다. 충전-완료는 DS-001을 가져와 부형제 — 폴리소르베이트 80, 히스티딘 완충액, 수크로스, 묻혀 있는 레시피가 아니라 추적 가능한 구조가 되도록 실제 bp:hasComponent 간선으로 모델링됨 — 와 결합하고, 무균 조건에서 바이알-마개-밀봉 용기-마개 시스템(container-closure system) CCS-001에 충전합니다. 그 용기-마개는 제품에 부수된 포장이 아니라 제품 동일성의 일부입니다. 용기-마개 완전성은 유효기간 전반에 걸쳐 무균성과 안정성을 보호하는 quality이기 때문입니다. 무균성 자체는 충전-완료 프로세스에 의해 가능해집니다. 보관 탱크 안의 벌크에게는 충전 단위 의미에서 무균인지를 묻지 않지만, 밀봉된 바이알에게는 반드시 묻습니다 — EU GMP Annex 1이 무균 충전의 공식 요건으로 만드는 오염 관리 전략입니다 [5]. 그래서 그 기준들은 bp:DrugProduct만 표적하는 별도 형상 bp:DrugProductFinishShape에 속하며 — 모델이 CQ-10에 답하는 방식입니다 [3]:

# shapes.ttl — the finish gate: drug-product-specific criteria the bulk substance does not carry.
bp:DrugProductFinishShape a sh:NodeShape ;
sh:targetClass bp:DrugProduct ;

sh:property [
sh:path bp:sterilityResult ;
sh:name "sterility" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:in ( "STERILE" ) ;
sh:message "Sterility result is missing or not STERILE." ] ;

sh:property [
sh:path bp:appearance ;
sh:name "appearance" ;
sh:minCount 1 ;
sh:message "Appearance description is missing." ] ;

sh:property [
sh:path bp:fillVolumeMl ;
sh:name "fill volume (mL)" ;
sh:minCount 1 ; sh:maxCount 1 ;
sh:datatype xsd:float ;
sh:minInclusive 0.1 ;
sh:message "Fill volume is missing or implausibly low." ] .

게이트를 나누는 것이 모델링의 요점이며, 이는 continuant/occurrent(지속하는 사물 대 일어났다 끝나는 프로세스) 구분과 벌크 대 이산 구분을 강제 가능하게 만든 것입니다. 모든 bp:DrugProductbp:ReleaseShape(공유된 항체 패널) bp:DrugProductFinishShape(완료 기준)을 둘 다 통과해야 하지만, bp:DrugSubstance는 패널에만 묶입니다. 완제의약품 로트 DP-001sterilityResult "STERILE", 외관 문자열 — "clear, colourless, essentially free of visible particles" — 그리고 fillVolumeMl "1.0"을 지니므로 완료 게이트를 통과합니다. 벌크 DS-001은 형상이 그것을 표적하지 않으므로 무균 결과를 결코 요구받지 않습니다. 두 형상, 하나의 제품, 모순 없음. 완료 게이트가 아직 확인하지 않는 것에 주목하십시오. 개별 바이알의 동일성입니다. 하나의 로트는 수만 개의 바이알이며, 출하 시 우리는 품목이 아니라 로트를 모델링합니다 — 로트 대 품목의 개체화 긴장은 실재하며, 모델은 직렬화(serialization)가 나중에 재구축 없이 품목 동일성을 끼워 넣을 수 있도록 의도적으로 설계되었지만, 출하 게이트에서 검증 단위는 충전된 로트입니다.

출하 게이트 히어로 도해. 왼쪽에는 DS-001 원료의약품 로트가 bp 98.611 퍼센트, bp 1.287 퍼센트, 서명된 bp를 보여 줍니다. validate 화살표가 가운데의 보라색 SHACL 출하 게이트 상자 bp로 이어지며, 닫힌 세계 제약들을 나열합니다. 각 필수 시험 존재(minCount 1), 정확히 하나의 결과(maxCount 1), 유형이 정해진 값(xsd), monomer 범위 내(minInclusive 95.0), HMW 범위 내(maxInclusive 2.0), 귀속 가능한 서명(approvedBy), 그리고 누락된 시험은 실패라는 주석입니다. 초록색 sh true 화살표가 releaseStatus가 PASS인 Released 상자로 이어집니다. 아래에는 규격 이탈 완제의약품 로트 DP-004가 게이트에 들어가고, 빨간색 sh false 화살표가 검증 보고서 — focusNode DP-004, resultPath bp, 제약 MaxInclusive, 심각도 Violation, 메시지 HMW above 2.0을 명명하는 질의 가능한 RDF 그래프 — 를 내보내며, 이는 조사(일탈 검토)와 영향 질의(실타래 내 형제 로트)로 경로를 잡습니다. 캡션은 규격은 형상이고 출하는 적합성이라고 읽습니다. 게이트로서의 출하: 로트의 CQA 패널과 서명이 SHACL 형상으로 표현된 규격 — 공유된 ReleaseShape과 제품 전용 완료 게이트 — 에 대해 점검되고, 위반은 조사와 공동 운명 영향 질의로 경로를 잡는 구조화된 보고서를 내보냅니다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

두 개의 닫힌 세계 게이트 더: 세포 은행과 disjointness 가드

같은 닫힌 세계 규율이 계보의 뿌리를, 그것이 가장 중요한 곳에서 게이트로 막습니다. 워킹 세포 은행은 모든 하류 로트가 전이적으로 유래하는 단일 물질이므로, 거기서의 오류는 모든 배치로 완전한 확신을 갖고 전파됩니다 — 그리고 세포주는 분열하면서 표류하는, 살아 있고 돌연변이하는 배양이며, 그 동일성을 IRI는 종이 위에서 안정시킬 수 있지만 생물학은 결코 완전히 고정하지 못하는 유일한 노드입니다. 바로 그래서 규제 당국은 워킹 은행이 사용 전에 특성 규명(characterized)되기를 기대합니다. WCB-CHO-001은 네 가지 특성 규명 결과 — 동일성(이것이 정말 mAb-A CHO 세포주이고 교차 오염물이 아닌가?), 무균성/마이코플라스마, 외래 인자 바이러스 안전성, 유전적 안정성 — 를 지니며, 각각은 verdict "PASS"bp:CharacterizationResult이고, ValidatedPassageLimit 40에 대해 passageNumber 8입니다. 계대 수는 배양이 얼마나 오래 분열했는지를, 따라서 그 생산성과 산물 품질이 얼마나 표류했을 수 있는지를 한정하기 때문입니다. bp:WorkingCellBank에 대한 OWL 최소 cardinality 제약은 워킹 은행이 특성 규명을 지닌다고 열린 세계로 진술합니다. bp:CellBankShape은 그것을, 없으면 실패로, 닫힌 세계로 강제합니다 — 모델이 CQ-17에 답하는 방식입니다 [4]:

# shapes.ttl — the cell-bank gate (WCB-CHO-001 conforms: 4 characterizations + passage 8).
bp:CellBankShape a sh:NodeShape ;
sh:targetClass bp:WorkingCellBank ;
sh:property [
sh:path bp:hasCharacterization ;
sh:minCount 1 ;
sh:message "A working cell bank must carry at least one characterization result." ] ;
sh:property [
sh:path bp:passageNumber ;
sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:integer ;
sh:message "A working cell bank must record exactly one passage count." ] .

특성 규명이 기록되지 않은 워킹 은행은 모순적인 것이 아니라 불완전합니다 — 열린 세계 추론기는 이의를 제기할 거리가 없습니다. OWL에게 부재는 거짓이 아니기 때문입니다. 그러나 제조 뿌리 노드에서 "우리에게는 동일성 시험 기록이 없다"는 출하해서는 안 될 최악의 상태입니다. 그것은 일단 계보의 열한 층을 전이적으로 전파하고 나면 어떤 하류 시험으로도 잡을 수 없는 바로 그 오인입니다. 세포 은행 게이트는 증거가 진짜로 존재하기 전에는 은행을 사용 가능하다고 부르기를 거부하여, 규제 기대(세포 기질의 ICH Q5D 특성 규명)를 그래프가 강제하는 규칙으로 바꿉니다.

그리고 두 개의 disjointness 가드가 열린 세계 추론기가 사물의 종류 수준에서 남기는 틈을 닫습니다. BFO(기초 형식 온톨로지(Basic Formal Ontology) — 상위 척추에서 가져온 상위 온톨로지)에 근거한 척추 전체는 continuant(시간에 걸쳐 지속하며 quality를 지니는 항체 배치)를 occurrent(일어났다가 끝나는 발효)에서 갈라내는 데 기댑니다. bioproc.ttlbp:Batch owl:disjointWith bp:CellCultureProcess(continuant는 결코 occurrent가 아니다)와 bp:Material owl:disjointWith bp:Equipment(항체 배치는 결코 그것을 담은 스테인리스 용기가 아니다)를 단언합니다 — 이는 탁상공론이 아닙니다. 생물반응기 BR-101을 배치 물질 BATCH-2026-001로 착각하는 로더는 계보를 붕괴시켜, 연간 수백 배치를 처리하는 용기에 출하 사실을 붙이고 그것을 지나는 모든 계통 추적을 깨뜨릴 것입니다. 그러나 실행 가능한 검증기가 쓰는 OWL-RL 프로파일은 owl:disjointWith에 대해 작동하지 않으므로, 심어진 혼동은 조용히 통과합니다. 실제로 그것을 잡는 것은 SHACL 형상입니다:

# shapes.ttl — the continuant/occurrent and material/equipment guards (closed-world).
bp:BatchNotProcessShape a sh:NodeShape ;
sh:targetClass bp:Batch ;
sh:not [ sh:class bp:CellCultureProcess ] ;
sh:message "A Batch (material/continuant) must not also be a CellCultureProcess (occurrent)." .

bp:MaterialNotEquipmentShape a sh:NodeShape ;
sh:targetClass bp:Material ;
sh:not [ sh:class bp:Equipment ] ;
sh:message "A Material (batch/lot/pool) must not also be Equipment (a persisting vessel)." .

이것이 책 전체가 의지하는 분업입니다. OWL 공리는 추론기가 추론에 사용할 필요조건을 진술하고, SHACL 형상은 같은 조건을 우리가 실제로 보유한 데이터에 대한 게이트로 강제합니다. 깨끗한 캠페인에서는 두 가드 모두 침묵을 지킵니다. 출처 조정(provenance reconciliation)이 의도적으로 용기 BR-101을 배치 물질 BATCH-2026-001과 별개의 노드로 유지하기 때문입니다 — 장비 안으로 한 번도 횡단하지 않고 배치 계보를 걸을 수 있게 해 주는 continuant/occurrent 분리입니다. 둘을 융합하는 두 번째 rdf:type을 심으면, MaterialNotEquipmentShape이 발화합니다 — disjointness 가드 CQ가 약속한 그대로입니다.

OWL이 이 틈을 남기는지에 대한 주석입니다. 이는 실재하며 자주 오해되는 미묘함이기 때문입니다. bioproc.ttl은 disjointness를 단언합니다 — bp:Material owl:disjointWith bp:Equipment — 그리고 완전한 OWL 2 DL 추론기 — 가장 표현력 있고 완전히 논리적인 OWL 프로파일로, HermiT, Pellet, ELK 같은 엔진이 구현합니다 — 는 둘 다로 유형이 정해진 어떤 노드에 대해서도 owl:Nothing(빈 클래스, 아무것도 속할 수 없는 유형)을 도출하여 온톨로지를 비일관(inconsistent)(논리적으로 불가능)으로 표시할 것입니다. 그러나 실행 가능한 검증기는 OWL 2 RL 구체화기인 owlrl — 전체 논리적 일관성을 점검하는 대신 자신의 규칙이 함의하는 사실만을 추가하는 더 가볍고 규칙 기반인 OWL 프로파일 — 을 쓰며, RL 프로파일의 규칙 집합은 disjointness 모순을 드러난 위반으로 생성하지 않습니다 — 양의 폐포(그것이 도출할 수 있는 새 사실: 하위 클래스, 하위 속성, 전이, 역)를 계산하고 넘어갑니다. 그래서 그 혼동은 DL에서는 금지됨에도 추론 체제에는 보이지 않습니다. 그것이 바로 닫힌 세계 SHACL sh:not [ sh:class ... ] 가드가 OWL 공리와 중복되지 않는 정확한 이유입니다. 공리는 옳지만, 우리가 운영에서 실행하는 프로파일은 그것에 대해 작동하지 않습니다. (그것이 또한 GxP 파이프라인이 현장에서 실행하는 것이 살아 있는 DL 일관성 점검이 아니라 SHACL 게이트인 이유이기도 합니다 — 살아 있는 추론기를 현장에서 떼어 놓는 것에 관해서는 규제 시맨틱스 장을 보십시오.)

그러므로 다섯 형상이 게이트 전체를 떠받치며, 각각은 역량 질문 하나와 깨끗한 캠페인에서의 알려진 결과에 대응합니다:

형상표적강제(닫힌 세계)답하는 질문깨끗한 캠페인에서
bp:ReleaseShapeDrugSubstance, DrugProductCQA마다 범위 내 값 하나 + 통제된 상태 + 서명CQ-08, CQ-09DS-001/DP-001/DP-002 적합
bp:DrugProductFinishShapeDrugProduct무균성, 외관, 그럴듯한 충전량CQ-10DP-001/DP-002 적합
bp:CellBankShapeWorkingCellBank특성 규명 하나 이상 + 계대 수 정확히 하나CQ-17WCB-CHO-001 적합
bp:BatchNotProcessShapeBatchCellCultureProcess가 아님(continuant/occurrent)CQ-23침묵(혼동 없음)
bp:MaterialNotEquipmentShapeMaterialEquipment가 아님(배치/용기)CQ-23침묵(혼동 없음)

모델링 안티패턴 현장 안내

위의 두 disjointness 가드는 더 넓은 교훈의 사례입니다: 소수의 모델링 안티패턴(anti-pattern)이 모든 바이오제약 온톨로지에 되풀이해 나타나며, 각각은 그럴듯한 지름길이지만 질의, 계보 추적, 또는 출하 결정을 조용히 부패시킵니다. 이 책이 그것들을 하나씩 스쳐 지나며 만났고 수용 스위트가 이미 대부분을 지키고 있으므로 — 그리고 결함에 이름을 붙이는 것이 그것을 잡는 첫걸음이므로 — 한자리에 모아 둘 가치가 있습니다. 일반적인 것들은 규격 장이 돌리는 커뮤니티 도구 OOPS!(온톨로지 함정 스캐너, Ontology Pitfall Scanner)가 목록화하며, 아래 행들은 이 캠페인에서 중요한 바이오제약 특유의 함정입니다.

안티패턴무엇이 잘못되는가어떻게 잡히는가고치는 법
owl:sameAs 남용단지 관련될동일하지 않은 두 용어를 sameAs(또는 owl:equivalentClass)로 잇는 것으로, 그 인스턴스와 공리를 조용히 융합함 — 가장 흔한 정렬 결함, OOPS!의 "same-as / equivalent" 계열.저작 시점의 OOPS! 함정 스캔; 그다음 추론기가 과도하게 병합하여 하류에서 모순을 드러냄.sameAs는 진짜 동일성에만 예약하고, 더 느슨한 것은 무엇이든 rdfs:subClassOf, skos:closeMatch, 또는 유형 부여된 bp: 관계를 사용(재사용과 정렬 참조).
맨숫자(bare number)결과를 단위가 컬럼 머리글이나 산문에 든 채 맨 리터럴(98.6)로 저장하여, 소비자가 퍼센트와 ppm을 구별할 수 없고 어떤 게이트도 범위 점검을 할 수 없음.CQ-19, 맨숫자 없음 감사.모든 수량을 qudt:hasUnit IRI를 지닌 QUDT QuantityValue로 감쌈(식별자와 단위 참조).
포장/계보 혼동"이 카톤이 이 바이알들을 담는다"를 "이 로트가 저 로트에서 파생되었다"와 같은 간선으로 모델링하여, 부분전체(mereology) 걷기가 계보 걷기로 새어 들어가고 리콜 범위가 잘못 정해짐.CQ-14, bp:contains(부분-전체)를 bp:derivedFrom(계보)과 구별해 유지.담음과 파생을 서로 다르게 유형 부여된 별개의 관계로 유지(관계와 계보 참조).
배치/공정 혼동배치(지속하는 continuant)를 그것을 만든 세포배양 공정(occurrent)으로 유형 지정하여, BFO 척추를 무너뜨리고 출하 사실을 발효에 붙임.CQ-23, bp:BatchNotProcessShape(위의 가드)를 통해.배치 물질과 그 공정을 별개의 노드로 유지하고, 배치를 운전과 융합하는 대신 그 계보에 bp:derivedFrom으로 이음.
물질/장비 혼동배치 물질을 그것을 담은 용기와 융합하여, 계보가 연간 수백 배치를 처리하는 반응기 안으로 횡단함.CQ-23, bp:MaterialNotEquipmentShape(위의 가드)를 통해.용기 BR-101(장비)을 물질 BATCH-2026-001과 별개의 노드로 유지.

이 가운데 둘 — 배치/공정과 물질/장비 혼동 — 은 이 장이 방금 지은 가드이고, 나머지 셋은 같은 수용 스위트의 다른 곳에서 강제됩니다. 그것들을 표로 정리하는 요점이 바로 이것입니다: 안티패턴은 누군가 그것을 다시 들여오는 날 실행 가능한 점검이 실패할 때에야 진정으로 은퇴하며, 그래서 각 행은 저자가 규칙을 기억하기를 믿는 대신 그것을 잡는 CQ나 스캔을 이름 짓습니다.

검증: 현실적인 규격 이탈 모드, 한 경로로 고립되다

validate.pybioproc.ttl + align.ttl + instances.ttl을 파싱하고, OWL-RL 폐포를 적용하며 — 추론기의 규칙을 그것들이 함의하는 모든 사실을 추가할 때까지 실행하여, 그래프를 2120 트리플에서 7137로 키웁니다 — 모든 형상을 실행합니다. 진행 중인 예시의 정직한 세부는 출하가 노출하는 실패가 어떤 종류인가입니다 — 그리고 그것은 실제로 항체 캠페인을 괴롭히는 실패 모드입니다. 원료의약품 로트 DS-004와 그것에서 충전된 완제의약품 DP-004는 둘 다 단량체 순도 98.687 %로, 95.0 % 바닥값을 넉넉히 넘기므로 monomerPct를 통과합니다. 그들의 CEX-주, HCP, 단백질 농도도 모두 규격 내입니다. 게이트를 걸리게 하는 것은 2.0 % 한계를 넘는 그들의 HMW 응집체 2.41 %입니다. 이것이 현실적인 이유는 바로 단량체 순도와 응집체 수준이 같은 측정이 아니기 때문입니다. 로트는 압도적으로 온전한 항체이면서도, 실패하기에 딱 충분한 고분자량 덩어리 — 면역원성 위험 — 를 지닐 수 있습니다. 그 응집체는 어디서 왔을까요? 그래프는 인과를 증명할 수 없습니다. 단량체 순도는 전체 정제 사슬의 누적적 속성으로, 포획·바이러스 불활화·폴리싱·UF/DF(한외여과/정용여과, 농축하고 완충액을 교환하는 단계)에서 조금씩 정련되며 어떤 단일 단계도 소유하지 않습니다. 출하 게이트는 응집체가 어디서 생겼는지 알 필요가 없습니다. 그저 로트를 거부하기만 하면 됩니다.

그다음에 일어나는 일이 게이트가 자동화할 수 없는 부분입니다. 규격 이탈 HMW 결과는 단지 로트를 표시하는 데 그치지 않습니다 — FDA의 규격 이탈(out-of-specification) 지침에 따라 그것은 공식 OOS 조사를 엽니다 [6]. 먼저 1단계 실험실 평가(SEC 방법이 올바르게 실행되었는가, 시료가 제대로 준비되었는가, 컬럼이 적격이었는가, 적분이 정직했는가?), 그리고 귀속 가능한 실험실 원인이 발견되지 않을 때에만, 응집체가 포획·저pH 유지·폴리싱·UF/DF 중 어디서 실제로 생겼는지를 묻는 2단계 제조 조사입니다. 아래의 공동 운명 질의는 그 2단계 단계의 구조화된 데이터 척추입니다. DP-001DP-002가 실패한 DP-004와 같은 워킹 세포 은행으로 거슬러 가므로, 조사는 그들이 같은 잠재 위험을 지니는지 평가할 의무가 있습니다 — 그래프는 "또 어떤 로트를 봐야 하는가?"를 판단의 문제에서 횡단으로 바꾸지만, 처분은 여전히 사람이 소유합니다.

그래서 실패는 sh:resultPath bp:hmwPct에서의 단일 sh:MaxInclusiveConstraintComponent 위반입니다. 다음은 전체 그래프 검증에 대한 pySHACL — validate.py가 호출하는 오픈소스 SHACL 검증기 — 의 실제 보고서입니다 — CQ-11이 구체화된 것으로, 두 개의 결과, OOS 로트당 하나씩, 둘 다 같은 경로에서 그 외 어디에서도 아닙니다:

Validation Report
Conforms: False
Results (2):
Constraint Violation in MaxInclusiveConstraintComponent (http://www.w3.org/ns/shacl#MaxInclusiveConstraintComponent):
Severity: sh:Violation
Source Shape: [ sh:datatype xsd:float ; sh:maxCount Literal("1", datatype=xsd:integer) ; sh:maxInclusive Literal("2.0", datatype=xsd:decimal) ; sh:message Literal("HMW aggregate is missing or above the 2.0 % release limit.") ; sh:minCount Literal("1", datatype=xsd:integer) ; sh:name Literal("SEC %HMW aggregate") ; sh:path bp:hmwPct ]
Focus Node: bp:DP-004
Value Node: Literal("2.41", datatype=xsd:float)
Result Path: bp:hmwPct
Message: HMW aggregate is missing or above the 2.0 % release limit.
Constraint Violation in MaxInclusiveConstraintComponent (http://www.w3.org/ns/shacl#MaxInclusiveConstraintComponent):
Severity: sh:Violation
Source Shape: [ sh:datatype xsd:float ; sh:maxCount Literal("1", datatype=xsd:integer) ; sh:maxInclusive Literal("2.0", datatype=xsd:decimal) ; sh:message Literal("HMW aggregate is missing or above the 2.0 % release limit.") ; sh:minCount Literal("1", datatype=xsd:integer) ; sh:name Literal("SEC %HMW aggregate") ; sh:path bp:hmwPct ]
Focus Node: bp:DS-004
Value Node: Literal("2.41", datatype=xsd:float)
Result Path: bp:hmwPct
Message: HMW aggregate is missing or above the 2.0 % release limit.

로트는 한 기준으로는 순수하면서도 응집체에서 실패할 수 있고, 실패는 진짜로 범위를 벗어난 정확히 그 한 경로에만 고립된 채 머뭅니다 — 모두 통과하는 다른 패널 값들로 가짜 연쇄가 번지지 않습니다. 보고서는 조사의 끝이 아니라 시작이며, 조사를 다루기 쉽게 만드는 것은 계보의 구조입니다. 보고서 자체가 RDF 그래프이므로, 실패는 다른 어떤 사실과도 같이 질의 가능하고, 정방향 DS-대-DP 분기가 계산 가능하게 만드는 공동 운명 영향 분석(shared-fate impact analysis)으로 곧장 이어집니다. 충전-완료는 DS-001을 형제 완제의약품 로트 DP-001DP-002로 정방향 분기했습니다(bp:DS-001 bp:fillsInto bp:DP-001 , bp:DP-002). OOS인 DP-004는 대신 별개의 원료의약품 로트 DS-004에서 유래하지만, 두 분기는 모두 워킹 세포 은행 WCB-CHO-001공유합니다. 그래서 DP-004가 실패하면, 영향 질의는 그 계통을 위로 걸어 공유 조상에 이르고 다시 아래로 그것에서 도달 가능한 모든 완제의약품으로 내려갑니다 — 전체 부지를 격리하는 대신 횡단으로 답한 CQ-04입니다:

# queries/CQ-04.rq — when DP-004 fails, which drug products share its fate via the shared cell bank?
PREFIX bp: <https://example.org/bioproc#>
SELECT DISTINCT ?affected WHERE {
bp:DP-004 (bp:derivedFrom)+ ?shared . # an ancestor of the failed lot
?affected (bp:derivedFrom)+ ?shared . # anything else derived from it
?affected a bp:DrugProduct .
FILTER(?affected != bp:DP-004)
} ORDER BY ?affected
# -> DP-001, DP-002 (the siblings tracing to the same WCB-CHO-001)

리콜의 범위를 정하는 그 동일한 역방향 걷기가 원료의약품 장이 만든 열한 조상 계통입니다. DS-001에서 POLpool-001, VFpool-001, VIpool-001, PApool-001, CLAR-001, BATCH-2026-001, SEED-001, SEEDFLASK-001을 거쳐, 세포 은행 단계 WCB-CHO-001, MCB-CHO-001, RCB-CHO-001까지 올라갑니다. bp:derivedFrom의 OWL owl:TransitiveProperty가 공짜로 계산하는 계보가, 한 바이알-로트에 대한 SHACL 실패를 정확히 두 형제에 대한 정밀하게 범위 잡힌 질문으로 바꾸는 것입니다. CQ-09, 즉 서명-및-상태 점검도 카탈로그가 실행하는 SPARQL 쌍둥이를 가집니다 — DS-001approvedBy 서명자와 통제된 집합에서 가져온 releaseStatus를 지니는지를 묻는 ASK — 그리고 ReleaseShape은 모든 출하 로트에 같은 조건을 닫힌 세계로 강제합니다:

# queries/CQ-09.rq — a released lot is attributably SIGNED, status from the controlled set (returns true).
PREFIX bp: <https://example.org/bioproc#>
ASK {
bp:DS-001 bp:approvedBy ?signer .
bp:DS-001 bp:releaseStatus ?status .
FILTER(?status IN ("PASS", "OOS", "PENDING"))
}

미해결 과제: SHACL은 정확성이 아니라 완전성을 점검한다

여기 가장 중요한 한계가 있으며, 이는 공리 장일관된 것이 옳은 것은 아니다라는 경고를 일반화합니다. SHACL 게이트는 로트의 기록이 완전하고, 잘 형성되고, 범위 내이며, 서명되었는지 — 모든 필수 시험이 수행되고, 한 번 기록되고, 올바르게 유형이 정해지고, 한계 안에 있는지 — 를 검증합니다. 그것은 기록이 참인지는 검증할 수 없습니다. 자신 있게 오기된 결과 — 엉뚱한 바이알에 입력된 HMW 값, 합격 로트의 SEC 트레이스가 실패 로트의 IRI 아래 철해진 시료 혼동, 우연히 2.4 % 대신 1.9 %에 떨어진 전사 오류 — 는 모든 구조적 규칙이 충족되므로 게이트를 깨끗이 통과합니다. "완전하다"는 모든 필수 시험이 기록에 나타난다는 뜻일 뿐입니다. 올바른 시료가 올바른 날에 적격 장비로 시험되었는지는 오직 상류의 데이터 무결성만이 보증할 수 있습니다. SHACL은 흔한 실패(누락된 무균 시험, 범위 밖 응집체, 서명 없는 출하, 중복된 단량체 결과)에 대한 강력한 가드이며, 그것이 대부분입니다. 그러나 그럴듯한, 범위 내 거짓에는 눈이 멉니다. 게이트는 체크리스트가 채워졌음을 증명할 뿐, 그 점검이 정직했음을 증명하지는 않습니다.

이것은 또한 실타래가, 디지털 스레드에 대해 우리가 경고했듯, 한 공장 안에서는 철벽이지만 그 너머에서는 취약한 이유이기도 합니다. 게이트는 한 공장이 보유한 트리플에 대한 완전성을 강제하지만, 기록이 결코 이 그래프에 들어오지 않은 자매 부지에 대해서는 아무 말도 하지 않습니다. 그래서 출하는, 현실에서, 결코 게이트이 아닙니다. SHACL 통과는 자동화가 지치지 않고 동일하게 강제할 수 있는 필요 전제조건 — 마감에 쫓겨 항체 로트의 종이 체크리스트를 사람이 다시 점검하는 것에 대한 진정한 진보 — 이지만, 출하 결정은 여전히 QC 판단, 일탈 검토, 그리고 게이트가 기록하지만 대체하지는 않는 적격자 승인에 기댑니다. "SHACL 게이트를 통과함"을 "좋은 배치임"과 혼동하는 그래프는, 이 책이 매 단계에서 경고하는 바로 그 과신을 범하는 것입니다. 정직한 기준은 이렇습니다. 완전성과 범위가 기계적으로 보장되고 조사가 경로 잡히도록 규격을 SHACL로 모델링하되, 정확성 — 각 결과가 정말로 이 mAb-A 로트를 기술하는지 — 은 상류의 데이터 무결성과, 모델이 대체가 아니라 뒷받침하는 인간 판단에 달려 있음을 분명히 하십시오.

학습하는 모델의 그라운드 트루스로서의 게이트

출하를 게이트하는 바로 그 형상들은, 기계 학습 모델이 무엇으로부터 학습하고 무엇 위에서 답할 수 있는지도 게이트합니다 — 동반 ML/AI 책과 이 책 자신의 프런티어 장이 향해 가는 용도입니다. 모델에게는 "완전함"이라는 본래적 관념이 없습니다. HMW 결과가 조용히 끝내 적재되지 않은 로트를 건네받으면, 모델은 항의하지 않습니다 — 결측을 대치하거나, 평균을 내거나, 그냥 구멍을 우회해 예측하고 자신만만한 숫자를 보고합니다. 바로 SHACL이 금지하려고 존재하는 실패 모드입니다. 그래서 적합성은 입력 게이트가 됩니다. DS-001의 패널이 출하 예측기를 위한 특징 행으로 바뀌기 전에, 혹은 계보 부분그래프가 검색 증강 LLM — 훈련 기억이 아니라 그래프에서 검색된 사실에서만 답하는 언어 모델 — 에 건네지기 전에, bp:ReleaseShape는 필요한 모든 CQA가 존재하고, 단일하고, 타입이 맞고, 범위 내임을 증명합니다. 형상을 통과하지 못하는 부분그래프는 바로 그 비어 있거나 잘못 라벨된 훈련 집합 — 프런티어 장이 경고하듯 유창하고 자신만만하고 틀린 답을 만들어 내는 — 이며, SHACL은 모델이 그러기 전에, 검토자 앞에서 그것을 잡아냅니다. 이렇게 읽으면 출하 게이트는 지도 학습 출하 예측의 라벨링 계약입니다. 유효한 PASS/OOS 라벨이 무엇인지조차 정하는 닫힌 세계 규칙입니다.

이는 이 책의 완전성 대 정확성 한계를 누그러뜨리는 것이 아니라 더 날카롭게 합니다. SHACL은 잘 형성된 훈련 행을 보장할 뿐, 참인 행을 보장하지는 않습니다. 따라서 그럴듯한 범위 내 거짓 — 엉뚱한 바이알에 올바른 HMW 숫자 — 은 깨끗한 라벨로 훈련 집합에 들어가 모델에게 자신만만한 오류를 가르칩니다. 이것이 ML 책의 모델과 검증 장이 반대편에서 이름 붙이는 검증 역설(validation paradox)입니다. 통계 모델은 홀드아웃 점수로 "검증"되지만, 추론된 그래프는 사람이 읽고 방어할 수 있는 규칙으로 검증됩니다 — sh:message "HMW aggregate is missing or above the 2.0 % release limit."는 R²가 그렇지 못한 방식으로 감사 가능합니다. 그래서 CQA에 닿는 모델은 그 책이 상술하는 잠금 모델/사전 결정 변경 통제 규율 아래에서 자문으로 남으며, 그래프를 점검 가능한 그라운드 트루스로 삼되 결코 자율 출하자로 두지 않습니다. 그라운딩은 반대 방향으로도 작동합니다. LLM에게 "DP-004는 출하되었는가?"를 물으면 정직한 답은 아니오입니다 — bp:hmwPct가 2.41 %에서 걸렸습니다 — 그리고 그 답을 참되게 만드는 것은 모델의 유창함이 아니라 검증된 그래프입니다. 이 '하나의 셰이프, 두 가지 역할' 주장은 수사가 아니라 실행 가능합니다. validate.py와 나란히, 동반 스크립트 train_gate_demo.py는 바로 이 bp:ReleaseShape와 같은 인스턴스를 불러와 허용 판정을 출력합니다 — DS-001/DP-001은 허용되고 규격 이탈 형제 로트 DS-004/DP-004bp:hmwPct에서 거부됩니다 — 그래서 출하 게이트와 ML 훈련-허용 게이트가 같은 방식으로 점검되는 같은 셰이프임이 입증됩니다.

한 가지 더 조용한 귀결이 이 인스턴스들 위에서 학습된 어떤 모델의 평가에까지 닿습니다. 그래프가 로트를 개별화하고 계보가 여러 로트를 하나의 워킹 셀 뱅크에 묶기 때문에, 행들은 독립이 아닙니다. DP-001, DP-002, DP-004는 조상을 공유하므로, 순진한 무작위 훈련/시험 분할은 형제 정보를 폴드 사이로 누설하고 점수를 부풀립니다. 공동 운명 질의가 이미 걷는 derivedFrom 계보가 바로 정직한 그룹 또는 배치 단위 leave-one-batch-out 교차 검증이 필요로 하는 그룹화 키입니다 — 공유된 WCB-CHO-001 계보를 따라 분할하되 결코 가로질러 분할하지 않음 — 그래서 리콜의 범위를 정하는 바로 그 전이적 간선이 공정한 모델 평가의 범위도 정합니다. 무엇이 무엇에서 파생되었는지를 기록하는 온톨로지가, 거저, 학습 곡선을 정직하게 유지하는 스키마입니다.

왜 중요한가

검증은 온톨로지가 제값을 하는 수명주기 단계이며, 항체의 출하 규격을 SHACL로 모델링하는 것은 기억해서 수동으로 적용하던 체크리스트를 강제되고 감사 가능한 게이트로 바꿉니다. 이 책이 모델링한 모든 CQA — 단량체 순도, HMW 응집체, 전하 변이체 균질성, 숙주세포 단백질, 충전-완료가 가능하게 한 무균성과 충전, 그리고 이 분자에 어떤 속성이 결정적인지를 정의한 설계 공간으로 거슬러 — 가 로트가 충족해야 할 형상으로 여기에 수렴하고, 실패는 어떤 형제 로트가 실패한 은행을 공유하는지 범위를 정하는 영향 분석으로 곧장 경로를 잡습니다. 다섯 개의 닫힌 세계 게이트(출하, 완료, 세포 은행, 그리고 두 disjointness 가드)는 어떤 SPARQL 질의로도 다룰 수 없는 것을 다룹니다. 있어야 하는데 없는 것들, 그리고 추론기가 그냥 통과시키는 유형 혼동 — 용기와 융합된 배치, 그것을 만든 프로세스와 융합된 continuant — 입니다. 여기가 품질 실타래가 기록이 아니라 통제가 되는 곳이고, 리콜이 추측이 아니라 질의가 되는 곳이며, 모델의 정직한 한계, 즉 정확성이 아닌 완전성이 온톨로지가 무엇을 위한 것인지를 가장 분명히 말하는 곳입니다.

현실 세계에서는

규격에 대해 항체 로트를 출하하는 것은, 21 CFR Part 11과 Annex 11 하의 서명된 기록과 함께, GMP 제조의 법적 구속력 있는 현실이며, 생명공학 규격의 구조는 ICH Q6B에 오래전부터 성문화되어 있습니다 [2][3]. 그리고 게이트는 정적인 예시가 아닙니다. validate.pyshapes.ttl을 적재하고 OWL-RL로 닫힌 그래프에 대해 pySHACL을 실행하는데, 이는 계통·바이러스 제거·포장 CQ를 증명하는 바로 그 23개 합격 점검 중 하나입니다 — 그래서 ReleaseShape 회귀 시험입니다. 한계를 바꾸거나, CQA를 더하거나, 인스턴스 값을 잘못 입력하면, 모음은 다음 실행 때 그것을 보고합니다. 그것이 출하 규격을 한 번의 도해가 아니라 모델이 지속적으로 재강제하는 통제로 만드는 것입니다. SHACL은 정착된 W3C 표준이고, 오픈소스 책은 바로 이런 종류의 BatchShape 게이트를 검증된 코드에서 실행합니다 — focus node와 제약을 명명하는 검증 결과와 함께 sh:conforms false — 이는 그 메커니즘이 가설이 아님을 증명합니다 [1]. 세포 은행 게이트는 ICH Q5D가 모든 세포 기질에 기대하는 특성 규명 — 검증된 한계에 대해 계대 이력이 추적되는 CHO 세포주의 동일성, 무균성, 바이러스 안전성, 유전적 안정성 — 을 그대로 반영합니다 [4]. 출하된 원료의약품 노드는 또한 두 번째 규제된 동일성을 지닙니다 — 게이트가 검증한 바로 그 DS-001에 매달린 ISO 11238 / IDMP 물질 식별자(UNII, MPID), 즉 규제 시맨틱스 장에서 상술하는 규제된 마스터 데이터 동일성입니다 — 그래서 로트는 규제 당국이 처음부터 다시 기술하는 대신 다시 점검하는 동일성을 지닌 채 PQ-CMC / eCTD 제출(같은 장에서 상술함)로 넘어갑니다. 해결된 기술 현실이 아니라 인간적·조직적 현실로 남는 것은, 게이트가 볼 수 없는 모든 것입니다. 일탈 조사, 데이터 무결성 문화, 그리고 그래프가 구조적으로 검증할 수는 있어도 보증할 수는 없는 출하 뒤에 서 있는 적격자 판단입니다.

서명 행은 상위 척추가 세운 realizable-entity 척추로 닿습니다. bp:approvedBy는 사람 문자열을 가리키지 않습니다. 출하된 로트는 bp:Signature를 가리키고, 그 서명은 다시 bp:QP-role에 귀속됩니다(instances.ttl: DS-001 bp:approvedBy bp:SIG-DS-001, 그다음 SIG-DS-001 bp:approvedBy bp:QP-role). 서명은 bp:InformationArtifact — 기록된 행위 — 이고, bp:QP-rolebp:QualifiedPersonRole — 적격자(Qualified Person)는 GMP에서 법적으로 책임 있는 출하 서명자입니다 — 즉 bp:Role의 한 종류이자 그러므로 그 기록된 행위에서 구체화된 realizable entity(다른 무언가에 담겨야만 존재하며 특정한 경우에 발휘되는 능력으로, BFO에서는 특정 의존적 continuant)입니다. 그래서 닫힌 세계 게이트("서명이 존재한다")와 열린 세계 척추("그 서명은 출하 책임을 실현하는 QP 역할에 귀속된다")는 같은 사실을 두 층에서 기술합니다. SHACL은 기록이 존재함을 강제하고, 온톨로지는 그것이 어떤 종류의 것인지를 말합니다.

규제 시맨틱스 장은 FDA의 KASA 플랫폼(Knowledge-Aided Assessment and Structured Application)이 CMC 데이터(화학·제조·관리(Chemistry, Manufacturing, and Controls) — 규제 당국이 검토하는 품질 문서)에 규칙 기반 구조화 점검을 적용하는 것을 보여 줍니다 — 같은 닫힌 세계 발상이, GxP(GMP가 그중 하나인 "우수 x 관리 기준(Good x Practice)" 규정 군) 검증 체제가 살아 있는 추론기를 현장에서 멀리 떼어 놓는 와중에도, 제출 경계에서 의무화된 것입니다.

핵심 용어

  • 열린 세계 대 닫힌 세계(Open world vs. closed world) — OWL은 누락된 사실을 알 수 없음으로 취급합니다(그래서 부재한 무균 시험으로 로트를 실패시킬 수 없습니다). SHACL은 누락된 필수 사실을 위반으로 취급합니다. 출하에는 닫힌 세계 쪽이 필요합니다.
  • 출하 게이트(bp:ReleaseShape)bp:DrugSubstancebp:DrugProduct를 모두 표적하며, CQA마다 범위 내 값을 정확히 하나(단량체 ≥ 95 %, HMW ≤ 2 %, CEX-주 60–80 %, HCP ≤ 100 ppm, 단백질 45–55 mg/mL)와 통제된 상태 및 서명을 요구하는 형상. CQ-08과 CQ-09에 답합니다.
  • 완료 게이트(bp:DrugProductFinishShape) — 무균성·외관·충전량을 더하는 제품 전용 형상 — 충전-완료가 용기-마개 시스템으로 가능하게 한 기준. 제품은 두 게이트를, 원료는 패널만 통과해야 합니다. CQ-10에 답합니다.
  • 세포 은행 게이트(bp:CellBankShape) — 워킹 은행 OWL 제약의 닫힌 세계 쌍둥이로, 네 가지 특성 규명(동일성, 무균성, 바이러스, 유전)과 계보 뿌리 노드의 계대 수 정확히 하나를 요구합니다. CQ-17에 답합니다.
  • Disjointness 가드BatchNotProcessShapeMaterialNotEquipmentShape으로, OWL-RL 프로파일이 잡지 못한 채 두는 continuant/occurrent(배치 대 발효)와 material/equipment(배치 대 용기) 혼동을 잡아냅니다.
  • 공동 운명 영향 분석(CQ-04) — 실패한 로트의 derivedFrom 계통을 공유 WCB-CHO-001까지 위로, 그리고 그 형제들까지 아래로 횡단하여, 추측이 아니라 질의로 리콜을 DP-001/DP-002로 범위 잡는 것입니다.
  • 검증 보고서(Validation report) — SHACL이 실패 시 반환하는 질의 가능한 RDF 그래프(focus node, result path, 제약, 값, 심각도, 메시지)로, 조사를 경로 잡는 데 쓰입니다. CQ-11은 그것이 DS-004/DP-004에 대해 정확히 hmwPct에서 발화함을 확인합니다.
  • 완전성 대 정확성(Completeness versus correctness) — SHACL은 기록이 완전하고, 잘 형성되고, 범위 내임을 보장할 뿐, 참임을 보장하지는 않습니다. 그럴듯한 범위 내 거짓 — 엉뚱한 바이알에 올바른 숫자 — 은 통과하므로, 게이트는 인간 출하 판단을 뒷받침할 뿐 대체하지 않습니다.
  • 입력 게이트로서의 적합성(Conformance as an admission gate) — 부분그래프가 훈련 행이나 검색 증강 LLM의 컨텍스트가 되기 전에 bp:ReleaseShape를 돌려, 모델이 빈틈을 유창하게 메우기 전에 비어 있거나 잘못 라벨된 그래프를 잡아냅니다. 그 닫힌 세계 규칙은 PASS/OOS 예측기의 라벨링 계약입니다.
  • 그룹 / 배치 단위 leave-one-batch-out 교차 검증 — 모델 평가를 무작위가 아니라 derivedFrom 계보(공유된 WCB-CHO-001 키)를 따라 분할하여, 형제 로트가 폴드 사이로 누설되지 않고 보고된 점수가 정직하도록 합니다. 리콜의 범위를 정하는 바로 그 전이적 간선이 공정한 평가의 범위도 정합니다.
  • 모델링 안티패턴(modeling anti-patterns) — 모델을 부패시키는 되풀이되는 지름길 — owl:sameAs 남용, 맨숫자, 포장/계보 혼동, 그리고 배치/공정 및 물질/장비 혼동 — 으로, 각각은 기억된 규칙이 아니라 그것이 다시 들여오는 날 실패하는 실행 가능한 점검(OOPS!, CQ-14, CQ-19, CQ-23)으로 은퇴됩니다.

이것이 이어지는 곳

이제 모델은 책임을 집니다. 게이트들이 실제 mAb-A 캠페인에 대해 실행되고, HMW 응집체 규격 이탈 모드가 한 경로로 고립되며, 세포 은행 뿌리가 특성 규명되었음이 증명되고, disjointness 가드가 추론기가 통과시키는 것을 잡아냅니다. 그러나 검증된 온톨로지가 완성된 온톨로지는 아닙니다 — 분자의 지식이 깊어지면서 규격은 바뀌고, 용어는 폐기되며, 새 출하 기준은 그래프에 이미 있는 모든 로트를 깨뜨리지 않고 추가되어야 할 수 있습니다. 다음 장 유지보수: 거버넌스, 버전 관리, 변경은 모델을 그 운영 수명으로 따라갑니다. 공들인, 변경 통제된 폐기가 옛 별칭을 조용히 덮어쓰지 않고 어떻게 퇴역시키는지, 버전 관리가 책 간 참조를 어떻게 유효하게 유지하는지, 그리고 실행 가능한 역량 질문 모음이 어떻게 모든 미래 변경이 여전히 통과해야 하는 회귀 시험이 되는지를 다룹니다.