본문으로 건너뛰기

러닝 예제와 증명 하니스

📍 현재 위치: 제1부 · 명세 — 두 번째 행마. (이 책은 온톨로지 구축 생애주기로 구성됩니다: 명세, 재사용, 개념화 등 이름 붙은 단계들의 순서이며, 각 장이 차례로 그 단계를 밟습니다. 명세는 첫 번째 단계로, 모델을 짓기 전에 그것이 무엇을 해야 하는지를 못 박는 일입니다.) 요구사항은 작성되었습니다. 이제 책 전체가 모델링하는 단 하나의 캠페인과, 그것을 담는 파일들, 그리고 그 모델이 자신의 역량 질문 23개에 답함을 증명하는 하니스를 만나 봅니다.

앞 장은 온톨로지 — 분리된 시스템들이 같은 대상을 같은 이름으로 부르게 해 주는, 공유되고 기계로 검사 가능한 어휘 — 가 무엇을 답해야 하는지를 적어 두었습니다. 이 장은 무엇에 대해 답하는지를 소개합니다 — 단 하나의 단일클론항체 제조 캠페인, 시리즈의 나머지가 따라가는 바로 그 배치 — 그리고 ORSD(Ontology Requirements Specification Document — 모델이 답할 수 있어야 하는 평이한 영어 질문인 역량 질문들의 명세서)를 정직하게 유지하는 실행 가능한 증명 하니스를. 이 책의 모든 Turtle(모델이 작성되는 텍스트 형식), SPARQL(역량 질문을 던지는 질의 언어), SHACL(게이트가 작성되는 규칙 언어) 조각은 여기서 소개하는 파일들의 진짜 발췌이며, 카탈로그의 모든 역량 질문은 그 파일들이 통과하는 테스트입니다.

쉽게 말하면

이 책은 십수 개의 장난감 예제 대신 하나의 약을 처음부터 끝까지 따라갑니다. 모든 전문의가 주석을 다는 한 환자의 차트처럼 말입니다. 얼린 세포 한 바이알이 배치가 되고, 정제된 원료의약품이 되고, 충전된 바이알이 됩니다 — 그리고 각 단계마다 차트에 몇 가지 사실이 더해집니다. "증명 하니스"는 그저 차트 전체를 다시 읽어서 명세서의 23개 질문에 여전히 답이 있는지 확인하는 프로그램입니다. 사실 하나를 바꾸면, 프로그램은 어떤 질문을 망가뜨렸는지 알려 줍니다.

역량 질문이 실행 가능한 테스트로 바뀌는 4단계 파이프라인 도해: 자연어 역량 질문 상자(CQ-04, 영향)에서 시작해, queries/CQ-04.rq라고 표시된 SPARQL 질의 상자로 화살표가 이어지고, cq-catalog.json을 읽어 모든 역량 질문을 실행하는 validate.py 상자로, 다시 결과가 기대 답과 대조되는 초록색 CQ-04 PASS 상자로 화살표가 이어집니다. PASS 상자에서 질문으로 돌아가는 초록색 회귀 루프가 있어, 요구사항은 변경이 있을 때마다 다시 실행되는 테스트이며 빌드를 통과하려면 23개 모두 초록색을 유지해야 함을 표시합니다. 하단 주석은 cq-catalog.json이 23개 역량 질문 전부를 각각 SPARQL 질의, SHACL 게이트, 또는 추론기 검사에 묶는다고 적습니다. 테스트로서의 요구사항: 각 역량 질문은 cq-catalog.json 안에서 그것에 답하는 산출물에 묶이며, validate.py는 23개 전부를 통과/실패 인수 테스트로 실행합니다. 저자가 AI의 도움을 받아 직접 제작한 그림입니다.

그림은 단 하나의 역량 질문 CQ-04를 처음부터 끝까지 따라갑니다 — 23개 중 가장 조사자 친화적이고(로트가 실패할 때, 또 무엇이 그 계보를 공유하는가?) 그래프 전체가 그 위에 지어진 전이적 derivedFrom 순회를 온전히 행사하기에 안내자로 골랐습니다(전이적 = 그 관계가 사슬처럼 이어지므로, 따라가면 부모뿐 아니라 모든 조상에 닿습니다; 아래 계보가 이를 구체화합니다). 나머지 22개도 동일한 루프를 타며, 가운데 상자에 어떤 산출물 — SPARQL 질의(그래프에 질문을 던짐), SHACL 게이트(데이터가 만족해야 하는 규칙), 또는 추론기 검사(모델이 도출하는 사실) — 이 들어가느냐만 다릅니다. 그 가운데 두 상자는 앞 장의 cq-catalog.json에 있던 CQ-04 항목을 실제로 실행한 것입니다. 거기서 본 query: CQ-04.rqcheck: equals [DP-001, DP-002]가 바로 아래 하니스 출력의 CQ-04 … affected = [DP-001, DP-002] PASS 줄입니다.

