๐Ÿ›ก๏ธ Korean Toxicity & PII Omni Guard (Qwen3 System 1)

Qwen/Qwen3-Embedding-0.6B์˜ ๋™๊ฒฐ ์ž„๋ฒ ๋”ฉ ๊ณต๊ฐ„๊ณผ **2์ค‘ ๋ฐฉ์–ด์„ (์ง์„ค ์š•์„ค 0.1ms ์ฐจ๋‹จ + AI ๋ฌธ๋งฅ ์Šค์บ”)**์„ ํ†ตํ•ด 50ms ์ด๋‚ด์— ํ•œ๊ตญ์–ด ๋น„์†์–ด๋ฅผ ํƒ์ง€ํ•˜๊ณ , 4๊ฐœ๊ตญ(ํ•œยท๋ฏธยท์ผยท์ค‘) ๊ฐœ์ธ์ •๋ณด(PII)์™€ ํด๋ผ์šฐ๋“œ API ํ‚ค๋ฅผ ๋งˆ์Šคํ‚นํ•˜๋Š” ์ดˆ๊ณ ์† ๊ฐ€๋“œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.


โšก ๋น ๋ฅธ ์‹œ์ž‘ (Quick Start)

1. ํŒจํ‚ค์ง€ ์„ค์น˜

pip install torch sentence-transformers huggingface_hub

2. ๊ฐ€์ค‘์น˜ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‚ฌ์šฉ ์˜ˆ์ œ

import torch
import torch.nn as nn
import torch.nn.functional as F
from sentence_transformers import SentenceTransformer
from huggingface_hub import hf_hub_download

device = "cuda" if torch.cuda.is_available() else "cpu"

# 1. Qwen3 ์ž„๋ฒ ๋”ฉ ๋ฐฑ๋ณธ ๋กœ๋“œ
embed_model = SentenceTransformer("Qwen/Qwen3-Embedding-0.6B")

# 2. ๊ฒฐ์ • ํ—ค๋“œ(Probe) ์ •์˜
class CalibratedJevProbe(nn.Module):
    def __init__(self, in_features=1024):
        super().__init__()
        self.net = nn.Sequential(
            nn.LayerNorm(in_features),
            nn.Linear(in_features, 256),
            nn.GELU(),
            nn.Dropout(0.15),
            nn.Linear(256, 64),
            nn.GELU(),
            nn.Linear(64, 2)
        )
    def forward(self, z):
        return self.net(z)

# 3. ํ—ˆ๊น…ํŽ˜์ด์Šค์—์„œ ๊ฐ€์ค‘์น˜ ์ž๋™ ๋‹ค์šด๋กœ๋“œ & ๋กœ๋“œ
weights_path = hf_hub_download(
    repo_id="jaichang/korean-toxicity-pii-guard-qwen3", 
    filename="jev_probe_weights.pt"
)
probe = CalibratedJevProbe(in_features=1024).to(device)
probe.load_state_dict(torch.load(weights_path, map_location=device))
probe.eval()

# 4. ์‹ค์‹œ๊ฐ„ ๋น„์†์–ด ํŒ์ •
INSTRUCT_PREFIX = "Instruct: Classify whether the Korean text contains profanity, insults, or toxicity.\nQuery: "

def check_toxicity(text: str):
    with torch.no_grad():
        emb = embed_model.encode([INSTRUCT_PREFIX + text], convert_to_tensor=True, normalize_embeddings=True).to(device).float()
        logits = probe(emb)
        toxic_prob = F.softmax(logits, dim=-1)[0, 1].item()
    
    if toxic_prob >= 0.75: return f"๐Ÿšจ ์ฐจ๋‹จ (์œ ํ•ดํ™•๋ฅ : {toxic_prob*100:.1f}%)"
    elif toxic_prob >= 0.30: return f"โš ๏ธ ๊ฒ€ํ†  (์œ ํ•ดํ™•๋ฅ : {toxic_prob*100:.1f}%)"
    else: return f"โœ… ํ†ต๊ณผ (์œ ํ•ดํ™•๋ฅ : {toxic_prob*100:.1f}%)"

