LLM 입력 전단에서 정상 분포 기반 이탈 탐지를 수행하는 하이브리드 판정 구조
LLM 기반 서비스에서 악의적 입력은 후단 모델에 도달하기 전에 걸러져야 합니다.
본 프로젝트는 공격 유형을 사전에 학습하지 않고, 정상 요청들이 형성하는 분포 중심을 기준으로 새로운 입력이 정상 서비스 범위를 벗어나는지를 판별하는 전단(Stage-1) 판정 구조를 구현하고 실험적으로 검증합니다.
코사인 거리 D(x)를 이탈 신호로, 키워드 판정 K(x)를 보조 신호로 결합한 하이브리드 판정 A(x)로 최종 차단 여부를 결정합니다.
A(x) = I[ D(x) > τ OR K(x) = 1 ]
├── config.py # 임계값 τ, 모델 설정
├── config/keywords/
│ ├── en_policy_bypass.txt # 정책 우회 키워드
│ ├── en_system_injection.txt # 시스템 프롬프트 인젝션
│ ├── en_crime_domain.txt # 범죄 도메인
│ └── en_social_engineering.txt # 소셜 엔지니어링
├── src/
│ ├── model.py # HybridDetector 핵심 로직
│ ├── dataset.py # UltraChat / AdvBench 로더
│ ├── metrics.py # 평가 지표
│ └── visualize.py # UMAP 시각화
└── experiments/
├── hybrid_experiment.py # Stage-1 메인 실험
├── baseline_experiment.py # Distance-only / Keyword-only 비교
└── attacker_loop_experiment.py # Stage-2 강도 곡선 실험
| 신호 | 수식 | 설명 |
|---|---|---|
| 거리 판정 | D(x) = 1 - cos(E(x), μ) |
정상 중심 μ로부터의 코사인 거리 |
| 키워드 판정 | K(x) ∈ {0, 1} |
운영자 정의 키워드 목록 매칭 |
| 하이브리드 판정 | A(x) = I[D(x)>τ ∨ K(x)=1] |
OR 결합 최종 판정 |
D(x) ∈ [0, 2]범위이며,D(x) > 1은 자동 차단τ = Q_0.85(D)— 정상 데이터 분포의 85분위수μ계산에 공격 데이터 미포함 (비지도 설계)
| 카테고리 | 키워드 수 |
|---|---|
| 사이버공격/악성코드 | 28 |
| 사기/금융범죄 | 24 |
| 무기/폭력 | 26 |
| 허위정보/선전 | 19 |
| 약물/화학 | 22 |
| 혐오/차별 | 18 |
| 자해/자살 | 17 |
| 프라이버시/스토킹 | 21 |
| 아동착취 | 16 |
| 소셜엔지니어링 | 22 |
| 합계 | 213 |
데이터셋: UltraChat 정상 2,000개 / AdvBench 공격 520개
임베딩 모델: sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
| 방법 | Accuracy | Precision | Recall | F1 |
|---|---|---|---|---|
| 거리 판정 단독 | 0.7556 | 0.4048 | 0.3923 | 0.3984 |
| 키워드 판정 단독 | 0.8171 | 0.5845 | 0.3923 | 0.4695 |
| 하이브리드 판정 | 0.7536 | 0.4318 | 0.6154 | 0.5075 |
회색지대 분석 (τ = 0.7938, 공격 총 520개)
| 구분 | 수 | 비율 |
|---|---|---|
거리 기준 회색지대 D(x) ≤ τ |
316 | 60.77% |
키워드 추가 회수 K(x)=1 |
116 | 22.31% |
완전 우회 D(x)≤τ, K(x)=0 |
200 | 38.46% |
- 전단 통과 200개 중 99.5% 후단 LLM이 거절/안전 응답으로 처리
pip install -r requirements.txt
# Stage-1 하이브리드 실험
python experiments/hybrid_experiment.py
# Stage-2 강도 곡선 실험
python experiments/attacker_loop_experiment.py
# UMAP 시각화
python src/visualize.pyMIT License