하나의 캠페인, 처음부터 끝까지

대부분의 온톨로지 튜토리얼은 서로 무관한 십수 개의 장난감 예제를 흩뿌립니다. 이 책은 정반대에 겁니다 — 하나의 캠페인을 남김없이 모델링하여, 모든 클래스가 동일한 구체적 그래프에 비추어 제 자리를 얻고 독자가 장마다 도메인을 다시 배우지 않아도 되게 합니다. 러닝 예제는 하나의 CHO 세포 단일클론항체로 — 승인된 바이오의약품 대다수가 만들어지는 플랫폼 공정이며, 예제가 특이하기보다 전이되도록 골랐습니다 — 발견 표적에서 환자의 콜드체인 바이알까지 운반됩니다. (아래의 제조 용어가 낯설다면 — CHO 세포, 단일클론항체, 세포 은행, 시드 트레인, Protein A 포획, 바이러스 제거, 원료의약품 대 완제의약품 — 1권이 세포에서 바이알까지의 물리적 사슬 전체를 평이한 언어로 짚습니다: 바이오의약품이란 무엇인가엔드투엔드 바이오공정 개요를 보세요. 여기서는 그 순서와 계보 간선만 있으면 됩니다.) 그 계보는 그래프 전체가 매달리는 척추입니다:

리서치 세포 은행 RCB-CHO-001이 마스터 세포 은행 MCB-CHO-001으로, 다시 워킹 세포 은행 WCB-CHO-001으로 적격성 확인을 거쳐 올라갑니다; 그 워킹 은행의 바이알 하나가 진탕 플라스크 SEEDFLASK-001과 시드 생물반응기 SEED-001을 거쳐 확장되고, 이는 생산 생물반응기 배치 BATCH-2026-001에 접종되며, 그 수확물은 청징(CLAR-001)되고 Protein A로 포획(PApool-001)되며, 바이러스가 제거(VIpool-001, VFpool-001)되고, 폴리싱(POLpool-001)되며, 원료의약품 로트 DS-001으로 농축되어, 완제의약품 로트 DP-001DP-002로 충전됩니다.

그 전체 사슬 — RCB → MCB → WCB → SEEDFLASK → SEED → BATCH → CLAR → PApool → VIpool → VFpool → POLpool, 즉 DS-001 위의 열한 개 물질 — 이 바로 CQ-01이 원료의약품 로트에서 위로 (bp:derivedFrom)+를 순회할 때 반환하는 것입니다. (끝의 +는 "derivedFrom 간선을 한 걸음 이상 따라가라"는 뜻이어서, 한 번의 질의로 직속 부모뿐 아니라 모든 조상에 닿습니다.)

이 척추 위의 각 단계는 1권이 온전히 짚는 실제 단위 조작입니다 — 세포 은행시드 트레인, 생산 생물반응기, 이어 수확과 청징, Protein A 포획, 바이러스 제거, 폴리싱, 그리고 완제의약품 바이알로 충전되는 원료의약품으로의 농축까지; 여기서는 그 순서와 계보 간선만 있으면 됩니다.