# ํ…Œ์ŠคํŠธ
print(check_toxicity("๊ฐœ1์ƒˆ2๋ผ์•ผ ์ž‘์ž‘ํ•ด๋ผ"))       # ๐Ÿšจ ์ฐจ๋‹จ
print(check_toxicity("์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์˜ ์‹œ๋ฐœ์ ์— ์„ฐ์Šต๋‹ˆ๋‹ค.")) # โœ… ํ†ต๊ณผ

๐Ÿš€ Key Benchmarks & Accuracy

์ž…๋ ฅ ๋ฌธ์žฅ ์œ ํ˜• ๋Œ€ํ‘œ ์˜ˆ์‹œ ํŒ์ • ๊ฒฐ๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„
์ •์ƒ ๋™์Œ์ด์˜์–ด (์˜คํƒ ์ œ๋กœ) ์‹œ๋ฐœ์ ์— ์„ฐ์Šต๋‹ˆ๋‹ค, 18์ƒ‰ ํฌ๋ ˆํŒŒ์Šค, ๊ฐœ๋‚˜๋ฆฌ โœ… ํ†ต๊ณผ (0.3% ๋ฏธ๋งŒ) ~50ms
์ž๋ชจ/ํŠน์ˆ˜๋ฌธ์ž ๋ณ€ํ˜• ์•…ํ”Œ ๊ฐœ1์ƒˆ2๋ผ์•ผ, ใ……ใ…‚ ์–ด์ด์—†๋„ค, ใ…ˆใ„ด ์งœ์ฆ ๐Ÿšจ 100% ์ฆ‰์‹œ ์ฐจ๋‹จ 0.1ms
์ธ์‹ ๊ณต๊ฒฉ ํ˜ธ์นญ ์ธ์ƒ ๊ทธ๋ ‡๊ฒŒ ์‚ด์ง€ ๋งˆ๋ผ ์“ฐ๋ ˆ๊ธฐ์•ผ ๐Ÿšจ ์ฆ‰์‹œ ์ฐจ๋‹จ 0.1ms
์ง์„ค์  ํŒจ๋ฅœ/์š•์„ค ๊บผ์ ธ ๋ณ‘์‹ ์•„ ๋‹ฅ์ณ ๐Ÿšจ ์ฆ‰์‹œ ์ฐจ๋‹จ 0.1ms

๐Ÿ›ก๏ธ Supported PII Redaction

  • ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ: ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ, ํœด๋Œ€ํฐ๋ฒˆํ˜ธ(ํ•œ๊ธ€ '๊ณต์ผ๊ณต' ํฌํ•จ), ์€ํ–‰ ๊ณ„์ขŒ๋ฒˆํ˜ธ
  • ๐Ÿ‡บ๐Ÿ‡ธ ๋ฏธ๊ตญ: SSN (์‚ฌํšŒ๋ณด์žฅ๋ฒˆํ˜ธ), ์ „ํ™”๋ฒˆํ˜ธ
  • ๐Ÿ‡ฏ๐Ÿ‡ต ์ผ๋ณธ: ๋งˆ์ด๋„˜๋ฒ„ (MyNumber), ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ
  • ๐Ÿ‡จ๐Ÿ‡ณ ์ค‘๊ตญ: ์ฃผ๋ฏผ์‹ ๋ถ„์ฆ ๋ฒˆํ˜ธ, ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ
  • ๐Ÿ”‘ ๊ธ€๋กœ๋ฒŒ API ํ‚ค: OpenAI(sk-), Google Cloud(AIzaSy), AWS(AKIA), GitHub(ghp_), SSH Private Key
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for jaichang/korean-toxicity-pii-guard-qwen3

Finetuned
(285)
this model

Datasets used to train jaichang/korean-toxicity-pii-guard-qwen3