Jev-as-Guardrail (JAG): 유형화된 질문이 실제로 제공하는 것
요약
본 글은 'Jev-as-Guardrail (JAG)'이라는 새로운 방어 메커니즘을 소개합니다. JAG는 LLM이 아닌 모델에 대해 유형화된 질문(noul, choice, score)을 던지고 보정된 확률 값을 받아와 코드 내 정책으로 활용하는 방식입니다. 오픈 가중치 Clef-flash가 기존 분류기보다 우수한 성능을 보여 주목받았습니다.
핵심 포인트
- JAG는 LLM이 아닌 모델에 유형화된 질문과 확률값을 적용합니다.
- 오픈 가중치 Clef-flash가 주입 방어벽 벤치마크에서 좋은 성능을 보였습니다.
- 방어 메커니즘은 프롬프트 기반이 아닌 임계값(threshold) 변경 방식으로 작동합니다.
요약
-
**JAG (Jev-as-guardrail)**는 의사결정 모델에게 하나의 입력에 대해 여러 개의 좁은 유형의 질문을 던지고, 보정된 확률 값을 받아와서 사용자의 _코드_가 정책(policy)을 갖게 하는 것을 의미합니다.
-
저는 다섯 가지 Jev 스타일의 오픈 모델을 주입 방어벽(injection guardrails)으로 벤치마킹했으며, 지도 학습 기반 DeBERTa 분류기를 기준으로 삼았습니다. Cloudflare의 오픈 가중치 Clef-flash가 더 어려운 세트에서 분류기보다 우수한 성능을 보였습니다. FalconDec는 영어 세트에서 기대치 이하의 점수를 기록했습니다.
-
세 가지 주의사항이 모든 것을 제약합니다: n(데이터셋 크기)이 작고, 저는 Jev 자체를 실행하지 못했으며, Clef의 원시 확률 값은 혼합 언어 데이터에서 크게 벗어났습니다.
저는 지루한 분류기가 또다시 이길 것이라고 예상했습니다. 하지만 그렇지 않았습니다. 그리고 어려운 세트에서는 제가 테스트할 것이라고 생각지 못한 질문, 즉 _어떤 유형의 질문을 던지는가_에 따라 격차가 역전되었습니다.
JAG란 무엇인가
Jev는 LLM이 아닙니다. 텍스트를 작성하지 않습니다. 사용자는 상태(state)와 유형화된 질문들(선택지, 점수, 또는 noul이라고 불리는 참/거짓 확률)을 보내면, 모델은 이 모든 것을 한 번의 호출로 병렬적으로 답변하며, 각각에 대해 보정된 확률 값을 제공합니다.
input / tool call / output
|
[ decision model: 1 call ] --> { noul: 0.91, choice: 0.88, score: 0.75 }
...
이 패턴은 다음과 같습니다: 상태 → 유형화된 질문 → 확률 → 코드 내 정책(policy). 프롬프트가 아닌 임계값(threshold)을 변경합니다. 이는 제가 이전에 다루었던 48시간 파괴적 명령어 차단기(destructive-command blocker)와 같은 형태이며, 프롬프트 주입에 적용됩니다.
무엇을 테스트했는가
저는 Jev 자체를 실행할 수 없었습니다. 폐쇄형 모델이라 API 접근이 불가능합니다. 따라서 이 벤치마크는 오픈된 Jev 스타일의 모델들을 통해 _접근 방식_을 테스트했습니다:
| Model | Notes |
|---|---|
| Clef-flash (Cloudflare) | 9B, open weights, Apache 2.0, Jev와 호환되도록 구축됨; 로컬에서 실행 가능 |
| ... | |
| openjev는 목록에 있었지만 제 실행에서는 로드 실패(누락된 헬퍼 모듈)하여 테스트하지 못했습니다. |
모든 Jev 스타일 모델은 각 텍스트에 대해 동일한 세 가지 유형화된 질문을 받았습니다:
-
noul: 이 텍스트가 어시스턴트의 지침을 무효화하려고 시도합니까?
-
choice:
injection입니까 아니면benign합니까? -
score: 없음 / 약함 / 강한 조작인가요?
저는 각 질문(question)만 따로 점수를 매겼고, 사용 가능한 답변들의 평균값인 jag도 계산했습니다. 두 개의 데이터셋을 사용했습니다: safeguard (n=300, 영어)와 deepset (n=116, 영어 및 독일어). 아래의 모든 숫자는 별도로 언급하지 않는 한 AUROC입니다.
무엇이 일어났는가
| 모델 | 질문 | safeguard | deepset |
|---|---|---|---|
| Clef-flash | noul | 0.980 | 0.889 |
| ... | |||
참고: 여기서 제가 사용한 jag는 단순히 평균값입니다. |
샘플당 지연 시간: Clef-flash ~204-219 ms, Von ~84-94 ms, Laya ~37-74 ms, FalconDec ~33-35 ms, DeBERTa ~4-25 ms.
-
Jev 스타일 모델이 분류기를 능가했다. Clef-flash는
safeguard에서 DeBERTa와 비슷한 성능을 보였고(둘 다 최고치 근접),deepset에서는 0.967 (score) 대 0.901로 이를 앞섰습니다. 이는 제가 이전에 얻었던 결과, 즉 DeBERTa가 시도했던 모든 결정 모델보다 뛰어났던 것과는 반대되는 결과입니다. -
어떤 질문을 하느냐가 예상보다 더 중요했다. Clef의 경우, noul 질문이 두 데이터셋 모두에서 가장 약했습니다.
deepset에서는 0.889 (noul) → 0.908 (choice) → 0.967 (score) 순서였습니다. Laya도 같은 패턴을 보였습니다. 만약 예/아니오 질문 하나만 계속 한다면, 최고의 신호(signal)를 놓치고 있을 수 있습니다. -
평균화는 방어책일 뿐, 승리는 아니다. Clef의
jag는 그 모델이 가진 최고의 단일 질문 점수를 능가한 적이 없습니다. 다만 가장 낮은 점수의 질문보다는 높았습니다. Laya의 경우deepset에서jag(0.834)는 모든 개별 질문을 능가했습니다. 따라서 평균화는 제가 잘못된 질문을 선택하는 것을 막아주었지만, 올바른 질문을 선택하는 것까지는 해주지 못했습니다. -
FalconDec는 사용 불가능하다.
safeguard에서 0.343의 AUROC는 우연에 미치지 못하며, 다른 변형 모델들은 0.4~0.5 근처를 맴돕니다. 어떤 것에든 이것을 사용하지 마십시오. -
단순한 단어 선택만으로 Laya가 크게 움직였다. 제가 이전에 Laya에게 다르게 표현된 예/아니오 질문을 했을 때는
safeguard에서 0.958,deepset에서 0.652를 얻었습니다. 이번에 다시 작성하여 질문한 경우에는 각각 0.930과 0.718을 얻었습니다.
작성한 문구와 호출 구성을 동시에 변경했기 때문에 어느 것이 중요했는지 말할 수 없습니다. 여전히 이 수치들이 '제가 작성한 문구'에 속한다는 것을 상기시켜 드립니다.
세부 사항
-
n이 작습니다. 116개의 샘플만으로는 AUROC 격차를 약 0.05 미만으로 간주하는 것이 노이즈로 처리해야 합니다.
safeguard는 최고 모델의 포화 상태에 가깝기 때문에 이 역시 구분할 수 없습니다. -
다국어 혼란 변수.
deepset에는 독일어가 포함되어 있습니다. Clef는 다국어 기반으로 구축되었지만, DeBERTa 분류기는 영어 전용입니다.deepset에서 Clef가 앞서 나가는 것이 Jev 방식의 우위라기보다는 언어적 이점일 수 있습니다. 저는 이것을 테스트하지 않았습니다. -
보정(Calibration)은 공짜가 아닙니다.
safeguard에서는 Clef의 원시 ECE(0.056, 선택지 기준; Platt 스케일링 후 0.009)가 괜찮았습니다.deepset에서는 원시 값이 0.31-0.36이었고, 최적 임계값은 0.03-0.07에 머물러 있어 0.5와는 거리가 멀었습니다. 순위(ranking)가 매우 좋았음에도 불구하고, 0.5 임계값에서의 F1 점수는 0.36-0.50으로 떨어졌습니다. 보정된 확률을 임계값 처리하려면 반드시 자신의 데이터로 임계값을 맞춰야 합니다. -
두 선도 모델 모두 이 데이터를 본 적이 있을 수 있습니다. 저는 DeBERTa나 Clef의 훈련 세트에 대해 이러한 데이터셋을 사용했는지 확인하지 않았습니다.
-
비용. 여기서 Clef-flash는 DeBERTa보다 10~50배 느립니다. 모든 요청에 대한 가드레일은 그만큼의 비용을 지불해야 합니다.
-
적응형 공격자. 여기에는 의도적인 공격자를 테스트하는 것이 없습니다. RL 기반 주입 공격(injection attacks)은 이미 여러 주입 탐지기를 우회하며, 보정되고 쿼리 가능한 점수는 좋은 오라클이 됩니다.
코드 구현
전체 노트북은 Colab에 있습니다. 중요한 부분만 여기에 제시합니다. 모든 모델은 Jev-core이며, 이는 P(attack)를 반환하는 모든 것을 의미합니다.
1. JAG 질문 세트. 세 가지 유형화된 질문이 모두 함께 나갑니다. 대략 같은 텍스트에 대한 것입니다:
이것이 JAG의 핵심입니다. 동일한 딕셔너리가 Laya, Clef 및 기타 Jev-스타일 모델에 적용됩니다. choice 옵션 설명 부분에서 정책(policy)을 정의합니다.
2. Jev-core 계약.
def lvl(x, k=len(LEVELS)): # 예상 순서 레벨 -> [0,1]
return float(np.clip(x / (k - 1), 0, 1))
...
각 어댑터는 모델의 출력을 질문당 P(attack)로 변환합니다. score 답변은 예상 순서 레벨이므로, lvl 함수가 이를 [0, 1]로 재조정합니다. with_jag는 평균을 추가합니다.
3. Clef-flash (Hugging Face 가중치에서 로컬 실행).
class ClefLocalCore(JevCore):
def __init__(self, name="clef_flash_local", repo="Cloudflare/clef-flash"):
from huggingface_hub import snapshot_download
...
텍스트당 한 번의 호출로 세 가지 답변을 모두 반환합니다. 이 기능은 약 20GB의 GPU 메모리가 필요하며, 저장소에 포함된 코드를 실행합니다.
4. Laya.
class LayaCore(JevCore):
def __init__(self, name="laya", mode="router"):
import laya
...
동일한 TYPED 딕셔너리이지만 다른 파서입니다. router 모드는 텍스트당 체크포인트를 선택하며, 이는 독일어 샘플에 중요합니다.
5. 교정 인식 지표 (Calibration-aware metrics).
def platt_cv(y, p, k=5, seed=0):
z = np.log(np.clip(p, 1e-6, 1 - 1e-6) / (1 - np.clip(p, 1e-6, 1 - 1e-6))).reshape(-1, 1)
k = min(k, int(np.bincount(y).min()))
...
저는 AUROC, 0.5에서의 F1, 임계값을 사용한 최고 F1, Brier, 원시 ECE, 그리고 플랫 스케일링을 거친 교차 적합(cross-fitted) ECE를 보고합니다. 원시 ECE와 플랫 ECE 간의 차이는 모델이 신뢰할 수 있는 확률을 얻기 위해 얼마나 많은 임계값 조정이 필요한지를 보여줍니다. 점수는 모델 및 데이터셋별로 캐싱되므로, Colab 연결이 끊어져도 실행 결과를 잃지 않습니다.
제가 JAG를 사용하는 방법
-
여러 개의 질문을 하세요. Clef의 경우, 단일 질문이 '예/아니오' 질문보다
deepset에서 최대 0.08 AUROC만큼 더 나았습니다. -
맹목적으로 평균 내지 마세요. 각 질문을 평가한 다음, 자체 데이터셋에서 선택하거나 가중치를 부여하세요.
-
자신의 트래픽에 맞게 임계값을 설정하세요. 혼합 언어 세트의 경우 0.5는 거의 모든 모델에게 적절하지 않았습니다.
-
되돌릴 수 없는 작업에는 결정론적 확인(deterministic check)이나 사람이 뒤따르세요.
-
저렴한 분류기(classifier)와 비교하여 벤치마크하세요. 한 세트에서는 Clef의 노이즈 범위 내에 있었고 훨씬 빨랐습니다.
결론적으로 (The bottom line)
JAG는 과장이 아니며, 마법도 아닙니다. 오픈 소스 Jev 스타일 모델이 제가 더 어렵게 설정한 세트에서 지도 학습 분류기(supervised classifier)를 능가했으며, 승리 요인은 단순히 단일 '예/아니오' 질문이 아니라 _올바른 유형화된 질문_을 하는 것이었습니다. 하지만 샘플 크기가 작고, 다국어 장점은 테스트되지 않았으며, 원시 확률(raw probabilities)은 임계값 설정이 필요하고, 저는 Jev 자체를 실행해 본 적이 없습니다. 이 접근 방식은 직접 데이터를 가지고 테스트할 가치가 있다고 생각합니다. 입증되었다고는 말할 수 없습니다.
실제 트래픽에 Jev 스타일의 가드레일을 적용해 보셨나요? 어떤 유형화된 질문이 신호(signal)를 전달했나요? 댓글로 알려주세요. 👉 다음 분석을 위해 좋아요와 팔로우해주세요.
참고 자료 (References)
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
Published via ZyVOP — Write once in Markdown, auto-backup to GitHub, and syndicate to Dev.to, Medium & Hashnode in 1 click.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기