각 화살표는 하나의 bp:derivedFrom 간선이 됩니다. 그 관계가 전이적이기 때문에, 모든 중간 노드가 그 사이에 놓여 있어도 DS-001은 단 한 번의 순회로 WCB-CHO-001까지 거슬러 올라갑니다 — 바로 이것이 CQ-01과 CQ-02를 답 가능하게 만드는 것입니다. 이 캠페인은 또한 의도적으로 규격 이탈 형제(out-of-spec sibling) — 승인된 출하 한계를 벗어나는 검사 결과로, 정식 조사의 방아쇠 — 를 함께 가지고 있는데, 이는 같은 워킹 세포 은행에서 출발하되 별도의 시드 트레인을 내려가는 병행 캠페인입니다: WCB-CHO-001SEED-004를 시드하고, 이것이 BATCH-2026-004에 접종되며, PApool-004로 포획되고, 원료의약품 로트 DS-004로 농축되어 완제의약품 로트 DP-004로 충전됩니다. 그 실제 실패 양상은 구체적입니다: SEC 단량체는 규격 내(98.687 %)이지만, HMW 응집체는 규격 이탈 — 최대 2.0 % 출하 한계(로트가 출하되려면 충족해야 하는 사전 승인 기준)에 대해 2.41 % — 이어서, 다른 모든 값이 정상인 채 하나의 속성, 하나의 경로에서 실패합니다. 이 OOS 로트가 바로 조사자가 실제로 던지는 질문 — 이 로트의 계보를 또 무엇이 공유하는가? (CQ-04, 공유 WCB-CHO-001까지 위로 올라가 규격 내 형제 DP-001/DP-002로 다시 내려옵니다) — 에 모델이 답하게 해 주는 것이며, 출하 게이트가 그 실패가 정확히 한 경로에 격리됨을 (CQ-11, [hmwPct]에서 OOS [DP-004, DS-004]) 보여 줄 수 있게 해 주는 것입니다. 이 형제는 일부러 실패시킨 것입니다. 모든 것이 통과하는 캠페인이라면 영향 추적(CQ-04)이나 출하 게이트(CQ-11) 질문을 단 한 번도 행사하지 못합니다 — 모델은 한 번도 시험받지 않은 채 그것들에 답한다고 주장할 수 있게 됩니다. 외과적으로 격리된 단 하나의 실패 — 하나의 속성, 하나의 경로, 나머지는 전부 정상 — 가 행복 경로가 아니라 그 기계 장치를 증명하는 가장 작은 사례입니다.

(위의 계보는 의도적인 단순화입니다: 이 헤드라인 척추는 하중을 지는 계보를 명명하며, 후속 장들은 그것이 단축한 단계들을 상술합니다 — 청징 단계 CLAR-001, 직교 바이러스 제거 풀 VIpool-001/VFpool-001, 폴리싱 풀 POLpool-001이 각각 자체의 워크드 예제를 갖습니다.)

그 로트들이 무엇을 위한 것인지 한마디 덧붙입니다. 캠페인 전반에 엮인 숫자들은 원료의약품의 핵심 품질 속성(CQA) — 안전성이나 유효성에 중요한 측정 가능한 성질 — 이며, 각각 실제 출하 의미를 갖습니다: SEC 단량체 / HMW 응집체(응집은 인정된 면역원성 위험이며 — 뭉친 항체는 환자에게 면역 반응을 유발할 수 있으므로 — HMW는 최대 2.0 %로 상한이 설정됩니다. DP-004가 위반하는 한계입니다), CEX 주피크(탈아미드화와 C-말단 라이신을 추적하는 전하 변이체 지문으로, 60–80 %로 한정되며 여기서는 70.686 %), 그리고 공정 관련 불순물인 숙주세포 단백질(최대 100 ppm — 백만분율 — 여기서는 12 ppm)과 잔류 DNA(겉치레가 아닌 환자 안전 한계)입니다. 이들 분석법의 깊은 화학은 1권의 분석 장에 있고, 여기서는 그저 게이트가 검사하는 속성일 뿐입니다. 이들은 핵심 공정 파라미터(CPP) — 라인에서 당신이 제어하는 설정값, 여기서는 배양 온도(설정점 36.5 °C)와 피드 속도(설정점 0.40 용기-부피/일) — 에 의해 구동되며, 각각 bp:affectsQuality bp:MonomerPct-CQA(즉 이 파라미터가 단량체 비율 품질 속성에 영향을 줌)로 선언되고 정상 운전 범위와 입증된 허용 범위를 지니므로, 당신이 설정하는 파라미터에서 당신이 측정하는 속성으로의 연결 그 자체가 순회 가능합니다 (CQ-06, CQ-07). 그것 — 당신이 설정하는 파라미터, 당신이 측정하는 속성, 그리고 둘을 묶는 한계들 — 이 축소판으로 본 이 캠페인의 관리 전략입니다.

