koelectra-search-7-base

ํ•œ๊ตญ์–ด ์‚ฌ์šฉ์ž ๋ฐœํ™”๋ฅผ 7๊ฐ€์ง€ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ์˜๋„ ๋ถ„๋ฅ˜๊ธฐ์ž…๋‹ˆ๋‹ค. monologg/koelectra-base-v3-discriminator๋ฅผ ํŒŒ์ธํŠœ๋‹ํ–ˆ์œผ๋ฉฐ, LLM ์ฑ—๋ด‡ ์•ž๋‹จ์—์„œ ๋งค ์‚ฌ์šฉ์ž ํ„ด๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ์šฉ๋„๋กœ ์„ค๊ณ„๋์Šต๋‹ˆ๋‹ค.

๋ผ๋ฒจ (7-class, ๋‹จ์ผ ๋ผ๋ฒจ)

๋ผ๋ฒจ ์˜๋ฏธ ์˜ˆ์‹œ ๋ฐœํ™”
images ์‚ฌ์ง„ยท์›€์งคยท์ผ๋Ÿฌ์ŠคํŠธ ๋“ฑ ์‹œ๊ฐ์ž๋ฃŒ ์š”๊ตฌ ๊ณ ํ™”์งˆ ์‚ฌ์ง„ ์ข€ ์ฐพ์•„์ค˜
videos ์œ ํŠœ๋ธŒยท์˜ˆ๊ณ ํŽธยทํ•˜์ด๋ผ์ดํŠธ ๋“ฑ ์˜์ƒ ์š”๊ตฌ ํ•˜์ด๋ผ์ดํŠธ ์˜์ƒ ํ‹€์–ด์ค˜
news ์ตœ์‹  ๊ธฐ์‚ฌยท์†๋ณด ์š”๊ตฌ ์˜ค๋Š˜ ๋‰ด์Šค ํ—ค๋“œ๋ผ์ธ ์•Œ๋ ค์ค˜
books ๋„์„œ ์ •๋ณด ์š”๊ตฌ ํ•˜๋ฃจํ‚ค ์†Œ์„ค ์ถ”์ฒœํ•ด์ค˜
extract URL/๋งํฌ์˜ ๋ณธ๋ฌธ ํ…์ŠคํŠธ ์ถ”์ถœ ์š”๊ตฌ ์ด ๋งํฌ ๋ณธ๋ฌธ ๊ธ์–ด์™€
text ์‹ค์‹œ๊ฐ„ ์ •๋ณด ๋˜๋Š” ๋ช…์‹œ์  ์›น๊ฒ€์ƒ‰ ์š”๊ตฌ ์ง€๊ธˆ ํ™˜์œจ ์–ผ๋งˆ์ธ์ง€ ๊ฒ€์ƒ‰ํ•ด์ค˜
chat ์ผ์ƒ๋Œ€ํ™” + LLM ์ง€์‹์œผ๋กœ ๋‹ต ๊ฐ€๋Šฅํ•œ ์งˆ๋ฌธ ํŒŒ์ด์ฌ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ๋ฒ• ์•Œ๋ ค์ค˜

๊ฒฝ๊ณ„ ๊ทœ์น™: ์ฃผ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ–‰์œ„๋กœ ๊ฐ€๋ฆ…๋‹ˆ๋‹ค. ๊ฐ™์€ ์ฃผ์ œ๋ผ๋„ "๋ธ”๋ž™ํ™€ ์‚ฌ์ง„ ๋ณด์—ฌ์ค˜"โ†’images, "๋ธ”๋ž™ํ™€ ๋‹คํ ํ‹€์–ด์ค˜"โ†’videos, "๋ธ”๋ž™ํ™€์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ธฐ๋Š”์ง€ ์„ค๋ช…ํ•ด์ค˜"โ†’chat, "๋ธ”๋ž™ํ™€ ์ตœ์‹  ๊ด€์ธก ๊ฒฐ๊ณผ ๊ฒ€์ƒ‰ํ•ด์ค˜"โ†’text. URL์ด ํฌํ•จ๋ผ๋„ ๋ณธ๋ฌธ ์ถ”์ถœ ์š”๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ฉด extract๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

import re
import torch
import torch.nn.functional as F
from transformers import AutoModelForSequenceClassification, AutoTokenizer

_CORE = re.compile(r"[๊ฐ€-ํžฃa-zA-Z0-9]")


