레거시 산업용 데이터 히스토리언(Industrial Historian)은 20년 전에 이미 유효성을 잃은 1980년대의 전제 조건, 즉 **“디스크 스토리지는 희소하고 비싸다”**는 가정 위에서 설계되었습니다.
1980년대의 자기 디스크 환경에서 살아남기 위해 OSIsoft / AVEVA PI System과 같은 독점(Proprietary) 히스토리언은 두 가지 아키텍처적 타협을 선택했고, 규제 대상 바이오제약 공장들은 지금까지도 그 대가를 치르고 있습니다:
- 손실형 “스윙잉 도어(Swinging Door,
CompDev)” 아카이브 압축: 원시 센서 측정값을 폐기하고 직선 근사치로 대체함으로써, 정제 스키드의 크로마토그래피 UV280 용출 피크가 뭉개지거나 GMP 배치 검토 중 짧은 열적 일탈(Thermal Spike)이 은폐될 위험을 초래합니다. - 태그당(Per-tag) 및 사용자당(Per-seat) 라이선스 과금과 취약한 Windows DCOM 구조: 자동화 엔지니어들이 어떤 현장 센서만 골라서 저장할지 할당량을 계산하게 만들고, 귀중한 배치 이력 데이터를 독점 바이너리
.dat아카이브 안에 가두어 현대적인 분석 및 AI 에이전트와의 연동을 가로막습니다.
반면 범용 오픈소스 시계열 데이터베이스(기본 InfluxDB, Prometheus, 또는 순수 TimescaleDB)는 FDA나 EMA 실사관이 21 CFR Part 11 §11.10(e) WORM(Write-Once-Read-Many) 감사 추적, §11.200 이중 인증 전자서명, ISA-95 계층형 설비 자산 컨텍스트, ISA-88 배치 및 일탈 이벤트 프레임(Event Frames), OPC 신호 품질(quality >= 192) 필터링, 그리고 이산형(LOCF) 대 연속형(LINEAR) 보간법 분리를 요구하는 순간 즉시 한계를 드러냅니다.
우리는 이 간극을 메우기 위해 GxPHistorian (github.com/saram-io/gxp-historian)을 구축했습니다. GxPHistorian은 데이터베이스 커널 수준에서부터 21 CFR Part 11, EU GMP Annex 11, ISPE GAMP 5 (개정 2판) 요구사항을 충족하도록 설계된 MIT 라이선스 기반의 4-Pillar 오픈소스 산업용 시계열 히스토리언이자 설비 자산 프레임워크(Asset Framework)입니다.
1. 4-Pillar 아키텍처: 불변 텔레메트리와 가변 제어 상태의 엄격한 분리
규제 준수 산업용 히스토리언은 본질적으로 정반대의 데이터 접근 패턴을 가진 두 가지 데이터베이스 워크로드를 동시에 처리해야 합니다:
- 고주파 추가 전용(Append-only) 센서 텔레메트리: 수만 개의 태그에서
1 Hz~10 Hz로 유입되는 스트림으로, 락(Lock) 경합 없이 수집되고 수학적 무손실로 압축되며 수십 년 치 배치 이력에 대해 초고속 집계를 제공해야 합니다. - 트랜잭션 관계형 제어 상태(Control State): ISA-95 설비 자산 트리, 태그 엔지니어링 카탈로그, ISA-88 이벤트 프레임 상태 전이, 21 CFR Part 11 WORM 감사 로그로 구성되며 엄격한 ACID 트랜잭션, 외래 키 무결성, 커널 레벨 트리거가 필수적입니다.
고주파 센서 시계열을 행(Row) 기반 관계형 데이터베이스에 밀어 넣으면 B-트리 인덱스 비대화와 VACUUM 병목이 발생합니다. 반대로 상태가 변하는 이벤트 프레임과 Part 11 감사 로그를 컬럼형 OLAP 엔진에 저장하면 무거운 ALTER TABLE ... UPDATE/DELETE 파트 재작성(Mutation)이 발생합니다.
GxPHistorian은 이 두 워크로드를 4개의 특화된 기둥(4-Pillar)으로 분리하고, 인메모리 ClickHouse FLAT 딕셔너리를 통해 실시간으로 연결합니다:
┌────────────────────────────────────────────────────────────────────────────┐
│ GxPHistorian 4-Pillar Architecture │
├────────────────────────────────────────────────────────────────────────────┤
│ │
│ PILLAR 1: Multi-Protocol Edge Collector (edge-collector) │
│ ┌────────────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ OPC UA (:4840), S7comm (:102), │ │ Stage 1 Exception Deadband │ │
│ │ BACnet/IP (:47808 COV) & MS/TP, │──▶│ Filter (ExcDev / ExcMax) │ │
│ │ Modbus TCP/RTU, HART, RS-232, │ │ + 1,000,000-Sample Disk WAL │ │
│ │ Zero-DCOM Windows OPC DA, Watchdir │ │ (/var/lib/telegraf/buffer) │ │
│ └────────────────────────────────────┘ └──────────────┬──────────────┘ │
│ │ │
│ HTTP JSONEachRow (:8125) │
│ ▼ │
│ PILLAR 2: Immutable Telemetry Archive PILLAR 3: Part 11 Control Plane │
│ (clickhouse-archive — ClickHouse 24.8) (postgres-control + FastAPI) │
│ ┌────────────────────────────────────┐ ┌─────────────────────────────┐ │
│ │ pi_historian.sensor_data │ │ PostgreSQL 16 (ltree, │ │
│ │ MergeTree partitioned by YYYYMM │ │ btree_gist, pgcrypto) │ │
│ │ Codecs: Delta + DoubleDelta + │ │ • ISA-95 Asset Hierarchy │ │
│ │ Gorilla + T64 + ZSTD(1) │ │ • Tag Catalog & Limits │ │
│ │ (1.5–2.5 bytes/sample, 100% raw) │ │ • ISA-88 Event Frames │ │
│ ├────────────────────────────────────┤ │ • PL/pgSQL WORM Triggers │ │
│ │ pi_historian.sensor_rollup_1m │ │ • SHA-256 Audit Hash Chain │ │
│ │ AggregatingMergeTree │ │ • §11.200 HMAC E-Signatures │ │
│ │ Strictly WHERE quality >= 192 │ ├─────────────────────────────┤ │
│ ├────────────────────────────────────┤ │ FastAPI + Pydantic AI + MCP │ │
│ │ pi_historian.pg_asset_tags │◀──│ v_clickhouse_tag_dict sync │ │
│ │ In-Memory FLAT Dictionary (5–15s) │ │ LTTB, DataLink & AI CoPilot │ │
│ └─────────────────┬──────────────────┘ └──────────────┬──────────────┘ │
│ │ │ │
│ └──────────────────┬──────────────────┘ │
│ ▼ │
│ PILLAR 4: Operator HMI, Excel DataLink & Enterprise Lakehouse │
│ ┌──────────────────────┐ ┌────────────────────────┐ ┌──────────────────┐ │
│ │ Grafana OSS 11.2 HMI │ │ Excel DataLink Client │ │ Zero-ETL Parquet │ │
│ │ Asset-Relative LTTB │ │ xlwings UDFs + Native │ │ PyArrow Snappy │ │
│ │ Trends + EF Overlays │ │ Power Query CSV Stream │ │ + S3 WORM Tier │ │
│ └──────────────────────┘ └────────────────────────┘ └──────────────────┘ │
└────────────────────────────────────────────────────────────────────────────┘
컨테이너 및 포트 매트릭스
5개의 핵심 서비스는 결정론적 헬스체크(Healthcheck)가 구성된 단일 docker-compose.yml 스택으로 기동됩니다:
| 컨테이너 이름 | 아키텍처 역할 | 내부 포트 | 기본 호스트 포트 (.env) |
핵심 기술 스택 |
|---|---|---|---|---|
edge-collector |
Pillar 1: 멀티 프로토콜 수집기, 1단계 데드밴드 및 디스크 WAL | 8080 |
8080 |
InfluxData Telegraf 1.32 Alpine + Python 3.12 |
clickhouse-archive |
Pillar 2: 무손실 시계열 아카이브 및 1분 롤업 엔진 | 8123 / 9000 |
8125 / 9005 |
ClickHouse Server 24.8 LTS (Apache-2.0) |
postgres-control |
Pillar 3: ISA-95 자산 계층 구조 및 21 CFR Part 11 WORM 감사 로그 | 5432 |
5435 |
PostgreSQL 16 (ltree, btree_gist, pgcrypto) |
historian-api |
Pillar 3: GxP REST API, 이벤트 프레임 엔진, DataLink 및 AI/MCP | 8000 |
8020 |
FastAPI, Psycopg 3, ClickHouse Connect, PyArrow, Pydantic AI, FastMCP |
grafana-vision |
Pillar 4: 사전 프로비저닝된 바이오리액터 및 클린룸 운전원 HMI | 3000 |
3020 |
Grafana OSS 11.2 + ClickHouse 및 PostgreSQL 데이터소스 |
2. OSIsoft / AVEVA PI System과의 1:1 기능 패리티(Parity)
기존 히스토리언을 대체할 때 공정 엔지니어가 사용하던 Excel 배치 리포트가 깨지거나 운전원의 설비 상대 경로(Asset-relative) 트렌드 화면이 사라진다면 마이그레이션은 실패합니다. GxPHistorian의 모든 하위 시스템은 OSIsoft / AVEVA PI System의 구성 요소와 1:1로 매핑됩니다:
| 레거시 OSIsoft / AVEVA PI 구성 요소 | GxPHistorian 오픈소스 대응 시스템 | 핵심 기술 및 규제 준수 역량 |
|---|---|---|
PI Data Archive (Swinging Door CompDev) |
ClickHouse 24.8 LTS (pi_historian.sensor_data) |
100% 수학적 무손실 Delta, DoubleDelta, Gorilla, T64 + ZSTD(1) 압축(샘플당 1.5~2.5 바이트) 및 실시간 1분 AggregatingMergeTree 롤업(WHERE quality >= 192). |
| PI Asset Framework (PI AF) | PostgreSQL 16 ltree + ClickHouse FLAT Dictionary |
GiST 인덱싱 기반 ISA-95 Enterprise.Site.Area.Unit 계층 경로 및 5~15초 주기로 ClickHouse RAM(pg_asset_tags)에 동기화되는 O(1) 메타데이터 조인. |
| PI Event Frames (EF) | PostgreSQL event_frames + FastAPI 상태 머신 |
자동화된 ISA-88 배치 및 일탈 감지(quality >= 192 기준 peak_val, avg_val, min_val, sample_count 캡처) 및 §11.200 이중 인증 HMAC-SHA256 전자서명. |
| PI Interface Node & PI Buffer Subsystem | Telegraf 1.32 디스크 WAL + Python 엣지 워커 | 인메모리 1단계 예외/데드밴드 필터링(ExcDev & ExcMax) + 10개 산업용 프로토콜 전반의 데이터 유실 제로(Zero-data-loss)를 보장하는 1,000,000 샘플 디스크 WAL 버퍼. |
PI Vision (PlotValues 트렌드 및 오버레이) |
Grafana OSS 11.2 + ClickHouse LTTB | 설비 상대 경로(${asset_path}) 기반 운전원 HMI, 네이티브 largestTriangleThreeBuckets 피크 보존 다운샘플링, 이벤트 프레임 음영 오버레이, 실시간 Part 11 감사 로그 테이블. |
PI DataLink (Excel PISampDat / PIAdvCalcDat) |
FastAPI DataLink CSV/JSON + xlwings UDF |
드롭인(Drop-in) =GXPHISTORIAN_SAMPLED(), =GXPHISTORIAN_PLOT_VALUES(), =GXPHISTORIAN_EVENT_SUMMARY() 수식 및 매크로 없는 Power Query CSV 스트림(LINEAR 대 LOCF 보간 규율 적용). |
| PI Integrator for Business Analytics | FastAPI + PyArrow Zero-ETL 익스포터 | 단일 API 호출(POST /api/v1/lakehouse/export-parquet)로 ISA-95 자산 컨텍스트와 공학 단위가 결합된 Snappy 압축 Apache Parquet 파일 생성. |
| AVEVA Industrial AI Assistant / PI Web API | Pydantic AI 코파일럿 & gxphistorian-mcp 서버 |
정적 타입 기반 ISA-88 일탈 조사 에이전트(DeviationInvestigationBrief, WHERE quality >= 192), Part 11 휴먼인더루프(ApprovalRequired) 태그 프로비저닝, 6개 도구를 갖춘 FastMCP 서버. |
3. 압축의 수학: 손실형 스윙잉 도어(Swinging Door)가 구시대적인 이유
전통적인 PI System에서 데이터 절감은 두 단계로 이루어집니다:
- 1단계 — 인터페이스 노드의 예외 보고(Exception Reporting): 유의미한 공정 변화가 발생하거나 하트비트 타이머(
ExcMax)가 만료될 때까지 데드밴드(ExcDev) 이내의 정적 ADC 전기 노이즈를 억제합니다. - 2단계 — 아카이브의 스윙잉 도어 압축(Swinging Door Compression): 실제로 전송된 샘플 중 기울어진 평행사변형 허용 오차(
CompDev) 내부에 들어오는 측정값들을 영구적으로 폐기하고 변곡점만 디스크에 기록합니다.
1단계는 물리적으로 타당합니다. 바이오리액터 온도가 37.00°C로 유지되는 동안 24비트 ADC의 미세한 열 잡음을 매초 전송하는 것은 네트워크 대역폭 낭비이기 때문입니다. 그러나 2단계(CompDev)는 원본 측정 기록 자체를 훼손합니다. TFF(접선 유동 여과) 스키드의 막간 차압(TMP) 센서나 크로마토그래피 UV280 검출기에 CompDev가 잘못 설정되면, 급격한 과도 피크가 디스크에 기록되기도 전에 평탄화되어 사라집니다. ALCOA+ 원본성(Original) 및 정확성(Accurate) 원칙 하에서 몇 바이트의 디스크 공간을 아끼기 위해 이미 수집된 1차 데이터를 버리는 것은 불필요한 규제 리스크입니다.
GxPHistorian은 Purdue 레벨 2.5 엣지(edge-collector)에서 **1단계 예외 데드밴드 필터링(ExcDev / ExcMax)**을 유지하되(앳라인 PAT 분석기의 경우 모든 분석값을 보존하기 위해 exc_dev = 0.0 적용), 2단계 손실 압축을 ClickHouse의 100% 수학적 무손실 컬럼형 코덱(init-clickhouse/01_telemetry_core.sql)으로 대체합니다:
CREATE TABLE IF NOT EXISTS pi_historian.sensor_data
(
tag_id UInt32 CODEC(Delta, ZSTD(1)),
ts DateTime64(3, 'UTC') CODEC(DoubleDelta, ZSTD(1)),
val Float64 CODEC(Gorilla, ZSTD(1)),
str_val LowCardinality(String) DEFAULT '' CODEC(ZSTD(1)),
quality UInt8 DEFAULT 192 CODEC(T64, ZSTD(1)),
status_code UInt16 DEFAULT 0 CODEC(T64, ZSTD(1))
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(ts)
ORDER BY (tag_id, ts);
데이터가 디스크 상에서 (tag_id, ts) 순으로 물리적 정렬되어 저장되기 때문에 다음의 압축 효율이 달성됩니다:
ts(DateTime64(3, 'UTC'))의DoubleDelta코덱: 일정한1 Hz폴링 주기에서 타임스탬프의 2차 미분값(Delta-of-delta)은0이 되므로, 8바이트 밀리초 타임스탬프가ZSTD(1)압축 전 단계에서 이미 1~2 비트로 줄어듭니다.val(Float64)의GorillaXOR 코덱: 동일tag_id의 연속된 IEEE 754 부동소수점 값을 XOR 연산하여 변경된 가수부(Mantissa) 비트만 기록합니다.quality및status_code의T64비트 전치 코덱: 전체 샘플의 99.9% 이상에서 OPC Good 품질(192)이 일정하게 유지되므로 비트 전치와ZSTD(1)을 거치면 오버헤드가 사실상 0에 수렴합니다.
압축 전 25바이트인 텔레메트리 행과 1분 AggregatingMergeTree 롤업 상태를 합산한 실효 디스크 사용량은 **샘플당 약 B_eff ≈ 1.5 ~ 2.5 바이트**입니다:
태그당 연간 디스크 사용량 (1 Hz 기준) = 86,400 samples/day × 365.25 days × B_eff × (1 - R_deadband)
25,000개 태그를 운영하는 상업용 GMP 공장이라 하더라도 10년 치 온라인 NVMe 핫 스토리지 요구량은 놀라울 정도로 작습니다:
| 운영 시나리오 | 실효 샘플링 속도 (1 - R_deadband) |
일일 태그당 용량 | 연간 태그당 용량 | 10년 핫 스토리지 총량 (25,000 태그) |
|---|---|---|---|---|
최악 조건 연속 수집 (exc_dev = 0, 100% 1 Hz) |
1.00 Hz (0% 억제) |
216 KB/일 |
78.9 MB/년 |
19.7 TB |
보수적 GMP 바이오공정 혼합 (50% 억제) |
평균 0.50 Hz |
108 KB/일 |
39.5 MB/년 |
9.86 TB |
일반적 GMP 플랜트 혼합 (70% 데드밴드 억제) |
평균 0.30 Hz |
64.8 KB/일 |
23.7 MB/년 |
5.92 TB |
로컬 엔터프라이즈 NVMe RAID-1 볼륨에서 10년간 즉시 조회가 가능한 핫 상태를 유지한 뒤에는, ClickHouse의 네이티브 멀티 볼륨 TTL ts + INTERVAL 10 YEAR TO VOLUME 'cold_worm_s3' 제로카피(Zero-copy) 티어링 정책이 오래된 파티션을 15년 S3 / MinIO Object Lock(Compliance Mode) WORM 스토리지로 자동 이관하여 FDA 21 CFR 211.180 및 EU GMP Chapter 4 보관 요건을 충족합니다.
4. 웹 앱이 아닌 데이터베이스 커널에서 강제하는 21 CFR Part 11 WORM 및 해시 체인
FDA와 EMA의 데이터 완전성(Data Integrity) 실사관들은 더 이상 전자 배치 기록에 대해 “웹 애플리케이션의 로깅 로직을 믿어달라”는 설명을 수용하지 않습니다. 감사 로그가 Python이나 Node.js 미들웨어에서만 기록된다면, 데이터베이스 접속 권한을 가진 관리자나 잘못 작성된 마이그레이션 스크립트가 언제든 흔적 없이 태그 알람 한계치를 수정하거나 감사 레코드를 삭제할 수 있기 때문입니다.
GxPHistorian은 PostgreSQL 16 데이터베이스 커널 내부(init-postgres/01_control_plane_part11.sql)에서 직접 21 CFR Part 11 및 EU GMP Annex 11 통제를 강제합니다:
1. 필수 세션 귀속성 강제 (21 CFR §11.10(e))
asset_templates, assets, tags, event_frames 테이블에 대한 모든 INSERT, UPDATE, DELETE 작업은 PL/pgSQL 트리거 함수 fn_enforce_part11_audit()에 의해 가로채집니다. 모든 트랜잭션은 DML 실행 전에 SET LOCAL을 통해 app.actor_id와 app.change_reason(historian-api의 X-Actor-Id 및 X-Change-Reason HTTP 헤더로부터 주입됨)을 바인딩해야 하며, 누락 시 커널이 즉시 트랜잭션을 거부합니다:
-- Enforce mandatory 21 CFR Part 11 attribution context
v_actor := NULLIF(current_setting('app.actor_id', true), '');
v_reason := NULLIF(current_setting('app.change_reason', true), '');
IF v_actor IS NULL OR v_reason IS NULL THEN
RAISE EXCEPTION '21 CFR Part 11 Violation: app.actor_id and app.change_reason are mandatory';
END IF;
2. 조건 없는 WORM 감사 트리거
part11_audit_log 테이블에는 행(Row) 레벨과 구문(Statement) 레벨 모두에 fn_prevent_audit_tampering() 트리거(trg_worm_part11_audit_log_row, trg_worm_part11_audit_log_stmt)가 장착되어 있습니다. part11_audit_log에 대한 어떠한 UPDATE, DELETE, TRUNCATE 시도도 무조건 21 CFR Part 11 WORM Violation: Audit trail records are immutable 예외를 발생시켜 데이터베이스 슈퍼유저(Superuser)에 의한 변조조차 원천 차단합니다.
3. 암호학적 SHA-256 해시 체이닝 (ALCOA+ Original & Enduring)
모든 감사 레코드는 체인 순서를 직렬화하기 위해 테이블을 EXCLUSIVE MODE로 잠근 뒤, GENESIS_0000000000000000 앵커에서부터 직전 레코드의 해시를 연결하는 pgcrypto SHA-256 다이제스트를 계산합니다:
row_hash = SHA256(prev_hash || recorded_at || actor_id || operation || coalesce(new_payload, ''))
QA 실사 중 언제든지 GET /api/v1/audit-trail/verify 엔드포인트를 호출하여 제네시스부터 현재까지의 전 구간 암호학적 무결성을 즉시 검증할 수 있습니다:
{
"chain_valid": true,
"verified_records": 220,
"genesis_anchor": "GENESIS_0000000000000000",
"broken_links": []
}
4. 이중 인증 전자서명 (§11.50, §11.70, §11.200)
ISA-88 이벤트 프레임에 전자서명을 수행할 때(POST /api/v1/event-frames/{event_id}/sign)는 PostgreSQL users 테이블의 pgcrypto bcrypt 해시를 통해 실시간 이중 요소(user_id + password)를 검증합니다. 인증이 완료되면 컨트롤 플레인은 (event_id, user_id, signature_meaning, signed_at)에 대해 부인 방지(Non-repudiable) HMAC-SHA256 서명 다이제스트를 생성하여 이벤트 프레임에 결합하고 이를 WORM 감사 로그에 영구 기록합니다.
5. 신호 품질 규율(quality >= 192)과 이산형(LOCF) 대 연속형(LINEAR) 보간법
바이오제약 현장의 자체 구축 히스토리언에서 데이터 완전성을 무너뜨리는 두 가지 대표적 결함이 있습니다:
결함 1: 불량 품질(Bad-Quality) 센서 폴트가 배치 롤업을 오염시키는 문제
CIP(정치세척) 중 pH 프로브가 분리되거나 Pt100 온도 센서에 단선(Wire break)이 발생하면, PLC는 흔히 -999.0이나 9999.0 같은 센티넬(Sentinel) 폴트 값을 OPC 품질 코드 0(Bad) 또는 64(Uncertain)와 함께 송출합니다.
- 만약 수집 단계에서
quality < 192를 아예 버리면, 보전(Maintenance) 엔지니어는 언제 케이블 단선이 발생했는지 진단할 증거를 잃게 됩니다. - 반대로
quality < 192를 롤업 집계에 포함시키면, 단 1초 동안 발생한9999.0폴트 스파이크가 해당 배치의 1분 평균값을 왜곡하고 허위 일탈 KPI를 발생시킵니다.
GxPHistorian은 pi_historian.sensor_data에 모든 원시 진단 상태(192 = Good, 64 = Uncertain, 0 = Bad)를 그대로 보존하는 동시에, 1분 AggregatingMergeTree 구체화 뷰(mv_sensor_rollup_1m), ClickHouse largestTriangleThreeBuckets(LTTB) 트렌드 쿼리, 이벤트 프레임 KPI 계산, Excel DataLink 추출 전반에서 WHERE quality >= 192 필터를 엄격하게 강제합니다.
결함 2: 이산형 설비 상태(Discrete State)에 선형 보간을 적용하는 오류
연속형 아날로그 측정값(BR201_TEMP_PV, BR201_PH_PV, is_step_tag = false)은 시간에 따라 연속적으로 변하므로 타임스탬프 사이를 선형 보간(LINEAR)해야 합니다. 반면 이산형 정수 상태 태그(BR201_AGIT_STATE: 0 = 정지, 1 = 저속, 2 = 고속 또는 is_step_tag = true인 ISA-88 배치 페이즈 태그)는 계단식으로 즉각 전이됩니다. 이산형 태그의 상태 1과 2 사이를 선형 보간하면 현실에 존재할 수 없는 1.5라는 교반기 상태가 합성됩니다.
GxPHistorian은 PostgreSQL tags 테이블의 is_step_tag 메타데이터를 ClickHouse RAM(pi_historian.pg_asset_tags)에 동기화하여 보간법을 자동으로 분기합니다:
- 연속형 태그(
is_step_tag = false): ClickHouse 시간 가중 선형 보간(WITH FILL STEP ... INTERPOLATE/LINEAR). - 이산형 스텝 태그(
is_step_tag = true): 직전 관측값 유지(LOCF_STEP) 보간을 적용하여 Grafana나 Excel DataLink(=GXPHISTORIAN_SAMPLED())에서 소수점 아티팩트가 절대 생성되지 않도록 보장합니다.
6. 결정론적 AI 오케스트레이션: Pydantic AI 코파일럿과 gxphistorian-mcp
거대 언어 모델(LLM)이 컨텍스트 윈도우 안에서 시계열 평균을 암산하게 하거나 타임스탬프를 보간하게 만들고, 나아가 전자서명을 직접 실행하도록 허용하는 것은 GAMP 5와 ALCOA+ 정확성(Accurate) 원칙에 정면으로 위배됩니다.
GxPHistorian은 app/gxp_ai_agent.py(Pydantic AI 기반)와 app/mcp_server.py(FastMCP 기반)를 통해 엄격한 아키텍처 경계를 구현합니다:
핵심 GxP AI 원칙: AI는 제안, 조회, 상관관계 분석만 수행하며, 모든 시계열 연산, 품질 필터링(
WHERE quality >= 192), 보간(LINEAR대LOCF_STEP), 감사 기록(SHA-256WORM 체인)은 결정론적 ClickHouse와 PostgreSQL이 실행한다.
1. 자동화된 ISA-88 일탈 사전 조사 (gxp_deviation_investigator_agent)
예를 들어 BioCorp.Fremont.USP.Bioreactor_201에서 BR201_TEMP_PV_High_Limit_Excursion 이벤트 프레임이 열리면, 조사 에이전트는 엄격하게 타입이 검증된 DeviationInvestigationBrief Pydantic 모델을 생성합니다(POST /api/v1/ai/event-frames/{event_id}/investigate):
- 동일 설비 형제 태그 상관분석: 동일한 ISA-95 자산에 연결된 모든 태그(
BR201_TEMP_PV,BR201_PH_PV,BR201_AGIT_STATE)에 대해 ClickHouse에서 결정론적으로 계산된min_val,avg_val,max_val,good_sample_count(quality >= 192),bad_quality_sample_count(quality < 192)를 조회합니다. - 온디맨드 역량 로딩(
defer_loading=True): 필요 시에만part11-forensicsCapability를 동적으로 로드하여 PostgreSQL SHA-256 해시 체인 무결성(verify_part11_hash_chain)과 최근 변경 이력(part11_audit_log)을 확인하고,diagnose_opc_signal_quality도구를 실행하여 해당 이벤트가 실제 공정 일탈(critical_process_excursion)인지, 센서/배선 불량(sensor_or_signal_fault,quality < 192)인지, 혹은 의도된 레시피 전이(setpoint_or_recipe_transition)인지 명확히 분류합니다.
2. 휴먼인더루프(HITL) 태그 온보딩 (gxp_copilot_agent + ApprovalRequired)
자동화 엔지니어가 신규 장비 온보딩을 요청하면(POST /api/v1/ai/copilot/propose-tag), gxp_copilot_agent는 brownfield-onboarding Capability(defer_loading=True)를 로드하여 35개 이상의 바이오제약 장비 플레이북을 검색하고, args_validator를 통해 공학 한계치(low_limit >= high_limit 역전 여부 및 스텝 태그의 데드밴드 설정 오류 등)를 검증(ModelRetry)한 뒤, Pydantic AI의 ApprovalRequired(DeferredToolRequests) 게이트를 발생시켜 실행을 일시 중지합니다.
인간 엔지니어가 스테이징된 BrownfieldOnboardingPlan을 검토하고 명시적인 X-Actor-Id 및 X-Change-Reason 헤더와 함께 승인하기 전까지는 어떠한 데이터베이스 쓰기도 일어나지 않습니다. 또한 AI 에이전트에게는 전자서명 엔드포인트(POST /api/v1/event-frames/{event_id}/sign)에 대한 도구 접근 권한이 원천적으로 부여되지 않으므로, 21 CFR §11.200 전자서명은 100% 인간 전용으로 유지됩니다.
3. 모델 컨텍스트 프로토콜 서버 (gxphistorian-mcp)
외부 에이전트 생태계(Claude Desktop, Cursor, Antigravity, 또는 GxPChat)와의 연동을 위해 app/mcp_server.py는 6개의 읽기 전용 결정론적 도구와 3개의 URI 리소스를 노출합니다:
mcp_browse_assets— PostgreSQL 내 ISA-95ltree설비 계층 구조 및 태그 카탈로그 탐색.mcp_get_lttb_plot_values— 피크를 보존하는 ClickHouse LTTB 다운샘플링 트렌드 조회(WHERE quality >= 192).mcp_get_sampled_values— 태그별 보간 규율(LINEAR대LOCF_STEP)이 적용된 시계열 조회.mcp_list_event_frames— ISA-88 배치/일탈 이벤트 프레임 및 §11.200 전자서명 상태 조회.mcp_verify_part11_audit_chain—GENESIS부터 시작하는 실시간 SHA-256 WORM 해시 체인 검증.mcp_investigate_event_frame— 특정 이벤트 프레임 UUID에 대한 결정론적DeviationInvestigationBrief생성.
7. 35개 이상의 바이오제약 장비 연동 플레이북 및 8종 GAMP 5 밸리데이션 바인더
소프트웨어 코드만으로는 GMP 공장의 적격성 평가(Qualification)를 통과할 수 없습니다. GxPHistorian 저장소와 gxphistorian.com에는 현장 엔지니어링과 QA 승인을 즉시 지원하는 두 가지 핵심 산출물이 포함되어 있습니다:
35개 이상의 바이오제약 장비 및 10대 산업용 프로토콜 시각적 가이드
문서 포털(gxphistorian.com/docs)은 물리적 커넥터 핀배열(RJ45 T568B, M12 D/X/A-Coded, DB9 RS-232/MPI, Phoenix RS-485, 4–20 mA HART), 산업용 게이트웨이 파트 넘버(Moxa NPort, Advantech ADAM, LOYTEC BACnet, Helmholz S7), 장비 HMI 메뉴 경로, 그리고 복사해서 바로 쓸 수 있는 태그 프로비저닝 명령어를 제공합니다:
- 싱글유즈 및 스테인리스 상류(USP) 바이오리액터: Cytiva Xcellerex™ XDR-50 ~ XDR-2000 (Figurate™ Automation / Emerson DeltaV™ / Rockwell PlantPAx®), Sartorius Biostat® STR 및 Ambr® 15/250, Thermo HyPerforma™ S.U.B., Eppendorf BioFlo® / DASGIP®.
- 하류 정제(크로마토그래피 및 TFF): Cytiva ÄKTA process™ / ready™ / readyflux™ (UNICORN™ 7 OPC UA/DA 및 LTTB UV280 피크 보존), Sartorius Sartoflow®, MilliporeSigma Mobius® / Cogent®.
- 앳라인 PAT 및 인라인 분광학(Spectroscopy): Nova BioProfile® FLEX2, Beckman Vi-CELL™ BLU, Roche Cedex® Bio HT, Endress+Hauser Kaiser Raman Rxn2/4 (
exc_dev = 0), Hamilton Arc® 지능형 센서. - 세포·유전자 치료제(CAR-T) 및 mRNA-LNP: Miltenyi CliniMACS Prodigy®, Cytiva Sefia™ 및 Sepax™ C-Pro, Precision NanoSystems NanoAssemblr™, Planer Kryo 560 프로그램 냉동기(
COI_ID이벤트 프레임). - 무균 충전·마감, 동결건조기, 클린룸 EMS 및 QC 시리얼 장비: SP Scientific / Telstar 동결건조기, SKAN 아이솔레이터, PMS LasAir® III 부유입자 계수기, Veolia Sievers® M9 TOC 분석기, BINDER 안정성 챔버(ClickHouse 평균운동온도 MKT SQL), Fedegari / Getinge 고압멸균기(
F₀치사율 SQL), 그리고 RS-232 MT-SICS 및 SHA-256 워치폴더를 통한 Mettler Toledo XPR / Sartorius Cubis® II 저울 연동(OSIsoft PI UFL 대체).
턴키 8종 GAMP 5 및 FDA CSA 밸리데이션 바인더
모든 릴리스에는 실행 가능한 pytest 기반 설치 및 운전 적격성 평가(IQ/OQ) 스위트(URS-001~URS-017을 검증하는 17/17 자동화 테스트)가 포함되어 있으며, 실행 결과 증거를 oq_execution_results.json에 기록하고 즉시 인쇄 및 QA 서명이 가능한 8종 상용 GMP 밸리데이션 바인더(온라인 HTML 바인더 바로가기)를 생성합니다:
VMP-GXPHISTORIAN-2026-001— 밸리데이션 마스터 플랜 (GAMP 5 개정 2판 및 FDA CSA 수명주기).URS-GXPHISTORIAN-2026-002— 사용자 요구사항 명세서 (URS-001~URS-017).FDS-GXPHISTORIAN-2026-003— 기능 및 설계 명세서 (4-Pillar 스키마, 코덱 및 커널 트리거).FRA-GXPHISTORIAN-2026-004— FDA CSA 기능적 위험 평가서 (Functional Risk Assessment).SOUP-GXPHISTORIAN-2026-005— SOUP / 오픈소스 벤더 적격성 평가 도시에 (컨테이너 이미지@sha256다이제스트 고정).IQOQ-GXPHISTORIAN-2026-006— 실행된 IQ/OQ 검증 결과 보고서 (17/17 Passed).RTM-GXPHISTORIAN-2026-007— 양방향 요구사항 추적성 매트릭스 (URS ↔ FDS ↔ FRA ↔ IQ/OQ).VSR-GXPHISTORIAN-2026-008— 밸리데이션 요약 보고서 및 QA 릴리스 승인서.
8. 60초 만에 시작하기
결정론적 멀티 프로토콜 바이오제약 플랜트 시뮬레이터(BioCorp.Fremont.USP.Bioreactor_201 및 BioCorp.Fremont.Cleanroom.Suite_A), ClickHouse 24.8 LTS, PostgreSQL 16 WORM 트리거, FastAPI 컨트롤 플레인, 그리고 사전 구성된 Grafana Vision HMI까지 포함된 5개 서비스 전체 스택을 단 세 줄의 명령어로 기동할 수 있습니다:
git clone https://github.com/saram-io/gxp-historian.git
cd gxp-historian
# 1. 5개 GxP 핵심 서비스 기동 (Edge WAL, ClickHouse, PG16, FastAPI, Grafana)
cp .env.example .env && docker compose up -d --build
# 2. GENESIS부터 이어진 암호학적 SHA-256 WORM 감사 해시 체인 무결성 검증
curl -s http://localhost:8020/api/v1/audit-trail/verify | jq .
# 3. 17개 테스트로 구성된 GAMP 5 / FDA CSA IQ & OQ 적격성 평가 스위트 실행
.venv/bin/pytest -v
GxPHistorian 살펴보기
- 공식 웹사이트: gxphistorian.com
- 기술 문서 및 35+ 바이오제약 장비 연동 가이드: gxphistorian.com/docs
- 실행 완료된 GMP 밸리데이션 바인더: gxphistorian.com/binder/COMPLETE_GMP_VALIDATION_BINDER.html
- GitHub 저장소 (MIT 라이선스): github.com/saram-io/gxp-historian
Saram Consulting