여기서 또한 이 책의 핵심 문제가 처음으로 물어 옵니다: 그 사실들을 한곳에 모두 담는 단일 시스템은 없으며, 각 시스템은 저마다의 형식으로 기록합니다. 배양 온도와 피드 속도는 히스토리안 / OPC UA 계층(시계열 데이터베이스와, 거기에 데이터를 공급하는 산업용 센서 프로토콜)에 UCUM 단위 문자열(Cel이나 1/d 같은 단위의 표준 코드)을 지닌 태그(BR101.Temp.PV, BR101.Feed.PV)로 존재합니다; 배치 계보와 BATCH-2026-001배치라는 단언은 MES / 전자 배치 기록(배치가 진행되는 대로 각 배치를 기록하는 제조 실행 시스템 — bp:BatchRegister)에서 옵니다; CQA 결과와 워킹 은행의 계대 수는 LIMS / ELN(랩의 결과·노트북 시스템 — bp:ELN)에서 옵니다. 이 시스템들과 그 사이의 프로토콜은 오픈소스 자매 책의 주제입니다; 여기서는 각각이 자기만의 사적 방언을 말한다는 것, 그리고 그것들이 같은 대상을 가리키도록 만드는 것이 온톨로지의 일이라는 것으로 충분합니다.

이 책 전체에서 여러분이 이미 본 bp: 접두어(bp:derivedFrom, bp:BatchRegister)는 네임스페이스 — 우리 용어를 유일하게 명명하는 주소의 약칭으로, 여기서는 예시용 https://example.org/bioproc# — 입니다. 이는 오픈소스 자매 책이 쓰는 것과 동일하므로, 여기의 클래스("Batch"나 "Bioreactor" 같은 사물의 범주)는 거기의 클래스와 같습니다.

데이터셋: 하나로 로드되는 여섯 파일

캠페인은 examples/platform/ontology/에, 하나의 RDF 그래프로 파싱되는 작은 파일 묶음으로 살아 있습니다. (RDF — Resource Description Framework — 는 모든 사실을 주어–술어–목적어 트리플로 모델링하므로, 데이터셋 전체가 말 그대로 연결된 노드의 그물입니다; 이것이 책 나머지가 그 위에 지어진 데이터 모델이며, 아래에서 하니스가 세는 단위입니다.)

파일담는 내용
bioproc.ttl로컬 bp: 어휘 — BFO 척추(Material / Equipment / Quality / RealizableEntity / InformationArtifact / Process) 전반에 걸친 클래스와 관계, 그리고 그것을 떠받치는 OWL 공리
align.ttl공개 온톨로지로의 정렬 — BFO, IOF Core 및 biopharma, OBO 생물학, Allotrope, QUDT, PROV, SOSA(제2부의 주제) — 그리고 동반 데이터 책이 그라운딩하는 제조 데이터 모델 표준으로의 정렬: ISA-95의 장비 계층과 B2MML의 배치 어휘이며, 그래서 bp:BatchRegister 노드는 ISA-95/B2MML 기록이 맡을 역할과 동일한 역할을 지닙니다
instances.ttl개체로서의 러닝 예제 — 위 계보의 모든 노드, 더하여 설계 공간, 분석, 출하 패널, 일련화, 유통, 출처
shapes.ttlSHACL 게이트 — 출하 규격, 완제 게이트, 세포 은행 게이트, 그리고 disjointness 가드
cq-catalog.json실행 가능한 ORSD — 23개 역량 질문, 각각 그것에 답하는 산출물에 묶임
queries/CQ-*.rq질의 기반 역량 질문 하나당 SPARQL 파일 하나

Turtle, SPARQL, JSON은 언어 중립적이므로, 한국어판은 바로 그 동일한 파일들을 인용합니다 — 모델의 번역본은 없고, 오직 그 주변 산문만 번역됩니다.

하니스: validate.py

산문 요구사항은 썩습니다. 한 파일에 적힌 요구서와 다른 파일에 지어진 모델은 조용히 어긋나고, 검토자가 그 틈에 부딪힐 때까지 아무도 알아채지 못합니다. 그래서 23개 역량 질문은 산문으로 남겨 두지 않고 프로그램으로 컴파일됩니다 — 실행할 수 없는 요구사항은 신뢰할 수 없는 요구사항이기 때문입니다. validate.py가 그 프로그램이며, 앞 장의 비유에 나온 검사관입니다. 그것은 다음 세 가지를 순서대로 합니다:

  1. 세 Turtle 파일을 하나의 그래프로 파싱한다.
  2. 그것을 OWL-RL 폐포 [1]추론하여 함의된 사실들 — 적어 둔 사실들로부터 논리적으로 따라 나오는 새 사실들 — 을 도출한다. 예를 들어, derivedFrom이 전이적이므로 추론기는 (직속 부모뿐 아니라) 모든 조상 쌍을 펼쳐 적고, 장비가 물질 존재의 일종으로 선언되어 있으므로 각 장비를 그것으로 표시한다. 이 함의된 사실들을 전부 명시적으로 만드는 것이 트리플 수가 이토록 크게 늘어나는(아래에서 2120에서 7137로) 이유이며, 장거리 계보와 구조적 질문(CQ-22)이 평범한 질의로 답해질 수 있게 해 주는 것이다.
  3. cq-catalog.json역량 질문을 실행한다 — 질의 기반 질문은 각각 SPARQL 평가 [2]로, 게이트 질문은 각각 SHACL 검증 [3]으로, 구조적 질문은 각각 추론기 검사로 — 그리고 질문마다 통과/실패 한 줄을 출력한다.

