본문으로 건너뛰기

제제화와 충전-마감: 컴퓨터 비전과 동결건조기

📍 현재 위치: 5부 · 충전-마감과 출하, 학습됨 — 17장. UF/DF가 제제화 완충액 안에서 목표 농도에 도달한 벌크 원액 DS-001을 넘겨주었습니다. 이 장은 그 벌크를 환자가 실제로 받는 것 — 충전되고, 검사되고, 때로는 동결건조된 바이알 — 으로 바꾸며, 바이오 제조 전체에서 가장 상용 배포가 많이 된 기계학습 응용을 만납니다. 바로 자동 외관 검사를 위한 심층학습 비전(deep-learning vision for automated visual inspection) 입니다.

원액은 분자로서는 완성되었습니다. 그것은 아직 제품이 아닙니다. 제제화와 충전-마감은 벌크 DS-001 로트를 가져다 최종 제제로 희석하거나 조정하고, 그것을 — 밀리리터 하나하나 — 수천 개의 유리 바이알이나 사전충전 주사기에 분주하는 작업이며, 그 결과가 우리의 진행 중인 계보에서 약물제품 로트 DP-001이 됩니다. 그다음, 많은 바이오의약품에서 제품은 안정한 케이크로 동결건조(lyophilized)됩니다. 모든 용기가 충전 정확도, 미립자, 마개 무결성에 대해 점검되고, 통과한 단위만 출하됩니다 — 품질 부서가 공장을 떠나도 좋다고 공식적으로 승인한 것입니다. 그것은 전체 공정에서 가장 물리적으로 이산적인 단계입니다 — 상류의 연속적인 배양액이 셀 수 있는 개별 물체들의 집단이 되었고, 그 각각은 자기 자신의 자격으로 합격 또는 불합격될 수 있습니다.

그 이산성이 바로 여기가 기계학습이 일상적 GMP(Good Manufacturing Practice — 고정되고 검증된 절차로 약을 만들기 위한, 법적 구속력 있고 규제기관이 사찰하는 규칙) 생산으로 진정으로 넘어온 곳인 이유입니다. 상류에서는 ML이 어떤 값을 소프트 센싱하고(다른 신호들로부터 측정하기 어려운 값을 추정함) 인간이 여전히 그것에 따라 행동합니다. 여기, 자동 외관 검사(AVI)에서는 합성곱 신경망이 바이알 하나의 사진을 보고 합격/불합격 결정을 내리며, 그것은 검증을 거친 후 스스로 설 수 있습니다. Amgen은 자동 검사를 통해 주사기와 바이알의 대략 95%를 출하한다고 공개적으로 보고했으며(벤더 자체보고) [1] — 그 모든 단서에도 불구하고, 그것은 업계에서 상용 ML을 가리키는 가장 강력한 단일 데이터 점입니다. 이 장은 그것을 둘러싼 정직하고 배포 가능한 두 조각을 만듭니다. 우리의 실제 충전 라인 위의 충전-중량 제어와 불합격 모델, 그리고 작은 CNN 스케치와 함께 비전 문제 자체의 틀잡기.

쉽게 말하면

사람이 삼키거나 주사하는 것을 만드는 어떤 공장 라인이든 그 마지막 작업대를 떠올려 보세요 — 헤어네트를 쓴 사람이 각 단위를 밝은 빛에 비춰 들고, 돌려 가며, 티끌이나 균열이나 부족한 충전이나 비뚤어진 캡을 찾고, 그것을 "양품" 통이나 "폐기" 통에 넣는 것입니다. 사람은 느리고, 지치며, 의견이 엇갈리고, 안전하려는 마음에 너무 많은 양품을 불합격시킵니다. 자동 외관 검사는 그 사람을 카메라와 소프트웨어로 만든 훈련된 눈으로 대체합니다. 카메라가 모든 바이알의 사진을 찍고, 신경망 — 사진에서 얼굴을 인식하는 바로 그 모델 부류 — 이 1초도 안 되는 시간에, 일관되게, 하루 종일 합격 또는 불합격을 결정합니다. 어려운 부분은 카메라가 아닙니다. 그것은 바이알이 결함이 될 수 있는 모든 방식을 그것에게 가르치고, 그다음 그것이 위험한 것들을 결코 놓치지 않는다는 것을 규제기관에게 입증하는 것입니다.

이 장에서 다루는 내용

  • 충전-마감이 상용 ML의 자연스러운 집인 이유 — 이산적 단위, 이진 합격/불합격 결정, 그리고 눈에 보이는 결함.
  • 충전 중량과 용량 정확도 제어 — 라인 자신의 통계로부터 관리한계와 조치한계를 유도하기, 공정 중 체크웨이어(checkweigher), 그리고 478-대-2 클래스 불균형에서 고정 한계가 학습된 임계값을 이기는 이유.
  • 심층학습 자동 외관 검사(AVI) — 과제 틀잡기, 표 기반 모델이 아니라 CNN이 필요한 이유, 합성곱-및-풀링 구조, 결함 라이브러리, 거짓 불합격 감축, 안전-임계 지표로서의 재현율, 그리고 상용 배포들(Amgen, Stevanato, Brevetti CEA, Syntegon, Microsoft Bonsai).
  • 동결건조 사이클 최적화 — 제품 온도와 1차 건조 종점의 소프트 센싱, 그리고 동결건조 사이클의 설계 공간 모델링.
  • 용기-마개 무결성(CCIT) 과 무균/아이솔레이터 환경 모니터링을 떠오르는 ML 표적으로.
  • 실행 가능한 모듈 examples/platform/ml/fill_control.py, 그리고 vision_avi.py의 CNN 스케치.
  • AVI 합격/불합격 기록 한 건의 해부 — 단일 일련번호 바이알의 검사를 신원 카드로 읽기: 촬영된 ROI, 잠긴 모델과 그 검증 라이브러리, 클래스별 신뢰도와 라우팅 임계값, 그리고 DP-001과 DS-001을 거쳐 출하까지 거슬러 가는 계보.
  • 정직한 미해결 과제: 검증-대-학습 역설(validation-versus-learning paradox)계속 학습할 수 있는 모델을 검증할 만큼 충분히 동결하면서도, 신뢰할 만큼 충분히 검증된 상태로 어떻게 유지하는가?

충전-마감이 상용 ML이 실제로 사는 곳인 이유

이 책의 모든 앞선 장은 같은 핸디캡과 씨름했습니다. 살아 있는 시스템, 성긴 오프라인 참조, 운전마다의 변동성, 그리고 빠르게 쇠퇴하는 모델 — 순수 ML을 자문 역할에 묶어 두는 소량-데이터 천장입니다. 충전-마감은 그 패턴을 중요한 세 가지 방식으로 깹니다.

첫째, 결정의 단위가 이산적이고 셀 수 있습니다. 바이오리액터는 하나의 연속 궤적을 만듭니다. 충전 라인은 480개의 개별 바이알(우리 데이터셋에서는 정확히 그만큼 — BATCH-2026-001)을 만들며, 각각은 자기 자신의 자격으로 검사되고 판정될 수 있는 독립된 물체입니다. 그것은 어려운 시간-회귀 문제를 깨끗한 항목별 분류 문제로 — 기계학습이 진정으로 잘하는 종류로 — 바꿉니다(각 물체를 범주로 분류하기 — 여기서는 합격 또는 불합격 — 이지, 시간에 걸쳐 연속적 숫자를 예측하는 것 즉 회귀(regression)가 아닙니다). 그것은 또한 표본 크기를 고정합니다. 상류 모델이 CQA(Critical Quality Attribute, 핵심 품질 속성 — 제품이 안전하고 효과적이려면 범위 안에 머물러야 하는 속성)를 학습하기 위해 아마 십여 개의 과거 배치를 가진 곳에서, AVI 프로그램은 바이알마다 라벨이 붙은 훈련 예시 하나를 누적하므로, 단일 상업 캠페인이 수십만 장의 이미지를 낼 수 있습니다 — 심층학습이 실제로 작동하는 데이터 체제입니다.

둘째, 결정은 이진적이고 경계 지어진 방식으로 중대합니다. 이 한 바이알을 합격 또는 불합격시킵니다. 잘못된 합격은 환자에게 도달하는 결함입니다. 잘못된 불합격은 폐기된 단위입니다. 둘 다 비용이 들지만, 어느 것도 상류 ML을 그토록 까다롭게 만드는 "14일 배치에 걸쳐 CQA를 잘못 제어했는가"라는 끝없는 문제가 아닙니다. 오차는 한 물체에 국소적이고, 지상 진실은 사후에 확인 가능하며(불합격된 바이알을 꺼내 들여다볼 수 있습니다), 두 오차 유형은 깨끗한 비대칭성을 가집니다 — 놓친 결함은 안전 사건이고, 거짓 불합격은 단지 돈입니다 — 이것이 단일한 정확도 숫자를 쫓는 대신 작동점을 의도적으로 조율하게 해 줍니다.

셋째 — 그리고 이것이 가장 깊은 이유인데 — 결함은 흔히 눈에 보이며, 이는 상류에서는 거의 결코 할 수 없는 방식으로 라벨이 붙은 훈련 데이터를 수집할 수 있다는 뜻입니다. 미립자, 균열, 낮은 메니스커스(meniscus), 빠진 마개: 이것들은 카메라가 볼 수 있고 훈련된 인간이 라벨을 붙일 수 있는 것들입니다. 병목은 "지상 진실이 없다"에서 "포괄적인 결함 라이브러리를 만들고 그에 대해 검증해야 한다"로 옮겨 갑니다 — 어려운 문제이지만 다루기 쉬운 문제이며, 업계가 이제 상업적 GMP에 배포할 만큼 잘 풀어낸 문제입니다. 그것이 바로, 바이오 제조에서 ML이 진정으로 상용에 도달한 곳이 어디냐고 물으면 정직한 답이 모니터링, 예지보전(predictive maintenance), 그리고 무엇보다 비전 검사 주위에 모이는 — CQA의 자율 제어가 아니라 — 이유입니다 [2].

