
미학습 공격에 대해 98% 재현율을 가진 프롬프트 인젝션 탐지기를 만들었습니다. 데이터가 아키텍처를 이긴 이유를 공개합니다.
요약
프롬프트 인젝션 탐지기 Lunaris Guard v0.2를 출시하며, 아키텍처 변경 없이 데이터 품질 개선만으로 미학습 공격에 대한 재현율을 98%까지 끌어올린 사례를 공유합니다. 학습 데이터의 다양성과 합성 레드팀 데이터를 통해 모델의 일반화 성능을 극대화했습니다.
핵심 포인트
- 아키텍처보다 데이터의 품질과 다양성이 모델 성능에 결정적임
- 미학습 공격 대응을 위해 합성 레드팀 데이터 활용 필수
- 클래스 불균형 해결을 위해 Focal Loss 적용
- ModernBERT-base 백본을 활용한 효율적인 탐지 성능 구현
6주 전 저는 프롬프트 인젝션 (Prompt Injection) 및 콘텐츠 안전성을 위한 듀얼 헤드 분류기(dual-head classifier)인 Lunaris Guard v0.1을 출시했습니다. 서류상으로는 괜찮아 보였습니다: 인젝션에 대해 0.74 F1 점수, 다국어 지원, Apache 2.0 라이선스.
그런데 학습 데이터에 포함되지 않은 데이터로 테스트를 해보았습니다.
실패했습니다. 63%의 확률로 말이죠.
그 수치 — 새로운 공격에 대한 37%의 재현율 (Recall) — 는 v0.1이 실제 운영 환경(production)에서는 쓸모없다는 것을 의미했습니다. 공격자들은 여러분의 학습 세트에 있는 프롬프트를 보내지 않습니다. 그들은 여러분이 한 번도 본 적 없는 것들을 보냅니다.
그래서 저는 v0.1의 가중치 (weights)를 태워버리고 처음부터 다시 시작했습니다.
오늘 저는 Lunaris Guard v0.2를 출시합니다. 동일한 149M 파라미터 백본 (ModernBERT-base), 동일한 8.2ms 지연 시간 (latency), 동일한 라이선스. 하지만 결과는 완전히 다릅니다.
수치 (The Numbers)
| 지표 (Metric) | v0.1 | v0.2 | 차이 (Delta) |
|---|---|---|---|
| Injection F1 | 0.736 | 0.964 | +22.8 |
| ... | |||
![]() |
실제로 바뀐 것
아키텍처 (Architecture)는 바뀌지 않았습니다. 백본은 여전히 CLS 풀링 (CLS pooling) 위에 두 개의 선형 헤드 (linear heads)를 가진 answerdotai/ModernBERT-base입니다.
바뀐 것은 바로 **데이터 (the data)**입니다:
- 248,627개의 학습 샘플 (~183K에서 증가)
- 37,299개의 인젝션 양성 샘플 (injection positives) (v0.1보다 4배 더 많음)
- 큐레이션 및 중복 제거를 거친 14개의 공개 데이터셋
- 엣지 케이스 (edge cases)를 위한 합성 레드팀 (Synthetic red-teaming)
- v0.1에서 미세 조정 (fine-tuning)하는 것이 아닌, 처음부터 학습 (Training from scratch)
클래스 불균형 (class imbalance)을 처리하기 위해 포컬 로스 (focal loss, α=0.75, γ=2.0)를 사용했으며, 단일 AMD MI300X에서 bf16으로 93분 동안 학습했습니다.
핵심 통찰: 새로운 공격은 마법이 아닙니다. 그것들은 단지 학습 분포 (training distribution)에 표현되지 않았던 패턴일 뿐입니다. 인코딩 트릭 (encoding tricks), 접두사 인젝션 (prefix injections), 지시문 무시 (instruction overrides), 역할극 (roleplay), DAN 변형 (DAN variants), 유니코드 난독화 (unicode obfuscation) 등 가능한 공격의 _공간 (space)_을 커버하는 데이터를 큐레이션한다면, 모델은 일반화 (generalize)됩니다.
v0.1은 약 9,000개의 유효한 인젝션 (injection) 예제로 학습되었습니다. v0.2는 37,000개로 학습되었습니다. 이것이 바로 차이점입니다.
이것이 프로덕션 (Production) 환경에서 중요한 이유
대부분의 오픈 소스 가드레일 (guardrails)은 다음 두 가지 중 하나만 수행합니다:
- 인젝션 (injection)만 탐지 (안전성/콘텐츠 정책 무시)
- 안전성 (safety)만 탐지 (적대적 프롬프트 무시)
Lunaris Guard는 단 한 번의 순전파 (forward pass)로 이 두 가지를 모두 수행합니다:
from transformers import AutoModel, AutoTokenizer
import torch
...
지연 시간 (Latency): MI300X에서 단일 프롬프트 기준 8.2ms.
처리량 (Throughput): 배치 크기 32 (batch-32)에서 초당 3,327개 샘플.
컨텍스트 (Context): 2048 토큰.
이 모델은 LLM API 앞에 위치하여, 나쁜 입력이 모델에 도달하기 전에 거부하도록 설계되었습니다.
한계점 (솔직한 부분)
이 모델이 여전히 실패하는 부분에 대해 솔직하게 말씀드리고 싶습니다:
- DAN 공격: 재현율 (recall) 90.6% — 가장 취약한 카테고리입니다. DAN 변형들은 이상할 정도로 창의적입니다.
- 저자원 언어 (Low-resource languages):
pl,tr,uk,pt,id언어의 안전성 재현율이 낮습니다. 이 언어들에 대한 학습 데이터가 더 적었습니다. - 2048 토큰 제한: 긴 문서는 청킹 (chunking)이 필요합니다. 청크 경계에서의 인젝션은 놓칠 수 있습니다.
- 멀웨어/스팸 탐지 불가: 이것은 안전성 + 인젝션 분류기 (classifier)이지, 일반적인 콘텐츠 중재자 (content moderator)가 아닙니다.
- 지시어 튜닝 (Instruction-tuned) 미적용: 텍스트에 점수를 매길 뿐, 그 추론 과정을 설명하지는 않습니다.
이 모델을 배포한다면, 심층 방어 (defense-in-depth) 전략과 결합하십시오: 시스템 프롬프트 (system prompts), 출력 필터링 (output filtering), 속도 제한 (rate limits), 그리고 중대한 결정에 대한 인간의 검토 (human review)가 필요합니다.
다음 단계
저는 6개의 공격 카테고리와 10개의 언어에 걸쳐 1,000개의 새로운 적대적 프롬프트 (adversarial prompts)로 구성된 **오픈 벤치마크 (open benchmark)**를 구축하고 있습니다. 제 수치를 믿기 때문이 아니라, 오히려 믿지 않기 때문입니다.
만약 여러분이 가드레일 (Llama Guard, ShieldGemma, DeBERTa 또는 자체 모델)을 유지 관리하고 있다면, 다음 주에 벤치마크가 공개될 때 이를 실행해 보십시오. 저는 프로덕션 환경에서 조용히 틀리기보다는, 공개적으로 틀렸음이 증명되는 쪽을 택하겠습니다.
아무도 묻지 않은 맥락
저는 브라질의 작은 마을인 피라포라 (Pirapora)에서 혼자 이 작업을 수행했습니다. AMD MI300X 한 대, 93분, 약 3달러의 컴퓨팅 비용이 들었습니다.
제가 Meta나 Google을 이기려고 하는 것이 아닙니다. 어떤 언어에서든, 그리고 법무팀에 문의할 필요 없이 바로 배포할 수 있는 라이선스를 가진, 실제 프로덕션 (production) 환경에서 제대로 작동하는 가드레일 (guardrail)이 필요했기 때문입니다.
이 내용이 공감된다면, 직접 사용해 보세요. 공감되지 않는다면 그 이유를 알려주세요. 모든 댓글을 읽고 있습니다.
모델 (Model): huggingface.co/auren-research/lunaris-guardv2
코드 (Code): github.com/Auren-Research/lunaris-guard
이전 버전 (Previous version): huggingface.co/auren-research/lunaris-guard
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기