23개가 모두 통과할 때에만 종료 코드 0으로 끝납니다. 이를 직접 재현하려면, examples/platform/ontology/README.md가 세 개의 오픈소스 파이썬 의존성(rdflib, pyshacl, owlrl)과 아래 출력을 만들어 내는 단일 명령을 나열합니다. 스택에 독점적이거나 라이선스가 필요한 것은 아무것도 없습니다: rdflib이 그래프를 파싱하고 질의하며, owlrl이 추론기를 실행하고, pyshacl이 게이트를 검증합니다 — 모두 pip로 설치 가능하고 모두 관대한 라이선스이므로, 종료 코드는 파이썬 인터프리터와 고정된 의존성 버전을 갖춘 어떤 머신에서도 재현 가능합니다. 트리플스토어 서버도, 벤더 키도, 클라우드 계정도 없이 말입니다. 동일한 저작 루프가 어떤 상용 플랫폼만큼이나 오픈소스 데스크톱 편집기 Protégé와 로컬 트리플스토어로도 충분히 잘 이루어진다는 것이 오픈소스 자매 책의 전체 논지이며, 이 하니스는 그것의 가장 작은 실행 가능한 증명입니다. 다음은 그 실제 출력 — 이 책 전체가 유지하도록 설계된 초록색 기준선입니다:

[1] parsed 2120 triples (bioproc + align + instances)
[2] reasoned: 2120 -> 7137 triples after OWL-RL closure
[3] competency questions (ORSD v1.0.0 acceptance tests):

CQ GROUP RESULT DETAIL
CQ-01 lineage PASS 11 row(s)
CQ-02 impact PASS descendant superset of {DP-001, DP-002, DP-004, DS-001} (26 total)
CQ-03 lineage PASS row {batch: BATCH-2026-001, monomer: 98.611} present
CQ-04 impact PASS affected = [DP-001, DP-002]
CQ-05 trajectory PASS material superset of {PApool-001, POLpool-001} (2 total)
CQ-06 qbd PASS parameter superset of {FeedRate, Temperature} (2 total)
CQ-07 qbd PASS row {parameter: FeedRate, lot: DS-001} present
CQ-08 release PASS DS-001 release panel complete and in spec
CQ-09 release PASS ASK = True
CQ-10 release PASS DP-001/DP-002 pass release + finish gates
CQ-11 release PASS OOS [DP-004, DS-004] on path [hmwPct]
CQ-12 viral PASS sum(lrv) = 8.7 over 2 step(s)
CQ-13 packaging PASS package = [CARTON-001, CASE-001, PALLET-001]
CQ-14 packaging PASS ASK = False
CQ-15 provenance PASS claim = [claim-batch-001, claim-vessel-001]
CQ-16 provenance PASS ASK = True
CQ-17 characterization PASS WCB-CHO-001 conforms to the cell-bank gate
CQ-18 characterization PASS ASK = True
CQ-19 units PASS 0 row(s)
CQ-20 units PASS row {host: CHO-host, taxon: NCBITaxon_10029} present
CQ-21 structural PASS row {run: CCP-001, vessel: BR-101, vesselType: ProductionBioreactor} present
CQ-22 structural PASS transitive lineage + equipment-is-material inferred
CQ-23 structural PASS Batch-as-process and Batch-as-bioreactor both caught

23/23 competency questions PASS

ALL CHECKS PASSED

