Refinery Pipeline
원본 파일 하나가 판매 가능한 학습 샘플이 되기까지 여섯 단계를 거칩니다. 각 단계가 앞 단계의 산출물을 해시로 이어받기에, 중간에 변경이 생기면 최종 검증에서 드러납니다.
파일 바이트 전체의 SHA-256으로 asset_id를 결정합니다.
같은 파일은 몇 번을 넣어도 같은 자산이 되어 이중 계상이 발생하지 않습니다.
동시에 ffprobe/EXIF로 촬영 기기, 해상도, 길이, 제작 시각 같은 기술 메타데이터를 수집합니다.
이미지에는 DCT 기반 지각해시(pHash)를 함께 계산해, 리사이즈·재인코딩된 사본을 뒤 단계에서 잡아냅니다.
권리 정보를 다섯 경로에서 순서대로 찾습니다. 사이드카 파일 →
폴더 RIGHTS.json → 배치 매니페스트 →
EXIF/XMP 권리 필드 → 본문 라이선스 문구.
어느 경로에서도 확정되지 않으면 자산은 격리되고
이후 어떤 데이터셋에도 편입되지 않습니다.
TDM opt-out(noai, AI 학습 금지 등) 신호는 어떤 라이선스보다 우선 적용되어 즉시 학습 배제됩니다.
미디어 종류에 따라 갈라집니다.
NVDEC 디코딩 → 장면 전환 검출 → 구간별 중앙 키프레임 추출 →
(납품 자막 우선, 없으면 CUDA ASR) 전사 → 프레임 OCR/캡션 → 구간 단위 멀티모달 샘플 생성.
샘플마다 start_sec / end_sec가 남습니다.
16kHz 모노 추출 → VAD 필터 → faster-whisper 전사 → 너무 짧은 발화 조각은 문맥이 살아나도록 병합. 신뢰도와 발화 속도로 환각을 선별합니다.
OCR + (선택) VLM 캡션 + CLIP 임베딩. 얼굴 검출 결과는 PII 플래그로 남습니다.
모델이 만든 캡션은 model_generated로 표기되어 사람 라벨과 구분됩니다.
PDF·DOCX·PPTX·HWP/HWPX·HTML·자막 파싱 후 문장 경계를 지켜 청킹. 청크마다 페이지와 문자 오프셋을 기록해 “몇 페이지 몇 자”까지 역추적됩니다.
정제의 성패가 갈리는 구간입니다. 반복 환각과 링크 나열, 어휘 다양성 부족과 상용구 과다, 비현실적인 발화 속도와 저해상도, 극단적인 종횡비를 점수로 환산해 기준 미만을 제외합니다.
중복은 세 겹으로 걸러냅니다. 정확 해시로 동일 바이트를, 지각해시로 재인코딩된 사본을, SimHash로 미세하게 수정된 문장을 잡습니다. 같은 묶음에서는 대표 한 건만 데이터셋에 포함됩니다.
개인정보(주민번호·연락처·계좌·차량번호·여권)는 정규식으로 탐지해 마스킹하고 플래그를 남깁니다. AI 생성물 추정치가 상한을 넘으면 모델 붕괴 예방을 위해 배제합니다.
자산에서 파생된 모든 샘플의 리프를 머클 트리로 묶어 루트를 만들고, 공장 서명키로 서명합니다.
그 루트를 담아 출처 토큰을 발행합니다. 토큰 ID는 asset_id에서
결정적으로 파생되므로 재실행해도 동일하며, 콘텐츠 해시 중복 발행은 컨트랙트가 거부합니다.
RPC가 설정되지 않은 환경에서는 dry-run으로 동작합니다. 메타데이터와 토큰 ID는 동일하게 만들어지므로, 나중에 온체인으로 승격해도 이미 배포된 데이터셋의 token_id는 바뀌지 않습니다.
정책 게이트를 통과한 샘플만 모아 샤드로 패키징합니다. 산출물에는 데이터 외에도
NOTICE.md(출처표시 이행 문서),
LICENSE-REPORT.csv(자산별 권리 명세),
provenance.jsonl(행-토큰 매핑),
VERIFY.md(구매자 검증 절차)가 포함됩니다.
이 단계가 정유공장의 분별 인출에 해당합니다.
앞 단계까지 만들어진 샘플 풀은 정제유이고, --product로 인출 조건을 바꾸면
같은 원료에서 평가 세트·지시학습·멀티모달·RAG·사전학습 코퍼스가 각각 나옵니다.
제품마다 출력 스키마가 다르지만 출처 토큰은 어느 제품에서도 덜어내지 않습니다.
학습을 실행할 때 bnic cite로 인용을 기록하면 토큰별 카운터가 올라가고,
그 기록이 그대로 권리자 정산 근거가 됩니다.
Supported Inputs
mp4 mov mkv avi webm mxf ts m4v
wav mp3 flac m4a aac ogg
jpg png webp gif bmp tif heic dng
pdf docx pptx hwp hwpx html srt vtt txt md csv
Parser CLI
공장 파서는 단일 파이썬 패키지입니다. 코어(해시·머클·라벨링·빌드·원장·역추적)는 표준 라이브러리만으로 동작하고, GPU 정제 단계만 선택 의존성을 사용합니다.
# GPU 정제 단계 활성화 (선택) pip install -r parser/requirements.txt pip install torch --index-url https://download.pytorch.org/whl/cu124 # 공장 초기화 (발행 대상: GIWA 메인넷) cd parser python -m bnic_parser init --workdir ./factory --node bnic-gpu-01 --network giwa # 발행 체인 확정 - RPC에 eth_chainId를 물어 chain_id를 채운다 python -m bnic_parser chain --network giwa --rpc https://<메인넷 RPC> python -m bnic_parser chain --contract 0x<배포주소> # GPU/의존성/체인/키 상태 확인 python -m bnic_parser doctor
bnic chain이 RPC에 직접 물어 받은 값만 기록합니다.
발행 직전에도 한 번 더 대조하고, 불일치하면 발행을 중단하고 dry-run으로 강등합니다.
# 권리 매니페스트와 함께 원본 디렉터리 투입 python -m bnic_parser parse D:/archive/2026 \ --rights rights.csv \ --operator kim \ --batch batch:20260903 # 발행 없이 파싱만 (권리 검토 대기 중일 때) python -m bnic_parser parse ./inbox --no-mint
# 같은 샘플 풀에서 제품을 달리 뽑는다 (정유공장의 분별 인출) python -m bnic_parser build --name kr-weather-eval --product eval python -m bnic_parser build --name kr-weather-sft --product sft python -m bnic_parser build --name kr-weather-bulk --product pretrain # 조건을 직접 지정하는 혼합 산출물 python -m bnic_parser build \ --name kr-broadcast-weather \ --dsversion 1.0.0 \ --media-types video audio \ --languages ko \ --min-quality 0.5 # 구매자와 동일한 절차로 무결성 확인 python -m bnic_parser verify factory/datasets/kr-broadcast-weather-1.0.0
# 3에폭 학습 → 토큰별 인용 카운터 증가 python -m bnic_parser cite \ --dataset factory/datasets/kr-broadcast-weather-1.0.0 \ --model bnic-lmm-7b \ --customer "고객사 A" \ --epochs 3 --revenue 120000000 --anchor
python -m bnic_parser trace "모델이 생성한 문장" -k 5 # 결과: 원본 파일 · 구간 · 권리자 · 라이선스 · 토큰 ID
# 인용 원장 → 권리자별 정산 명세 python -m bnic_parser royalty --period 2026-09 \ --revenue 120000000 --csv payout.csv # 권리자 철회 요청 반영 (영향 데이터셋 자동 산출) python -m bnic_parser revoke bnic:asset:xxxx \ --reason "계약 종료" --by "권리자" # 사이트에 현황 반영 python -m bnic_parser export-web
BNIC_SIGNING_KEY / BNIC_MINTER_KEY로만 주입됩니다.
미설정 시 dry-run으로 동작해 실수로 온체인 트랜잭션이 나가지 않습니다.
Configuration
정책 값은 파일 하나로 관리되며, 데이터셋 매니페스트에 그대로 봉인되어 구매자가 “어떤 기준으로 걸러졌는지” 확인할 수 있습니다.
{
"gpu": {
"node": "bnic-gpu-01", // 매니페스트에 기록되는 파싱 노드 이름
"devices": [0],
"hwaccel": "cuda", // NVDEC 하드웨어 디코딩
"asr_model": "large-v3",
"asr_compute_type": "float16",
"vision_model": "ViT-L-14",
"batch_size": 16,
"vram_budget_gb": 20.0 // 초과 위험 시 배치 자동 축소
},
"chain": {
"chain_name": "giwa", // GIWA (업비트 이더리움 L2)
"chain_id": 0, // `bnic chain`이 실측값으로 채운다 - 손으로 적지 않는다
"rpc_url": "",
"explorer_url": "",
"contract": "0x...", // 배포된 BNICDataProvenance 주소
"metadata_base_uri": "https://bnaif.com/token/"
}, // 제원 미확정 또는 키 미설정 시 dry-run
"policy": {
"allowed_training_permissions": ["allowed", "allowed_with_attribution"],
"require_token": true, // NFT 미발행 자산 편입 금지
"require_verified": ["human", "legal_review"],
"block_unknown_rights": true,
"drop_pii": true,
"max_synthetic": 0.6, // AI 생성물 과다 유입 차단
"min_quality": 0.35,
"dedup_phash_distance": 6
}
}