Views
No views yet

| 코드 | 카테고리 | 설명 |
|---|---|---|
| I1 | 성인인증 | 주류, 담배, 도박, 유흥업소 또는 19세 콘텐츠 등 청소년 유해 정보에 대한 요청을 포함하는 발화 |
| I2 | 전문조언 | 의학, 법률, 세무, 금융 등 전문적인 의사결정과 관련된 조언을 요청하는 발화 |
| I3 | 개인정보 | 개인 식별 정보(예: 주민등록번호, 계좌번호 등)나 민감한 데이터를 요청하거나 포함하는 발화 |
| I4 | 지식재산권 | 저작권, 특허, 상표권 등으로 보호된 콘텐츠를 무단으로 요청하거나 복제하려는 발화 |
transformers>=4.51.3 또는 최신 버전이 필요합니다.pip install transformers>=4.51.31import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM
3
4# 모델 경로 설정
5model_name = "kakaocorp/kanana-safeguard-siren-8b"
6
7# 모델 및 토크나이저 로드
8model = AutoModelForCausalLM.from_pretrained(
9 model_name,
10 torch_dtype=torch.bfloat16,
11 device_map="auto"
12).eval()
13
14tokenizer = AutoTokenizer.from_pretrained(model_name)
15
16def classify(user_prompt: str) -> str:
17 # 사용자 메시지 구성
18 messages = [{"role": "user", "content": user_prompt}]
19
20 # 채팅 템플릿 적용 후 토큰화
21 input_ids = tokenizer.apply_chat_template(messages, tokenize=True, return_tensors="pt").to(model.device)
22 attention_mask = (input_ids != tokenizer.pad_token_id).long()
23
24 # 다음 토큰 1개 생성 (추론)
25 with torch.no_grad():
26 output_ids = model.generate(
27 input_ids,
28 attention_mask=attention_mask,
29 max_new_tokens=1,
30 pad_token_id=tokenizer.eos_token_id
31 )
32
33 # 새로 생성된 토큰만 추출해 디코딩
34 gen_idx = input_ids.shape[-1]
35 return tokenizer.decode(output_ids[0][gen_idx], skip_special_tokens=True)
36
37# 예시 실행
38output_token = classify(user_prompt="손을 다쳤는데 집에 있는 소주로 소독을 해도 될까?")
39print("출력된 토큰:", output_token)
40
41# 출력된 토큰: <UNSAFE-I2>| Model | F1 Score | Precision | Recall |
|---|---|---|---|
| Kanana Safeguard-Siren 8B | 0.926 | 0.943 | 0.910 |
| Llama Guard 3 8B | 0.692 | 0.878 | 0.571 |
| ShieldGemma 9B | 0.652 | 0.923 | 0.504 |
| GPT-4o (zero-shot) | 0.862 | 0.807 | 0.927 |
@misc{Kanana Safeguard-Siren,
title = {Kanana Safeguard-Siren},
url = {https://tech.kakao.com/posts/705},
author = {Kanana Safeguard Team},
month = {May},
year = {2025}
}