Instructions to use coderecode95/KJH-Judge-4B-ko with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use coderecode95/KJH-Judge-4B-ko with Transformers:
# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("coderecode95/KJH-Judge-4B-ko") model = AutoModelForCausalLM.from_pretrained("coderecode95/KJH-Judge-4B-ko", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- KJH-Judge-4B-ko
- ์ด ๋ชจ๋ธ์ ํน์ง
- ๋น ๋ฅด๊ฒ ์์ํ๊ธฐ
- ์ฌ์ฉ ์์
- 1. ๊ณ ๊ฐ ๋ฌธ์ ๋ถ๋ฅ โ ๋ถ์์ ๊ธด๊ธ๋๋ฅผ ํ ๋ฒ์
- 2. ๋ฆฌ๋ทฐ ๊ฐ์ ๋ถ์ โ ๋๋ ์ฒ๋ฆฌ์ ์ฌ๋ ๊ฒํ ๊ธฐ์ค
- 3. ๋ฆฌ๋ทฐ๋ฅผ ์ฌ๋ฌ ์ธก๋ฉด์ผ๋ก โ ๋ฐฐ์กยทํ์งยท๊ฐ๊ฒฉ ๊ฐ๊ฐ
- 4. ๋๊ธ ๊ฒ์ โ ํ์ค ์ฌ๋ถ์ ๊ณต๊ฒฉ์ฑ ์์ค
- 5. ์์ด์ ํธ ๋ผ์ฐํฐ โ ๋๊ตฌ ํธ์ถ / ๋๋ฌป๊ธฐ / ์ง์ ๋ต๋ณ
- 6. ์ ์ฑ ์ ๋ฐ๋ฅธ ๊ณ ๊ฐ์ผํฐ ํ๋ ๊ฒฐ์
- 7. ๋ต๋ณ์ด ๊ทผ๊ฑฐ ๋ฌธ์์ ๋ง๋์ง ํ์ธ (RAG ๊ฒ์ฆ)
- 8. ์ฝ๊ดยท๋ฌธ์์ ๊ทผ๊ฑฐํ ์/์๋์ค
- 9. ๋น์ทํ ์ง๋ฌธ ์ฐพ๊ธฐ โ FAQ ์ค๋ณต ํ์ธ
- 10. ๋ด ๋ถ๋ฅ ์ฒด๊ณ ๊ทธ๋๋ก ์ฐ๊ธฐ
- ์๋ฆฌ: transformers๋ง์ผ๋ก ์ง์ ๊ณ์ฐํ๊ธฐ
- ํ๋กฌํํธ ํ์
- ์ฑ๋ฅ
- ์ํ๋ ๊ฒ๊ณผ ๋ชปํ๋ ๊ฒ
- ํ์ต
- ๋ผ์ด์ ์ค์ ์ฃผ์
- ์ด ๋ชจ๋ธ์ ํน์ง
KJH-Judge-4B-ko
Korean JEV Benchmark๋ฅผ ๋ณด๊ณ ํ์ ๋ชจ๋ธ์ ์ง์ ๋ง๋ค์ด ๋ณธ ๊ฐ์ธ ํ์ต ํ๋ก์ ํธ์ ๋๋ค. ์๋ ์์น๋ ๋ชจ๋ ์ง์ ์ฐ ๊ฒฐ๊ณผ์ด๋ฉฐ, ์ค์๋น์ค์์ ๊ฒ์ฆํ ๋ชจ๋ธ์ ์๋๋๋ค.
์ ํด์ง ๋ณด๊ธฐ ์ค ํ๋๋ฅผ ๊ณจ๋ผ, ๋ณด์ ๋ ํ๋ฅ ๊ณผ ํจ๊ป ๋๋ ค์ฃผ๋ ํ๊ตญ์ด ํ์ ๋ชจ๋ธ์ ๋๋ค. ๊ฐ์ ยท์ฃผ์ ๋ถ๋ฅ, ๋ฌธ์ฅ ๊ด๊ณ(ํจ์ยท๋ชจ์), ํ์ค ํํ ๊ฒ์, ์ ์ฑ ์ ๋ฐ๋ฅธ ํ๋ ์ ํ, ์์ด์ ํธ์ ๋๊ตฌ ํธ์ถ ํ๋จ(๋๊ตฌ ํธ์ถ / ๋๋ฌป๊ธฐ / ์ง์ ๋ต๋ณ) ๊ฐ์ ์ผ์ ์๋๋ค. ๋ค๋ฅธ ๋ชจ๋ธ์ ๋ต๋ณ์ ์ฑ์ ํ๋ LLM-as-a-judge ๋ชจ๋ธ์ด ์๋๋๋ค.
English summary. A personal learning project: a Korean decision model fine-tuned from Qwen3-4B. Given a task description, an item, and 2โ26 options, it returns the chosen option with calibrated probabilities from a single forward pass (no text generation, ~tens of ms per decision on a GPU). Good for classification, NLI, moderation, policy actions, and tool-call routing. It does not generate text, extract spans, or do numeric reasoning.
์ด ๋ชจ๋ธ์ ํน์ง
- ๋ณด๊ธฐ ๊ณ ๋ฅด๊ธฐ๋ง ํฉ๋๋ค. ๊ธ์ ์์ฑํ์ง ์๊ณ ํ๋กฌํํธ๋ฅผ ํ ๋ฒ ๊ณ์ฐํ ๋ค, ๋ณด๊ธฐ ๊ธฐํธ(A, B, โฆ) ํ ํฐ์ ์ ์๋ง ์ฝ์ต๋๋ค. ๊ทธ๋์ ๋น ๋ฅด๊ณ (GPU ์๋ฒ ์ ๊ณ์ฐ ๊ธฐ์ค ํ์ ํ ๋ฒ ์ฝ 90ms), ๋ต์ด ํญ์ ๋ณด๊ธฐ ์ค ํ๋์ ๋๋ค.
- ํ๋ฅ ์ด ๋ณด์ ๋์ด ์์ต๋๋ค. ๊ฒ์ฆ์ ์ผ๋ก ๋ง์ถ ์จ๋(1.72)๋ก ๋ณด์ ํด, Korean JEV Benchmark์์ ๊ธฐ๋ ๋ณด์ ์ค์ฐจ(ECE)๊ฐ 0.027์ ๋๋ค. โํ์ 70% ๋ฏธ๋ง์ด๋ฉด ์ฌ๋์๊ฒ ๋๊ธฐ๊ธฐโ ๊ฐ์ ๊ธฐ์ค์ ๊ฑธ ์ ์์ต๋๋ค. ๋ค๋ง ํ์ตํ์ง ์์ ์ถ์ฒ์ ๋ฐ์ดํฐ์์๋ ํ๊ท ํ์ ์ด ์ ํ๋๋ณด๋ค ์ต๋ 10%p ์ ๋ ๋๊ฒ ๋์์ผ๋, ๊ธฐ์ค๊ฐ์ ์ฐ๋ ค๋ ๋ฐ์ดํฐ์์ ๋ค์ ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋ณด๊ธฐ ์์์ ํ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๋ณด๊ธฐ๋ฅผ ์ ํํ ๊ฑฐ๊พธ๋ก ๋๊ณ ๋ค์ ๋ฌผ์ด๋ 97.9%๊ฐ ๊ฐ์ ๋ต์ ๋๋ค.
๋น ๋ฅด๊ฒ ์์ํ๊ธฐ
pip install torch "transformers>=5" accelerate
from transformers import pipeline
judge = pipeline(model="coderecode95/KJH-Judge-4B-ko", trust_remote_code=True,
device=0, dtype="bfloat16") # GPU๊ฐ ์์ผ๋ฉด device, dtype ๋ฅผ ๋นผ์ธ์ (๋งค์ฐ ๋๋ฆผ)
์ฐ๋ ๋ฐฉ๋ฒ์ ์ธ ๊ฐ์ง์ด๊ณ , ๊ฒฐ๊ณผ๋ ๋ชจ๋ ๊ฐ์ ๋ชจ์์ ๋๋ค.
{'choice': '๊ธ์ ', 'confidence': 0.97, 'probabilities': {'๊ธ์ ': 0.97, '๋ถ์ ': 0.03}}
# ๊ณ ๋ฅธ ๋ณด๊ธฐ ๊ทธ ๋ณด๊ธฐ์ ํ๋ฅ (๋ณด์ ๋จ) ๋ณด๊ธฐ๋ณ ํ๋ฅ
1. ์์ฃผ ์ฐ๋ ํ์ โ ๋ฉ์๋ ํ๋๋ก
ํ์ต ๋์ ๊ฐ์ ์ง์นจยท๋ณด๊ธฐ ๋ฌธ๊ตฌ๊ฐ ์๋์ผ๋ก ๋ค์ด๊ฐ์, ๋ฐ๋ก ํ๋กฌํํธ๋ฅผ ์ธ ํ์๊ฐ ์๊ณ ์ ํ๋๋ ๊ฐ์ฅ ์ ๋์ต๋๋ค.
judge.sentiment("๋ฐฐ์ก์ ๋๋ ธ์ง๋ง ๋ฌผ๊ฑด์ ์ ๋ง ๋ง์์ ๋ค์ด์") # โ ๊ธ์
judge.nli("๋ณด์ฆ๊ธ์ ํด๊ฑฐ ํ 30์ผ ์ด๋ด ๋ฐํํ๋ค.", "๋ณด์ฆ๊ธ์ ํด๊ฑฐ 40์ผ ๋ค์ ๋ฐ๋๋ค.") # โ contradiction
judge.next_action("๊ฐ๋จ์ญ์์ ์์ธ์ญ๊น์ง ํ์ ๋ถ๋ฌ์ค", tools) # โ CALL:call_taxi
| ๋ฉ์๋ | ํ์ | ๊ณ ๋ฅด๋ ๊ฐ |
|---|---|---|
sentiment(๋ฌธ์ฅ) |
๊ฐ์ | ๊ธ์ / ๋ถ์ |
topic(๋ด์ค ์ ๋ชฉ) |
๋ด์ค ์ฃผ์ | ์ฌํ / IT๊ณผํ / ์ธ๊ณ / ์ํ๋ฌธํ / ์ ์น / ์คํฌ์ธ / ๊ฒฝ์ |
hate(๋ฌธ์ฅ) |
ํ์คยท๋นํ ํํ | ๋นํ์ค / ํ์ค |
offensive(๋๊ธ, news_title=None) |
๋๊ธ ๊ณต๊ฒฉ์ฑ 3๋จ๊ณ | ์์ / ๊ณต๊ฒฉ์ / ํ์ค |
nli(์ ์ , ๊ฐ์ค) |
๋ฌธ์ฅ ๊ด๊ณ | entailment / contradiction / neutral |
similar(๋ฌธ์ฅ1, ๋ฌธ์ฅ2) |
๊ฐ์ ๋ป์ธ์ง | ๊ฐ์ / ๋ค๋ฆ |
yes_no(์ง๋ฌธ, ์ง๋ฌธ) |
์ง๋ฌธ ๊ทผ๊ฑฐ ์/์๋์ค | ์ / ์๋์ค |
same_meaning(๋จ์ด, ๋ฌธ๋งฅ1, ๋ฌธ๋งฅ2) |
๋จ์ด ๋ป์ด ๊ฐ์์ง | ๊ฐ์ / ๋ค๋ฆ |
reading(์ง๋ฌธ, ์ง๋ฌธ, ๋ณด๊ธฐ) |
๋ ํด ๊ฐ๊ด์ | ๋ณด๊ธฐ ์ค ํ๋ |
next_action(๋ํ, ๋๊ตฌ ๋ชฉ๋ก) |
์์ด์ ํธ ๋ค์ ํ๋ | CALL:<๋๊ตฌ> / ASK / RESPOND |
policy_action(์ ์ฑ
, ๊ณ ๊ฐ ์์ฒญ) |
์ ์ฑ ์ ๋ฐ๋ฅธ ํ๋ | ANSWER / ASK_CLARIFICATION / ASK_CONFIRMATION / CALL_TOOL / CALL_MULTIPLE_TOOLS / ESCALATE / REFUSE |
๋ฌธ์ฅ ํ๋๋ง ๋ฐ๋ ๋ฉ์๋(sentiment, topic, hate, nli ๋ฑ)๋ ๋ฆฌ์คํธ๋ฅผ ๋ฃ์ผ๋ฉด ์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ํ์ ํฉ๋๋ค.
2. ๋ด ํ์ ๋ง๋ค๊ธฐ โ JEV ํ์
Korean JEV BenchmarkยทJEV API์ ๊ฐ์ ๋ชจ์์
๋๋ค. ์ํฉ(state) ํ๋์ ์ด๋ฆ ๋ถ์ธ ์ง๋ฌธ ์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ๋ฌป๊ณ , ๋ณด๊ธฐ์๋ ๋ด๊ฐ ์ธ ID๋ฅผ ๋ถ์
๋๋ค. ๊ฒฐ๊ณผ๋ ๊ทธ ID๋ก ๋์์ต๋๋ค.
judge.decide(
state={"๊ณ ๊ฐ ๋ฌธ์": "์ง๋๋ฌ ์๊ธ์ด ๋ ๋ฒ ๋น ์ ธ๋๊ฐ์ด์. ์ค๋ ์์ ์ฒ๋ฆฌํด ์ฃผ์ธ์."},
questions={
"๋ถ์": {
"instructions": "๊ณ ๊ฐ ๋ฌธ์๋ฅผ ๋ด๋น ๋ถ์๋ก ๋ถ๋ฅํ๋ค.",
"criteria": {"billing": "๊ฒฐ์ ยทํ๋ถ", "delivery": "๋ฐฐ์ก", "account": "๊ณ์ ยท๋ก๊ทธ์ธ"},
},
"๊ธด๊ธ": {
"instructions": "๊ณ ๊ฐ์ด ์ฆ์ ์ฒ๋ฆฌ๋ฅผ ์๊ตฌํ๋์ง ํ๋จํ๋ค.",
"criteria": {"urgent": "์ฆ์ ์ฒ๋ฆฌ ์๊ตฌ", "normal": "์ผ๋ฐ ๋ฌธ์"},
},
},
)
# {'๋ถ์': {'choice': 'billing', 'confidence': 0.9โฆ, 'probabilities': {...}},
# '๊ธด๊ธ': {'choice': 'urgent', 'confidence': 0.9โฆ, 'probabilities': {...}}}
state: ํ๋จํ ๋ด์ฉ.{"์ด๋ฆ": ๊ฐ}์ด ํ๋กฌํํธ์ ํ ์ค์ฉ ๋ค์ด๊ฐ๋๋ค. ๋ฌธ์ฅ ํ๋๋ฉด ๊ทธ๋ฅ ๋ฌธ์์ด๋ก ๋ฃ์ด๋ ๋ฉ๋๋ค.instructions: ๋ฌด์์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ๊ณ ๋ฅผ์ง. ํ๋จ ๊ธฐ์ค์ ํ๋ ๋ฌธ์ฅ ๋ง๋ถ์ด๋ฉด(์: โ๋ฐ์ด๋ฅผ ๊ณ ๋ คํ๋คโ) ์ ํ๋๊ฐ ํฌ๊ฒ ์ค๋ฆ ๋๋ค.criteria:{ID: ์ค๋ช }, 2~26๊ฐ. ID๋ ๊ฒฐ๊ณผ๋ก ๋๋ ค๋ฐ๋ ๊ฐ์ด๊ณ , ๋ชจ๋ธ์ ์ค๋ช ์ ๋ณด๊ณ ๊ณ ๋ฆ ๋๋ค. ID๊ฐ ํ์ ์์ผ๋ฉด["๊ฒฐ์ ยทํ๋ถ", "๋ฐฐ์ก"]์ฒ๋ผ ๋ฆฌ์คํธ๋ก ๋ฃ์ด๋ ๋ฉ๋๋ค.
3. ํ ์ค๋ก
judge("์ง๋๋ฌ ์๊ธ์ด ๋ ๋ฒ ๋น ์ ธ๋๊ฐ์ด์", choices=["๊ฒฐ์ ยทํ๋ถ", "๋ฐฐ์ก", "๊ธฐํ"],
instruction="๊ณ ๊ฐ ๋ฌธ์๋ฅผ ๋ด๋น ๋ถ์๋ก ๋ถ๋ฅํ๋ค.")
judge.decide์์ ์ง๋ฌธ์ด ํ๋์ผ ๋์ ๊ฐ์ต๋๋ค. ๋ฆฌ์คํธ๋ฅผ ๋ฃ๊ณ batch_size=8์ฒ๋ผ ์ฃผ๋ฉด ๋ฌถ์ด์ ๊ณ์ฐํฉ๋๋ค.
trust_remote_code=True๋ ์ด ์ ์ฅ์์ judge_pipeline.py์ judge.py(ํ๋กฌํํธ ๋ง๋ค๊ธฐ์ ๋ณด๊ธฐ ์ ์ ๊ณ์ฐ)๋ฅผ ์คํํ๋ค๋ ๋ป์
๋๋ค. ์๊ฒฉ ์ฝ๋๋ฅผ ์ฐ๊ณ ์ถ์ง ์์ผ๋ฉด judge.py๋ฅผ ๋ด๋ ค๋ฐ์ from judge import Judge; judge = Judge()๋ก ๋๊ฐ์ด ์ธ ์ ์์ต๋๋ค. quickstart.ipynb์ ์์๋ฅผ ๋ชจ์ ๋์์ต๋๋ค.
์ฌ์ฉ ์์
์ด ๋ชจ๋ธ์ โ๋ฌด์์ ํ ์งโ๋ฅผ ๋น ๋ฅด๊ฒ ์ ํ๋ ์๋จ์ ๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ ๋ง์ต๋๋ค. ์ ํด์ง ๋ณด๊ธฐ ์ค ํ๋๋ฅผ ๊ณ ๋ฅด๋ ํ๋จ์ ์ด ๋ชจ๋ธ์ด ํ๊ณ , ๊ธ ์ฐ๊ธฐ๋ ๊ฐ ์ฑ์ฐ๊ธฐ์ฒ๋ผ ์์ฑ์ด ํ์ํ ์ผ๋ง ํฐ ๋ชจ๋ธ์ด๋ ์ฌ๋์๊ฒ ๋๊ธฐ๋ ๊ตฌ์ฑ์
๋๋ค. ์๋ ์์๋ ๋ชจ๋ ์์์ ๋ง๋ judge๋ก ๋ฐ๋ก ๋์๊ฐ๋๋ค. ์ฃผ์์ ์ ์ ๊ฒฐ๊ณผ๋ ์๋ํ ์ ๋ต์ด๊ณ , ์ค์ ํ๋ฅ ์ ์ง์ ์คํํด ํ์ธํ์ธ์.
1. ๊ณ ๊ฐ ๋ฌธ์ ๋ถ๋ฅ โ ๋ถ์์ ๊ธด๊ธ๋๋ฅผ ํ ๋ฒ์
๋ฌธ์ ํ๋๋ฅผ ์ฌ๋ฌ ๊ด์ ์ผ๋ก ๋์์ ๋ถ๋ฅํฉ๋๋ค. ์ง๋ฌธ๋ง๋ค ๋ณด๊ธฐ ID๋ฅผ ์ ํด ๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ์ ๋ฌด ์ฝ๋์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
def route_ticket(text):
r = judge.decide(
state={"๊ณ ๊ฐ ๋ฌธ์": text},
questions={
"๋ถ์": {
"instructions": "๊ณ ๊ฐ ๋ฌธ์๋ฅผ ๋ด๋น ๋ถ์๋ก ๋ถ๋ฅํ๋ค. ์ฌ๋ฌ ๋ด์ฉ์ด ์์ฌ ์์ผ๋ฉด ๊ณ ๊ฐ์ด ํด๊ฒฐ์ ์ํ๋ ๋ฌธ์ ๋ฅผ ์ฐ์ ํ๋ค.",
"criteria": {"billing": "๊ฒฐ์ ยทํ๋ถ", "delivery": "๋ฐฐ์ก", "account": "๊ณ์ ยท๋ก๊ทธ์ธ",
"product": "์ ํ ์ฌ์ฉยท๊ณ ์ฅ", "other": "๊ธฐํ"},
},
"๊ธด๊ธ": {
"instructions": "๊ณ ๊ฐ์ด ์ฆ์ ์ฒ๋ฆฌ๋ฅผ ์๊ตฌํ๊ฑฐ๋ ๊ธ์ ํผํด๊ฐ ์งํ ์ค์ธ์ง ํ๋จํ๋ค.",
"criteria": {"urgent": "์ฆ์ ์ฒ๋ฆฌ ํ์", "normal": "์ผ๋ฐ ์ฒ๋ฆฌ"},
},
},
)
return r["๋ถ์"]["choice"], r["๊ธด๊ธ"]["choice"]
route_ticket("์ง๋๋ฌ ์๊ธ์ด ๋ ๋ฒ ๋น ์ ธ๋๊ฐ์ด์. ์ค๋ ์์ ํ๋ถํด ์ฃผ์ธ์.") # ('billing', 'urgent')
- ์ง์นจ์ ํท๊ฐ๋ฆฌ๋ ๊ฒฝ์ฐ์ ๊ธฐ์ค์ ํ ๋ฌธ์ฅ ๋ฃ์ผ๋ฉด(โ์ฌ๋ฌ ๋ด์ฉ์ด ์์ฌ ์์ผ๋ฉด โฆ์ ์ฐ์ ํ๋คโ) ์ ํ๋๊ฐ ์ค๋ฆ ๋๋ค.
- ๋ณด๊ธฐ์
๊ธฐํ๋ฅผ ๋๋ฉด ์ด๋์๋ ์ ๋ง๋ ๋ฌธ์๋ฅผ ์ต์ง๋ก ๋ผ์ ๋ฃ์ง ์์ต๋๋ค.
2. ๋ฆฌ๋ทฐ ๊ฐ์ ๋ถ์ โ ๋๋ ์ฒ๋ฆฌ์ ์ฌ๋ ๊ฒํ ๊ธฐ์ค
๋ฆฌ์คํธ๋ก ๋ฃ์ผ๋ฉด ๋ฌถ์ด์ ๊ณ์ฐํฉ๋๋ค. ํ์ ์ด ๋ฎ์ ๊ฑด ๋ฐ๋ก ๋ชจ์ ์ฌ๋์ด ๋ด ๋๋ค.
reviews = ["๋ฐฐ์ก ์ฐธ ๋น ๋ฅด๋ค์. 2์ฃผ ๊ฑธ๋ ธ์ด์", "๊ฐ๊ฒฉ ๋๋น ๊ด์ฐฎ์์", "๋ค์๋ ์ ์ฝ๋๋ค", "๊ทธ๋ฅ ๊ทธ๋์"]
results = judge.sentiment(reviews)
auto = [(t, r["choice"]) for t, r in zip(reviews, results) if r["confidence"] >= 0.7]
review = [t for t, r in zip(reviews, results) if r["confidence"] < 0.7] # ์ฌ๋์ด ํ์ธ
- ๋ฐ์ดยท๋น๊ผผ(โ๋ฐฐ์ก ์ฐธ ๋น ๋ฅด๋ค์. 2์ฃผ ๊ฑธ๋ ธ์ด์โ)์ ๋์ ํ์ ์ผ๋ก ํ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค. ์ค์ํ ๊ณณ์๋ ํ๋ณธ์ ์ฌ๋์ด ๋ค์ ๋ณด์ธ์.
- ๊ธฐ์ค๊ฐ 0.7์ ์์์ ๋๋ค. ์ค์ ๋ฐ์ดํฐ ์๋ฐฑ ๊ฑด์ ์ ๋ต์ ๋ฌ์ ๋ณด๊ณ โ์ด ๊ธฐ์ค ์ด์์ด๋ฉด ๋ช %๊ฐ ๋ง๋์งโ๋ฅผ ํ์ธํด ์ ํ์ธ์.
3. ๋ฆฌ๋ทฐ๋ฅผ ์ฌ๋ฌ ์ธก๋ฉด์ผ๋ก โ ๋ฐฐ์กยทํ์งยท๊ฐ๊ฒฉ ๊ฐ๊ฐ
ํ ๋ฆฌ๋ทฐ์์ ์ธก๋ฉด๋ณ๋ก ๋ฐ๋ก ํ๋จํฉ๋๋ค. ๊ฐ์ state์ ์ง๋ฌธ๋ง ๋๋ฆฌ๋ฉด ๋ฉ๋๋ค.
ASPECT = {"pos": "๊ธ์ ์ ์ผ๋ก ์ธ๊ธ", "neg": "๋ถ์ ์ ์ผ๋ก ์ธ๊ธ", "none": "์ธ๊ธํ์ง ์์"}
judge.decide(
state={"๋ฆฌ๋ทฐ": "๋ฐฐ์ก์ ํ๋ฃจ ๋ง์ ์๋๋ฐ ๋ง๊ฐ์ด ์๋ง์ด๋ค์. ์ด ๊ฐ๊ฒฉ์ด๋ฉด ๊ทธ๋ฅ ๊ทธ๋์."},
questions={
"๋ฐฐ์ก": {"instructions": "๋ฆฌ๋ทฐ๊ฐ ๋ฐฐ์ก(์๋ยทํฌ์ฅ)์ ์ด๋ป๊ฒ ์ธ๊ธํ๋์ง ๊ณ ๋ฅธ๋ค.", "criteria": ASPECT},
"ํ์ง": {"instructions": "๋ฆฌ๋ทฐ๊ฐ ์ ํ ํ์ง(๋ง๊ฐยท๋ด๊ตฌ์ฑยท์ฑ๋ฅ)์ ์ด๋ป๊ฒ ์ธ๊ธํ๋์ง ๊ณ ๋ฅธ๋ค.", "criteria": ASPECT},
"๊ฐ๊ฒฉ": {"instructions": "๋ฆฌ๋ทฐ๊ฐ ๊ฐ๊ฒฉยท๊ฐ์ฑ๋น๋ฅผ ์ด๋ป๊ฒ ์ธ๊ธํ๋์ง ๊ณ ๋ฅธ๋ค. ์ ๋งคํ ํ๊ฐ๋ ์ธ๊ธํ ๊ฒ์ผ๋ก ๋ณด๋ ๊ธ์ ยท๋ถ์ ์ ๋ฌธ๋งฅ์ผ๋ก ํ๋จํ๋ค.", "criteria": ASPECT},
},
)
# {'๋ฐฐ์ก': {'choice': 'pos', โฆ}, 'ํ์ง': {'choice': 'neg', โฆ}, '๊ฐ๊ฒฉ': {โฆ}}
4. ๋๊ธ ๊ฒ์ โ ํ์ค ์ฌ๋ถ์ ๊ณต๊ฒฉ์ฑ ์์ค
hate๋ก ์ฐจ๋ณยท๋นํ ์ฌ๋ถ๋ฅผ ๊ฑฐ๋ฅด๊ณ , offensive๋ก ๊ณต๊ฒฉ์ฑ ์์ค์ ๋๋๋๋ค. ๊ธฐ์ฌ ๋๊ธ์ด๋ฉด ์ ๋ชฉ์ ๋ฌธ๋งฅ์ผ๋ก ํจ๊ป ๋ฃ์ต๋๋ค.
comment = "์ด๋ฐ ๊ธฐ์ฌ ์ฐ๋ ๊ธฐ์๋ ๋จธ๋ฆฌ๊ฐ ์๋ ๊ฑด์ง"
judge.hate(comment) # ๋นํ์ค / ํ์ค
judge.offensive(comment, news_title="์ ๋ถ, ๋ด๋
์์ฐ์ ๋ฐํ") # ์์ / ๊ณต๊ฒฉ์ / ํ์ค
- ๋ ๋ฉ์๋๋ ๊ธฐ์ค์ด ๋ค๋ฆ
๋๋ค.
hate๋ ์ฑ๋ณยท๋์ดยท์ถ์ ๊ฐ์ ์ง๋จ์ ๋ํ ์ฐจ๋ณยท๋นํ(APEACH ๊ธฐ์ค),offensive๋ ๊ฐ์ธ์ ํฅํ ๋ชจ์๊น์ง ํฌํจํ ๊ณต๊ฒฉ์ฑ 3๋จ๊ณ(BEEP ๊ธฐ์ค)์ ๋๋ค. - ์ฌ๋์๊ฒ ๋ถ์ด์ต์ ์ฃผ๋ ๊ฒฐ์ (์ญ์ ยท์ ์ฌ)์ ์ธ ๋๋ ํ์ ์ด ๋ฎ์ ๊ฑด ๋ฐ๋์ ์ฌ๋์ด ๊ฒํ ํ๊ฒ ํ์ธ์.
5. ์์ด์ ํธ ๋ผ์ฐํฐ โ ๋๊ตฌ ํธ์ถ / ๋๋ฌป๊ธฐ / ์ง์ ๋ต๋ณ
์์ด์ ํธ๊ฐ ๋งค ํด ํฐ ๋ชจ๋ธ์ โ๋ค์์ ๋ญ ํ ์งโ๋ฅผ ๋ฌป๋ ๋์ , ์ด ๋ชจ๋ธ์ด ๋จผ์ ์ ํฉ๋๋ค. ๋๊ตฌ ์ธ์ ์ฑ์ฐ๊ธฐ์ ๋ต๋ณ ์์ฑ๋ง ํฐ ๋ชจ๋ธ์ ๋งก๊น๋๋ค.
tools = [
{"type": "function", "function": {"name": "call_taxi", "description": "ํ์๋ฅผ ํธ์ถํ๋ค",
"parameters": {"type": "object", "properties": {"pickup": {"type": "string"}, "destination": {"type": "string"}},
"required": ["pickup", "destination"]}}},
{"type": "function", "function": {"name": "get_weather", "description": "์ง์ญ์ ํ์ฌ ๋ ์จ๋ฅผ ์๋ ค์ค๋ค",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}}},
]
messages = [{"role": "user", "content": "๊ฐ๋จ์ญ์์ ์์ธ์ญ๊น์ง ํ์ ๋ถ๋ฌ์ค"}]
r = judge.next_action(messages, tools)
if r["confidence"] < 0.7:
action = "ํฐ ๋ชจ๋ธ์๊ฒ ๋ค์ ํ๋์ ๋งก๊น"
elif r["choice"].startswith("CALL:"):
action = f"ํฐ ๋ชจ๋ธ๋ก {r['choice'][5:]} ์ ์ธ์๋ฅผ ์ฑ์ ํธ์ถ" # ์ด ๋ชจ๋ธ์ ์ธ์๋ฅผ ์ฑ์ฐ์ง ๋ชปํฉ๋๋ค
elif r["choice"] == "ASK":
action = "๋น ์ง ํ์ ์ ๋ณด๋ฅผ ์ฌ์ฉ์์๊ฒ ๋๋ฌป๊ธฐ"
else: # RESPOND
action = "๋๊ตฌ ์์ด ๋ฐ๋ก ๋ต๋ณ"
- ๋๊ตฌ๋ OpenAI ํ์ ๊ทธ๋๋ก, ํนํ
required๋ฅผ ๊ผญ ๋ฃ์ผ์ธ์. ์ด๋ฆ๋ง ์ฃผ๋ฉด ํ์ ์ธ์๋ฅผ ๋ณผ ์ ์์ด ASK์ CALL์ ๊ตฌ๋ณํ์ง ๋ชปํฉ๋๋ค. - ๋ํ ๊ธฐ๋ก(์ ํด, ๋๊ตฌ ๊ฒฐ๊ณผ
{"role": "tool", โฆ})์ ํจ๊ป ๋ฃ์ผ๋ฉด โ์ด๋ฏธ ์ฒ๋ฆฌ๋์ผ๋ ๊ฒฐ๊ณผ ์๋ด(RESPOND)โ ๊ฐ์ ํ๋จ๋ ํฉ๋๋ค. - ๋๊ตฌ๋ ์ต๋ 24๊ฐ๊น์ง ๋ฃ์ ์ ์์ต๋๋ค (๋ณด๊ธฐ 26๊ฐ ์ค 2๊ฐ๊ฐ ASKยทRESPOND).
6. ์ ์ฑ ์ ๋ฐ๋ฅธ ๊ณ ๊ฐ์ผํฐ ํ๋ ๊ฒฐ์
์ ์ฑ ๋ฌธ์์ ๊ณ ๊ฐ ์์ฒญ์ ์ฃผ๋ฉด ์คํ / ํ์ธ / ๋๋ฌป๊ธฐ / ์ด๊ด / ๊ฑฐ์ ์ค ๋ฌด์์ ํ ์ง ๊ณ ๋ฆ ๋๋ค. ์์ธ ์กฐํญ์ด ์ ์ฉ๋๋์ง๊น์ง ๋ฐ์ง๋๋ค.
policy = ("ํด์ธ ์นด๋ ์น์ธ ๊ธ์ก์ด 100,000์ ์ด์์ด๋ฉด ๊ณ ๊ฐ์ ํ์ธ์ ๋ฐ์ ํ์๋ง ์คํํ๋ค. "
"๋ค๋ง VIP ๋ฑ๊ธ ๊ณ ๊ฐ์ ํ์ธ ์์ด ๋ฐ๋ก ์คํํ๋ค.")
judge.policy_action(policy, "ํ์ฝฉ์์ ์นด๋๋ก 149,000์ ๊ฒฐ์ ํ๋ ค๋๋ฐ ์น์ธํด์ค. ๋ด ๋ฑ๊ธ์ ์ผ๋ฐ์ด์ผ.")
# โ ASK_CONFIRMATION (๊ธ์ก ๊ธฐ์ค์ ๋์๊ณ VIP ์์ธ๊ฐ ์๋)
- ์ ์ฑ ์ ์ ํ ์๋ ๊ฒ๋ง ๊ทผ๊ฑฐ๋ก ํ๋จํ๋๋ก ํ์ตํ์ต๋๋ค. ์ค์ ์ ๋ฌด ๊ท์ ์ ๋ชจ๋ธ์ด ์์์ ๋ณด์ถฉํ์ง ์์ผ๋, ํ์ํ ์กฐ๊ฑด์ ์ ์ฑ ๋ฌธ์ฅ์ ๋ค ์ฐ์ธ์.
- ๋ณด๊ธฐ:
ANSWER,ASK_CLARIFICATION,ASK_CONFIRMATION,CALL_TOOL,CALL_MULTIPLE_TOOLS,ESCALATE,REFUSE.
7. ๋ต๋ณ์ด ๊ทผ๊ฑฐ ๋ฌธ์์ ๋ง๋์ง ํ์ธ (RAG ๊ฒ์ฆ)
๊ฒ์ํ ๋ฌธ์๋ฅผ ์ ์ ๋ก, ์์ฑ๋ ๋ต๋ณ์ ๋ฌธ์ฅ์ ๊ฐ์ค๋ก ๋ฃ์ต๋๋ค. contradiction์ด๋ฉด ๋ฌธ์์ ์ด๊ธ๋ ๋ต์ด๊ณ , neutral์ด๋ฉด ๋ฌธ์์ ๊ทผ๊ฑฐ๊ฐ ์๋ ๋ด์ฉ์
๋๋ค.
doc = "์๋์ธ์ ๊ณ์ฝ์ด ๋๋๊ณ ์์ฐจ์ธ์ด ์ง์ ๋น์ด ๋ ๋ถํฐ 30์ผ ์ด๋ด์ ๋ณด์ฆ๊ธ์ ๋๋ ค์ค๋ค."
answer_sentences = ["๋ณด์ฆ๊ธ์ ์ง์ ๋น์ด ๋ค 30์ผ ์์ ๋๋ ค๋ฐ์ต๋๋ค.",
"๋ณด์ฆ๊ธ์ ์ง์ ๋น์ด ๋ค 40์ผ ๋ค์ ๋๋ ค๋ฐ์ต๋๋ค.",
"๋ณด์ฆ๊ธ์๋ ์ฐ 3% ์ด์๊ฐ ๋ถ์ต๋๋ค."]
for s, r in zip(answer_sentences, judge.nli([doc] * len(answer_sentences), answer_sentences)):
print(r["choice"], s)
# entailment โฆ 30์ผ ์์ โฆ โ ๊ทผ๊ฑฐ ์์
# contradiction โฆ 40์ผ ๋ค์ โฆ โ ๋ฌธ์์ ์ด๊ธ๋จ
# neutral โฆ ์ฐ 3% ์ด์ โฆ โ ๋ฌธ์์ ๊ทผ๊ฑฐ ์์
- ๋ต๋ณ์ ๋ฌธ์ฅ ๋จ์๋ก ๋๋ ๋ฃ์ผ์ธ์. ์ฌ๋ฌ ์ฃผ์ฅ์ด ์์ธ ๊ธด ๋ต๋ณ์ ํ๋จ์ด ํ๋ ค์ง๋๋ค.
- ํ์ต ์ต๋ ๊ธธ์ด๊ฐ 2,048ํ ํฐ์ด๋ผ ๊ธด ๋ฌธ์๋ ๊ด๋ จ ๋จ๋ฝ๋ง ์๋ผ ๋ฃ์ผ์ธ์.
8. ์ฝ๊ดยท๋ฌธ์์ ๊ทผ๊ฑฐํ ์/์๋์ค
๋ฌธ์๋ฅผ ์ฃผ๊ณ ์ง๋ฌธ์ ์/์๋์ค๋ก ๋ตํ๊ฒ ํฉ๋๋ค. ๋ฌธ์์ ์๋ ์์์ผ๋ก ๋ตํ์ง ์๋๋ก ํ์ตํ์ต๋๋ค.
terms = "๊ตฌ๋งค ํ 7์ผ ์ด๋ด์๋ ๋จ์ ๋ณ์ฌ์ผ๋ก๋ ํ๋ถํ ์ ์๋ค. ๋จ, ํฌ์ฅ์ ๋ฏ์ ์ํํธ์จ์ด๋ ํ๋ถ ๋์์์ ์ ์ธํ๋ค."
judge.yes_no("ํฌ์ฅ์ ๋ฏ์ ๊ฒ์ CD๋ฅผ 3์ผ ๋ง์ ํ๋ถํ ์ ์๋์?", terms) # โ ์๋์ค
judge.yes_no("๋ฏ์ง ์์ ํค๋ณด๋๋ฅผ 5์ผ ๋ง์ ํ๋ถํ ์ ์๋์?", terms) # โ ์
9. ๋น์ทํ ์ง๋ฌธ ์ฐพ๊ธฐ โ FAQ ์ค๋ณต ํ์ธ
์๋ก ๋ค์ด์จ ์ง๋ฌธ์ด ๊ธฐ์กด FAQ์ ๊ฐ์ ๋ป์ธ์ง ํ์ธํฉ๋๋ค. ํ๋ณด๋ ๊ฒ์(์๋ฒ ๋ฉ ๋ฑ)์ผ๋ก ๋จผ์ ์ขํ๊ณ , ์ต์ข ํ์ธ์ ์ด ๋ชจ๋ธ์ ์ฐ๋ ๊ตฌ์ฑ์ด ์ข์ต๋๋ค.
faq = ["๋น๋ฐ๋ฒํธ๋ฅผ ์์ด๋ฒ๋ ธ์ด์", "๋ฐฐ์ก์ง๋ ์ด๋ป๊ฒ ๋ฐ๊พธ๋์", "ํ์ ํํด๋ ์ด๋์ ํ๋์"]
q = "๋ก๊ทธ์ธ ๋น๋ฒ์ด ๊ธฐ์ต์ด ์ ๋์"
hits = judge.similar([q] * len(faq), faq)
best = max(range(len(faq)), key=lambda i: hits[i]["probabilities"]["๊ฐ์"])
faq[best], hits[best]["choice"] # ('๋น๋ฐ๋ฒํธ๋ฅผ ์์ด๋ฒ๋ ธ์ด์', '๊ฐ์')
similar๋ ํ์ตํ์ง ์์ ๊ณผ์ ์ ๋๋ค (ํ์ตํ์ง ์์ KLUE-STS์์ 85.9%).
10. ๋ด ๋ถ๋ฅ ์ฒด๊ณ ๊ทธ๋๋ก ์ฐ๊ธฐ
์ด๋ค ๋ถ๋ฅ๋ ์ง์นจ๊ณผ ๋ณด๊ธฐ๋ง ์ฐ๋ฉด ๋ฉ๋๋ค. ํ์ตํ์ง ์์ ๊ณผ์ ๋ผ๋ ํ๋จ ๊ธฐ์ค์ ์ง์นจ์ ์ ์ด ์ฃผ๋ ๊ฒ์ด ์ ํ๋๋ฅผ ๊ฐ์ฅ ํฌ๊ฒ ์ข์ฐํฉ๋๋ค.
judge.decide(
state={"๋ณด๊ณ ์ ๋ฌธ์ฅ": "3๋ถ๊ธฐ ๋งค์ถ์ ์ ๋
๋๋น 12% ์ฆ๊ฐํ์ผ๋ ์์
์ด์ต๋ฅ ์ ์ํญ ํ๋ฝํ๋ค."},
questions={
"๋
ผ์กฐ": {
"instructions": "๋ฌธ์ฅ์ด ํ์ฌ ์ค์ ์ ์ด๋ค ๋
ผ์กฐ๋ก ์ ๋ฌํ๋์ง ๊ณ ๋ฅธ๋ค. ์ข์ ์ ๊ณผ ๋์ ์ ์ด ํจ๊ป ์์ผ๋ฉด ํผํฉ์ผ๋ก ๋ณธ๋ค.",
"criteria": {"positive": "๊ธ์ ์ ", "negative": "๋ถ์ ์ ", "mixed": "ํผํฉ", "neutral": "์ฌ์ค ์ ๋ฌ๋ง"},
},
},
)
์ ์ ๋๋ ์ฐ์์: ์ซ์ ๋น๊ตยท๊ณ์ฐ์ด ํต์ฌ์ธ ํ๋จ(โ์ด๋ ์ชฝ์ด ๋ ์ผ๊ฐโ), ๋ฌธ์ฅ์์ ๊ฐ ๋ฝ๊ธฐ, ๋ต๋ณ ์์ฑ, ๋ค๋ฅธ ๋ชจ๋ธ ๋ต๋ณ์ ํ์ง ์ฑ์ (LLM-as-a-judge). ์ด๋ฐ ์ผ์ ์์ฑ ๋ชจ๋ธ์ ๋งก๊ธฐ์ธ์.
์๋ฆฌ: transformers๋ง์ผ๋ก ์ง์ ๊ณ์ฐํ๊ธฐ
import torch, json
from transformers import AutoModelForCausalLM, AutoTokenizer
from huggingface_hub import hf_hub_download
name = "coderecode95/KJH-Judge-4B-ko"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name, dtype=torch.bfloat16, device_map="auto").eval()
T = json.load(open(hf_hub_download(name, "calibration.json")))["temperature"] # 1.7179
choices = ["๊ธ์ ์ ๊ฐ์ ", "๋ถ์ ์ ๊ฐ์ "]
prompt = ("๋ฌธ์ฅ์ ์ ๋ฐ์ ์ธ ๊ฐ์ ๊ทน์ฑ์ ํ๋จํ๋ค.\n\n"
"text: ๋ฐฐ์ก์ ๋๋ ธ์ง๋ง ๋ฌผ๊ฑด์ ์ ๋ง ๋ง์์ ๋ค์ด์\n\n"
"๋ณด๊ธฐ:\n" + "\n".join(f"{chr(65+i)}. {c}" for i, c in enumerate(choices)) +
"\n\n์ ๋ต ๋ณด๊ธฐ์ ๊ธฐํธ ํ๋๋ง ๋ตํ์ธ์.")
ids = tok(f"<|im_start|>user\n{prompt}<|im_end|>\n<|im_start|>assistant\n", return_tensors="pt", add_special_tokens=False).input_ids.to(model.device)
with torch.no_grad():
logits = model(ids).logits[0, -1]
letters = [tok.encode(chr(65 + i), add_special_tokens=False)[0] for i in range(len(choices))]
probs = torch.softmax(logits[letters].float() / T, -1)
print({c: round(p, 4) for c, p in zip(choices, probs.tolist())})
ํ๋กฌํํธ ํ์
ํ์ต๊ณผ ํ๊ฐ์ ์ด ํ์์ ๋๋ค. ์ด ํ์์ ์ง์ผ์ผ ์ ์ฑ๋ฅ์ด ๋์ต๋๋ค.
<|im_start|>user
{๊ณผ์ ์ค๋ช
} โ instructions
{ํญ๋ชฉ ์ด๋ฆ}: {๊ฐ} โ state ์ ํญ๋ชฉ๋ง๋ค ํ ์ค. ๊ฐ์ด ๋ฌธ์์ด์ด ์๋๋ฉด JSON
{ํญ๋ชฉ ์ด๋ฆ}: {๊ฐ}
๋ณด๊ธฐ:
A. {๋ณด๊ธฐ 1} โ criteria ์ ์ค๋ช
B. {๋ณด๊ธฐ 2}
โฆ
์ ๋ต ๋ณด๊ธฐ์ ๊ธฐํธ ํ๋๋ง ๋ตํ์ธ์.<|im_end|>
<|im_start|>assistant
judge.decide()์ ๋ฉ์๋๋ค์ ์ด ํ์์ ์๋์ผ๋ก ๋ง๋ญ๋๋ค. ์ง์ ๋ง๋ค ๋๋ง ์ ๊ฒฝ ์ฐ๋ฉด ๋ฉ๋๋ค.- ๋ณด๊ธฐ๋ 2~26๊ฐ์ ๋๋ค.
- ๊ณผ์ ์ค๋ช ์ ์งง๊ณ ๊ตฌ์ฒด์ ์ผ๋ก ์ฐ์ธ์. ํ๋จ ๊ธฐ์ค์ ํ๋ ๋ฌธ์ฅ ๋ง๋ถ์ด๋ฉด(์: โ๋ฐ์ด๋ฅผ ๊ณ ๋ คํ๋คโ, โ์ ๋ณด๊ฐ ์๋ค๋ ์ด์ ๋ง์ผ๋ก ๋ชจ์์ ๊ณ ๋ฅด์ง ์๋๋คโ) ์ ํ๋๊ฐ ํฌ๊ฒ ์ค๋ฆ ๋๋ค.
generate()๋ก ์ธ ๊ฒฝ์ฐmax_new_tokens=1๋ก ๋ณด๊ธฐ ๊ธฐํธ ํ๋๋ง ๋ฐ์ผ์ธ์ (์ด ์ ์ฅ์์generation_config.json์do_sample: false์ ๋๋ค). ํ๋ฅ ์ด ํ์ํ๋ฉด ์์ฒ๋ผ logits๋ฅผ ์ฝ์ผ์ธ์.
์ฑ๋ฅ
1. ํ์ตํ์ง ์์ ๊ณต๊ฐ ๋ฒค์น๋งํฌ
์ด ๋ชจ๋ธ์ ํ์ต์ ์ฐ์ง ์์ ์ถ์ฒ์ ๊ณต๊ฐ ๋ฐ์ดํฐ์
๋๋ค (KLUE-STS๋ ํ์ต์ ์ด KLUE NLIยทYNAT์ ๊ฐ์ KLUE ๋ฌถ์์ด์ง๋ง, STS ๊ณผ์ ๋ ํ์ตํ์ง ์์์ต๋๋ค). 0-shot, ์ ํ๋กฌํํธ ํ์, ๋ณด๊ธฐ ๊ธฐํธ ์ ์ ๋ฐฉ์์ผ๋ก ์์ต๋๋ค (ํ๋ณธ์ ๊ณ ์ ์๋, ๊ดํธ๋ 95% ์ ๋ขฐ๊ตฌ๊ฐ). ์ฌํ ์คํฌ๋ฆฝํธ: eval/bench_heldout.py.
| ๋ฒค์น๋งํฌ | ๋ฌด์์ ์ฌ๋ | ๋ฌธํญ | ์ ํ๋ (95% ๊ตฌ๊ฐ) | ๋ฌด์์ | ์ถ์ฒ ยท ๋ผ์ด์ ์ค |
|---|---|---|---|---|---|
| NSMC | ์ํ ๋ฆฌ๋ทฐ ๊ฐ์ฑ (๊ธ์ /๋ถ์ ) | 1,000 | 85.7% (83.4~87.7) | 50% | e9t/nsmc ยท ratings_test ยท CC0 1.0 |
| KorNLI (XNLI) | ๋ฌธ์ฅ ๊ด๊ณ 3๋ถ๋ฅ (XNLI ํ๊ตญ์ด ๋ฒ์ญ) | 1,000 | 74.5% (71.7~77.1) | 33% | kakaobrain/kor_nli ยท xnli/test ยท CC BY-SA 4.0 |
| KLUE-STS | ๋ ๋ฌธ์ฅ์ด ๊ฐ์ ๋ป์ธ์ง (์/์๋์ค) | 519 | 85.9% (82.7~88.7) | 50% | klue/klue ยท sts/validation (binary-label) ยท CC BY-SA 4.0 |
| Korean UnSmile | ์ ํยทํ์ค ํํ ์ฌ๋ถ | 1,000 | 82.1% (79.6~84.4) | 50% | smilegate-ai/kor_unsmile ยท valid (clean ์ฌ๋ถ) ยท CC BY-NC-ND 4.0 |
| KMMLU | ํ๊ตญ์ด ์ ๋ฌธ ์ง์ 4์ง์ ๋ค (45๊ณผ๋ชฉ) | 990 | 42.6% (39.6~45.7) | 25% | HAERAE-HUB/KMMLU ยท test ยท CC BY-ND 4.0 |
| HAE-RAE Bench 1.0 | ํ๊ตญ ๋ฌธํยท์ดํ ์ง์ 5์ง์ ๋ค | 983 | 56.1% (53.0~59.2) | 21% | HAERAE-HUB/HAE_RAE_BENCH_1.0 ยท test ยท CC BY-NC-ND 4.0 |
๊ฐ์ ์กฐ๊ฑด ๋น๊ต ยท ๊ฐ์ ๋ฌธํญ ยท ๊ฐ์ ํ๋กฌํํธ ยท 0-shot ยท ๋ณด๊ธฐ ๊ธฐํธ ์ ์. ๋ค๋ฅธ ๋ชจ๋ธ์ ์๊ฐ(thinking)์ ๋๊ณ ๊ฐ์์ ๋ํ ํ์์ผ๋ก ๋ฌผ์์ต๋๋ค.
| ๋ฒค์น๋งํฌ | KJH-Judge-4B-ko (4B) | Gemma 4 26B-A4B-it (0-shot) |
|---|---|---|
| NSMC | 85.7% | 88.7% |
| KorNLI (XNLI) | 74.5% | 77.1% |
| KLUE-STS | 85.9% | 88.4% |
| Korean UnSmile | 82.1% | 81.3% |
| KMMLU | 42.6% | 64.0% |
| HAE-RAE Bench 1.0 | 56.1% | 79.7% |
์๋ณธ Qwen3-4B์ ์ฌ์ ํ์ต์ ์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋์ง๋ ์ ์ ์์ต๋๋ค. KMMLUยทHAE-RAE๋ ์ ๋ฌธ ์ง์์ ๋ฌป๋ ์ํ์ด๋ผ, ํ์ ๋ฅ๋ ฅ๋ณด๋ค ์๋ณธ ๋ชจ๋ธ์ ์ง์์ด ์ ์๋ฅผ ์ข์ฐํฉ๋๋ค.
2. Korean JEV Benchmark (์ฐธ๊ณ : ๊ฐ์ ์ถ์ฒ์ ์ํ ๋ฌธํญ)
DaehanKim/korean-jev-benchmark 25,418๋ฌธํญ ์ ์ฒด์ ๋๋ค. ์ด ์ํ ๋ฌธํญ ์์ฒด๋ก ํ์ตํ์ง๋ ์์์ง๋ง, ๊ฐ์ ์ถ์ฒ ๋ฐ์ดํฐ(KLUE, KoBEST ๋ฑ)์ ํ์ต ๋ถํ ๋ก ํ์ตํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ชจ๋ธ์ 0-shot ์ ์์ ๊ฐ์ ์กฐ๊ฑด์ ๋น๊ต๊ฐ ์๋๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ์ ์ฒด ์ ํ๋ | 90.37% (ํ์ต ์ Qwen3-4B 29.56%, ๋ฌด์์ 29.86%) |
| ํ์ต ๋ฐ์ดํฐ๊ฐ ์๋ ๊ณผ๋ชฉ (Belebele ํ๊ตญ์ด ๋ ํด) | 86.87% |
| ๋ณด๊ธฐ๋ฅผ ๊ฑฐ๊พธ๋ก ๋์๋ ๊ฐ์ ๋ต | 97.93% |
| ๊ธฐ๋ ๋ณด์ ์ค์ฐจ (ECE) | 0.0265 |
| ๊ณผ๋ชฉ | ์ ํ๋ | ๊ณผ๋ชฉ | ์ ํ๋ |
|---|---|---|---|
| KoBEST BoolQ | 95.65% | KLUE YNAT (๋ด์ค ์ฃผ์ ) | 93.93% |
| KoBEST HellaSwag | 94.65% | KLUE NLI | 92.39% |
| KoBEST SentiNeg | 93.91% | APEACH (ํ์ค) | 88.64% |
| KoBEST COPA | 92.55% | KoBEST WiC | 84.96% |
| SIB-200 | 94.44% | Korean Hate Speech (3๋ถ๋ฅ) | 77.87% |
| FunctionChat ๋๊ตฌ ๊ณ ๋ฅด๊ธฐ | 94.68% | EnterpriseOps ์ ์ฑ ํ๋ (7๋ถ๋ฅ) | 83.43% |
| FunctionChat ๋ํ | 93.50% | ๋ฒ๋ น ์ง๋ฌธ (v2ยทv3, 6๊ฐ ๋ฌถ์) | 90.8~99.2% |
| FunctionChat ํธ์ถ ํ๋จ | 84.55% | ๋ฒ๋ น ๊ธฐ๊ฐ ๊ณ์ฐ | 69.10% |
์๋
๊ฐ์ธ GPU ์๋ฒ์์ ๊ฐ์ ๋ฌธํญ 60๊ฐ(NSMCยทKorNLI)๋ก ์ฐ ์ฐธ๊ณ ๊ฐ์
๋๋ค (๋คํธ์ํฌ ์๋ณต ํฌํจ, ์ธก์ ์คํฌ๋ฆฝํธ: eval/bench_speed.py).
| ์ธก์ | KJH-Judge-4B-ko | Gemma 4 26B-A4B-it |
|---|---|---|
| ํ์ ํ ๋ฒ (์ค์๊ฐ) | 250ms (์๋ฒ ์ ๊ณ์ฐ 87ms) | 621ms |
| ๋์ 4๊ฐ์ฉ ๋ณด๋์ ๋ ์ฒ๋ฆฌ๋ | 3.9๊ฑด/์ด | 9.9๊ฑด/์ด |
| ์๊ฐ์ ์ผ๊ณ ๋ต์ ์์ฑํ ๋ | 6.3์ด |
- ๋์ ์ฒ๋ฆฌ๋์ ๋น๊ต ๋ชจ๋ธ์ด ์์ฐ์ต๋๋ค. ๋น๊ต ๋ชจ๋ธ์ ์์ฒญ์ ๋ฌถ์ด ์ฒ๋ฆฌํ๋ ์๋น ์์ง์์, ์ด ๋ชจ๋ธ์ ํ๋์ฉ ์ฒ๋ฆฌํ๋ ๋จ์ํ ์๋ฒ์์ ๋์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ ์ฒ๋ฆฌ์๋ ๋ฆฌ์คํธ๋ก ๋ฃ๊ณ
batch_size๋ฅผ ์ฃผ์ด ๋ฌถ์ด ๊ณ์ฐํ์ธ์. - CPU(๋ ธํธ๋ถ, fp32)์์๋ ํ์ ํ ๋ฒ์ 6์ด์์ ์ ๋ถ์ด ๊ฑธ๋ ค ์ค์ฌ์ฉ์ด ์ด๋ ต์ต๋๋ค.
์ํ๋ ๊ฒ๊ณผ ๋ชปํ๋ ๊ฒ
์ํ๋ ๊ฒ: ๋ณด๊ธฐ๊ฐ ์ ํด์ง ๋ถ๋ฅ, ๋ฌธ์ฅ ๊ด๊ณ ํ๋จ, ์ง๋ฌธ์ ๊ทผ๊ฑฐํ ์/์๋์ค, ์ ์ฑ ยท๊ท์น์ ๋ฐ๋ฅธ ํ๋ ์ ํ, ์์ด์ ํธ์ ๋ค์ ํ๋(๋๊ตฌ ํธ์ถ / ๋๋ฌป๊ธฐ / ์ง์ ๋ต๋ณ) ๊ฒฐ์ . ์ฒ์ ๋ณด๋ ์ง์๋ฌธ์ด๋ผ๋ ์ด๋ฐ ํ์์ด๋ฉด ์ ๋ฐ๋ฆ ๋๋ค.
๋ชปํ๋ ๊ฒ
- ๊ธ ์์ฑ, ๋ฌธ์ฅ์์ ๊ฐ ๋ฝ๊ธฐ: ๋ณด๊ธฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฒ๋ง ํฉ๋๋ค. ๋๊ตฌ ์ธ์ ๊ฐ์ ์ฑ์ฐ๊ฑฐ๋ ๋ต๋ณ์ ์ฐ๋ ์ผ์ ์์ฑ ๋ชจ๋ธ์ ๋งก๊ธฐ์ธ์.
- ์ซ์ ๋น๊ตยท๊ณ์ฐ์ด ํต์ฌ์ธ ํ๋จ: ๊ฑฐ๋ฆฌยท์๋ยท์ ์ ๊ฐ์ ์์น๋ฅผ ๋น๊ตํด ๊ณ ๋ฅด๋ ์ผ์ ์ฝํฉ๋๋ค.
- ๋ฐ์ดยท๋น๊ผผ: โ๋ฐฐ์ก ์ฐธ ๋น ๋ฅด๋ค์. 2์ฃผ ๊ฑธ๋ ธ์ด์โ๋ฅผ ๊ธ์ ์ผ๋ก ๋์ ํ์ ๊ณผ ํจ๊ป ๊ณ ๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
- ์ง์๋ฌธ ๋ฌธ๊ตฌ์ ๋ฏผ๊ฐ: โ์ค์ ์กด์ฌํ๋ ์ธ๋ฌผ์ธ๊ฐ์?โ๋ฅผ โ์ค์ ์กด์ฌํ๋์?โ์ฒ๋ผ ์ฝ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ธฐ์ค์ ๋ช ํํ ์ฐ์ธ์.
๊ถ์ฅ ๊ตฌ์ฑ: ํฐ LLM ์๋จ์์ ์ด ๋ชจ๋ธ์ด โ๋ฌด์์ ํ ์งโ๋ฅผ ๋น ๋ฅด๊ณ ์ธ๊ฒ ์ ํ๊ณ , ํ์ ์ด ๋ฎ์ ๊ฑด ์ฌ๋์ด๋ ํฐ ๋ชจ๋ธ์ ๋๊ธฐ์ธ์.
ํ์ต
ํ์ต ๋ฐ์ดํฐ ๊ตฌ์ฑ, ๋ณด๊ธฐ ์์ ์ญ์ ํ์ต, ์ค์ผ ์ ๊ฑฐ, ํฉ์ฑ ๋ฐ์ดํฐ ๋ง๋๋ ๋ฒ, ํ๋ฅ ๋ณด์ , ์ฒดํฌํฌ์ธํธ๋ณ ์ ํ๋๊น์ง ์์ธํ ๊ณผ์ ์ **TRAINING.md**์ ์ ๋ฆฌํ์ต๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ์๋ณธ ๋ชจ๋ธ | Qwen/Qwen3-4B |
| ๋ฐฉ๋ฒ | SFT, LoRA (r 16, ฮฑ 32, dropout 0.05, qยทkยทvยทoยทgateยทupยทdown) โ ์๋ณธ์ ๋ณํฉ |
| ํ์ต๋ | 69,144๋ฌธํญ ร ๋ณด๊ธฐ ์์ 2๊ฐ์ง(์์ ์์ + ์ญ์), ์ถ์ฒ ๋น์จ๋๋ก ์์ด 4,430 step ยท ๋ฐฐ์น 32, ์ต๋ ๊ธธ์ด 2,048 |
| ์ต์ ํ | ํ์ต๋ฅ 2e-4, cosine, warmup 3% |
| ์ฅ๋น | GPU 1์ฅ, ์ฝ 3.5์๊ฐ |
| ์ ๋ต ํ์ | ๋ณด๊ธฐ ๊ธฐํธ ํ ๊ธ์ + `< |
| ๋ณด์ | ๊ฒ์ฆ์ 3,089๋ฌธํญ์ผ๋ก ๋จ์ผ ์จ๋(1.7179)๋ฅผ ๋ง์ถค. ECE 0.066 โ 0.013 |
ํ์ต ๋ฐ์ดํฐ (๋ชจ๋ ์ ํ๋กฌํํธ ํ์์ผ๋ก ๋ฐ๊ฟ ์ฌ์ฉ, ํ๊ฐ ๋ฌธํญ๊ณผ ๊ฒน์น๋ ๋ฌธ์ฅ์ ์ ์ธ)
| ๋ฐ์ดํฐ | ๋ผ์ด์ ์ค |
|---|---|
| KLUE NLI ยท YNAT (ํ์ต ๋ถํ ) | CC BY-SA 4.0 |
| KoBEST BoolQ ยท COPA ยท HellaSwag ยท SentiNeg ยท WiC (ํ์ต ๋ถํ ) | CC BY-SA 4.0 |
| kocohub/korean-hate-speech (ํ์ต ๋ถํ ) | CC BY-SA 4.0 |
| APEACH (ํ์ต ๋ถํ ) | CC BY-SA 4.0 |
| SIB-200 (ํ์ต ๋ถํ ) | CC BY-SA 4.0 |
| ์ ์ฑ ํ๋ ยท ๋ฒ๋ น ์ง๋ฌธ ยท ๋๊ตฌ ํธ์ถ ํ๋จ | ์์ฒด ํฉ์ฑ (๊ท์น์ผ๋ก ์์ฑ, ์ ๋ต์ ์ฝ๋๋ก ๊ณ์ฐ. ์ ์ฑ ยท๋ฒ๋ นยท๋๊ตฌ๋ ๋ชจ๋ ์ง์ด๋ธ ๊ฒ์ด๋ฉฐ LLM ์์ฑ๋ฌผ์ ์ฐ์ง ์์) |
๋ผ์ด์ ์ค์ ์ฃผ์
- ๊ณต๊ฐ ํ์ต ๋ฐ์ดํฐ๋ ๋ชจ๋ CC BY-SA 4.0์ ๋๋ค.
judge.py์ ๊ณผ์ ๋ณ ์ง์นจยท๋ณด๊ธฐ ๋ฌธ๊ตฌ(TASKS,CRITERIA)์ ํ๊ฐ ์คํฌ๋ฆฝํธ์ ์ง์นจ ์ผ๋ถ๋ Korean JEV Benchmark(DaehanKim)์ ๊ณผ์ ๋ฌธ๊ตฌ๋ฅผ ๊ทธ๋๋ก ์ด ๊ฒ์ผ๋ก, CC BY 4.0์ ๋ฐ๋ฆ ๋๋ค.space/ํด๋(์ผ๋ฆด ํ์ด์ง)๋ KoBESTยทKLUE ๋ฌธ์ฅ์ ํฌํจํ๊ณ ์์ด CC BY-SA 4.0์ ๋๋ค.- ํ์ค ํํ ํ์ , ์ ์ฑ ํ๋จ ๋ฑ ์ฌ๋์๊ฒ ์ํฅ์ ์ฃผ๋ ๊ฒฐ์ ์ ์ธ ๋๋ ํ์ ์ด ๋ฎ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋์ด ๊ฒํ ํ๋๋ก ํ์ธ์.
- ๋ฒ๋ฅ ยท๊ธ์ต ํ๋จ์ ๊ทผ๊ฑฐ๋ก ์ฐ์ง ๋ง์ธ์. ์ฃผ์ด์ง ๊ธ ์์์ ๋ด์ฉ์ ์ฐพ๊ณ ๋์กฐํ๋ ๋๊ตฌ์ ๋๋ค.
- Downloads last month
- 52
Model tree for coderecode95/KJH-Judge-4B-ko
Space using coderecode95/KJH-Judge-4B-ko 1
Evaluation results
- accuracy (0-shot on NSMCtest set self-reported85.700
- accuracy (0-shot on KorNLI (XNLI)test set self-reported74.500
- accuracy (0-shot on KLUE-STSvalidation set self-reported85.900
- accuracy (0-shot on Korean UnSmileself-reported82.100
- accuracy (0-shot on KMMLUtest set self-reported42.600
- accuracy (0-shot on HAE-RAE Bench 1.0test set self-reported56.100