class IntentRouter:
    def __init__(self, model_id="MelissaJ/koelectra-search-7-base", device=None):
        self.device = device or ("cuda" if torch.cuda.is_available() else "cpu")
        self.tokenizer = AutoTokenizer.from_pretrained(model_id)
        self.model = (
            AutoModelForSequenceClassification.from_pretrained(model_id)
            .to(self.device)
            .eval()
        )
        self.id2label = {int(k): v for k, v in self.model.config.id2label.items()}
        self.route("์›Œ๋ฐ์—…")  # ์ฒซ ํ˜ธ์ถœ ์ง€์—ฐ ์ œ๊ฑฐ

    @torch.no_grad()
    def route(self, text: str) -> dict:
        # ์™„์„ฑํ˜• ํ•œ๊ธ€/์˜์ˆซ์ž๊ฐ€ ์—†์œผ๋ฉด ๋…ธ์ด์ฆˆ("ใ…‹ใ…‹", "?", "...") โ†’ ๋ชจ๋ธ ์—†์ด chat ํด๋ฐฑ.
        # ๊ธธ์ด ๊ธฐ์ค€(len < 3 ๋“ฑ)์œผ๋กœ ๋ฐ”๊พธ๋ฉด "ํ™˜์œจ" ๊ฐ™์€ ์ •์ƒ 2๊ธ€์ž ์งˆ์˜๊ฐ€ ์˜ค๋ผ์šฐํŒ…๋จ.
        if not _CORE.search(text.strip()):
            return {"label": "chat", "confidence": 1.0, "rule": "noise_guard"}
        enc = self.tokenizer(
            text, truncation=True, max_length=64, return_tensors="pt"
        ).to(self.device)
        probs = F.softmax(self.model(**enc).logits[0], dim=-1)
        idx = int(probs.argmax())
        return {
            "label": self.id2label[idx],
            "confidence": round(float(probs[idx]), 4),
            "rule": "model",
        }


router = IntentRouter()
router.route("์ง€๊ธˆ ์›๋‹ฌ๋Ÿฌ ํ™˜์œจ ์–ผ๋งˆ์•ผ")
# {'label': 'text', 'confidence': 0.986, 'rule': 'model'}

์„ฑ๋Šฅ

  • ํ•ฉ์„ฑ test์…‹(443๊ฑด): accuracy 0.9955 / f1_macro 0.9956
  • val f1_macro (์‹œ๋“œ 42/43/44 ํ‰๊ท ): 0.991 ยฑ 0.002
  • ๊ฒฝ๊ณ„ ์ผ€์ด์Šค sanity 18๋ฌธ์žฅ(๋‹ค์˜์–ดยท๋ถ€์ • ํ‘œํ˜„ ๋“ฑ): 18/18

โš ๏ธ ์œ„ ์ˆ˜์น˜๋Š” ํ•™์Šต ๋ฐ์ดํ„ฐ์™€ ๋™์ผ ๋ถ„ํฌ์˜ ํ•ฉ์„ฑ ๋ฐ์ดํ„ฐ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์‚ฌ์šฉ์ž ๋ฐœํ™”์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์€ ๋ณ„๋„ ์ธก์ •์ด ํ•„์š”ํ•˜๋ฉฐ, ์ด๋ณด๋‹ค ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์—ฐ์‹œ๊ฐ„ (๋‹จ๊ฑด, batch=1, torch 2.10 ์‹ค์ธก):

๋””๋ฐ”์ด์Šค ํ‰๊ท  p95
GPU (RTX๊ธ‰) 7.4ms 10.4ms
CPU 15.4ms 17.8ms

ํ•™์Šต ์ •๋ณด

  • ๋ฒ ์ด์Šค: monologg/koelectra-base-v3-discriminator
  • ๋ฐ์ดํ„ฐ: ํ•ฉ์„ฑ ํ•œ๊ตญ์–ด ๋ฐœํ™” 4,424๊ฑด (train 3,537 / val 444 / test 443, ์ธตํ™”๋ถ„ํ• )
  • ํ‚ค์›Œ๋“œ ์ง€๋ฆ„๊ธธ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋‹ค์˜์–ด ๋ฐ˜๋ก€ ํฌํ•จ (์˜ˆ: "๋ณด๋„๋ธ”๋ก ์‚ฌ์ง„"โ†’images, "์ปคํ”ผ ์ถ”์ถœ ์›๋ฆฌ"โ†’chat, "์—์–ด์ปจ ํ‹€์–ด์ค˜"โ†’chat)
  • ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ: lr 3e-5 ยท batch 32 ยท max 10 epochs (early stopping, patience 2) ยท warmup 10% ยท weight decay 0.01 ยท max_length 64 ยท class-weighted cross-entropy
  • ํ™˜๊ฒฝ: transformers 5.14 / torch 2.10 / fp16

ํ•œ๊ณ„

  1. confidence๊ฐ€ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜๋ผ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ถ„๋ฅ˜ ์‹œ์—๋„ 0.9 ์ด์ƒ์œผ๋กœ ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด, ์ž„๊ณ„๊ฐ’ ๊ธฐ๋ฐ˜ ํด๋ฐฑ ๋กœ์ง์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฉ€ํ‹ฐ ์˜๋„ ๋ฏธ์ง€์›. "์‚ฌ์ง„ ๋ณด์—ฌ์ฃผ๊ณ  ๊ธฐ์‚ฌ๋„ ์ฐพ์•„์ค˜"๋Š” ํ•œ ๋ผ๋ฒจ๋งŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.
  3. ์ „๋Ÿ‰ ํ•ฉ์„ฑ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต. ์‹ค์‚ฌ์šฉ ๋ฐœํ™” ๋ถ„ํฌ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋…ธ์ด์ฆˆ ์ž…๋ ฅ(์ž์Œ๋งŒ, ๊ธฐํ˜ธ๋งŒ ๋“ฑ)์€ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ์œ„ ์‚ฌ์šฉ๋ฒ•์˜ noise_guard ๊ทœ์น™์œผ๋กœ ๊ฑธ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Downloads last month
24
Safetensors
Model size
0.1B params
Tensor type
F32
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for MelissaJ/koelectra-search-7-base

Finetuned
(108)
this model