1품질 예측 모델
품질 예측 모델은 공정 중 수집되는 센서 데이터로부터 최종 품질 특성을 예측합니다. 이를 통해 공정 완료 전에 품질 이상을 감지하고 실시간 조정이 가능합니다. Virtual Metrology라고도 불리는 이 기법은 반도체, 디스플레이 등 고가 공정에서 필수입니다.
품질-공정 연계 폐쇄루프 제어
센서 데이터
온도/압력/속도
설정값
Setpoint
환경 조건
습도/진동
Virtual Metrology (품질 예측)
RandomForest / XGBoost / Neural Net
SPC + AI 통합 감시
Western Electric Rules
Rule1: 1점 3σ 초과
Rule2: 연속 9점 한쪽
Rule3: 연속 6점 추세
품질 기반 공정 조정 (MPC)
예측 품질 → 목표 Gap → 조정량 계산
불량률 30-50%↓
|
Cpk 0.3-0.5↑
import numpy as np
from dataclasses import dataclass
from typing import List, Dict, Tuple
from sklearn.ensemble import RandomForestRegressor
@dataclass
class QualitySpec:
"""품질 규격"""
name: str
target: float
lsl: float # Lower Spec Limit
usl: float # Upper Spec Limit
@dataclass
class ProcessSnapshot:
"""공정 순간 데이터"""
timestamp: float
sensor_values: Dict[str, float]
setpoints: Dict[str, float]
class VirtualMetrology:
"""가상 계측 (품질 예측)"""
def __init__(self, quality_specs: List[QualitySpec]):
self.specs = {s.name: s for s in quality_specs}
self.models = {} # {품질특성명: 모델}
def train(self, snapshots: List[ProcessSnapshot],
quality_results: Dict[str, List[float]]):
"""학습: 공정 데이터 → 품질 결과"""
X = self._to_features(snapshots)
for q_name, y_values in quality_results.items():
model = RandomForestRegressor(n_estimators=100)
model.fit(X, y_values)
self.models[q_name] = model
def _to_features(self, snapshots: List[ProcessSnapshot]) -> np.ndarray:
"""시계열 통계 특성 추출"""
features = []
for snap in snapshots:
feat = list(snap.sensor_values.values()) + list(snap.setpoints.values())
features.append(feat)
return np.array(features)
def predict(self, snapshot: ProcessSnapshot) -> Dict[str, float]:
"""품질 예측"""
X = self._to_features([snapshot])
predictions = {}
for q_name, model in self.models.items():
predictions[q_name] = model.predict(X)[0]
return predictions
def check_spec(self, predictions: Dict[str, float]) -> Dict:
"""규격 이탈 검사"""
results = {}
for q_name, value in predictions.items():
spec = self.specs.get(q_name)
if spec:
in_spec = spec.lsl <= value <= spec.usl
cpk = min(spec.usl - value, value - spec.lsl) / (3 * 0.1) # 예시 std
results[q_name] = {'value': value, 'in_spec': in_spec, 'cpk': cpk}
return results2SPC-AI 통합
통계적 공정 관리(SPC)와 AI를 결합하면 전통적 관리도의 한계를 극복할 수 있습니다. AI는 복잡한 패턴 인식, 다변량 분석, 예측적 이상 탐지를 제공하고, SPC는 통계적 신뢰성과 관리 한계를 제공합니다.
class SPCAIIntegration:
"""SPC + AI 통합 품질 관리"""
def __init__(self, control_limits: Dict[str, Tuple[float, float]]):
self.control_limits = control_limits # {변수: (LCL, UCL)}
self.history = {k: [] for k in control_limits}
self.pattern_rules = self._init_western_electric_rules()
def _init_western_electric_rules(self) -> List:
"""Western Electric 규칙"""
return [
('Rule1', '1점 3σ 초과'),
('Rule2', '연속 9점 중심선 같은 쪽'),
('Rule3', '연속 6점 증가/감소'),
('Rule4', '연속 14점 교대')
]
def update(self, values: Dict[str, float]) -> Dict:
"""새 데이터 추가 및 이상 검사"""
alerts = []
for var, value in values.items():
if var in self.history:
self.history[var].append(value)
lcl, ucl = self.control_limits[var]
# Rule 1: 관리한계 초과
if value < lcl or value > ucl:
alerts.append({'var': var, 'rule': 'Rule1', 'value': value})
# Rule 2: 연속 9점 한쪽
if len(self.history[var]) >= 9:
recent = self.history[var][-9:]
center = (lcl + ucl) / 2
if all(v > center for v in recent) or all(v < center for v in recent):
alerts.append({'var': var, 'rule': 'Rule2'})
# Rule 3: 연속 6점 추세
if len(self.history[var]) >= 6:
recent = self.history[var][-6:]
if all(recent[i] < recent[i+1] for i in range(5)) or \
all(recent[i] > recent[i+1] for i in range(5)):
alerts.append({'var': var, 'rule': 'Rule3'})
return {'alerts': alerts, 'count': len(alerts)}
def calculate_cpk(self, var: str, spec_limits: Tuple[float, float]) -> float:
"""Cpk 계산"""
data = np.array(self.history.get(var, []))
if len(data) < 30: return None
mean, std = data.mean(), data.std()
lsl, usl = spec_limits
cpu = (usl - mean) / (3 * std)
cpl = (mean - lsl) / (3 * std)
return min(cpu, cpl)3품질 기반 공정 조정
예측된 품질이 목표에서 벗어날 경우 실시간으로 공정 조건을 조정합니다. 이는 폐쇄 루프 제어를 형성하여 품질 변동을 최소화합니다. Model Predictive Control(MPC) 개념을 품질 관리에 적용한 것입니다.
class QualityBasedController:
"""품질 예측 기반 공정 제어"""
def __init__(self, vm: VirtualMetrology,
controllable_params: List[str],
param_limits: Dict[str, Tuple[float, float]]):
self.vm = vm
self.controllable = controllable_params
self.limits = param_limits
self.sensitivity = {} # {(품질, 파라미터): 기울기}
def calibrate_sensitivity(self, snapshots: List[ProcessSnapshot],
quality_results: Dict[str, List[float]]):
"""파라미터-품질 민감도 학습"""
for q_name in quality_results.keys():
for param in self.controllable:
# 간단한 선형 회귀로 민감도 추정
x = [s.setpoints.get(param, 0) for s in snapshots]
y = quality_results[q_name]
if len(set(x)) > 1:
slope = np.corrcoef(x, y)[0, 1] * np.std(y) / np.std(x)
self.sensitivity[(q_name, param)] = slope
def compute_adjustment(self, current: ProcessSnapshot,
target_quality: Dict[str, float]) -> Dict[str, float]:
"""품질 목표 달성을 위한 조정량 계산"""
predicted = self.vm.predict(current)
adjustments = {}
for q_name, target in target_quality.items():
error = target - predicted.get(q_name, target)
if abs(error) < 0.001: continue
# 가장 민감한 파라미터 찾기
best_param, best_sens = None, 0
for param in self.controllable:
sens = self.sensitivity.get((q_name, param), 0)
if abs(sens) > abs(best_sens):
best_param, best_sens = param, sens
if best_param and best_sens != 0:
delta = error / best_sens
current_val = current.setpoints.get(best_param, 0)
new_val = current_val + delta
lo, hi = self.limits.get(best_param, (-np.inf, np.inf))
adjustments[best_param] = np.clip(new_val, lo, hi)
return adjustments
def run_control_cycle(self, current: ProcessSnapshot,
specs: Dict[str, float]) -> Dict:
"""제어 사이클 실행"""
predicted = self.vm.predict(current)
adjustments = self.compute_adjustment(current, specs)
return {
'predicted_quality': predicted,
'adjustments': adjustments,
'status': 'ADJUSTED' if adjustments else 'OK'
}4통합 품질-공정 최적화 시스템
품질 예측, SPC 모니터링, 실시간 조정을 통합한 시스템으로 품질 변동 감소와 공정 능력 향상을 동시에 달성합니다.
class IntegratedQualityProcessSystem:
"""통합 품질-공정 최적화"""
def __init__(self, vm: VirtualMetrology,
spc: SPCAIIntegration,
controller: QualityBasedController):
self.vm = vm
self.spc = spc
self.controller = controller
self.history = []
def process_snapshot(self, snapshot: ProcessSnapshot,
target: Dict[str, float]) -> Dict:
"""스냅샷 처리"""
# 1. 품질 예측
predicted = self.vm.predict(snapshot)
# 2. SPC 검사
spc_result = self.spc.update(snapshot.sensor_values)
# 3. 조정 계산
control_result = self.controller.run_control_cycle(snapshot, target)
result = {
'timestamp': snapshot.timestamp,
'predicted_quality': predicted,
'spc_alerts': spc_result['alerts'],
'adjustments': control_result['adjustments'],
'status': self._determine_status(spc_result, control_result)
}
self.history.append(result)
return result
def _determine_status(self, spc: Dict, ctrl: Dict) -> str:
if spc['alerts']: return 'SPC_ALERT'
if ctrl['adjustments']: return 'ADJUSTING'
return 'NORMAL'
def generate_report(self) -> Dict:
"""품질 리포트"""
if not self.history: return {}
alerts = sum(1 for h in self.history if h['spc_alerts'])
adjustments = sum(1 for h in self.history if h['adjustments'])
return {
'total_snapshots': len(self.history),
'spc_alerts': alerts,
'adjustments_made': adjustments,
'alert_rate': alerts / len(self.history)
}
# 사용 예시
specs = [QualitySpec('thickness', 100.0, 98.0, 102.0)]
vm = VirtualMetrology(specs)
spc = SPCAIIntegration({'temp': (195, 205), 'pressure': (2.8, 3.2)})
controller = QualityBasedController(vm, ['temp', 'pressure'],
{'temp': (180, 220), 'pressure': (2.0, 4.0)})
system = IntegratedQualityProcessSystem(vm, spc, controller)효과: 품질-공정 연계 AI로 불량률 30-50% 감소, Cpk 0.3-0.5 향상이 가능합니다.