몇 줄만 읽어 보면 설계가 구체적으로 다가옵니다. CQ-01은 DS-001에서 11개의 조상을 순회합니다. CQ-04는 실패한 로트와 세포 은행을 공유하는 정확히 두 형제를 반환합니다. CQ-11은 출하 게이트가 오직 두 개의 -004 로트에 대해 오직 hmwPct에서만 실패함을 보여 줍니다 — 다른 모든 패널 값은 규격 이내입니다 — 이것이 현실적인 규격 이탈 사건의 모습입니다. CQ-12의 8.7은 공짜 덧셈이 아닙니다: 그것은 ICH Q5A 의미의 직교 바이러스 제거 주장입니다(바이러스 안전에 관한 규제 지침으로, 두 독립적인 제거 단계를 합산하도록 허용합니다). 두 단계는 독립적인 메커니즘으로 제거합니다 — 외피 보유 바이러스를 불활화하는 저-pH 유지(pH 3.6, 60분, 4.5 LRV)와 작은 비외피 바이러스를 크기로 제거하는 바이러스 보유 나노필터(4.2 LRV) — 따라서 그 로그 감소 값(LRV — 각 단위는 바이러스의 10배 감소)은 4.5 + 4.2 = 8.7 총 제거로 합산될 수 있습니다. 검증된 능력(LogReductionValue, 스파이킹 연구에서 한 번 확립됨)은 배치별 조건(holdPH 3.6, holdTimeMin 60, 매 배치 기록됨)과 별도로 모델링되는데 — 이는 심사자가 강제하는 바로 그 구분입니다. CQ-14는 올바르게 FalseASK(행의 표가 아니라 예/아니오 답을 반환하는 SPARQL 질의)입니다: 바이알이 안에 담기는 그 어떤 것도 그것이 만들어진 재료는 아니므로, 담음(containment)과 계보는 분리된 채로 유지됩니다. DETAIL 열은 증거이고, RESULT 열은 계약입니다.

빌드 규칙으로서의 진실

"모든 조각은 진짜 발췌다"라는 비기능 요구사항은 문체상의 약속이 아니라 — 강제됩니다. 조각들이 bioproc.ttl, instances.ttl, shapes.ttl의 발췌이고, validate.py가 바로 그 동일한 파일들을 실행하기 때문에, 데이터셋에서 표류한 조각은 역량 질문을 망가뜨리거나(그리고 빌드를 실패시키거나) 살아 있는 출력과의 대조 리뷰에서 잡힙니다. 이 책의 숫자들 — 단량체 98.611 %, 총 LRV 8.7, 조상 11개, 2120 트리플이 7137로 폐포되는 것 — 은 예시용 어림수가 아니라 하니스가 출력하는 그대로입니다. 뒤의 어떤 장이 Turtle 블록을 보여 줄 때, 여러분은 모델을 읽고 있는 것이지 그것의 스케치를 읽는 것이 아닙니다.

미해결 부분: 초록색은 필요조건이지 충분조건이 아니다

통과하는 하니스는 모델이 자신의 질문들에 대해 일관되고 완전함을 증명합니다. 그것이 모델이 임을 증명하지는 않습니다. validate.pyWCB-CHO-001이 완전히 특성 규명되었고 계대 한도 이내임을 (CQ-17, CQ-18) 확인하지만, 냉동고의 바이알이 실제로 WCB-CHO-001이고 잘못 표시된 이웃이 아님을 확인할 수는 없습니다. 그것은 모든 수량이 단위를 지님을 (CQ-19) 확인하지만, 분석자가 올바른 숫자를 입력했는지는 확인할 수 없습니다. 하니스는 요구사항모델 사이의 루프를 닫습니다; 모델현실 사이의 루프는 습식 실험실 특성 규명, 데이터 무결성, 그리고 인간의 판단으로 닫힙니다 — 판결이 되돌아가는 그 한계들입니다. 초록색 표가 장마다 거듭 등장하는 동안 이 구분을 시야에 두십시오: 그것은 모델이 약속한 일을 한다는 것을 보증하는데, 이는 모델이 옳다는 주장보다 더 작고 더 정직한 주장입니다.

모델의 그라운드 트루스로서의 하니스

앞 절이 명명한 바로 그 간극 — 모델은 일관되지만, 참인가? — 은 거의 글자 그대로, 머신러닝 모델이 거꾸로 제기하는 질문이며, 이 결정론적 하니스가 조용히 두 번째 일을 떠맡는 자리입니다. 추론되고 게이트된 그래프야말로, 유창한 모델이 스스로 공급할 수 없다고 동반 ML 책이 논증하는 그 그라운드 트루스(ground truth)(학습 시스템이 닻을 내리는, 검증되고 큐레이션된 사실) 그 자체입니다. 그 책의 교훈 셋이 이 페이지의 산출물에 곧장 사상됩니다.

