CE 마킹
CE Marking
유럽 시장 출시를 위한 적합성 인증 마크. 고위험 AI는 CE 마킹 필수.
CE Marking
유럽 시장 출시를 위한 적합성 인증 마크. 고위험 AI는 CE 마킹 필수.
CE 마킹(Conformite Europeenne)은 제품이 EU의 안전, 건강, 환경 보호 요구사항을 충족함을 나타내는 인증 마크입니다. EU AI Act에서 고위험 AI 시스템은 CE 마킹을 획득해야만 EU 시장에 출시할 수 있으며, 이는 적합성 평가(Conformity Assessment)를 통과했음을 의미합니다.
고위험 AI의 CE 마킹 획득을 위해서는 기술 문서 작성, 품질관리시스템 구축, 위험 관리 시스템 운영, 데이터 거버넌스 체계 확립이 필요합니다. 대부분의 고위험 AI는 자체 적합성 평가(Self-Assessment)로 충분하나, 특정 분야(생체인식 등)는 제3자 기관(Notified Body) 평가가 필요합니다.
CE 마킹 절차는 1) EU AI Act 요구사항 파악, 2) 기술 문서 준비, 3) 적합성 평가 수행, 4) EU 적합성 선언서(Declaration of Conformity) 작성, 5) CE 마킹 부착, 6) EU 데이터베이스 등록 순으로 진행됩니다.
CE 마킹은 제품에 직접 부착하거나, 불가능한 경우 포장, 동봉 문서, 사용 설명서에 표시합니다. 마킹 높이는 최소 5mm 이상이어야 하며, 비율을 유지하며 축소/확대 가능합니다. 다른 마크와 혼동되지 않도록 배치해야 합니다.
# CE 마킹 적합성 평가 체크리스트 시스템
from dataclasses import dataclass, field
from typing import List, Dict, Optional
from datetime import datetime
from enum import Enum
class AssessmentRoute(Enum):
"""적합성 평가 경로"""
SELF_ASSESSMENT = "self_assessment" # 자체 적합성 평가
NOTIFIED_BODY = "notified_body" # 제3자 기관 평가
class ConformityModule(Enum):
"""EU 적합성 평가 모듈"""
MODULE_A = "internal_production_control" # 내부 생산 통제
MODULE_B = "eu_type_examination" # EU 유형 검사
MODULE_C = "conformity_to_type" # 유형 적합성
MODULE_D = "quality_assurance" # 품질 보증
MODULE_H = "full_quality_assurance" # 완전 품질 보증
@dataclass
class CEMarkingRequirement:
"""CE 마킹 요구사항"""
id: str
category: str
description: str
eu_ai_act_article: str
status: str = "not_started" # not_started, in_progress, completed
evidence_document: Optional[str] = None
@dataclass
class CEMarkingProcess:
"""CE 마킹 획득 프로세스 관리"""
ai_system_name: str
provider_name: str
high_risk_category: str
assessment_route: AssessmentRoute
notified_body: Optional[str] = None
requirements: List[CEMarkingRequirement] = field(default_factory=list)
# 마킹 정보
ce_marking_date: Optional[datetime] = None
declaration_number: Optional[str] = None
registration_id: Optional[str] = None
def __post_init__(self):
self._initialize_requirements()
def _initialize_requirements(self):
"""EU AI Act 기반 CE 마킹 요구사항"""
reqs = [
CEMarkingRequirement(
id="CE-01",
category="위험관리",
description="위험 관리 시스템 수립 및 문서화",
eu_ai_act_article="Article 9"
),
CEMarkingRequirement(
id="CE-02",
category="데이터 거버넌스",
description="학습/검증/테스트 데이터 품질 관리",
eu_ai_act_article="Article 10"
),
CEMarkingRequirement(
id="CE-03",
category="기술문서",
description="기술 문서 작성 (부속서 IV 준수)",
eu_ai_act_article="Article 11"
),
CEMarkingRequirement(
id="CE-04",
category="기록보관",
description="자동 로깅 기능 구현",
eu_ai_act_article="Article 12"
),
CEMarkingRequirement(
id="CE-05",
category="투명성",
description="사용자 대상 정보 제공 체계",
eu_ai_act_article="Article 13"
),
CEMarkingRequirement(
id="CE-06",
category="인간감독",
description="인간 감독 메커니즘 구현",
eu_ai_act_article="Article 14"
),
CEMarkingRequirement(
id="CE-07",
category="정확성/견고성",
description="정확성, 견고성, 사이버보안 확보",
eu_ai_act_article="Article 15"
),
CEMarkingRequirement(
id="CE-08",
category="품질관리",
description="품질관리시스템(QMS) 구축",
eu_ai_act_article="Article 17"
),
]
self.requirements.extend(reqs)
def check_conformity_readiness(self) -> Dict:
"""적합성 평가 준비 상태 확인"""
total = len(self.requirements)
completed = len([r for r in self.requirements if r.status == "completed"])
in_progress = len([r for r in self.requirements if r.status == "in_progress"])
return {
"ai_system": self.ai_system_name,
"provider": self.provider_name,
"assessment_route": self.assessment_route.value,
"notified_body": self.notified_body,
"progress": {
"total_requirements": total,
"completed": completed,
"in_progress": in_progress,
"not_started": total - completed - in_progress,
"completion_rate": completed / total * 100
},
"ready_for_assessment": completed == total,
"pending_items": [
{"id": r.id, "description": r.description}
for r in self.requirements if r.status != "completed"
]
}
def generate_declaration_of_conformity(self) -> Dict:
"""EU 적합성 선언서 생성"""
if not self.check_conformity_readiness()["ready_for_assessment"]:
raise ValueError("모든 요구사항 충족 전 선언서 생성 불가")
return {
"document_type": "EU DECLARATION OF CONFORMITY",
"declaration_number": self.declaration_number or f"DoC-{datetime.now().strftime('%Y%m%d')}",
"provider": {
"name": self.provider_name,
"address": "...", # 실제 구현 시 입력
"contact": "..."
},
"ai_system": {
"name": self.ai_system_name,
"high_risk_category": self.high_risk_category,
"version": "...",
"unique_identifier": "..."
},
"conformity_assessment": {
"route": self.assessment_route.value,
"notified_body": self.notified_body,
"certificate_number": "..." if self.notified_body else None
},
"legal_references": [
"Regulation (EU) 2024/1689 (AI Act)",
],
"declaration": "본 AI 시스템은 위 규정의 관련 요구사항을 준수합니다.",
"signed_date": datetime.now().isoformat(),
"authorized_signatory": "..."
}
# 사용 예시
ce_process = CEMarkingProcess(
ai_system_name="AI 신용평가 시스템 v2.0",
provider_name="KAITRUST Corp",
high_risk_category="Essential Services - Credit Scoring",
assessment_route=AssessmentRoute.SELF_ASSESSMENT
)
# 요구사항 완료 처리
for req in ce_process.requirements:
req.status = "completed"
req.evidence_document = f"DOC-{req.id}-evidence.pdf"
print(ce_process.check_conformity_readiness())
print(ce_process.generate_declaration_of_conformity())
법무팀: "CE 마킹 없이 EU 출시하면 불법이에요. 2026년 8월 전에 적합성 평가 완료해야 합니다."
개발팀: "신용평가 AI는 자체 적합성 평가로 충분하다고 확인했습니다. 기술 문서와 QMS 문서화가 핵심이에요. 제3자 기관 필요한 건 생체인식뿐입니다."
면접관: "AI 제품의 CE 마킹 획득 절차를 설명해 주세요."
지원자: "먼저 고위험 AI 해당 여부를 확인하고, 기술 문서와 QMS를 준비합니다. 대부분 자체 적합성 평가로 충분하지만, 생체인식 등은 인증기관 평가가 필요합니다. 평가 통과 후 적합성 선언서 작성, CE 마킹 부착, EU 데이터베이스 등록 순으로 진행합니다."
컴플라이언스: "이 버전 업데이트로 CE 마킹 재인증이 필요한가요?"
개발자: "실질적 변경(Substantial Modification)에 해당하는지 체크리스트로 확인했습니다. 의도된 용도나 위험 프로필 변경 없어서 기존 마킹 유지 가능합니다. 기술 문서만 업데이트하면 됩니다."