고위험 AI
High-Risk AI
EU AI Act에서 정의한 안전·기본권에 높은 위험을 초래하는 AI. 의료, 교육, 고용 분야 등이 해당.
High-Risk AI
EU AI Act에서 정의한 안전·기본권에 높은 위험을 초래하는 AI. 의료, 교육, 고용 분야 등이 해당.
고위험 AI(High-Risk AI)는 EU AI Act(인공지능법)에서 정의한 분류로, 사람의 안전이나 기본권에 상당한 위험을 초래할 수 있는 AI 시스템을 말합니다. 이러한 AI 시스템은 시장에 출시되기 전 엄격한 요건을 충족해야 하며, 사용 중에도 지속적인 모니터링과 규제가 적용됩니다.
EU AI Act는 2024년 8월 1일 공식 발효되었으며, 세계 최초의 포괄적 AI 규제법으로 전 세계 AI 규제의 기준점 역할을 하고 있습니다. 고위험 AI는 두 가지 경로로 분류됩니다:
고위험 AI로 분류되는 Annex III의 8개 영역:
AI 시스템 전 생애주기에 걸친 위험 식별, 분석, 평가, 완화 프로세스 수립
학습/검증/테스트 데이터셋의 품질, 대표성, 편향성 관리 체계
시스템 설계, 개발, 테스트 정보의 상세 문서 작성 및 유지
운영 중 이벤트 자동 기록, 추적 가능성 보장
배포자·사용자에게 충분한 정보 제공, 결과 해석 가능성
인간이 AI 시스템을 모니터링하고 개입할 수 있는 체계
적절한 정확도 수준, 오류·공격에 대한 복원력
무단 접근, 조작, 데이터 유출 방지 조치
| 위반 유형 | 최대 과징금 | 매출 비율 |
|---|---|---|
| 금지된 AI 관행 위반 | 3,500만 유로 | 전 세계 연매출 7% |
| 고위험 AI 요건 위반 | 1,500만 유로 | 전 세계 연매출 3% |
| 기타 의무 위반 | 750만 유로 | 전 세계 연매출 1.5% |
| 허위 정보 제공 | 750만 유로 | 전 세계 연매출 1% |
※ SME(중소기업) 및 스타트업에는 감경 조항이 적용될 수 있습니다.
# EU AI Act 고위험 AI 분류 체커 (Python) from dataclasses import dataclass, field from enum import Enum from typing import List, Optional class AnnexIIICategory(Enum): BIOMETRICS = "1. 생체 인식" CRITICAL_INFRASTRUCTURE = "2. 중요 인프라" EDUCATION = "3. 교육·직업훈련" EMPLOYMENT = "4. 고용" ESSENTIAL_SERVICES = "5. 필수 서비스" LAW_ENFORCEMENT = "6. 법 집행" MIGRATION = "7. 이민·망명" JUSTICE = "8. 사법" class RiskLevel(Enum): PROHIBITED = "금지" HIGH_RISK = "고위험" LIMITED_RISK = "제한적 위험" MINIMAL_RISK = "최소 위험" @dataclass class HighRiskAIClassifier: """EU AI Act 고위험 AI 분류기""" system_name: str system_description: str deployment_region: str intended_purpose: str def check_prohibited_practices(self) -> List[str]: """금지된 AI 관행 체크""" prohibited_indicators = [] checks = { "subliminal": "무의식적 조작 기법 사용", "exploit_vulnerable": "취약 계층 착취", "social_scoring": "소셜 스코어링 (공공기관)", "predictive_policing": "개인 대상 범죄 예측", "emotion_workplace": "직장/교육 감정 인식", "facial_scraping": "무차별 얼굴 데이터 수집", "real_time_biometric": "실시간 원격 생체인식 (법집행)", } # 실제 구현에서는 NLP/규칙 기반으로 판단 purpose_lower = self.intended_purpose.lower() for key, desc in checks.items(): if key.replace("_", " ") in purpose_lower: prohibited_indicators.append(desc) return prohibited_indicators def check_annex_iii_category(self) -> Optional[AnnexIIICategory]: """Annex III 고위험 영역 해당 여부""" purpose = self.intended_purpose.lower() category_keywords = { AnnexIIICategory.BIOMETRICS: ["생체", "얼굴 인식", "지문", "감정 인식"], AnnexIIICategory.CRITICAL_INFRASTRUCTURE: ["전력", "가스", "수도", "교통 관제"], AnnexIIICategory.EDUCATION: ["입학", "학습 평가", "시험", "부정행위"], AnnexIIICategory.EMPLOYMENT: ["채용", "이력서", "면접", "인사 평가", "해고"], AnnexIIICategory.ESSENTIAL_SERVICES: ["대출", "신용", "보험", "응급"], AnnexIIICategory.LAW_ENFORCEMENT: ["범죄", "수사", "증거", "경찰"], AnnexIIICategory.MIGRATION: ["비자", "이민", "망명", "국경"], AnnexIIICategory.JUSTICE: ["판결", "법원", "재판", "분쟁 해결"], } for category, keywords in category_keywords.items(): if any(kw in purpose for kw in keywords): return category return None def classify(self) -> dict: """AI 시스템 위험 분류 수행""" result = { "system_name": self.system_name, "risk_level": RiskLevel.MINIMAL_RISK, "prohibited_practices": [], "annex_iii_category": None, "eu_market_applicable": "EU" in self.deployment_region.upper(), "obligations": [], "deadline": None, } # Step 1: 금지된 관행 체크 prohibited = self.check_prohibited_practices() if prohibited: result["risk_level"] = RiskLevel.PROHIBITED result["prohibited_practices"] = prohibited result["deadline"] = "2025-02-02 (이미 시행 중)" return result # Step 2: Annex III 고위험 체크 category = self.check_annex_iii_category() if category: result["risk_level"] = RiskLevel.HIGH_RISK result["annex_iii_category"] = category.value result["deadline"] = "2027-08-02" result["obligations"] = [ "위험 관리 시스템 구축 (Art. 9)", "데이터 거버넌스 수립 (Art. 10)", "기술 문서 작성 (Art. 11)", "자동 로깅 구현 (Art. 12)", "투명성 보장 (Art. 13)", "인간 감독 체계 (Art. 14)", "정확성·견고성·보안 (Art. 15)", "적합성 평가 및 CE 마킹", ] return result def generate_report(self) -> str: """분류 결과 보고서 생성""" result = self.classify() report = f""" ╔══════════════════════════════════════════════════════════════╗ ║ EU AI Act 고위험 AI 분류 보고서 ║ ╠══════════════════════════════════════════════════════════════╣ ║ 시스템명: {result['system_name']:<44}║ ║ 위험 등급: {result['risk_level'].value:<43}║ ║ EU 시장 적용: {'예' if result['eu_market_applicable'] else '아니오':<40}║ ╚══════════════════════════════════════════════════════════════╝ """ if result["risk_level"] == RiskLevel.PROHIBITED: report += """ ⛔ [금지된 AI 관행 해당] 다음 금지 조항에 해당될 수 있습니다: """ for p in result["prohibited_practices"]: report += f" • {p}\n" elif result["risk_level"] == RiskLevel.HIGH_RISK: report += f""" ⚠️ [고위험 AI 해당] 분류 영역: {result['annex_iii_category']} 준수 마감: {result['deadline']} 필수 의무 사항: """ for ob in result["obligations"]: report += f" ✓ {ob}\n" else: report += """ ✅ [고위험 AI 비해당] 별도의 강제 의무 없이 자율 규제 적용 """ return report # 사용 예시 classifier = HighRiskAIClassifier( system_name="AI 채용 심사 시스템", system_description="이력서 분석 및 면접 평가 AI", deployment_region="EU, 한국", intended_purpose="채용 프로세스에서 이력서 심사 및 면접 평가 지원" ) print(classifier.generate_report())
# EU AI Act 기술 문서 생성기 (Art. 11 준수) from dataclasses import dataclass, field from typing import List, Dict, Optional from datetime import datetime import json @dataclass class TechnicalDocumentation: """EU AI Act Article 11 기술 문서 템플릿""" # 1. 일반 정보 system_name: str version: str provider_name: str provider_address: str intended_purpose: str high_risk_category: str # 2. 시스템 설명 general_description: str = "" interaction_with_hardware: str = "" software_version: str = "" input_data_types: List[str] = field(default_factory=list) output_data_types: List[str] = field(default_factory=list) # 3. 개발 과정 design_specifications: str = "" development_methodology: str = "" training_approach: str = "" # 4. 데이터셋 정보 training_data_description: str = "" training_data_source: str = "" data_preparation_methods: str = "" data_labeling_info: str = "" bias_examination: str = "" # 5. 성능 메트릭 performance_metrics: Dict[str, float] = field(default_factory=dict) validation_methodology: str = "" known_limitations: List[str] = field(default_factory=list) # 6. 위험 관리 identified_risks: List[str] = field(default_factory=list) risk_mitigation_measures: List[str] = field(default_factory=list) # 7. 인간 감독 human_oversight_measures: str = "" operator_instructions: str = "" def generate_document(self) -> str: """기술 문서 생성""" doc = f""" ════════════════════════════════════════════════════════════════════ 기술 문서 (TECHNICAL DOCUMENTATION) EU AI Act Article 11 준수 ════════════════════════════════════════════════════════════════════ 문서 생성일: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 문서 버전: {self.version} ──────────────────────────────────────────────────────────────────── 1. 일반 정보 (GENERAL INFORMATION) ──────────────────────────────────────────────────────────────────── 시스템명: {self.system_name} 공급자: {self.provider_name} 주소: {self.provider_address} 고위험 분류: {self.high_risk_category} 의도된 목적: {self.intended_purpose} ──────────────────────────────────────────────────────────────────── 2. 시스템 설명 (SYSTEM DESCRIPTION) ──────────────────────────────────────────────────────────────────── 일반 설명: {self.general_description} 소프트웨어 버전: {self.software_version} 입력 데이터 유형: {chr(10).join(f' • {t}' for t in self.input_data_types)} 출력 데이터 유형: {chr(10).join(f' • {t}' for t in self.output_data_types)} 하드웨어 상호작용: {self.interaction_with_hardware} ──────────────────────────────────────────────────────────────────── 3. 개발 과정 (DEVELOPMENT PROCESS) ──────────────────────────────────────────────────────────────────── 설계 사양: {self.design_specifications} 개발 방법론: {self.development_methodology} 학습 접근법: {self.training_approach} ──────────────────────────────────────────────────────────────────── 4. 데이터셋 정보 (DATA INFORMATION) ──────────────────────────────────────────────────────────────────── 학습 데이터 설명: {self.training_data_description} 데이터 출처: {self.training_data_source} 데이터 준비 방법: {self.data_preparation_methods} 레이블링 정보: {self.data_labeling_info} 편향성 검토: {self.bias_examination} ──────────────────────────────────────────────────────────────────── 5. 성능 지표 (PERFORMANCE METRICS) ──────────────────────────────────────────────────────────────────── """ for metric, value in self.performance_metrics.items(): doc += f" {metric}: {value}\n" doc += f""" 검증 방법론: {self.validation_methodology} 알려진 제한사항: {chr(10).join(f' • {l}' for l in self.known_limitations)} ──────────────────────────────────────────────────────────────────── 6. 위험 관리 (RISK MANAGEMENT) ──────────────────────────────────────────────────────────────────── 식별된 위험: {chr(10).join(f' • {r}' for r in self.identified_risks)} 완화 조치: {chr(10).join(f' • {m}' for m in self.risk_mitigation_measures)} ──────────────────────────────────────────────────────────────────── 7. 인간 감독 (HUMAN OVERSIGHT) ──────────────────────────────────────────────────────────────────── 감독 조치: {self.human_oversight_measures} 운영자 지침: {self.operator_instructions} ════════════════════════════════════════════════════════════════════ [문서 끝] ════════════════════════════════════════════════════════════════════ """ return doc def to_json(self) -> str: """JSON 형식으로 내보내기""" data = { "document_version": self.version, "generated_at": datetime.now().isoformat(), "general_info": { "system_name": self.system_name, "provider": self.provider_name, "high_risk_category": self.high_risk_category, }, "performance": self.performance_metrics, "risks": self.identified_risks, "limitations": self.known_limitations, } return json.dumps(data, indent=2, ensure_ascii=False) # 사용 예시 doc = TechnicalDocumentation( system_name="AI 채용 심사 시스템 v2.0", version="2.0.1", provider_name="KAITRUST Corp.", provider_address="서울특별시 강남구", intended_purpose="채용 과정에서 이력서 분석 및 초기 심사 지원", high_risk_category="Annex III - 4. 고용", general_description="NLP 기반 이력서 분석 및 직무 적합도 점수 산출", input_data_types=["PDF 이력서", "텍스트 자기소개서"], output_data_types=["적합도 점수 (0-100)", "핵심 역량 추출"], performance_metrics={"Accuracy": 0.87, "F1-Score": 0.84}, identified_risks=["성별 편향", "학력 편향", "연령 편향"], risk_mitigation_measures=["공정성 감사", "편향성 테스트", "인간 최종 검토"], ) print(doc.generate_document())
# EU AI Act 자동 로깅 시스템 (Art. 12 준수) from dataclasses import dataclass, field from datetime import datetime from typing import Any, Dict, List, Optional from enum import Enum import hashlib import json import uuid class EventType(Enum): SYSTEM_START = "system_start" SYSTEM_STOP = "system_stop" PREDICTION_REQUEST = "prediction_request" PREDICTION_RESPONSE = "prediction_response" HUMAN_OVERRIDE = "human_override" ERROR = "error" CONFIG_CHANGE = "config_change" DATA_ACCESS = "data_access" @dataclass class LogEntry: """EU AI Act 준수 로그 엔트리""" event_id: str timestamp: str event_type: EventType system_version: str operator_id: Optional[str] input_hash: Optional[str] # 입력 데이터 해시 (개인정보 보호) output_summary: Optional[str] confidence_score: Optional[float] human_verified: bool metadata: Dict[str, Any] class HighRiskAILogger: """EU AI Act Article 12 자동 로깅 시스템""" def __init__(self, system_name: str, system_version: str): self.system_name = system_name self.system_version = system_version self.logs: List[LogEntry] = [] self.retention_period_days = 365 * 5 # 5년 보관 (Art. 12(4)) def _generate_event_id(self) -> str: return str(uuid.uuid4()) def _hash_input(self, input_data: Any) -> str: """입력 데이터 해시화 (개인정보 보호)""" data_str = json.dumps(input_data, sort_keys=True, default=str) return hashlib.sha256(data_str.encode()).hexdigest()[:16] def log_prediction(self, input_data: Any, output: Any, confidence: float, operator_id: Optional[str] = None, human_verified: bool = False) -> str: """예측 요청/응답 로깅""" event_id = self._generate_event_id() # 요청 로그 request_log = LogEntry( event_id=event_id, timestamp=datetime.utcnow().isoformat() + "Z", event_type=EventType.PREDICTION_REQUEST, system_version=self.system_version, operator_id=operator_id, input_hash=self._hash_input(input_data), output_summary=None, confidence_score=None, human_verified=False, metadata={"input_type": type(input_data).__name__} ) self.logs.append(request_log) # 응답 로그 response_log = LogEntry( event_id=event_id, timestamp=datetime.utcnow().isoformat() + "Z", event_type=EventType.PREDICTION_RESPONSE, system_version=self.system_version, operator_id=operator_id, input_hash=self._hash_input(input_data), output_summary=str(output)[:200], confidence_score=confidence, human_verified=human_verified, metadata={"output_type": type(output).__name__} ) self.logs.append(response_log) return event_id def log_human_override(self, event_id: str, operator_id: str, original_output: Any, overridden_output: Any, reason: str): """인간 개입/오버라이드 로깅""" override_log = LogEntry( event_id=event_id, timestamp=datetime.utcnow().isoformat() + "Z", event_type=EventType.HUMAN_OVERRIDE, system_version=self.system_version, operator_id=operator_id, input_hash=None, output_summary=f"Original: {str(original_output)[:50]}, Overridden: {str(overridden_output)[:50]}", confidence_score=None, human_verified=True, metadata={"reason": reason} ) self.logs.append(override_log) def log_error(self, error_type: str, error_message: str, operator_id: Optional[str] = None): """에러 로깅""" error_log = LogEntry( event_id=self._generate_event_id(), timestamp=datetime.utcnow().isoformat() + "Z", event_type=EventType.ERROR, system_version=self.system_version, operator_id=operator_id, input_hash=None, output_summary=None, confidence_score=None, human_verified=False, metadata={"error_type": error_type, "message": error_message} ) self.logs.append(error_log) def export_logs(self, format: str = "json") -> str: """로그 내보내기 (감사용)""" log_data = [] for log in self.logs: log_data.append({ "event_id": log.event_id, "timestamp": log.timestamp, "event_type": log.event_type.value, "system_version": log.system_version, "operator_id": log.operator_id, "input_hash": log.input_hash, "output_summary": log.output_summary, "confidence_score": log.confidence_score, "human_verified": log.human_verified, "metadata": log.metadata, }) return json.dumps(log_data, indent=2, ensure_ascii=False) def get_audit_summary(self) -> str: """감사 요약 생성""" total = len(self.logs) predictions = len([l for l in self.logs if l.event_type == EventType.PREDICTION_RESPONSE]) overrides = len([l for l in self.logs if l.event_type == EventType.HUMAN_OVERRIDE]) errors = len([l for l in self.logs if l.event_type == EventType.ERROR]) return f""" ╔═══════════════════════════════════════════════╗ ║ EU AI Act 로깅 감사 요약 ║ ╠═══════════════════════════════════════════════╣ ║ 시스템: {self.system_name:<30}║ ║ 버전: {self.system_version:<32}║ ╠═══════════════════════════════════════════════╣ ║ 총 로그 수: {total:<28}║ ║ 예측 건수: {predictions:<29}║ ║ 인간 개입: {overrides:<29}║ ║ 에러 발생: {errors:<29}║ ║ 개입 비율: {(overrides/max(predictions,1)*100):.1f}%{' '*23}║ ╚═══════════════════════════════════════════════╝ """ # 사용 예시 logger = HighRiskAILogger("AI-Hiring-System", "2.0.1") # 예측 로깅 event_id = logger.log_prediction( input_data={"resume_id": "R-12345", "position": "Engineer"}, output={"score": 85, "recommendation": "Interview"}, confidence=0.92, operator_id="OP-001" ) # 인간 오버라이드 로깅 logger.log_human_override( event_id=event_id, operator_id="HR-MANAGER-01", original_output={"score": 85}, overridden_output={"score": 75}, reason="직무 경험 부족 고려" ) print(logger.get_audit_summary())
"우리 채용 AI가 EU에서 서비스되면 고위험 AI로 분류됩니다. Annex III의 '고용' 카테고리에 해당하며, 2027년 8월까지 CE 마킹과 적합성 평가를 완료해야 합니다. 위반 시 최대 1,500만 유로 과징금이 부과됩니다."
"고위험 AI는 Article 9부터 15까지 7개 핵심 요건을 충족해야 합니다. 특히 Article 12의 자동 로깅은 5년간 보관 의무가 있어서 스토리지 비용도 고려해야 해요."
"고위험 AI의 핵심은 '추적 가능성'입니다. 모든 의사결정 과정을 로깅하고, 왜 그런 결과가 나왔는지 설명할 수 있어야 해요. SHAP이나 LIME 같은 XAI 라이브러리가 필수입니다."
"고위험 AI 적합성 평가는 두 가지 경로가 있어요. 대부분은 자체 평가(self-assessment)로 가능하지만, 생체 인식처럼 민감한 영역은 공인 기관(Notified Body)의 제3자 평가가 필요합니다."
"EU AI Act의 고위험 AI 요건을 분석해서 우리 AI 시스템의 갭을 식별한 경험이 있습니다. 특히 데이터 거버넌스와 인간 감독 기능이 가장 큰 보완 영역이었고, MLOps 파이프라인에 compliance-by-design을 적용했습니다."
EU에 직접 서비스하지 않아도 EU 시민 데이터를 처리하거나 EU 기업에 AI 시스템을 공급하면 적용될 수 있습니다. GDPR과 유사한 역외 적용 원칙입니다.
전면 시행은 2027년이지만 금지된 관행은 2025년 2월부터 적용됩니다. 또한 기존 시스템도 2030년까지 준수해야 하는 경과 조치가 있습니다.
기업용 AI도 고위험 영역(채용, 신용평가 등)에 사용되면 동일하게 규제됩니다. 최종 사용 목적이 기준입니다.
AI가 안전 제품(의료기기, 기계류 등)의 일부로 사용될 때도 Annex I 경로로 고위험 AI가 될 수 있습니다.
AI 시스템별로 Annex I/III 해당 여부를 판단하고, 문서화된 위험 평가 체계를 구축하세요. 'Compliance by Design' 원칙으로 개발 초기부터 요건을 반영하는 것이 비용 효율적입니다.
이탈리아 데이터보호청(Garante)이 OpenAI ChatGPT의 서비스를 일시 금지했습니다. 아동 보호 미비, 학습 데이터의 법적 근거 부재, 투명성 부족 등이 문제였습니다. OpenAI는 연령 확인, 개인정보 처리 투명성 개선, EU 데이터 주체 권리 보장 등을 약속한 후 서비스를 재개했습니다.
미국 얼굴인식 기업 Clearview AI가 EU 여러 국가에서 GDPR 위반으로 대규모 과징금을 부과받았습니다. 프랑스 CNIL(2,000만 유로), 이탈리아 Garante(2,000만 유로), 영국 ICO(750만 파운드) 등이 무단 생체정보 수집과 처리에 대해 제재했습니다.
AI 기반 면접 평가 시스템 HireVue가 얼굴 표정 분석을 통한 평가로 비판받았습니다. EPIC(Electronic Privacy Information Center)이 FTC에 조사를 요청했고, HireVue는 결국 얼굴 분석 기능을 폐기했습니다. 투명성 부족과 편향 가능성이 주요 쟁점이었습니다.
✅ 정답: A) 고위험 AI는 두 경로로 분류됩니다. Annex I은 의료기기, 기계류 등 기존 EU 제품 안전 법률에 AI가 적용되는 경우이고, Annex III는 채용, 교육, 금융 등 8개 독립적 고위험 영역입니다.
✅ 정답: D) Annex III 기반 고위험 AI(채용, 교육, 금융 등)는 2027년 8월 2일부터 전면 시행됩니다. 단, 금지된 AI 관행은 2025년 2월, Annex I 기반 고위험 AI는 2026년 8월에 먼저 시행됩니다.
✅ 정답: B) 고위험 AI 요건 위반 시 최대 1,500만 유로 또는 전 세계 연매출 3% 중 높은 금액이 과징금으로 부과됩니다. 3,500만 유로/7%는 금지된 AI 관행 위반에 해당합니다.