첫째, 나쁜 출하를 거절하는 게이트는 나쁜 학습 데이터도 거절합니다. shapes.ttl SHACL 게이트는 부적합한 출하를 거절하도록 만들어졌습니다; 모델에 건네지려는 부분 그래프 — 특징 집합으로서든, 검색 증강 LLM(학습 기억이 아니라 신뢰 저장소에서 끌어온 사실로부터만 답하는 모델)의 검색 맥락으로서든 — 을 겨누면, 동일한 셰이프가 부적합한 적재를 거절합니다. 셰이프를 통과하는 그래프는 모든 로트에 그 bp:derivedFrom 부모가 있고 모든 CQA에 단위를 지닌 값이 있는 그래프입니다; 그것을 통과하지 못하는 그래프는 모델이 자신만만한 지어냄으로 기꺼이 채워 넣을, 텅 비었거나 잘못 라벨링된 입력입니다. SHACL은 모델이 검토자 앞에서 그것을 잡아내기 전에 당신이 먼저 잡아내는 방법입니다.

둘째, 타입 부여된 계보는 학습되어야 할 특징이 아니라 정답지입니다. LLM이 DP-004는 무엇에서 파생되었는가?라는 질문을 받을 때, 정직한 설계는 모델이 추측하도록 두지 않습니다: 그것은 CQ-04가 이미 실행하는 바로 그 (bp:derivedFrom)+ 순회를 실행합니다 — GraphRAG, 즉 신뢰 저장소가 이 그래프이고 검색이 흩어진 텍스트가 아니라 타입 부여된 간선(bp:derivedFrom, bp:affectsQuality)을 따르는 방식 — 그리고 모델은 묶인 행을 서술할 뿐입니다. 그래서 CQ-04를 초록으로 유지하는 스위트인 validate.py는 그 검색 경로의 회귀 테스트이기도 합니다; 초록색 하니스는 답을 그라운딩하기에 충분히 좋은 그래프입니다. 프런티어 장이 이 전환을 온전히 전개합니다.

셋째 — 그리고 ML 독자에게 가장 날카롭게 — 모델과 추론된 그래프는 정반대 방향으로 실패하며, 바로 그것이 둘 다를 유지하는 이유입니다. 이 하니스는 결정론적입니다: 데이터와 OWL/SHACL 규칙이 함의할 때에만 사실을 단언하고, 그 밖에는 답을 보류합니다. 학습된 모델은 그 역입니다 — 그것은 참이든 거짓이든 언제나 답을 내놓는데, 유창하고 표시 없이 그렇게 합니다. 따라서 비결정론적 모델을 검증한다는 것은 23개의 통과/실패 검사를 다시 돌리는 것일 수 없습니다; 그것은 정직한 분할 아래의 홀드아웃 지표를 뜻하며, 모델 장의 신뢰성·CSA 규율을 뜻합니다. 그리고 그래프에서 파생된 데이터에서 그 지표를 정직하게 유지하는 분할은 구조적입니다: BATCH-2026-001 계보를 공유하는 행들이 train/test 선을 가로질러서는 안 되며, 그렇지 않으면 모델은 생산에서 결코 보지 못할 배치를 외움으로써 높은 점수를 받습니다 — 데이터 누설(data leakage)입니다. 온톨로지는 그 묶음을 읽을 수 있게 만드는데, bp:derivedFrom이 어떤 행이 한 배치에 속하는지를 이미 말해 주기 때문입니다; 당신은 그래프가 단언하는 계보를 써서 교차검증을 배치별로(leave-one-batch-out, 배치 하나를 떼어 둠) 묶습니다. 검증된 그래프는 자신이 대체할 수 없는 학습기를 제약하고 감사합니다; 학습기는 그래프가 그저 기록만 하는 곳에서 예측합니다 — 이 책의 하이브리드 모델·디지털 트윈 장이 그 위에 지어진 노동의 분업입니다.

왜 중요한가

러닝 예제에 실행 가능한 하니스를 더한 것이, 이 책의 나머지를 그럴듯한 데 그치지 않고 신뢰할 만하게 만드는 것입니다. 앞으로의 모든 모델링 결정은 같은 방식으로 검사될 수 있습니다: 모델을 바꾸고, 하니스를 실행하고, 23줄을 읽으면 됩니다. 어떤 클래스가 제 자리를 얻는다면 역량 질문이 그것에 의존하며 초록색을 유지하고; 그렇지 않다면 그것을 제거해도 아무것도 망가지지 않습니다 — 이것이 어떤 클래스가 속하는지를 가리는 가장 깔끔한 검사입니다. 약은 이 책에 구체성을 주고, 하니스는 엄밀함을 줍니다.