충전 중량과 용량 정확도: ML을 쓰지 않는 논거

화려한 비전 문제 앞에, 모든 라인에서 돌아가는 화려하지 않은 문제가 있습니다. 각 바이알은 올바른 양의 약물을 받았는가? 무균 충전기는 공칭 부피 — 우리 데이터셋에서는 1.0 mL — 를 분주하고, 공정 중 제어(IPC) 체크웨이어(checkweigher) 가 바이알의 무게를 (연속적으로, 100% 순중량 체크웨잉으로, 또는 표본 추출로) 측정하여 전달된 용량이 용량 정확도 규격 — 액상 충전의 경우 일반적으로 목표의 약 ±5% — 안에 머무는지 확인합니다. 체크웨이어는 무게 를 읽으므로, 전달된 부피는 순중량을 제제 용액의 측정된 밀도(이 완충된 mAb-A(monoclonal-antibody product A, 단클론항체 제품 A) 제제의 경우 약 1.01 g/mL, 예시)로 나누어 역산됩니다 — 그것이 바로 1.0107 g 평균 무게가 둘이 1.000에서 일치하는 대신 1.0008 mL 평균 부피로 읽히는 이유입니다. 이것은 제어 문제이며, 이 책 전체가 거듭 고집하는 교훈의 가장 깨끗한 예시입니다. 물리가 허용하는 가장 단순한 도구를 집고, 그것이 진정으로 도움이 될 때에만 확대하라.

여기서 옳은 도구는 기계학습이 아니라 고전적 통계 공정 관리(SPC)입니다. 라인 자신의 운전 내 변동으로부터 개별값(I) 관리한계(individuals (I) control limits) 를 유도하고, 그제서야 규격과 비교합니다. 수학은 오픈소스 SPC 장(open-source SPC chapter)에서 본 것과 같은 sigma = MR-bar / d2 단기-시그마 추정입니다. 개별 측정값에 대해서는 합리적 부분군 안에서 평균을 낼 수 없으므로, 평균 이동범위(average moving range) — 연속 쌍의 평균 절대차, MR-bar — 를 관리도 상수 d2로 나누어 단기 표준편차를 추정하는데, d2는 n이 2인 연속-쌍의 경우 1.128입니다. 중심선 양쪽으로 3 시그마가 개별값 관리한계를 줍니다. 원시 표본 표준편차가 아니라 이동범위를 쓰는 이유는 미묘하면서도 중요합니다. 느린 표류는 전체 산포를 부풀리지만 연속 차이는 거의 건드리지 않으므로, 이동범위 시그마는 좁게 유지되고 관리도가 표류를 흡수하는 대신 그것에 발화합니다. 관리한계는 규격이 아니라 공정에서 나옵니다 — 라인이 떠돌 때 발동하는 조치한계가 어떤 바이알이 용량 규격을 벗어나기 전에 발달 중인 충전 문제를 잡아내는 것입니다.

그다음 능력 지수(capability index), Cpk로 별개의 질문을 던집니다. 공정이 어디에 중심을 두고 있고 그 산포가 얼마나 좁은지를 고려할 때, 그것은 ±5% 용량 창 안에 얼마나 편안하게 앉아 있는가? Cpk는 공정 평균에서 더 가까운 규격 가장자리까지의 거리를 3 시그마 단위로 잰 것입니다 — 형식적으로는 (상한 규격 빼기 평균)을 3 시그마로 나눈 것과 (평균 빼기 하한 규격)을 3 시그마로 나눈 것 중 최소값입니다. Cpk 1.33이 관례적인 "능력 있는" 바닥선입니다. 1.0은 더 가까운 규격 가장자리가 정확히 3 시그마 바깥에 앉아 있다는 뜻으로, 대략 740개 바이알 중 하나가 그것을 지나 떠돕니다. 우리의 실제 충전 라인에서 운전 내 이동범위는 중심 1.0107 g과 대략 0.951에서 1.071 g의 개별값 한계를 주는 한편, ±5% 규격에 대한 전달-부피 능력은 Cpk ≈ 0.84 — 능력 바닥선 아래 의 한계적 능력으로, 솔직히 말해 이 라인이 가끔 바이알을 불합격시키는지를 설명합니다. 480개 중 두 개를, 둘 다 낮은 충전 때문에. 라인은 고장 난 것이 아닙니다. 그것은 좁은 규격에 빠듯하게 맞춰져 있는데, 바로 그것이 불합격이 실재하고 관리도가 제값을 하는 체제입니다.

이제 솔깃한 수: 분류기로 불합격 경계를 학습하면 안 될까? 할 수 있습니다 — 그리고 그 결과는 조용한 본보기입니다. 478개의 양품 바이알과 2개의 불합격으로, 클래스 불균형은 잔혹합니다(양성이 약 0.4%). 내버려 두면, 분류기는 모든 것을 양품이라고 부름으로써 손실을 최소화하고 99.6% 정확도를 기록하면서 결함을 0개 잡을 것입니다 — 불균형 데이터에서 정확도의 교과서적 실패입니다. 그래서 손실을 재가중하여(class_weight="balanced"가 두 불합격을 그 빈도의 역수만큼, 대략 240배 상향 가중) 모델이 소수 클래스를 진지하게 받아들이도록 강제합니다. (fill_volume, fill_weight)에 대한 클래스-균형 로지스틱 회귀는 그러면 두 진짜 불합격을 모두 잡지만, 결정 경계를 너무 보수적으로 그어 완벽히 멀쩡한 바이알 수십 개도 의심스럽다고 표시함으로써만 그렇게 합니다. 학습된 임계값은 고정 한계를 되찾을 뿐 그것을 이기지는 못합니다 — 그리고 학습된, 데이터에서 유도된 경계는 심사자가 한 줄로 읽을 수 있는 고정 수치 한계보다 GMP 아래에서 검증하기가 훨씬 어렵습니다. 이것은 축소판 거짓-불합격 문제이며, 심층학습 AVI를 가치 있게 만드는 바로 그 트레이드오프를 예고합니다. 충전-마감에서 ML의 승리는 규칙이 놓치는 결함을 잡는 것이 아니라, 양품을 버리지 않으면서 그것들을 잡는 것입니다.

학습 문제로서의 충전-마감 작업대의 히어로 도해: 왼쪽에서, 벌크 원액 DS-001이 약물제품 DP-001의 480개 개별 바이알을 분주하는 제제화 및 무균-충전 스키드로 흘러 들어가고; 공정 중 체크웨이어가 각 바이알의 무게를 운전 내 이동범위에서 유도된 개별값 관리한계에 대해 읽으며, 두 개의 낮은-충전 바이알이 불합격으로 표시되고 ±5 퍼센트 용량 규격에 대한 전달-부피 능력 Cpk 0.84가 함께 나오고; 중앙에서는 선택적 동결건조기가 바이알을 안정한 케이크로 동결건조하는 동안 제품-온도 소프트 센서가 승화 종점을 예측하며; 오른쪽에서는 심층학습 자동 외관 검사 작업대가 제어된 빛 아래에서 모든 바이알을 촬영하고 합성곱 신경망이 미립자, 균열, 충전-수위, 마개, 외관 결함 클래스에 걸쳐 그것을 합격 또는 불합격으로 분류하며, 대략 95 퍼센트가 자동 출하되고(벤더 자체보고) 나머지는 인간 검토로 보내지고; 작은 패널이 모델은 초안 Annex 22 아래 검증 시점에 잠긴다고 주석한다. 학습된 충전-마감 작업대: ML이 아니라 통계로 제어되는 한계적-능력의 충전, 소프트 센싱된 종점을 가진 선택적 동결건조 사이클, 그리고 각 개별 바이알을 합격 또는 불합격시키는 상용급 심층학습 비전 검사 — 모델의 결정이 일상적으로 스스로 서는, 바이오 제조에서 유일한 곳. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

# examples/platform/ml/fill_control.py — fill-weight control + a reject model on
# the REAL fill line (480 vials of DP-001, BATCH-2026-001). The lesson is that the
# fixed checkweigh limit beats the learned threshold; the classifier only recovers it.
TARGET_ML = 1.0
SPEC_LOW_ML, SPEC_HIGH_ML = 0.95, 1.05 # +/- 5% dose-accuracy spec on a 1.0 mL fill
D2 = 1.128 # moving-range control-chart constant for n=2

def control_limits(weights):
w = np.asarray(weights, dtype=float)
mr_bar = np.abs(np.diff(w)).mean() # average within-run moving range
sigma = mr_bar / D2 # short-term sigma (drift-robust)
center = w.mean()
return {"center_g": round(center, 4), "sigma_g": round(sigma, 5),
"ucl_g": round(center + 3 * sigma, 4), "lcl_g": round(center - 3 * sigma, 4)}

def capability(volumes): # Cpk vs the +/- 5% dose spec
v = np.asarray(volumes, dtype=float)
mu, sd = v.mean(), v.std(ddof=1)
cpu, cpl = (SPEC_HIGH_ML - mu) / (3 * sd), (mu - SPEC_LOW_ML) / (3 * sd)
return {"mean_mL": round(mu, 4), "cpk": round(min(cpu, cpl), 3)}

def reject_model(df): # the tempting, inferior ML move
X = df[["fill_volume_mL", "fill_weight_g"]].to_numpy()
y = df["reject"].astype(int).to_numpy()
clf = LogisticRegression(class_weight="balanced", max_iter=1000).fit(X, y) # ~0.4% positives
tn, fp, fn, tp = confusion_matrix(y, clf.predict(X), labels=[0, 1]).ravel()
return {"n": len(y), "n_reject": int(y.sum()),
"tp": int(tp), "fp": int(fp), "fn": int(fn), "tn": int(tn)}

