정준 바이오리액터 정보 모델: 컴패니언 스펙, NodeSet2, 그리고 의미론적 정합
📍 현재 위치: 1부 · 청사진 — 6장. 5장은 모든 신호에 정준 이름을 주었습니다. 이 장은 바이오리액터에 정준 모델을 줍니다 — 플랫폼 무관하고 디바이스별로 모듈화된 OPC UA 정보 모델로, 컴패니언 사양에 맞춰 타입이 부여되고 공유 온톨로지에 정합되어, 두 벤더의 서버가 같은 프로토콜만이 아니라 같은 의미를 노출할 수 있게 합니다.
두 바이오리액터 벤더가 둘 다 "OPC UA를 말할" 수 있으면서도 서로 대화하지 못할 수 있습니다 — 둘 다 영어를 말하지만 같은 사실을 서로 다른 서랍의 서로 다른 표제 아래 정리하는 두 사람처럼요. 한 서버는 항체 농도를 Process 폴더 아래 그램 매 리터의 Titer로 게시합니다. 다른 서버는 그것을 Analytics 트리 아래 밀리그램 매 밀리리터의 ProductConc라 부릅니다. 첫 번째를 읽던 당신의 코드는 두 번째에서 깨집니다. 해법은 미리 하나의 모양에 합의하는 것입니다. 이것은 바이오리액터이고, 이것들이 그 디바이스이며, 각 디바이스는 이 신호들을 이 데이터형과 이 단위로 노출하고, 각각이 뜻하는 사전 단어는 이것이다. 그 합의된 모양이 정준 정보 모델(canonical information model)이고, 그것을 벤더 전반에 이식 가능하게 만드는 합의가 컴패니언 사양(companion specification)입니다. 이 장은 우리 바이오리액터를 위해 하나를 설계합니다 — 디바이스별로 모듈화되고, 타입이 부여되고, 단위를 나르고, 공유 어휘에 묶인 — 그리고 바이오리액터 자체에 대해서는 업계 합의가 아직 온전히 존재하지 않는다는 점을 정직하게 밝힙니다.
이 장에서 다루는 내용
5장은 명명을 풀었습니다 — 모든 신호가 BR101.Titer.PV 같은 절제된 이름을 가집니다. 그러나 이름은 상자에 붙은 라벨입니다. 모델은 상자 안에 무엇이 있는지, 그것이 어떤 타입인지, 어떤 단위를 나르는지, 무엇을 뜻하는지를 말합니다. 이 장은 그 모델을 짓습니다. 우리는 다음을 다룹니다.
- 왜 표준 준수가 상호운용성이 아닌가 — 두 OPC UA 서버가 둘 다 적합하면서도 같은 수량을 호환되지 않는 주소-공간 경로·데이터형·단위 관례로 노출할 수 있음.
- 디바이스별로 모듈화된 정준 모델 — 바이오리액터를 하나의 평평한 태그 목록이 아니라 재사용 가능한 디바이스 모듈(인시투 프로브 랙, 세포배양 분석기, 라만 PAT)의 집합으로, 분산 분석기가 프로브 랙과는 다른 디바이스이기 때문.
- 컴패니언 사양에 맞춘 타입 부여 — 프로브에는 OPC UA DI, 앳라인 분석기에는 Analyzer Devices 컴패니언 스펙(OPC 10020), 라만/실험실 디바이스에는 LADS(OPC 30500) — 그리고 바이오리액터 자체에는 게시된 컴패니언 스펙이 없다는 정직한 간극.
- 단위와 의미론적 정합 — 모든 노드가 UCUM 단위와 IOF/Allotrope-앵커 온톨로지 IRI를 날라, 의미가 값과 함께 이동함.
- 모델을 파일로서의 NodeSet2 — 서버가 가져오는 표준 XML 직렬화 —
examples/chapters/06-bioreactor-information-model/bioreactor_model.py에서 짓고 검증함.
표준 준수는 상호운용성과 같지 않다
모든 디바이스가 일단 "OPC UA를 말하면" 통합 문제가 풀린다고 생각하기 쉽습니다. 아닙니다. 그 이유가 이 장의 핵심입니다. OPC UA 전송 — 연결 장의 주소 공간, 보안 핸드셰이크, 구독 모델 — 은 바이트를 신뢰성 있고 자기 기술적으로 옮깁니다. 그것이 그 자체로 하지 않는 것은, 두 벤더가 그 바이트가 어떤 모양을 취할지 합의하게 만드는 것입니다. 벤더 A는 항체 농도를 Process 객체 아래 g/L의 Double인 Titer라는 이름의 노드로 노출합니다. 벤더 B는 같은 물리량을 Analytics 폴더 아래 mg/mL의 Float인 ProductConc로, 다른 NodeId 경로로 노출합니다. 두 서버 다 완전히 OPC UA 적합입니다. A의 주소 공간에 맞춰 쓰인 컬렉터는 B에 대고 소리 없이 실패합니다 — 또는 더 나쁘게, 소리 없이 잘못 읽습니다.
이것이 데이터 관리 책이 직접 이름 붙이는 구문적(syntactic) 상호운용성(프로토콜과 데이터 형식에 합의)과 의미론적(semantic) 상호운용성(데이터가 뜻하는 바에 합의)의 차이입니다. 전송은 풀렸고, 모양과 의미는 아닙니다. 처방은 각 벤더가 자기 주소 공간을 발명하게 두기를 멈추고 대신 정준 정보 모델에 합의하는 것입니다. 바이오리액터가 OPC UA 용어로 무엇인지 — 어떤 객체, 어떤 변수, 어떤 데이터형, 어떤 단위 — 에 대한, 게시되고 벤더 중립적인 하나의 기술로, 모든 적합 서버가 같은 방식으로 노출하기로 기대되는 것입니다. NIIMBL Big-Data 상호운용성 작업이 정확히 이것입니다. 한 번 쓰인 통합이 벤더별로 손 매핑되는 대신 어떤 적합 디바이스에 대해서도 작동하도록, 플랫폼 무관 바이오리액터 데이터 모델을 만들어 내는 것입니다 [1].
디바이스별로 모듈화된 모델
첫 설계 결정은 RFP 작업이 명시하고 진짜 모델을 태그 덤프와 구별하는 그것입니다. 디바이스별로 모듈화하라. 생산 바이오리액터는 하나의 단일 계기가 아닙니다. 그것은 용기에 물리적으로 통합된 인시투 프로브 랙(온도, pH, 용존 산소, 교반, 압력); 더하기 시료를 뽑아 생존 세포 밀도·글루코스·젖산·역가를 보고하는 별도의, 종종 분산된 세포배양 분석기; 더하기 라만 프로브 같은 인라인 PAT 계기와 그 소프트-센서 출력입니다. 이들은 서로 다른 디바이스로, 흔히 서로 다른 벤더에서 오고, 독립적으로 연결되고 교체됩니다. 그것들을 하나의 평평한 목록으로 뭉뚱그리는 정준 모델은, 한 현장이 분석기를 다른 모델로 바꿨다거나 라만 프로브가 선택적이라는 것을 표현할 수 없습니다.
그래서 모델은 재사용 가능한 디바이스 모듈의 집합으로, 각각이 자기 변수를 가진 자기완결적 객체 타입이며 서버가 그것들을 조합합니다. 동반 모듈 bioreactor_model.py는 정확히 셋을 짓습니다.
in-situ-probes— 표준 프로브로, OPC UA DIAnalogItemType(이미 공학-단위 범위를 나르는 디바이스 통합 기반 타입)으로 타입 부여.cell-culture-analyzer— 앳라인 분석기로, Analyzer Devices 컴패니언 사양에 맞춰 타입 부여.raman-pat— 라만 프로브와 그 소프트-센서 출력으로, LADS에 맞춰 타입 부여.
모듈화가 모델을 공장의 실제 연결-및-교체 토폴로지에 들어맞게 만드는 것이고, 그것이 적합성이 점검되는 단위입니다. 벤더의 분석기는 프로브 랙과 독립적으로, cell-culture-analyzer 모듈에 적합하거나 아닙니다.
컴패니언 사양에 맞춘 타입 부여
모듈은 그 타입이 게시되고 공유될 때에만 이식 가능하고, 그것이 OPC UA 컴패니언 사양이 무엇인가입니다. 어떤 디바이스 부류를 위한, OPC UA 기반 위에 계층화된, 표준화되고 벤더 중립적인 객체·변수 타입 집합입니다. 관련된 둘이 존재하고 모델은 둘 다 씁니다. LADS — 실험실 및 분석 디바이스 표준, OPC 30500 — 은 실험실·분석 디바이스를 위한 첫 OPC UA 컴패니언 사양으로, OPC Foundation이 SPECTARIS·VDMA와 함께 발표했습니다. 여러 바이오의약품-계기 벤더가 기여했고, 그것이 라만/실험실 모듈의 자연스러운 타입인 까닭입니다 [2]. Analyzer Devices 컴패니언 사양, OPC 10020은 분석기 계기의 주소-공간 모양 — 채널, 결과, 그 메타데이터 — 을 표준화하고, 세포배양 분석기 모듈의 자연스러운 타입입니다 [3]. 노드를 맨 BaseDataVariableType이 아니라 AnalyserChannelType이나 LADS FunctionalUnitType에 맞춰 타입 부여하는 것이, 일반 클라이언트가 어떤 적합 분석기든 브라우즈하고 결과가 어디 있는지 알게 하는 것입니다.
여기 정직한 간극이 있고, 이 장은 그것을 분명히 당신에게 빚집니다. 포유류-세포 바이오리액터 자체를 위한 게시된 OPC UA 컴패니언 사양은 없습니다. LADS는 그 둘레의 실험실·분석 계기를 다루고, Analyzer Devices 스펙은 분석기를 다루고, PA-DIM은 공정-자동화 송신기를 다루고, MTP는 모듈식 스키드를 다룹니다 — 그러나 머리기사 신호(생존 세포 밀도, 온라인 글루코스, 역가)를 가진 중심의 CHO 유가식 바이오리액터에는 적합할 표준 모델이 없습니다 [1]. 그 부재가 이 장이 "표준 모델을 가져오기"가 아니라 "정준 모델을 설계하기"인 까닭이고, 정확히 NIIMBL 바이오리액터-데이터-스키마 작업이 메우려는 간극입니다. 컴패니언 스펙이 존재하는 곳(분석기, 실험실 디바이스, 공정 송신기)에서는 그것에 적합하고, 존재하지 않는 곳(바이오리액터 본체)에서는 같은 규율으로 — 모듈식, 타입 부여, 단위 보유, 의미론적 정합 — 모델을 발명하여, 적어도 엄격히 자기 일관적이고 표준이 도착하면 정합할 준비가 되게 합니다.
단위와 의미론적 정합: 의미가 이동하게 하기
모든 노드의 두 필드가 주소 공간만으로는 잃을 의미를 나릅니다. 첫째는 공학 단위로, UCUM 코드(Unified Code for Units of Measure) — Cel, g/L, [pH], mmHg — 로 표현되어 OPC UA EngineeringUnits 속성에 실려, 값이 결코 맨숫자가 아니게 합니다. 레거시 스키드 장이 경고하는 단위 없는 0.40은 정확히 정준 모델이 구성상 금지하는 실패입니다. 단위 없는 노드는 적합하지 않습니다.
둘째는 의미론적 IRI — 노드가 한 서버가 부르는 이름이 아니라 공유 어휘에서 무엇인지를 말하는 전역 고유 식별자입니다. 모델의 각 노드는 러닝 예제의 바이오공정 온톨로지로의 IRI(bp:Temperature, bp:ProductTiter, afo:RamanSpectrum)를 나르며, 산업 온톨로지 파운드리(IOF) 바이오파마 클래스와 Allotrope 재단 온톨로지(AFO)에 정합됩니다 [4][5]. 이것이 시맨틱과 지식 그래프 장으로의, 그리고 동반 온톨로지 책으로의 다리입니다. 같은 정준 모델이, 한 방식으로 읽으면 서버가 노출하는 OPC UA 주소 공간이고, 다른 방식으로 읽으면 그 노드가 단위는 QUDT/UCUM IRI이고 완전성을 SHACL 형상이 게이트할 수 있는 타입 지정 트리플입니다. 명명(5장)은 신호에 일관된 문자열을 주었고, 이 모델은 그것에 벤더 경계를 건너 살아남는 타입과 단위와 의미를 줍니다.
NodeSet2: 파일로서의 모델
정준 모델은 발상이 아니라, 서버가 가져오는 파일입니다. OPC UA 표준 직렬화는 NodeSet2 XML(UANodeSet 스키마)입니다 — 모든 객체·변수·데이터형·참조가 적힌, 어떤 적합 서버든 모델을 적재하고 노출할 수 있는. 모듈 examples/chapters/06-bioreactor-information-model/bioreactor_model.py는 모델을 데이터로 짓고 한 노드의 NodeSet2 단편을 내어, 추상적 "모양에 합의하기"를 구체적 산출물로 만듭니다. 검증기가 모델의 수락 기준입니다 — 모든 노드는 타입이 있고, 단위를 나르고, 범위가 있고, 의미론적으로 정합되어야 합니다.
# examples/chapters/06-bioreactor-information-model/bioreactor_model.py (excerpt)
def validate(node: Node) -> list[str]:
"""A canonical-model node must be typed, unit-bearing, ranged, and semantically aligned."""
bad = []
if not node.datatype: bad.append("no-datatype")
if not node.base_type: bad.append("no-companion-type")
if not node.ucum: bad.append("no-unit") # the bare-number failure
if not (node.lo < node.hi): bad.append("bad-range")
if ":" not in node.iri: bad.append("no-ontology-iri") # home-namespace-only
return bad
python bioreactor_model.py를 실행하면 모델, NodeSet2 단편, 적합성 점검을 그대로 출력합니다:
canonical bioreactor information model — platform-agnostic, modular, typed, aligned
device modules: 3 variable nodes: 11
-- module 'in-situ-probes' -> conforms to OPC UA DI (Devices) — AnalogItemType
Temperature Double unit=Cel bp:Temperature
pH Double unit=[pH] bp:pH
DissolvedO2 Double unit=% bp:DissolvedOxygen
Agitation Double unit=min-1 bp:AgitationRate
Pressure Double unit=mmHg bp:HeadspacePressure
-- module 'cell-culture-analyzer' -> conforms to OPC 10020 Analyzer Devices
ViableCellDensity Double unit=10*6.{cells}/mL bp:ViableCellDensity
Glucose Double unit=g/L bp:GlucoseConcentration
Lactate Double unit=g/L bp:LactateConcentration
Titer Double unit=g/L bp:ProductTiter
-- module 'raman-pat' -> conforms to OPC 30500 LADS (Laboratory & Analytical Device Standard)
RamanSpectrum Float[] unit=1 afo:RamanSpectrum
GlucoseSoftSensor Double unit=g/L bp:GlucoseConcentration
-- NodeSet2 serialization (one node, the standard XML a server imports) --
<UAVariable BrowseName="1:Titer" DataType="Double" ParentNodeId="ns=1;s=BR101.cell-culture-analyzer">
<DisplayName>Titer</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">AnalyserChannelType</Reference>
</References>
<!-- EngineeringUnits: UCUM "g/L"; NormalRange: 0.0..10.0; semantic IRI: bp:ProductTiter -->
</UAVariable>
-- MODEL CONFORMANCE (every node modular, typed, unit-bearing, aligned) --
nodes conforming: 11/11
every node carries a UCUM unit: True
every node aligned to an ontology IRI: True
NodeSet2 단편을 열한 줄에 담긴 이 장 전체로 읽으세요. 노드는 정준적으로 명명되고(Titer), 컴패니언 스펙에 맞춰 타입 부여되고(AnalyserChannelType, Analyzer Devices 결과 타입), 디바이스 모듈에 배치되고(BR101.cell-culture-analyzer), 단위가 붙고(UCUM g/L), 범위가 있고(그 정상 운전 밴드), 정합됩니다(bp:ProductTiter, 공유 온톨로지로의 IRI). 이것을 가져오는 서버는 역가를 다른 어떤 적합 서버와도 같은 방식으로 노출하고, 한 번 쓰인 클라이언트가 그것들을 모두 읽으며, 같은 노드가 단위와 의미를 동반했기에 지식 그래프로 깔끔히 들어 올려집니다. 그것이 ML 책의 에이전트형 연결 PoC가 실제의, 지저분한 벤더 디바이스를 그 위에 매핑하는 산출물입니다 — 그 논리 사슬 검증기가 모든 제안된 매핑을 대조하는, 단위와 타입을 가진 정준 타깃입니다.
하나의 정준 모델, 두 독해: 서버가 노출하는 OPC UA 주소 공간(세 컴패니언-스펙-타입 디바이스 모듈을 조합하는 BR101)과, 모든 노드가 UCUM 단위와 IOF/Allotrope-정합 IRI를 나르기에 지식 그래프로 들어 올려지는 타입 지정 트리플. 바이오리액터 자체에는 아직 게시된 컴패니언 스펙이 없으므로 — 모델은 같은 규율으로 작성되어, 하나가 도착하면 정합할 준비가 됩니다.
저자가 AI의 도움을 받아 직접 제작한 그림입니다.
왜 중요한가
명명은 각 신호를 우리 플랫폼 안에서 일관되게 만들었습니다. 정준 정보 모델은 그것을 벤더 전반에 일관되게 만드는 것입니다 — 한 번 쓰는 통합과, 현장이 설치하는 모든 새 바이오리액터마다 손 매핑하는 통합의 차이입니다. 그것을 건너뛰는 비용은 오늘날 바이오 제조의 조용하고 비싼 일상입니다. 모든 디바이스가 표준 프로토콜을 말하면서도 아무도 모양에 합의하지 않으므로, 통합 엔지니어는 mg/mL의 ProductConc를 g/L의 Titer로 한 벤더씩 매핑하는 데 시간을 쓰고, 그 위에 지은 지식 그래프는 모든 불일치를 물려받습니다. 이 장의 모델이 해독제이고, 더 야심 찬 모든 것의 전제조건이기도 합니다. 디지털 트윈, 사이트 간 소프트 센서, 매핑을 초안 잡는 에이전트형 연결 도구 — 그것들 모두 그 위에 매핑할 정준 타깃을 가정합니다. 그 타깃을, 모듈식으로 타입 부여되고 단위를 나르고 의미론적으로 정합되게 짓는 것은 화려하지 않은 스키마 작업이고, 데이터 플랫폼의 나머지가 조용히 그 위에 서는 하중을 지는 작업입니다.
현실 세계에서는
컴패니언-사양 지형은 실재하고, 최근이고, 고르지 않습니다 — 그리고 그 고르지 않음이 이야기입니다. LADS(OPC 30500)는 게시되었고(릴리스 1.0.1, 2024년 1월), 바이오의약품-계기 벤더가 기여자에 포함된 채 2025년 해커톤에서 Allotrope 재단 온톨로지와 함께 처음부터 끝까지 시연되었습니다 [2]. Analyzer Devices 컴패니언 사양(OPC 10020)은 분석기 주소 공간을 표준화하고 [3], PA-DIM과 MTP는 각각 공정 송신기와 모듈식 스키드를 다룹니다. 그러나 연결 장이 이미 진술하는 정직한 평결이 여기서도 유효합니다. CHO 유가식 바이오리액터나 Protein A 포획 단계를 위한 컴패니언 사양은 없으므로, 이 책 전체가 따르는 머리기사 분석물에는 적합할 표준 모델이 없고, 대부분의 서버는 여전히 벤더별 주소 공간을 노출합니다 [1]. 의미론 쪽에서는 IOF 바이오파마 참조 온톨로지(2026년 2월 릴리스, 단위-공정과 품질-파라미터 클래스를 가진)와 Allotrope 재단 온톨로지가 정합 타깃을 주고, 단위에는 QUDT/UCUM이 있습니다 [4][5]. 오픈소스-대-상용 선은 이 책의 거듭되는 그것입니다. NodeSet2 형식, 게시된 컴패니언 스펙, 오픈소스 도구(asyncua는 NodeSet을 적재함)는 모두 자유로이 쓸 수 있고, 표준이 아직 다루지 않는 부분 — 바이오리액터 자체에는, 여전히 공장의 중심 — 을 위한 충실하고 적합한 모델을 작성하는 일은 당신 몫입니다.
핵심 용어
- 정보 모델(information model) — 디바이스가 OPC UA 용어로 무엇인지(그 객체·변수·데이터형·참조)에 대한, 단순한 태그 이름 목록이 아닌, 게시되고 벤더 중립적인 기술. 두 서버가 같은 수량을 같은 방식으로 노출하게 만드는 것.
- 컴패니언 사양(companion specification) — 어떤 디바이스 부류를 위한, OPC UA 기반 위에 계층화된, 표준화되고 공유된 OPC UA 객체·변수 타입 집합. 하나에 적합한 것이 모듈을 벤더 전반에 이식 가능하게 만듦.
- OPC 10020 (Analyzer Devices) — 분석기 계기의 주소 공간(채널, 결과, 메타데이터)을 표준화하는 OPC UA 컴패니언 사양. cell-culture-analyzer 모듈이 적합하는 타입.
- LADS (OPC 30500) — 실험실 및 분석 디바이스 표준, 실험실/분석 디바이스를 위한 첫 OPC UA 컴패니언 사양. 라만/PAT 모듈이 적합하는 타입.
- 디바이스별 모듈화(modularization by device) — 모델을 하나의 평평한 태그 목록이 아니라 재사용 가능한 디바이스별 모듈(프로브 랙, 분석기, 라만)로 설계하여, 공장의 실제 연결-및-교체 토폴로지에 들어맞게 하고 적합성을 디바이스별로 점검하게 함.
- NodeSet2 (UANodeSet) — OPC UA 정보 모델의 표준 XML 직렬화. 서버가 정준 모델을 노출하기 위해 가져오는 파일.
- UCUM 공학 단위(UCUM engineering unit) — OPC UA
EngineeringUnits속성에 실린 Unified Code for Units of Measure 코드(Cel,g/L,[pH])로, 값이 결코 맨숫자가 아니게 함. 단위 없는 노드는 적합하지 않음. - 의미론적 IRI / 정합(semantic IRI / alignment) — 노드가 공유 어휘에서 무엇을 뜻하는지를 말하는 전역 고유 식별자(예:
bp:ProductTiter, IOF 바이오파마와 Allotrope 재단 온톨로지에 정합)로, 모델이 지식 그래프로 들어 올려지게 함. - 빠진 바이오리액터 컴패니언 스펙(the missing bioreactor companion spec) — 정직한 간극: LADS, OPC 10020, PA-DIM, MTP가 실험실/분석기/송신기/스키드를 다루지만, CHO 바이오리액터 자체를 다루는 게시된 컴패니언 스펙은 없으며, 그것이 이 모델이 가져와지지 않고 작성되는 까닭.
이것이 이끄는 곳
바이오리액터는 이제 정준 모양을 가집니다 — 디바이스별로 모듈식이고, 존재하는 컴패니언 스펙에 맞춰 타입이 부여되고, 존재하지 않는 곳에서는 같은 규율으로 작성되고, 단위를 나르고, 공유 어휘에 정합된. 그러나 모델은 무언가가 그것을 와이어 위에서 말하기까지는 여전히 청사진입니다. 다음 장은 2부를 열고, OT의 언어: OPC UA, MQTT, 그리고 Sparkplug B는 이 모델의 노드를 바이오리액터에서 떼어 플랫폼으로 나르는 프로토콜을 세워 — 여기서 설계한 모양을 살아 있고 보안되고 자기 기술적인 데이터로 바꿉니다.