실제 현장에서는

완전히 작업된 단 하나의 예제를 실행 가능한 검증기로 뒷받침하는 것이, 진지한 온톨로지가 실제로 출하되고 회귀 테스트되는 방식입니다 — SAMOD가 형식화한 패턴이자, 큰 어휘 프로젝트들이 모델이 성장하면서 썩지 않도록 유지하는 데 쓰는 패턴입니다 [2][3]. 실제 플랫폼에서 동일한 derivedFrom 순회는 Palantir Foundry의 객체 링크이거나 Neo4j Cypher 순회이며, 동일한 SHACL 게이트는 트리플스토어의 검증 단계에서 실행됩니다; 여기의 데이터셋은 한나절이면 읽을 만큼 작으면서도 생산 그래프가 답해야 할 모든 질문을 행사할 만큼 완전한데, 이것이야말로 교육용 산출물이 갖추어야 할 바로 그것입니다.

핵심 용어

  • 러닝 예제(Running example) — 처음부터 끝까지 모델링된 하나의 CHO mAb 캠페인(WCB-CHO-001 → … → DP-001, OOS 형제 DP-004 포함). 그래서 모든 장이 동일한 구체적 그래프 위에 쌓입니다.
  • 증명 하니스(validate.py) — 데이터셋을 파싱하고, 추론하고, 그것에 대해 23개 역량 질문을 실행하여 통과/실패 표를 출력하고 그것으로 게이트를 거는 프로그램.
  • RDF — 데이터셋 전체가 표현되는 그래프 데이터 모델: 모든 사실이 주어–술어–목적어 링크이므로, 데이터셋은 연결된 노드의 그물입니다.
  • 트리플(Triple) — 그러한 주어–술어–목적어 사실 하나; 하니스가 세는 원자 단위(2120 → 7137).
  • Turtle(.ttl) — 그 RDF 그래프를 작성하는, 사람이 읽을 수 있는 텍스트 구문.
  • SPARQL(.rq) — 역량 질문에 답하기 위해 그래프를 순회하는 질의 언어.
  • SHACL(shapes.ttl) — 데이터가 통과해야 하는 출하 / 완제 / 세포 은행 게이트를 정의하는 규칙 언어.
  • OWL-RL 폐포(closure) — 질의가 실행되기 전에 적어 둔 사실들로부터 이미 함의된 사실들(예: 모든 전이적 조상, 물질 존재로 표시된 모든 장비)을 펼쳐 적는 추론 단계; 트리플 수가 늘어나는 이유입니다.
  • 진짜 발췌(True excerpt) — 단순화된 예시가 아니라 로드 가능한 데이터셋의 일부를 글자 그대로 옮긴 코드 조각. 이 책의 상시 규칙입니다.
  • 초록색 기준선(Green baseline) — 뒤의 모든 장이 보존해야 하는 하니스의 전체 통과 상태(23/23).
  • 그라운드 트루스(Ground truth) — 학습 또는 검색 시스템이 닻을 내리는, 검증되고 큐레이션된 사실; 여기서는 추론되고 SHACL로 게이트된 그래프이며, 유창한 모델이 스스로 공급할 수 없는 실질을 공급합니다.
  • GraphRAG — 신뢰 저장소가 지식 그래프인 검색 증강 생성. 그래서 모델은 추측이 아니라 타입 부여된 간선(bp:derivedFrom)을 걸어가며 답합니다 — CQ-04가 실행하는 바로 그 (bp:derivedFrom)+ 순회입니다.
  • 데이터 누설(Data leakage) — 한 배치의 행을 train/test 분할 양쪽에 떨어지게 두어 모델 점수를 부풀리는 검증 오류; 계보 그래프는 그것을 막는 배치별 그룹화(leave-one-batch-out)를 명시적으로 만듭니다.

다음 이야기

요구사항은 작성되었고 예제는 초록색으로 로드됩니다. 이제 생애주기 본편이 시작됩니다 — 그리고 그 첫 규칙은 빌릴 수 있는 것은 만들지 말라입니다. 다음 장, 상위 척추: 연속체, 발생체, 그리고 왜 모두가 BFO 위에 쌓는가는 모델의 가장 꼭대기에서 제2부(재사용)를 엽니다: 이후의 모든 클래스가 매달리는, 작고 도메인 중립적인 범주 집합과, 온톨로지가 내리는 첫 번째이자 가장 중대한 재사용 결정입니다.