assert mdl["fn"] == 0, "reject model must not miss a true low-fill vial"
assert mdl["fp"] > 0, "the learned threshold over-rejects vs the fixed limit"

커밋된 fill_events.csv에 대해 실행하면 논증 전체를 출력합니다:

Fill line BATCH-2026-001: 480 vials, 2 rejected (reason: low_fill)
Checkweigh control limits (from within-run MR): center=1.0107 g LCL=0.9507 UCL=1.0708
Dose-accuracy capability vs +/- 5% spec: mean=1.0008 mL Cpk=0.841
Reject classifier confusion: tp=2 fp=41 fn=0 tn=437
ASSERT ok: a fixed checkweigh limit catches every low-fill vial with no over-rejection; the learned threshold adds false rejects and validation burden without improving detection.

혼동 행렬(confusion matrix) 은 예/아니오 분류기의 가능한 네 가지 결과를 집계합니다. 참 음성(tn, 통과된 양품 바이알), 거짓 양성(fp, 잘못 불합격된 양품 바이알), 거짓 음성(fn, 잘못 통과된 결함), 그리고 참 양성(tp, 잡힌 결함)입니다. 그것이 논증 전체를 한 줄에 담습니다. 학습된 임계값은 두 진짜 낮은-충전 바이알을 모두 잡지만(fn=0), 41개의 거짓 불합격(fp=41)이라는 대가를 치릅니다 — 잡은 불량 하나마다 양품 스무 개 넘게 폐기됩니다. 그리고 이 혼동 숫자들은 표본 내(in-sample) 임에 유의하세요. 분류기는 그것이 학습한 바로 그 같은 480개 바이알에 채점됩니다(재대입, resubstitution). 이는 모델이 진정으로 학습하는 대신 암기할 수 있어 언제나 모델을 좋게 보이게 합니다. 정직한 시험은 보류 집합(held-out set) — 모델이 훈련에서 결코 본 적 없는 데이터 — 으로, 그것이 새 바이알에 대해 모델이 어떻게 일반화하는지를 알려 줍니다. 그러나 양성이 단 두 개뿐이라 누출 없는 보류 집합을 떼어 낼 방법이 아예 없으므로, 이 경계의 일반화를 추정조차 할 수 없는데, 그것이 과잉 불합격보다 더 날카로운, 학습된 충전-불합격 규칙이 GMP 아래에서 검증 불가능한 이유입니다. 고정 체크웨잉 한계는 같은 두 개를 과잉 불합격 없이 잡고, 심사자가 한 문장으로 읽을 수 있는 검증 파일을 가집니다. 모듈은 그 교훈을 통과하는 한 쌍의 단언으로 부호화합니다 — fn == 0(분류기는 둘 다 잡는다)과 fp > 0(그러나 과잉 불합격으로만) — 그래서 실패 모드 자체가 통과하는 시험입니다. ML은 잘못 조율되어서 진 것이 아닙니다. 그것은 문제가 그것을 필요로 하지 않았기에 졌습니다. 어느 충전-마감 문제가 학습을 필요로 하고 어느 것이 그렇지 않은지를 기억하는 것이 이것을 잘하는 일의 절반입니다.

자동 외관 검사: 심층학습의 상용 논거

외관 검사는 정반대 이야기입니다. 모든 비경구(parenteral, 삼키는 대신 바늘로 주사하는 주사제) 제품은 눈에 보이는 미립자와 용기/마개 결함에 대해 검사되어야 합니다 — 그것은 약전(compendial) 요구사항이며(USP <790> — 미국 약전(U.S. Pharmacopeia), 즉 FDA가 시행하는 공식 약품-품질 표준의 한 장 — 이 100% 외관 검사를 의무화하고 눈에 보이는 미립자에 대한 합격 / AQL(Acceptable Quality Level, 합격 품질 수준 — 표본 추출 기반 결함 한계) 틀을 정하는 시행 가능한 일반장(General Chapter)이며, 그 뒤에 USP <1790>(그리고 유럽에서는 Ph. Eur. 2.9.20)의 정보용 모범사례 지침이 있음), 역사적으로는 정해진 조도(lux) 아래 번갈아 나오는 흑백 배경에 대고 바이알을 돌리는 훈련된 인간이 수행했습니다. 인간 검사는 두 가지 만성적 실패를 가집니다. 그것은 비일관적이고(검사자들은 의견이 엇갈리고, 같은 검사자도 한 교대 동안 자기 자신과 엇갈리며, 피로가 오를수록 탐지 확률이 떨어짐), 과도하게 보수적입니다 — 안전하기 위해, 인간과 그들을 대체한 더 오래된 규칙 기반 기계는 양품의 큰 분획을 불합격시킵니다. 업계 전문가들은 규칙 기반 AVI의 거짓-불합격률을 양품 바이알의 대략 20%만큼 높게 인용해 왔으며(학회 보고), 일반적으로는 고정-임계값 기계가 굽은 유리의 번쩍임을 균열로, 또는 일시적 기포를 미립자로 읽기 때문입니다 [3]. 수백만 바이알 캠페인에서 20% 거짓-불합격률은 완벽히 멀쩡한 약의 충격적이고 보이지 않는 낭비입니다.

여기서 심층학습이 진정으로 제 자리를 얻습니다. 과제는 이미지 분류(image classification) 입니다. 카메라가 각 바이알을 — 흔히 여러 각도에서, 제어된 조명 아래에서, 때로는 바이알을 회전시켰다가 급정거시켜 진짜 미립자는 이제 정지한 유리 특징들에 대비해 계속 움직이도록 하면서(인간이 떠다니는 섬유를 고정된 긁힘과 구별하게 해 주는 바로 그 물리) — 촬영합니다. 그다음 합성곱 신경망(convolutional neural network, CNN) 이 그 결과 이미지를 합격으로, 또는 여러 결함 유형(미립자, 균열, 낮은 충전 수위, 마개/봉합 결함, 외관) 중 하나로 분류합니다. CNN이 옳은 도구인 것은 정확히 이것이 표 기반 문제가 아니기 때문입니다. 신호는 픽셀의 공간적 패턴이고, 합성곱 계층은 국소 특징(가장자리, 티끌, 메니스커스)을 학습하여 그것들을 결함/무결함 판정으로 위계적으로 결합하도록 설계되었습니다. 평탄화된 이미지를 로지스틱 회귀에 건네주고 유리에 대비된 작은 입자를 찾기를 기대할 수는 없습니다. 평탄한 벡터는 결함을 정의하는 바로 그것 — 밝은 픽셀들이 서로에 대해 어디에 앉아 있는지 — 을 버립니다. 자신의 아키텍처가 데이터의 구조와 맞는 모델이 필요합니다.

구조적으로, CNN인 이유

합성곱 계층은 같은 작은 학습된 필터 — 우리 스케치에서는 3×3 격자의 가중치 — 를 이미지의 모든 위치에 걸쳐 미끄러뜨리며, 각 정지점에서 윈도 아래를 곱하고 합산합니다. 같은 필터가 어디서나 재사용되기 때문에(가중치 공유), "어두운 유리에 대비된 작고 밝은 티끌"을 학습한 특징 탐지기는 그 티끌이 나타나는 곳마다 발화하고, 계층은 이미지 크기와 무관하게 필터당 한 줌의 가중치만 필요로 합니다. 그것이 평탄화된 밀집 계층이 파괴하는 속성입니다. 그것은 모든 픽셀 위치마다 티끌을 따로 학습해야 할 것입니다. 쌓인 합성곱-및-풀링 블록은 그다음 위계를 만듭니다 — 초기 필터는 가장자리와 티끌을 잡고, 더 깊은 필터는 그것들을 더 큰 구조(메니스커스 선, 균열의 분기)로 결합합니다 — 한편 맥스풀링(max-pooling)은 각 단계에서 공간 해상도를 절반으로 줄여 더 깊은 계층이 같은 필터 크기로 더 넓은 시야를 보게 합니다. 마지막 분류 헤드(head)가 학습된 특징을 결함 클래스로 매핑합니다. 스케치에서 실제로 중요한 두 조각이 더 있습니다. 각 합성곱 뒤의 배치 정규화(batch normalization) 는 각 계층의 활성을 재중심화하여 훈련을 안정시키고 가속하며, 출력 계층 앞의 드롭아웃(dropout) 은 훈련 중 특징의 한 분획을 무작위로 0으로 만들어 유한한 결함 라이브러리에서의 과적합과 싸웁니다. 우리 예제 모음의 스케치는 세 개의 합성곱 블록, 전역 평균 풀링, 그리고 6-클래스 헤드로 형상 계약을 구체화합니다:

# examples/platform/ml/vision_avi.py — an HONEST CNN sketch for AVI (no real vial
# images ship in the dataset). It fixes the architecture and shape contract; the
# real accept/reject numbers (Amgen ~95% auto-release) are vendor/self-reported.
import torch, torch.nn as nn

IMG_CH, IMG_HW = 1, 128 # grayscale ROI cropped to the meniscus
CLASSES = ["accept", "particulate", "crack", "fill_level", "stopper", "cosmetic"]

class VialInspectorCNN(nn.Module):
def __init__(self, n_classes=len(CLASSES)):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(IMG_CH, 16, 3, padding=1), nn.BatchNorm2d(16), nn.ReLU(),
nn.MaxPool2d(2), # 128 -> 64
nn.Conv2d(16, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(),
nn.MaxPool2d(2), # 64 -> 32
nn.Conv2d(32, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(),
nn.AdaptiveAvgPool2d(1), # -> 64 x 1 x 1
)
self.head = nn.Sequential(nn.Flatten(), nn.Dropout(0.3), nn.Linear(64, n_classes))

def forward(self, x): # x: (batch, 1, 128, 128)
return self.head(self.features(x))

torch.manual_seed(2026) # reproducible stand-in ROIs and weights
model = VialInspectorCNN().eval() # LOCKED model: eval() only, no learning in prod
for p in model.parameters():
p.requires_grad_(False) # weights frozen at validation (draft Annex 22)
vials = torch.randn(8, IMG_CH, IMG_HW, IMG_HW) # stand-in for camera ROIs
with torch.no_grad():
prob = torch.softmax(model(vials), dim=1)
decisions = prob.argmax(dim=1) # class 0 = accept; anything else = a reject reason
print(f"AVI CNN (sketch): {sum(p.numel() for p in model.parameters()):,} params, "
f"{len(CLASSES)} classes, decisions={decisions.tolist()}")
AVI vial-inspection CNN (sketch) — locked at validation, eval() only
classes : ['accept', 'particulate', 'crack', 'fill_level', 'stopper', 'cosmetic']
parameters : 23,910
input (b,c,h,w): (8, 1, 128, 128)
output (b,classes): (8, 6)
decisions (argmax class id): [0, 0, 0, 0, 0, 0, 0, 0]
NOTE: real accept/reject performance (e.g. Amgen ~95% auto-release) is vendor/self-reported; this sketch only fixes the shape contract.

우리의 23,910-매개변수 스케치는 장난감입니다 — 가중치가 무작위이고 훈련되지 않았기에 모든 결정이 accept에 떨어집니다. 출력은 텐서가 8×1×128×128 ROI 배치에서 8×6 로짓 행렬로 흐른다는 것만 입증합니다. 상용 AVI 망은 훨씬 더 깊고, 수만에서 수십만 장의 라벨 붙은 이미지에 이르는 독점 결함 라이브러리에 대해 훈련됩니다. 그러나 구조는 진짜 구조이며, 스케치의 두 설계 선택은 상용에서 하중을 견디는 것입니다. 모델은 requires_grad_(False)로 가중치를 동결한 채 eval() 모드로 돌아갑니다 — 상용에서 학습하지 않는 잠긴 모델(locked model), 이제 모든 규제기관이 기대하는 자세입니다. 그리고 출력은 헐벗은 합격/불합격이 아니라 클래스에 대한 소프트맥스 확률이므로, 시스템은 합격-확률을 라우팅 임계값과 비교하여 낮은-신뢰 바이알을 짐작하는 대신 인간 검토로 보낼 수 있습니다 — AVI를 배포 가능하게 만드는 인간-개입(human-in-the-loop) 패턴입니다.

재현율이 지표이고, 거짓 불합격이 비용이다

모델은 틀릴 수 있는 두 가지 방식을 가지며, 그것들은 대칭이 아닙니다. 거짓 합격(false accept) — 합격으로 채점된 결함 바이알 — 은 안전 사건입니다. 미립자나 균열된 용기가 환자에게 도달하는 것. 거짓 불합격(false reject) — 결함으로 채점된 양품 바이알 — 은 단지 폐기된 약입니다. 그래서 안전 사례를 다스리는 지표는 재현율(recall)(민감도)입니다. 진정으로 결함인 모든 바이알 중에서, 모델이 어느 분획을 잡았는가? 검증된 AVI 시스템은 모든 결함 클래스에서, 희귀하고 경계선상인 것들까지 포함하여, 그것이 대체하는 수동 방법만큼은 좋은 재현율을 입증해야 합니다. 재현율은 배포된 AVI 프로그램이 통과해야 하는 합격 게이트이고, 모음은 그것을 vision_avi.py의 의도된 기준으로 기록합니다 — 실행은 그 목적을 "게이트 위의 결함 분류기 재현율"로 명명합니다. 그러나 데이터셋에 라벨 붙은 바이알 이미지가 없으므로 스케치는 바이알별 6-클래스 형상 계약만을 고정합니다. 그것은 재현율을 측정할 수 없고, 보류된 숫자를 단언함으로써가 아니라 깨끗하게 종료함으로써 하니스를 통과합니다. 그 간극이 바로 핵심입니다. 결함을 조용히 놓치는 모델은 무용한 것보다 더 나쁘고, 위험합니다 — 그것이 바로 신경망이 아니라 결함 라이브러리가 규제되는 산출물인 이유입니다.

재현율 하나만으로는 최대화하기가 사소합니다(모든 것을 불합격시키면 됨). 그래서 경제적 사례는 거짓-불합격률이 다스리고, 심층학습 AVI의 가치 전체는 둘을 한꺼번에 개선하는 것입니다. 더 많은 진짜 결함을 잡으면서(더 높은 재현율) 훨씬 더 적은 양품 바이알을 불합격시키는 것(더 낮은 거짓-불합격률). 그 두-축 개선이 정확히 학습된 모델을 고정-임계값 기계로부터 가르는 것이며 — 그리고 그것은 fill_control.py 교훈이 축소판으로 보여 준 바로 그 트레이드오프인데, 이제 학습이 이기는 사례로 뒤집힌 것입니다. 작동점 — 바이알이 인간에게 라우팅되는 합격-확률 임계값 — 을 의도적으로 조율하여, 더 많은 인간 검토를 대가로 더 많은 재현율을 사도록 미끄러뜨리며, 결코 그 반대로는 하지 않습니다.

진짜 병목: 결함 라이브러리와 검증

신경망은 쉬운 부분입니다. AVI 프로그램의 어렵고, 규제되고, 비싼 부분은 결함 라이브러리(defect library) 입니다. 모든 결함 유형을 모든 심각도에서, 희귀하고 경계선상인 사례를 포함하여 다루는, 큐레이션되고 라벨 붙은 이미지 집합으로, 그것에 대해 모델이 훈련되고 — 훨씬 더 중요하게는 — 검증됩니다. AVI 시스템이 그것이 대체하는 수동 방법만큼은 좋다는 것을 입증하려면, 알려진 결함과 알려진-양품 단위의 대표적 집단에 대해 그 탐지 성능을 입증해야 하며, 이는 어떤 약전 검사 방법이든 자격검증되는 방식 그대로입니다 — 심은 결함(고의로 제조된 균열, 알려진 크기의 주입된 미립자, 충전 부족 바이알)과 모든 경계선상 이미지에 대한 인간-판정 지상 진실로. 그 라이브러리를 만들고 유지하는 데 수년의 작업이 들어가며, 그것은 또한 쇠퇴하는 것입니다. 새 유리 공급업체, 새 마개, 라이브러리가 결코 담은 적 없는 새 미립자 유형 — 그러면 검증된 모델은 이제 그것이 자격검증된 집단 바깥에서 운영되고 있는 것입니다. Amgen은 대략 95%-자동 출하 바이알과 주사기로의 이동이 수년의 노력과 FDA와의 직접 대화를 들였다고 명시했으며(벤더 자체보고) [1], 최초의 완전히 검증된 개조는 바이알 라인이 아니라 푸에르토리코 Juncos의 주사기 라인이었습니다 — "가장 강력한 상용 ML 사례"가 여전히 다년의, 면밀히 정밀조사받은 프로그램이지 플러그인이 아니라는 상기입니다.

상업적 지형은 실재하고 명명되어 있습니다. Stevanato Group의 Vision AI 플랫폼은 최대 99.9%로 주장되는 탐지 정확도와 거짓 불합격의 대략 한 자릿수(10배) 감축을 동반한 심층학습 검사를 시장에 내놓고 있습니다(벤더 자료) [4]; Brevetti CEA는 규제 검사를 위한 같은 CNN-및-이상탐지 능력을 구축하기 위해 2025년에 덴마크 심층학습 전문회사 Brevetti AI(이전 Criterion AI, 2018년 설립)를 완전히 흡수했습니다 [5]; Syntegon의 AIM(AI-강화 검사)은 실질적으로 더 적은 거짓 불합격과 함께 실질적으로 더 많은 입자 탐지를 보고하며(벤더 보고), Syntegon은 그 검증된 개조에서 Amgen의 장비 파트너였습니다; 그리고 Cognex, Antares Vision, Körber, 그리고 Microsoft의 Bonsai(산업 제어와 검사에 맞춰진 강화학습 / 기계-교습 플랫폼)가 같은 공간 안에서 또는 그 인접에서 활동합니다. 헤드라인 숫자들은 벤더- 또는 학회-보고이지 동료심사된 것이 아니며, 그렇게 읽혀야 합니다 — 실제로 임계 작업대에 대해 발표된 가장 방어 가능한 Amgen/Syntegon 수치는 둥근 95%가 아니라 더 검소한 "대략 70% 더 높은 입자 탐지와 대략 60% 더 적은 거짓 불합격"입니다. 그러나 방향은 일관되고 벤더들과 하나의 명명된 제약사 배포에 걸쳐 입증됩니다. 심층학습 AVI는 그것이 대체하는 규칙 기반 기계보다 훨씬 적은 양품을 불합격시키면서 더 많은 진짜 결함을 탐지합니다.

AVI 합격/불합격 기록 한 건의 해부

배포된 AVI 작업대는 헐벗은 "불합격"을 내보내지 않습니다. 이 시리즈의 모든 산출물처럼, 가치는 결정과 함께 따라가는 것 안에 있습니다 — 심사자, 규제기관, 또는 조사가 이 바이알이 폐기 통으로 갔는지 재구성하고 그것을 보낸 모델이 검증된 그 모델이었음을 신뢰하게 해 주는 출처(provenance)입니다.

라벨 붙은 신원 카드로서의 AVI 검사 기록 한 건의 해부: 약물제품 로트 DP-001, 배치 BATCH-2026-001에서 일련번호 식별자 00361414000017-점-0000150으로 바이알을 명명하는 인디고 헤더; 타임스탬프, 카메라 작업대와 뷰, 잘라낸 관심영역 이미지 참조와 제어된-조명 레시피를 담은 입력 블록; 예측된 클래스 합격 대 불합격 사유, 미립자 균열 충전-수위 마개 외관의 여섯 결함 클래스에 대한 소프트맥스 신뢰도, 그리고 검토-라우팅 임계값과 함께한 합격-신뢰 값을 담은 녹색 핵심 결정 블록; 잠긴 모델 id와 버전, 검증 결함-라이브러리 해시, 그리고 모델이 동결되어 eval 모드로 돌았다는 플래그를 고정하는 모델-신원 블록; 낮은-신뢰 바이알에 대한 인간-검토 판정과 같은 일련번호의 공정 중 체크웨잉 무게로 잇는 화해 블록; 그리고 기록을 검증 연구, 결함-라이브러리 버전, DS-001까지 거슬러 가는 배치 계보, 그리고 QC 장이 내릴 출하 결정에 잇는 보라색 관계 패널. 검사 한 건이 하나의 온전한 기록입니다: 단일 일련번호 바이알의 촬영된 영역, 잠긴 모델과 그것이 자격검증된 검증 라이브러리, 클래스별 신뢰도와 경계선상 바이알을 인간에게 보내는 라우팅 임계값, 그리고 DP-001과 DS-001을 거쳐 출하 결정까지 거슬러 가는 링크 — 출처가 바로 자동 불합격이 GMP 아래에서 서게 해 주는 것이다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

카드를 위에서 아래로 읽으면 이 장의 논증 전체가 필드로 펼쳐집니다. 헤더는 단위를 단일 일련번호 바이알에 고정합니다 — 00361414000017.0000150, 여기서 앞의 열네 자리는 mAb-A 약물제품 제형의 GTIN-14(제품으로, GS1 AI 01 아래 운반됨 — 이 제품의 모든 바이알에 있는 같은 번호)이고 접미사는 이 바이알의 일련번호로, 패키징 장(packaging chapter)이 추적-및-탐지(track-and-trace)를 위해 발번하는 바로 그 신원입니다. 바이알은 그 로트를 명명하는 GTIN이 아니라 DP-001 로트의 part_of입니다. 그 일련번호 식별자는 또한 Book 4가 바이알의 IRI로 승격하는 안정적 조인 키이기도 하므로, 이 기록은 같은 바이알을 명명하는 다른 모든 시스템과 조인될 수 있습니다. 입력 행들은 값싸고 빠른 신호입니다. timestamp, 카메라 작업대와 뷰, 잘라낸 관심영역 image에 대한 참조, 그리고 조명 레시피 — AVI 모델은 그것이 훈련된 촬영 조건 아래에서만 유효하고, 바뀐 전구나 배경막은 입력 분포를 검증된 집단 바깥으로 조용히 옮기기 때문입니다. 녹색 핵심 은 결정입니다. predicted_class(합격, 또는 명명된 불합격 사유), 여섯 클래스 전부에 대한 confidence 분포, 그리고 불확실한 바이알을 모델이 짐작하게 두는 대신 인간에게 라우팅하는 review_threshold와 비교된 accept_confidence. 모델-신원 블록은 model_id, model_version, 그리고 모델이 자격검증된 validation_library의 해시를, 더하기 가중치가 동결되었고 모델이 eval() 모드로 돌았다는 플래그를 고정합니다 — 그래서 기록은 어느 잠긴 모델이 이 판정을 내렸고 그것이 교대 도중 표류할 수 없었음을 입증합니다. 화해 행들은 비전 결정을 같은 일련번호의 다른 증거에 잇습니다. 라우팅된 바이알에 대한 human_verdict(새로운 지상 진실이 되는 인간-개입 판정), 그리고 위 충전-제어 모델에서 온 공정 중 checkweigh_g 무게로, 그래서 카메라가 표시한 낮은 충전을 저울에 대해 교차 점검할 수 있습니다. 보라색 관계 패널은 계보를 기록합니다 — 자격검증 연구가 validated_by, 결함 라이브러리가 trained_on, DS-001에서 파생되는 DP-001 로트가 part_of, 그리고 출하 결정(release decision)feedsBook 4의 인스턴스 그래프(instance graph)가 노드로 모델링하는 바로 그 DP-001 바이알이며, DS-001을 거쳐 세포 은행까지 거슬러 가는 바로 이 derivedFrom 에지들(그리고 카톤/케이스/팰릿 위계를 올라가는 contains 에지들 — 계보가 아니라 담음)을 가집니다.

기록은 JSON 덩어리가 아니라 타이핑된 노드입니다

그 신원 카드는 레이아웃 이상입니다. Book 4의 온톨로지를 그 아래 깔고 읽으면, 모든 필드는 타이핑된 진술이며, 그 타이핑이 바로 기록을 모델에 먹일 만큼 신뢰할 수 있게 만드는 것입니다. 일련번호 바이알은 연속체(continuant) — 시간을 통해 지속하며 품질을 띠는 것 — 로, 그것을 판정한 검사 사건과 범주적으로 구별되어 유지됩니다. 그 사건은 발생체(occurrent) 입니다. timestamp, 작업대, 한 번 돌아간 모델을 가진 하나의 일어남입니다. 둘을 융합하면(절반은 객체, 절반은 사건인 단일 "불합격 행") BFO 연속체/발생체 절단이 무너지고, 그와 함께 이 같은 바이알이 두 번째 작업대에서 재촬영되었다거나 카메라가 다른 십만 개의 바이알을 검사했다고 말하는 능력도 무너집니다. part_of, derivedFrom, contains 에지들도 자유 텍스트 문자열이 아닙니다. 각각은 bp: 어휘 안의 명명된 객체 속성(object property)으로 해소되며, derivedFrom은 OBO 관계 온톨로지(Relation Ontology)의 derives from(RO_0001000)으로 정렬되어, 바이알 계보 위의 리콜 워크가 이 라인의 소프트웨어에게만이 아니라 그 표준 용어를 임포트하는 어떤 도구에게도 같은 것을 뜻하게 합니다. 특히 계보 에지는 owl:TransitiveProperty이며, 그것이 바로 보라색 패널이 기록이 단언하는 직속 부모 홉만으로 바이알이 DS-001을 거쳐 세포 은행까지 거슬러 추적된다고 주장하게 해 주는 것입니다 — 추론을 하는 것은 AVI 작업대가 아니라 계보 척추(genealogy spine)입니다.

이 타이핑은 두 번 값을 합니다. 첫째, 그것이 검사 기록을 깨지기 쉬운 컬럼이 아니라 의미적으로 근거된 훈련 특징(semantically-grounded training feature) 으로 만드는 것입니다. AVI 모델의 다음 빈티지가 훈련될 때, 특징은 스키마 마이그레이션이 학습기 아래에서 조용히 이름을 바꿀 수 있는 컬럼 이름이 아니라 그 온톨로지 IRI(주어진 DS 로트에서 derivedFrom한 바이알 위의 bp:acceptConfidence)로 당겨집니다 — 관계 장(relations chapter)이 상류 affectsQuality 행들에 대해 논하는 바로 그 누출-방지 라벨 저장소 속성입니다. 둘째, 계보는 정직한 검증을 위한 그룹화 키(grouping key) 입니다. derivedFrom 조상을 공유하는 두 약물제품 로트는 독립적 예제가 아니므로, 누적된 검사 기록으로 재훈련된 AVI 모델은 한 번에 통째로 derivedFrom-연결된 계보를 보류하는 leave-one-batch-out 분할로 채점되어야 합니다 — 이 책 나머지가 고집하는 같은 GroupKFold 규율이며, 기록이 이미 각 바이알이 어느 캠페인에서 내려왔는지를 기록하므로 여기서 모델에게 공짜로 건네집니다. 무작위 행-단위 분할은 한 세포 은행에서 나온 거의-쌍둥이 형제들이 훈련/시험 경계를 넘어 누출되게 하고, 진정으로 새로운 배치에서 증발하는 검증 재현율을 보고하게 만듭니다.

같은 형상 게이트, 훈련 세트를 향함

validation_library 해시 안에 더 깊은 재사용이 숨어 있습니다. QC 장이 내리는 출하 결정은, Book 4에서, SHACL 형상(SHACL shape) — 필수 CQA 패널이 빠졌거나 중복되었거나 범위를 벗어난 로트를 불합격시키는 닫힌-세계 게이트로, 빠진 결과가 그저 "알 수 없음"으로 읽히기에 어떤 열린-세계 추론기도 던질 수 없는 질문 — 입니다. 그 같은 형상 어휘를 로트가 아니라 후보 훈련 하위그래프를 향하게 하면 그것은 비순응 데이터셋을 거부합니다. 단 한 행이 학습기에 건네지기 전에, 모든 검사 기록이 그 derivedFrom 부모를, 모든 신뢰도가 그 6-클래스 분포를, 모든 바이알이 그 조명 레시피와 잠긴 model_version을 지녀야 합니다. 그것은 ML 파이프라인이 혼자서는 거의 만들지 못하는 닫힌-세계 포착입니다 — 조용히 빠진 특징은 데이터가 결코 말하지 않은 것을 기꺼이 지어내는 모델을 훈련하며, 정확히 유창한 모델이 참된 이야기만큼 매끄럽게 거짓 이야기를 서술하는 검증-대-학습 실패입니다. 입력을 SHACL-검증하는 것은 같은 출하-게이트 엄정함을, 모델이 판정하는 로트가 아니라 모델을 만드는 데이터로 한 걸음 앞당긴 것입니다. 그것은 또한 기록이 분석 스택이 가정하는 FAIR 기대(찾을 수 있고, 접근 가능하고, 상호운용 가능하고, 재사용 가능)를 충족하게 해 주는 것이기도 합니다 — 해소 가능한 IRI로 키잉되고 발행된 어휘에 대해 타이핑된 검사 행은 이 라인을 결코 본 적 없는 도구에 의해 재사용 가능합니다.

이 아래의 표준이 모델에 중요한 이유

검사 기록은 홀로 살지 않습니다. 그것은 이미 같은 바이알을 명명하는 공장 시스템들과 상호운용해야 하며, 그 상호운용성이 바로 규모에서 훈련 세트를 정직하게 유지하는 것입니다. 온톨로지가 그리는 용기-배치-운전 분리는 ISA-95(기업-대-공장 데이터 모델, IEC 62264)가 별개의 EquipmentElement, MaterialLot, 생산-응답 객체로 운반하고 그 B2MML XML 직렬화가 별개의 요소로 유지하는 바로 그 분리입니다 — 그래서 AVI 작업대의 "이 충전 라인의 배치 BATCH-2026-001에서 온 바이알"은 사적 문자열이 아니라 시맨틱 상호운용성 계층(semantic-interoperability layer)이 그 로트의 한 bp: IRI로 다시 귀속시킬 수 있는 MaterialLot 참조입니다. 기록이 교차 참조하는 라이브 신호들 — 공정 중 checkweigh_g, 아이솔레이터 입자 수 — 은 OPC UA(개방형 기계-대-기계 프로토콜, OPC Unified Architecture, 레거시 Windows-전용 OPC DA가 아님) 위로 도착하며, 그 정보 모델 자체가 평평한 태그가 아니라 타이핑된 객체 그래프입니다. 모든 소스를 하나의 공유 참조 모델 — Book 2의 데이터 그림자(data-shadow)거버넌스(governance) 규율 — 을 통해 매개하는 것이 n-제곱의 쌍별 통합 엉킴을 한 줌의 깨끗한 정렬로 바꾸는 것이며, 그것이 계보를 신뢰할 수 있는 검사 데이터셋과 조인 키가 조용히 어긋나는 CSV 더미 사이의 차이입니다. 모델은 그것이 훈련된 데이터 그림자만큼만 신뢰할 수 있고, 데이터 그림자는 한 바이알에 대한 두 시스템의 이름을 화해 가능하게 유지하는 표준만큼만 신뢰할 수 있습니다.

동결건조: 서두를 수 없는 얼림을 소프트 센싱하기

많은 바이오의약품은 액상으로는 안정하지 않으므로, 충전 후 동결건조(lyophilized) 됩니다 — 고체로 얼린 뒤 깊은 진공 아래 건조하여 얼음이 직접 증기로 승화하게 하고(1차 건조), 그다음 최종의 더 따뜻한 2차-건조 단계가 잔여 결합수를 뽑아내어, 사용 전 재구성되는 건조하고 안정한 케이크를 남깁니다. 동결건조는 느리고(흔히 며칠), 에너지를 많이 먹으며, 가차 없습니다. 너무 공격적으로 건조하면 제품 온도가 부분-건조된 기질이 구조를 잃는 온도 — 유리질의 비결정질(amorphous) 제제에서는 붕괴 온도(collapse temperature), 용질이 결정화하는 제제에서는 더 낮은 공융-용융(eutectic-melt) 온도 — 위로 오르면서 케이크가 무너지거나 제품이 손상됩니다. 어느 쪽이든 넘으면 케이크가 주저앉습니다. 너무 부드럽게 건조하면 며칠의 사이클 시간과 동결고 용량을 낭비합니다. 따라서 사이클 개발과 제어는 양쪽에 진짜 돈과 진짜 제품 위험이 걸린 진정한 최적화 문제입니다 — 정확히 모델링이 값을 하는 종류의 문제입니다.

여기서 학습 표적들은 기계론-소프트-센싱 문제입니다 — 기계론적이란 순수하게 데이터로 학습된 적합과 대비되는, 알려진 물리 방정식(열·물질 전달)에 근거함을 뜻합니다. 1차 건조 중 가장 알고 싶은 양은 승화 전선(sublimation front)에서의 제품 온도1차 건조가 끝나는 순간(모든 자유 얼음이 사라졌을 때)이며, 둘 다 멸균 경계를 침범하지 않고는 모든 바이알에서 측정하기 쉽지 않습니다 — 그리고 둘 수 있는 몇 개의 열전대-계측 바이알은 대표성이 없는데, 프로브가 꽂힌 바이알이 그 이웃들과 다르게 핵형성하고 건조하기 때문입니다. 고전적 접근은 이것들을 챔버 압력, 선반 온도, 그리고 수증기 분압으로부터 추정하며, 이 분야는 건조 케이크를 통과하는 결합된 열-및-물질 전달의 잘 발달된 제일원리 모델(선반 온도, 바이알 열-전달 계수, 건조-층 저항의 함수로서의 승화 계면 온도)을 가집니다. 학습 렌즈는 그 물리 위에 두 가지를 더합니다. 소프트 센서 가 간접 신호들 — 케이크에서 얼마나 많은 수증기가 아직 떠나고 있는지를 지켜보는 여러 독립적이고 전(全)-배치적인 방법들(피라니(Pirani) 게이지는 수증기가 있는 동안 높게 읽고 얼음이 사라지면 참-압력 정전용량 마노미터(capacitance-manometer) 판독값을 향해 떨어집니다; 비교 / 압력-상승 압력측정 온도 측정(manometric-temperature measurement, MTM)은 챔버를 잠시 격리하고 압력 상승을 지켜봅니다; 조율 가능 다이오드-레이저 수증기 분광법은 물 분자를 직접 셉니다), 더하기 승화 속도의 감쇠 — 을 제품 온도의 연속 추정값과 예측된 1차-건조 종점으로 융합하는데, 그 종점은 그 신호들이 모두 평평해지는 순간에 도착하므로, 사이클이 모든 배치에 몇 시간의 여유를 덧붙이는 보수적 고정 시간 대신 올바른 순간에 2차 건조로 전진하게 합니다. MTM과 피라니/정전용량-마노미터 수렴은 학습된 소프트 센서가 대체하는 것이 아니라 그 위에 쌓는, 확립된 전-배치 종점 방법입니다 — ML 렌즈가 확장하는 고전적이고 잘 검증된 선행자입니다.

그리고 사이클의 설계 공간 모델링공정 개발(process development)에서 온 같은 베이지안-최적화와 대리-모델링 논리 — 이 선반-온도 / 챔버-압력 운영 공간을 탐색하여 빠르면서 동시에 제품 온도를 그 붕괴점 안전하게 아래로 유지하는 사이클을 찾고, 다일의 전체 사이클로 이루어진 값비싼 요인 격자를 한 줌의 정보적인 사이클로 대체합니다. 물리가 진정으로 잘 이해되어 있으므로, 강한 수는 하이브리드입니다. 깨끗한 방정식에 저항하는 부분(바이알마다의 이질성, 선반 가장자리 효과, 케이크 형태)을 위한 학습된 성분을 가진 기계론적 열-및-물질-전달 골격으로, 이 책이 디지털 트윈 장(digital-twins chapter)에서 돌아가는 지배적 패러다임입니다.

용기-마개 무결성과 클린룸

두 가지 충전-마감 표적이 그림을 마저 채우며, 둘 다 성숙 곡선에서 더 이른 쪽입니다. 용기-마개 무결성 시험(container-closure integrity testing, CCIT) 은 바이알과 그 마개 사이의 봉합이 실제로 유지되는지를 묻습니다 — 누출은 손상된 멸균 장벽을, 그리고 동결건조 제품의 경우 케이크를 망치는 잃어버린 진공을 뜻합니다. 비파괴 CCIT 방법 — USP <1207>이 이제 수명주기 무결성을 위해 확률적 미생물-침입 및 염료 시험보다 선호하는 결정론적, 물리화학적 부류: 레이저 기반 헤드스페이스 가스 분석, 고전압 누출 탐지, 진공 감쇠, 질량 추출 — 은 분류기가 합격/불합격에 매핑하도록 학습할 수 있는 연속 신호를 만들며, 체크웨이어가 한계적 충전을 표시하는 방식으로 한계적 봉합을 표시하기 위해 이 인라인 게이지 위에 ML이 얹히고 있습니다. 그 결정론적, 연속-신호 선호가 바로 CCIT가 그럴듯하고 현재적인 ML 표적인 이유입니다. 학습에 가장 적합한 방법들이 약전이 이제 권장하는 바로 그것들입니다. 이 책 나머지의 같은 기댓값-대비-잔차 논리가 적용됩니다. 헤드스페이스 산소나 수분 시그니처가 집단에서 표류하는 봉합은 아직 단단한 한계를 넘지 않았더라도 의심스럽습니다 — 마개-안착 문제가 실패한 단위를 만들기 전에 그것을 잡는 선행 지표입니다.

무균과 아이솔레이터 환경 모니터링 이 다른 최전선입니다. 충전은 등급-A 아이솔레이터(개방 무균 작업에 배정되는 가장 깨끗한 공기 등급) 안에서 일어나며, 비생존 입자(무생물 미립자)와 생존 오염(살아 있는 미생물)에 대해 연속적으로 모니터링됩니다 — 정확히 QC 장(QC chapter)이 그 심은 등급-A 일탈과 함께 의지하는 em_samples.csv 데이터입니다. 학습 기회는 오염-위험 예측입니다. 입자 수, 압력 차, 기류, 그리고 회복 패턴을 다변량 스트림으로 다루어, 경보 후 반응하는 대신 일탈(excursion — 측정값이 허용 범위 밖으로 벗어남)이 한계를 깨기 전에 그것을 예측하는 것입니다. 이것은 제어가 아니라 모니터링입니다 — 규제기관이 지지하는 인간-개입, 자문 범주에 정확히 있습니다 — 그리고 그것은 자율-제어 군집에서는 대부분 그렇지 않은 것과 대조적으로, 제약에서 ML이 오늘날 진정으로 사는 상용-기울어진 군집(모니터링과 이상탐지) 중 하나입니다 [2].

미해결 과제: 검증-대-학습 역설

여기서 정직한 미해결 과제는 빠진 알고리즘이 아닙니다. 그것은 규제된 AI의 심장에 있는 모순이며, AVI는 그것이 가장 세게 무는 곳인데, AVI가 바로 모델의 결정이 실제로 스스로 서는 곳이기 때문입니다 — 상류 역가 추정값에 그러하듯 나쁜 판정을 잡아 줄 인간 소프트-센서 소비자가 하류에 없습니다. 불합격은 폐기 통으로, 합격은 환자를 향해 가고, 모델의 판단이 게이트입니다.

모순은 이것입니다. 기계학습을 가치 있게 만드는 것은 그것이 계속 학습할 수 있다는 점입니다 — 새 결함 유형을 보고, 새 바이알 기하에 적응하고, 더 많은 라벨 붙은 이미지가 누적될수록 개선됩니다(그리고 AVI 라인은 모든 교대마다, 모든 인간-판정 경계선상 바이알과 함께 그것들을 누적합니다). 규제된 공정을 신뢰할 만하게 만드는 것은 그것이 통제 없이는 바뀌지 않는다는 점입니다. 검증된 시스템은 그것이 검증되었을 때 행동한 방식대로, 매번 행동해야 하며, 그렇지 않으면 검증은 무의미합니다. 계속 학습하는 모델은 정의상 움직이는 표적이며, 전통적 일회성 검증이 결코 그것을 위해 만들어지지 않았습니다 — 당신이 인증한 이후로 가중치가 바뀐 것의 행동을 인증할 수는 없습니다. Amgen은 자신의 AVI 여정을 정확히 이 긴장 — 검증-대-학습 역설 — 둘레로 명시적으로 틀잡았으며, 그것과 규제기관이 수렴한 해법은 검증 시점에 모델을 잠그는 것(lock the model at validation) 입니다(여기서 검증은 그 엄격한 GMP 의미를 띱니다 — 시스템이 의도대로 일관되게 수행함을 입증하는 문서화된 증거로, GMP 소프트웨어가 사용 전에 통과해야 하는 규제 기준선입니다). 가중치를 동결하고, 동결된 산출물을 다른 어떤 GMP 소프트웨어처럼 검증하며, 오직 형식적이고 미리 계획된 변경 관리 절차를 통해서만 그것을 갱신하는 것입니다 [1][6]. vision_avi.py 스케치는 정확히 이것을 실연합니다 — eval() 더하기 requires_grad_(False) — 코딩 세부가 아니라 실행 가능하게 만들어진 규제 자세로서.

이를 둘러싼 규제 틀은 이제 날카롭습니다. FDA의 위험 기반 신뢰성 틀 — 주어진 사용 맥락에 대한 AI 모델의 신뢰성을 확립하기 위한 7단계 접근으로, AI 출력이 제품 품질에 영향을 주는 제조 단계를 명시적으로 다룸 — 은 당신이 가져와야 할 증거를 결정의 결과에 맞춰 조정합니다. 멸균 주사제를 자동 출하하는 AVI 모델은 고-결과 끝에 앉아 그에 상응하는 무거운 증거 부담을 집니다 [7]. 초안 EU/PIC/S GMP Annex 22(부속서 — 주제별 부록 — 으로, EU와 국제 의약품실사상호협력기구(Pharmaceutical Inspection Co-operation Scheme)가 공유하는 GMP 규칙에 붙음), 최초의 제조-특화 AI 규칙은 임계 응용에 대해 더 나아갑니다. 그것은 오직 정적이고 결정론적인 모델만을 허용하고 동적, 연속-학습, 확률적, 생성형 AI를 임계 GMP 사용에서 배제하며, 미리 정해진 변경-관리 계획에 의해 다스려지는, 검증 시점에 잠긴 모델을 요구합니다 [8][9]. 그리고 인간-검토 경계를 무시한 결과는 더 이상 가설이 아닙니다. 2026년 4월, FDA는 품질-부서 검토 없이 AI 에이전트를 써서 규격과 생산 기록을 생성한 회사 Purolea에 최초의 AI-인용 cGMP(current GMP, 현행 GMP) 경고장 — 규제 위반에 대한 공식 시행 통지 — 을 발부했습니다 [10].

그래서 역설은 해결된 것이 아니라 관리됩니다. 모델을 잠그는 것은 ML을 동기 부여했던 바로 그 적응성을 대가로 검증 가능성을 삽니다. 이제 모든 개선이 재검증을 들이고, 재검증 사이의 몇 달은 이 분야의 최선의 새 아이디어가 쓰이지 않은 채 앉아 있는 몇 달입니다. 진정으로 열린 질문은 미리-정해진-변경-관리-계획 개념이 가리키기만 한 것들입니다. 모델의 허용된 진화를 검증할 만큼 충분히 빠듯하게, 그러면서도 유용할 만큼 충분히 느슨하게 어떻게 미리 명세하는가; 잠긴 AVI 모델이 — 새 유리 공급업체, 새 조명 전구, 결코 훈련된 적 없는 새 미립자 유형으로 — 진짜 결함을 놓치기 전에 조용히 쇠퇴했음을, 잠긴 모델이 구조상 결코 자신이 뒤처졌다고 말해 주지 않는다는 점을 고려할 때, 어떻게 탐지하는가; 그리고 합격/불합격 판단 중 얼마나 많은 부분이 책임 있게 인간을 완전히 떠날 수 있는가. 95%-자동 출하 숫자는 실재하고 인상적입니다 — 그리고 인간에게 라우팅된 나머지 5%는 반올림 오차가 아닙니다. 그것은 바이오 제조에서 가장 강력한 상용 ML 사례조차 의도적으로 사람을 루프 안에 둔다는 상존하는 시인입니다.

이 장이 모델 모음에 더하는 것

이 장은 examples/platform/ml/에 두 개의 모듈을 기여하며, 그것들은 정반대 논점을 만드는 의도적으로 짝지어진 쌍입니다:

  • fill_control.py — 실제 fill_events.csv 라인 위의 충전-중량 제어와 불합격 모델. 그것은 운전 내 이동범위로부터 개별값 관리한계를, 라인 자신의 통계로부터 용량 정확도 Cpk를 유도하고, 그다음 478-대-2 불균형에 클래스-균형 로지스틱 분류기를 훈련하여 학습된 임계값이 고정 체크웨잉 한계를 되찾을 뿐(tp=2, fn=0)이면서 41개의 거짓 불합격과 검증 부담을 더한다는 것을 보여 줍니다. 정직한 교훈은 통과하는 단언으로 부호화됩니다. 고정 한계가 모든 낮은-충전 바이알을 과잉 불합격 없이 잡고; ML은 여기서 탐지를 개선하지 않는다.
  • vision_avi.py — 자동 외관 검사를 위한 CNN 스케치. 데이터셋에 바이알 이미지가 없으므로, 그것은 아키텍처와 형상 계약(128×128 흑백 ROI 위 6-클래스 결함 헤드, 23,910개 매개변수)을 고정하고, 잠긴-모델 규율을 구현하기 위해 동결된 가중치로 eval() 모드에서 한 번의 순방향 패스를 돌리며, 모든 실세계 성능 숫자(Amgen ~95% 자동 출하)를 벤더/자체보고로 표시합니다. 그 기록된 기준은 임계값 위의 재현율 — 배포된 프로그램이 통과해야 하는 안전-임계 지표 — 이지만, 라벨 붙은 이미지가 없으므로 스케치는 보류 재현율이 아니라 형상 계약만을 단언합니다. 다른 곳의 게이트된 모듈들은 보류 지표가 존재하는 경우 그것을 실제 보류 지표로, 존재하지 않는 경우 구조적 보증(여기서는 바이알별 6-클래스 형상 계약)으로 자신의 합격 기준을 단언합니다.

함께 이들은 이 장의 양면 명제를 부호화합니다. 충전-마감에서의 ML은 때로 잘못된 도구이고(충전 중량) 때로는 이 책 전체에서 가장 강력한 도구입니다(비전) — 그리고 그 둘을 분간하는 것이 기량입니다.

두 모듈 모두 모음의 오픈소스 재현성 계약 아래 돌아가며, 그것 자체가 정직함의 일부입니다. vision_avi.py는 대역 ROI와 가중치를 시드하여(torch.manual_seed(2026)) 인쇄된 형상과 매개변수 수가 기계마다 바이트-안정하게 합니다. fill_control.py는 커밋된 fill_events.csv 위에서 결정론적입니다. 모음 전체가 의존성 버전을 고정하고 run_all.py 아래 처음부터 끝까지 돌아가므로, 심사자는 인쇄된 숫자를 믿음으로 받는 대신 재현합니다 — 오픈소스 분석 스택(open-source analytics stack)이 누군가에게 신뢰해 달라고 요청하는 모델의 입장료로 다루는 같은 고정-시드, 버전-고정 규율입니다. 그 이면을 분명히 말하면, 데이터셋에 진짜 바이알 이미지가 실리지 않으므로 vision_avi.py는 훈련된 분류기가 아니라 형상 계약을 고정하는 스케치로 있고 또 머뭅니다 — 그리고 진짜 AVI 점수를 인정 가능하게 만들 데이터-분할 거버넌스(위의 계보로 키잉된 leave-one-batch-out 그룹화)는 이 CSV의 컬럼이 아니라 온톨로지의 계보에 삽니다. 오픈 동반물은 정직한 골격을 보여 줍니다. 규제된 결함 라이브러리와 검증된 가중치는 교과서가 실을 수 없는 부분입니다.

왜 중요한가

충전-마감은 기계학습이 약속이기를 멈추고 일상이 되는 곳입니다. 단위의 이산성, 이진 결정, 그리고 결함의 가시성이 함께 이곳을, 학습된 모델의 판단이 — 다년의, 면밀히 검증된 프로그램 후에 — 상업적 GMP에서 스스로 설 수 있는 유일한 작업으로 만듭니다. AVI 프로그램을 제대로 잡으면 훨씬 적은 양품 약을 폐기하면서 더 많은 진짜 결함을 탐지하는데, 그것은 안전 승리(더 높은 재현율)이자 막대한 경제 승리(옛 거짓-불합격률의 일부)입니다. 충전-중량 문제를 그것을 과잉 설계하지 않음으로써 제대로 잡으면, 검증 부담을 마땅한 자리에 둡니다. 그리고 검증-대-학습 규율을 둘 모두에 관철하면 — 잠긴 모델, 인간-개입 라우팅, 미리 정해진 변경 관리 — 공장의 다른 모든 곳에서 ML이 신뢰를 얻는 방식의 템플릿을 가지게 됩니다. 충전-마감은 바이오 제조의 나머지 ML 야망이 그에 견주어 측정되는 개념 증명입니다.

실제 현장에서는

가장 깊은 상용 배포는 Amgen의 것입니다. 자동 외관 검사를 통해 출하되는 주사기와 바이알의 대략 95%로, 검증-대-학습 역설 둘레로 구축되고 직접적 FDA 관여를 동반한 다년 노력의 결과이며, 푸에르토리코 Juncos의 주사기 라인에서 처음 검증되었습니다(벤더 자체보고; 더 보수적으로 발표된 임계-작업대 수치는 ~70% 더 높은 입자 탐지와 ~60% 더 적은 거짓 불합격) [1]. 장비 쪽에서, 심층학습 AVI는 실재하고 경쟁적인 제품 시장입니다 — Stevanato Vision AI, Brevetti CEA(그 Brevetti AI / Criterion AI 인수를 통해), Syntegon AIM, Cognex, Antares Vision, Körber, 그리고 Microsoft Bonsai가 모두 그 안에서 또는 인접해서 구축합니다 — 그것들이 대체하는 규칙 기반 기계보다 한 자릿수 더 적은 거짓 불합격과 실질적으로 더 높은 입자 탐지라는 벤더 보고 이득과 함께 [4][5]. 동결건조 사이클 모델링과 건조 종점의 소프트 센싱은 사이클 개발에서 성숙해 있고 점점 제어에서도 그렇습니다; CCIT-ML과 클린룸 오염-위험 예측은 더 이르며, 제약 ML이 진정으로 전진하고 있는 모니터링 군집에 있습니다. 그 모든 것을 통일하는 것은 이제 제조에서 AI 둘레로 굳어지고 있는 규제 자세입니다 — FDA 신뢰성 틀, 초안 Annex 22의 적응형과 생성형 AI를 임계 사용에서 배제함, 그리고 시행 닻으로서의 Purolea 경고장 — 그것들이 함께, 모호함 없이, 모델은 똑똑할지 몰라도 약의 안전은 여전히 잠긴 산출물과 책임을 질 수 있는 인간에게 달려 있다고 말합니다 [7][8][10].

핵심 용어

  • GMP(Good Manufacturing Practice) — 고정되고 검증된 절차로 약을 만들어야 하는, 법적 구속력 있고 규제기관이 사찰하는 규칙; "cGMP"는 시행 중인 현행(current) GMP.
  • CQA(Critical Quality Attribute, 핵심 품질 속성) — 제품이 안전하고 효과적이려면 범위 안에 머물러야 하는 제품 속성(순도, 역가, 용량).
  • 소프트 센서(Soft sensor) — 측정하기 어려운 양(여기서는 제품 온도, 또는 1차-건조 종점)을 다른 더 쉬운 신호로부터 추정하는 소프트웨어.
  • 충전-마감(Fill-finish) — 벌크 원액을 최종 용기(바이알, 주사기)에 분주하고, 선택적으로 동결건조하고, 검사하고, 통과한 단위를 약물제품 로트로 출하하는 작업.
  • 자동 외관 검사(automated visual inspection, AVI) — 미립자와 결함에 대한 모든 용기의 카메라-플러스-소프트웨어 검사; 심층학습 버전이 바이오 제조에서 가장 강력한 상용 ML 사례.
  • 합성곱 신경망(convolutional neural network, CNN) — AVI에 쓰이는 이미지-분류 모델 부류로, 그 합성곱 계층이 표 기반 모델로는 불가능한, 가중치-공유 필터를 통해 국소-에서-전역 공간 특징(티끌, 가장자리, 메니스커스)을 학습함.
  • 결함 라이브러리(defect library) — 모든 결함 유형과 심각도의 큐레이션되고 라벨 붙은 이미지 집합(심은 결함과 인간-판정 지상 진실 포함)으로, AVI 모델을 훈련하고 — 결정적으로 — 검증하는 데 쓰임; AVI 프로그램의 진짜 병목.
  • 재현율(민감도)(Recall (sensitivity)) — 모델이 잡는, 진정으로 결함인 바이알의 분획; AVI의 안전-임계 지표이자 배포된 프로그램이 통과해야 하는 합격 게이트인데(vision_avi.py 스케치는 그것을 의도된 기준으로 기록하지만, 라벨 붙은 이미지가 없으므로 형상 계약만을 단언함), 놓친 결함이 거짓 불합격보다 훨씬 나쁘기 때문.
  • 거짓 불합격(과잉 불합격)(False reject (over-rejection)) — 양품 단위를 폐기함; 심층학습 AVI가 가장 많이 줄이는, 인간과 규칙 기반 검사의 만성적 실패.
  • 공정 중 제어(IPC) 체크웨이어(In-process-control (IPC) checkweigher) — 일반적으로 ±5% 규격에 대해 용량 정확도를 확인하기 위해 충전된 바이알의 무게를 재는 게이지; ML이 아니라 통계로 가장 잘 풀리는 제어 문제.
  • 능력 지수(Cpk)(Capability index (Cpk)) — 공정 평균에서 더 가까운 규격 가장자리까지 3 시그마 단위로 잰 거리; 우리 충전 라인은 Cpk 0.84 근처, 능력 바닥선 1.33 아래에 앉아 있고, 그것이 가끔 바이알을 불합격시키는 이유.
  • 동결건조(freeze-drying)(Lyophilization (freeze-drying)) — 제품을 얼린 뒤 진공-승화하여 안정한 케이크로 만듦; 학습 표적은 제품-온도 소프트 센싱, 1차-건조-종점 예측, 그리고 사이클 설계-공간 최적화.
  • 용기-마개 무결성 시험(container-closure integrity testing, CCIT) — 바이알-마개 봉합이 유지되는지의 비파괴 검증; 떠오르는 ML/이상-탐지 표적.
  • 잠긴 모델(locked model) — 가중치가 검증 시점에 동결되고(여기서는 eval() 더하기 무-기울기) 미리 정해진 변경-관리 계획을 통해서만 바뀌는 모델; 검증-대-학습 역설의 규제적 해법.
  • 검증-대-학습 역설(validation-versus-learning paradox) — ML의 가치는 적응에 있는 반면 GMP의 신뢰는 바뀌지 않음을 요구한다는 모순; 모델을 잠금으로써 관리되되 결코 완전히 해결되지 않음.
  • 미리 정해진 변경-관리 계획(predetermined change-control plan, PCCP) — 모델이 어떻게 갱신될 수 있는지에 대한, 미리 명세되고 미리 검증된 봉투(envelope)로, 그래서 개선이 매번 임시 재검증을 요구하지 않음.
  • 연속체 / 발생체(continuant / occurrent) — 지속하는 것(일련번호 바이알)을 일어남(그것을 판정한 검사 사건)과 범주적으로 구별되게 유지하는 BFO 상위-온톨로지 절단; 둘을 융합하면 계보와 재검사가 깨짐.
  • 의미적으로 근거된 특징(semantically-grounded feature) — 깨지기 쉬운 컬럼 이름이 아니라 온톨로지 IRI(bp:acceptConfidence)와 타이핑된 객체 속성으로 당겨지는 모델 입력으로, 그래서 스키마 변경이 학습기 아래에서 그것의 이름을 조용히 바꿀 수 없음.
  • 훈련 세트 위의 SHACL 게이트 — 같은 닫힌-세계 출하-게이트 형상(release-gate shape)을 후보 훈련 하위그래프를 향하게 하여, 조용히 빠진 필수 특징을 가진 데이터셋을 모델이 그 위에 훈련되기 에, 후가 아니라, 거부함.
  • leave-one-batch-out(그룹화) 검증 — 계보로 키잉하여, 재훈련된 AVI 모델을 한 번에 통째로 derivedFrom-연결된 계보를 보류함으로써 채점하는 것으로, 그래서 거의-쌍둥이 형제 바이알이 훈련/시험 분할을 넘어 누출해 재현율을 부풀릴 수 없음.
  • ISA-95 / B2MML / OPC UA — 검사 기록의 MaterialLot과 라이브 신호가 각 바이알을 명명하는 한 IRI로 화해되게 해 주는, 공장 데이터-모델 표준(IEC 62264), 그 XML 직렬화, 그리고 개방형 기계-대-기계 프로토콜(OPC Unified Architecture, 레거시 OPC DA가 아님).

다음 이야기

바이알이 충전되고, 건조되고, 검사되고, 양품이 세어졌습니다 — 그러나 로트가 출하되기 전까지는 어떤 단위도 출고되지 않습니다. 다음 장 QC와 출하: MSPC, 실시간 출하, 그리고 OOS 예측하기(QC and Release: MSPC, Real-Time Release, and Predicting the OOS)는 모든 배치가 통과해야 하는 게이트로 향합니다. hplc_results.csv 패널의 출하 분석, 황금 배치(golden batch)에 대한 다변량 통계 공정 모니터링, 종말 시험을 모델로 대체하는 실시간 출하 시험, 그리고 모든 것 중 가장 어려운 학습 문제 — 일어나기 전에 규격 외(out-of-specification) 결과를 예측하기, 하나뿐인 OOS 형제 BATCH-2026-004를 예로 삼아.