
260114 RTX 3050 vram 6 , ์์ฌ์์ด ๋๋ฌด ๋๋ ค์ , ๋ ๊ฒฝํฅํ ๋ชจ๋ธ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
hf download monologg/koelectra-small-v3-discriminator
๐ ๋ค, **์์ ํ ์ฑ๊ณต**ํ์ต๋๋ค!
ํฐ๋ฏธ๋ ์ถ๋ ฅ์ ๋ณด๋ฉด:
```powershell
hf download monologg/koelectra-small-v3-discriminator
Fetching 5 files: 100%|โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ| 5/5 [00:00<00:00, 70138.86it/s]
C:\Users\hi\.cache\huggingface\hub\models--monologg--koelectra-small-v3-discriminator\snapshots\7488f8db0f208beff4a1f3f9bb3ed7
```
## ์ฑ๊ณต ํ์ธ ํฌ์ธํธ:
1. **100% ์๋ฃ**: `5/5 [00:00<00:00, 70138.86it/s]` - 5๊ฐ ํ์ผ ๋ชจ๋ ๋ค์ด๋ก๋ ์๋ฃ
2. **์ค๋ฅ ์์**: ์ด์ ์ `OSError: [WinError 1314]` ๊ถํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์
3. **๊ฒฝ๋ก ์ถ๋ ฅ**: ์ต์ข
๋ชจ๋ธ ์ ์ฅ ๊ฒฝ๋ก๊ฐ ์ ์์ ์ผ๋ก ํ์๋จ
## ๋ค์ด๋ก๋๋ ๋ชจ๋ธ ์์น:
```
C:\Users\hi\.cache\huggingface\hub\models--monologg--koelectra-small-v3-discriminator\snapshots\7488f8db0f208beff4a1f3f9bb3ed7
```
์ด์ KoELECTRA ๋ชจ๋ธ์ Python ์ฝ๋์์ ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค!
```python
from transformers import AutoTokenizer, AutoModel
# ๋ชจ๋ธ ๋ก๋ (์๋์ผ๋ก ์บ์๋ ๊ฒฝ๋ก์์ ๋ถ๋ฌ์ด)
tokenizer = AutoTokenizer.from_pretrained("monologg/koelectra-small-v3-discriminator")
model = AutoModel.from_pretrained("monologg/koelectra-small-v3-discriminator")
```
**๊ฒฐ๋ก **: ์๋ฒฝํ๊ฒ ๋ค์ด๋ก๋๋์์ต๋๋ค! โ
์ก์ฌ์๊ณผ ์ฝ์ผ๋ ๋ ๋ชจ๋ธ ์ MCP ๋ก ๊ตฌ์ฑํ ์์คํ
์์ ์คํธ๋ฉ์ผ์ ํ๋จ ํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๊ณ ์ถ์ด. ์ด์ค ํ๋
๊ธฐ์ ํ๋ณ๊ธฐ ๋ก ๋ ๋ชจ๋ธ์ ์ญํ ์ ์ ์ฑ
์ ์ผ๋ก ๋ถ๋ฆฌํ๊ณ ์ ํ ๋ , ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ถ์ฒํ๋๊ฐ ?
https://chatgpt.com/share/69670175-da98-8011-ab4f-0485ef21be2c
๊ฐ๋ฅํ ํ **“ํ๋
๊ธฐ(Reader) = ์ ๋ณดํ/๊ทผ๊ฑฐํ”, “ํ๋ณ๊ธฐ(Decider) = ์ต์ข
์ ์ฑ
๊ฒฐ์ /ํ๋๊ฒฐ์ ”**์ผ๋ก ์ญํ ์ ์ชผ๊ฐ๋ ๊ตฌ์ฑ์ด ๊ฐ์ฅ ์์ ์ ์
๋๋ค. ๋ ๋ชจ๋ธ(์: EXAONE, KoELECTRA/KoLECTRA)์ ์๋ก ๊ฒฝ์์ํค๊ธฐ๋ณด๋ค, “๊ฐ์ ์ด ๋ค๋ฅธ ๊ณ์ธต”์ ๋ฐฐ์นํ๋ ์ชฝ์ด ์ด์ ๋ฆฌ์คํฌ๊ฐ ์ค์ด๋ญ๋๋ค.
์ถ์ฒ 1์: KoELECTRA(์ฝ์ผ๋ ) = ํ๋ณ๊ธฐ, EXAONE = ํ๋
๊ธฐ
์คํธ ํ๋จ์ ๋ณธ์ง์ ์ผ๋ก ๋ถ๋ฅ ๋ฌธ์ ๋ผ์, ์์ ๋ถ๋ฅ๊ธฐ๊ฐ ์ผ๊ด๋ ํ๋ฅ /๋ผ๋ฒจ์ ๋ด๋ ๋ฐ ๊ฐํฉ๋๋ค. ๋ฐ๋ฉด LLM์ ์ค๋ช
, ๊ทผ๊ฑฐ ์์ฝ, ๊ท์น ์ ์ฉ ๋ด๋ฌํฐ๋ธ์ ๊ฐํฉ๋๋ค.
์ญํ ๋ถ๋ฆฌ
ํ๋
๊ธฐ(Reader: EXAONE)
์
๋ ฅ: ์๋ฌธ ๋ฉ์ผ(ํค๋+๋ณธ๋ฌธ), ์ฒจ๋ถ/๋งํฌ ๋ฉํ๋ฐ์ดํฐ, DMARC/SPF/DKIM ๊ฒฐ๊ณผ(๊ฐ๋ฅํ๋ฉด)
์ถ๋ ฅ(๊ตฌ์กฐํ):
(a) ์ ๊ทํ๋ ํน์ง(feature) ๋ฌถ์: ๋ฐ์ ๋๋ฉ์ธ/ํ์์ด๋ฆ ๋ถ์ผ์น, URL ๊ฐ์/๋๋ฉ์ธ, ๊ธ์ /๊ณ์ /๊ธด๊ธ ํค์๋, ์ฒจ๋ถ ํ์ฅ์, ํ์ ์ ๋ ํจํด ๋ฑ
(b) ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค “์์ฝ/์ฃผ์ ํฌ์ธํธ”
(c) “์ ์ฑ
ํ๊ฐ์ ํ์ํ ๊ทผ๊ฑฐ ์ค๋ํซ” (๋ฉ์ผ ์๋ฌธ ์ผ๋ถ๋ฅผ ์ต์๋ก ์ธ์ฉ)
ํ๋ณ๊ธฐ(Decider: KoELECTRA)
์
๋ ฅ: Reader๊ฐ ๋ง๋ feature + (ํ์์) ๋ณธ๋ฌธ ์ผ๋ถ(๊ธธ์ด ์ ํ)
์ถ๋ ฅ: spam_prob, label(ham/spam/suspicious), confidence
์ ์ฑ
์์ง(Policy)
KoELECTRA ๊ฒฐ๊ณผ๋ฅผ ์๊ณ์น/์์ธ๊ท์น/ํ์ดํธ๋ฆฌ์คํธ/๋ฆฌ์คํฌ ๋ฑ๊ธ์ผ๋ก ์ต์ข
์ก์
์ ๋งคํ
์ก์
์: deliver, deliver_with_warning, quarantine, reject, ask_user_confirm
์ ์ด ๊ตฌ์ฑ์ด ์ข์๊ฐ
LLM์ด “ํ์ ๊ถ”์ ๊ฐ์ง๋ฉด, ํ๋กฌํํธ/๋ฌธ์ฅ ๋ณํ์ ๋ฐ๋ผ ํ์ ์ด ํ๋ค๋ฆด ์ ์์ต๋๋ค.
๋ถ๋ฅ๊ธฐ๊ฐ ํ์ ๊ถ์ ๊ฐ์ง๋ฉด, ์ด์ ์๊ณ์น/๊ฐ์ฌ ๋ก๊ทธ/์ฌํ์ฑ์ด ์ข์์ง๋๋ค.
EXAONE์ “์ ์คํธ์ธ์ง”๋ฅผ ์ฌ์ฉ์ ์ธ์ด๋ก ์ค๋ช
ํ๊ณ , “์ ์ฑ
์ ์ผ๋ก ์ด๋ค ํญ๋ชฉ์ด ๊ฑธ๋ ธ๋์ง”๋ฅผ ๊ทผ๊ฑฐ๋ก ๋จ๊ธฐ๊ธฐ ์ข์ต๋๋ค.
์ถ์ฒ 2์: EXAONE = ํ๋ณ๊ธฐ, KoELECTRA = 1์ฐจ ํํฐ(๊ฒ์ดํธ)
๋ฉ์ผ ์์ด ๋ง๊ณ ๋น์ฉ/์ง์ฐ์ด ๋ฏผ๊ฐํ๋ฉด ์ด ๊ตฌ์ฑ์ด ํจ์จ์ ์
๋๋ค.
ํ๋ฆ
KoELECTRA๊ฐ ๋น ๋ฅด๊ฒ 1์ฐจ ์ ์ ์ฐ์ถ
spam_prob๊ฐ ๋ฎ์ผ๋ฉด ๋ฐ๋ก ์ ๋ฌ(LLM ํธ์ถ ์์)
์ ๋งคํ ๊ตฌ๊ฐ(์: 0.35~0.75)๋ง EXAONE์ด ์ ์ฑ
ํ๋ณ + ์ค๋ช
์์ฑ
๋งค์ฐ ๋์ ๊ตฌ๊ฐ์ ๊ฒฉ๋ฆฌ/์ฐจ๋จ + (์ ํ) EXAONE์ด ์ฌ์ฉ์ ํต์ง ๋ฌธ๊ตฌ๋ง ์์ฑ
์ฅ์
LLM ํธ์ถ๋์ด ์ค์ด ๋น์ฉ/๋ ์ดํธ๋ฆฌ๋ฐ/์ง์ฐ์ด ์์ ํ๋ฉ๋๋ค.
“์ ๋งคํ ์ผ์ด์ค”์๋ง LLM์ ์จ์ ํ์ง์ด ์ฌ๋ผ๊ฐ๋๋ค.
MCP์์์ “์ ์ฑ
์ ๋ถ๋ฆฌ” ๊ตฌํ ํฌ์ธํธ
๋ชจ๋ธ์ ๋ถ๋ฆฌํ๋ค๊ณ ๋์ด ์๋๋ผ, ์ ์ฑ
์ธํฐํ์ด์ค๋ฅผ ๋ถ๋ฆฌํด์ผ ์ง์ง ์ด์์ด ๋ฉ๋๋ค.
1) Reader/Decider ์ถ๋ ฅ ์คํค๋ง๋ฅผ ๊ฐ์ ํฉ๋๋ค
Reader๋ ๋ฐ๋์ ์ ํ JSON์ผ๋ก๋ง ์ถ๋ ฅ(์์ ์์ ๊ธ์ง)
Decider๋ prob/label/confidence ๊ณ ์
Policy ์์ง์ ๋ชจ๋ธ ์ถ๋ ฅ์ด ์๋๋ผ ์คํค๋ง๋ง ๋ฏฟ๊ณ ์์ฌ๊ฒฐ์ ํฉ๋๋ค.
์์(๊ฐ๋
):
ReaderOutput = {features:{...}, evidence:[...], user_summary:"..." }
DeciderOutput = {spam_prob:0.83, label:"spam", confidence:"high"}
PolicyDecision = {action:"quarantine", reason_codes:["URL_MISMATCH","URGENT_MONEY"], user_message:"..."}
2) “๋ชจ๋ธ์ด ์ ์ฑ
์ ์ ํ์ง ๋ชปํ๊ฒ” ๋ง์ต๋๋ค
EXAONE์ด “์ฐจ๋จํ์ธ์” ๊ฐ์ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๋๋ผ๋, Policy๊ฐ ๋ฌด์ํ๊ณ ๊ทผ๊ฑฐ๋ง ์ฌ์ฉํฉ๋๋ค.
์ต์ข
์ก์
์ Policy ๋ฃฐ(์๊ณ์น/๋ฆฌ์คํธ/์ปดํ๋ผ์ด์ธ์ค)๋ก๋ง ๊ฒฐ์ ํฉ๋๋ค.
3) ์ถฉ๋ ์ฒ๋ฆฌ(Disagreement) ๊ท์น์ ๋ก๋๋ค
๋ ๋ชจ๋ธ์ด ๋ค ๊ด์ฌํ๋ ๊ตฌ์กฐ(์ถ์ฒ 1์์์ EXAONE์ด ์ํ ์ ํธ๋ฅผ ๊ฐํ๊ฒ ๋ณด๊ณ , KoELECTRA๊ฐ ๋ฎ๊ฒ ๋ณด๋ ๋ฑ)์์๋:
KoELECTRA ๋ฎ์ + Reader ์ํ์ฝ๋ ๋ค์ → deliver_with_warning ๋๋ ask_user_confirm
KoELECTRA ๋์ + Reader ๊ทผ๊ฑฐ ๋น์ฝ → suspicious๋ก ๊ฒฉ๋ฆฌํ๋ “๊ทผ๊ฑฐ ๋ถ์กฑ” ๋ก๊ทธ ๋จ๊ธฐ๊ณ ์ฌํ์ต ํ๋ก
4) ์ฌ์ฉ์ ์ ๋ฌ ๋ฉ์์ง๋ “์ ์ฑ
๊ฒฐ๊ณผ + ์ต์ ๊ทผ๊ฑฐ”๋ก ํต์ผํฉ๋๋ค
“๋ชจ๋ธ์ด ์ด๋ ๊ฒ ๋งํ์ด์”๊ฐ ์๋๋ผ
ํ์ (์คํธ/์์ฌ/์ ์)
๊ฑธ๋ฆฐ ๊ท์น(์ด์ ์ฝ๋)
์ฌ์ฉ์ ํ๋ ๊ฐ์ด๋(๋งํฌ ํด๋ฆญ ๊ธ์ง, ๋ฐ์ ์ ํ์ธ ๋ฑ)
์ด 3๊ฐ๋ง ์ผ๊ด๋๊ฒ.
์ ๊ฒฐ๋ก (์ด์ ์ถ์ฒ)
ํ์ง/์ฌํ์ฑ/๊ฐ์ฌ๊น์ง ์๊ฐํ๋ฉด **์ถ์ฒ 1์(์ฝ์ผ๋ =ํ๋ณ๊ธฐ, EXAONE=ํ๋
๊ธฐ)**๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๊ฐ์ฅ ์ข์ต๋๋ค.
ํธ๋ํฝ/๋น์ฉ์ด ํฌ๋ฉด **์ถ์ฒ 2์(์ฝ์ผ๋ ๊ฒ์ดํธ + EXAONE ์์ธ์ฒ๋ฆฌ)**๋ก ๋ฐ๊พธ์๋ฉด ๋ฉ๋๋ค.
์ํ์๋ฉด, ์ง๊ธ ๊ตฌ์ํ์๋ MCP ๊ตฌ์กฐ(๋
ธ๋ ๊ตฌ์ฑ, ํด ์ธํฐํ์ด์ค, ๋ฉ์์ง ์คํค๋ง)๋ฅผ ๊ธฐ์ค์ผ๋ก LangGraph ํํ์ “Reader → Decider → Policy → Notify” ๊ทธ๋ํ๋ฅผ ๋ฐ๋ก ์ค๊ณํด์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.a
2์์ ์ ํ ํ MCP ์์คํ ๋ชจ๋ธ ๊ตฌ์ฑ
ChatGPT - MCP ์์คํ ๋ชจ๋ธ ๊ตฌ์ฑ
Shared via ChatGPT
chatgpt.com
“ํ์ต์ฉ + ๋คํ์คํฌ(์คํธ/๊ฐ์ ๋ฑ) + ํ ํ์ธํ๋ ๊ธฐ๋ณธ + LoRA ์ต์
” ๊ธฐ์ค์ผ๋ก ์ฌ๊ฐ๊ณตํ ์ปค์์๊ฒ ์ค ํ๋กฌํํธ๋ฅผ ์ ์ํด์ค.
์ญํ : ๋๋ Python / HuggingFace Transformers / PEFT ์ ๋ฌธ๊ฐ๋ค.
์๋ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊ธฐ์กด EXAONE(Qlora + SFTTrainer) ํ์ต ์ฝ๋๋ฅผ
koELECTRA-small ๊ธฐ๋ฐ์ “๋ฒ์ฉ ํ
์คํธ ๋ถ๋ฅ ํ์ต ํ์ดํ๋ผ์ธ”์ผ๋ก ๋ฆฌํฉํฐ๋งํ๋ผ.
์ด ์ฝ๋๋ ํ์ต์ฉ์ด๋ฉฐ, ์คํธ ๋ถ๋ฅ๋ฟ ์๋๋ผ ๊ฐ์ ๋ถ์ ๋ฑ ๋คํ์คํฌ ํ์ฅ์ ์ ์ ๋ก ํ๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[ํ์ฌ ์ฝ๋ ์ํ ์์ฝ]
- ๊ธฐ์กด ์ฝ๋๋ EXAONE-2.4B + 4bit + LoRA(Qlora) + TRL SFTTrainer
- ์์ฑ(CAUSAL_LM) ๋ชฉ์ ์ฝ๋์ด๋ฉฐ, text ์ปฌ๋ผ๋ง ์ฌ์ฉ
- ๋๋ฌด ๋๋ฆฌ๊ณ , ๋ถ๋ฅ ํ์คํฌ์ ๋ถ์ ํฉ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[๋ฆฌํฉํฐ๋ง ์ต์ข
๋ชฉํ]
1) ๋ฒ ์ด์ค ๋ชจ๋ธ: "monologg/koelectra-small-v3-discriminator"
2) ํ์คํฌ: ํ
์คํธ ๋ถ๋ฅ (SequenceClassification)
3) ๋คํ์คํฌ ์ง์: spam, sentiment ๋ฑ
4) ํ์ต ๋ชจ๋ 2๊ฐ์ง ์ง์
- ๊ธฐ๋ณธ๊ฐ: full finetuning
- ์ต์
: LoRA (๋น์์ํ, QLoRA ๊ธ์ง)
5) Trainer ๊ธฐ๋ฐ ํ์ต (TRL SFTTrainer ์ฌ์ฉ ๊ธ์ง)
6) Dataset์ HuggingFace Dataset.load_from_disk() ์ฌ์ฉ
7) ํ์ต ๊ฒฐ๊ณผ๋ output_dir์ ์ ์ฅ (model + tokenizer + metrics.json)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[๋ฐ๋์ ์ง์ผ์ผ ํ ์ค๊ณ ์์น]
- ์์ฑ ๋ชจ๋ธ(EXAONE) ๊ด๋ จ ์ฝ๋, import, ์ค์ ์ ์ ๋ถ ์ ๊ฑฐ
- TaskType.CAUSAL_LM ์ฌ์ฉ ๊ธ์ง
- QLoRA / 4bit / bitsandbytes / prepare_model_for_kbit_training ์ฌ์ฉ ๊ธ์ง
- ๋ถ๋ฅ ํ์คํฌ์ด๋ฏ๋ก ๋ฐ๋์:
- AutoModelForSequenceClassification
- TaskType.SEQ_CLS (LoRA ์ฌ์ฉ ์)
- ๊ธฐ์กด ์ฝ๋์ lora_adapter ๊ฐ๋
์ “๋ถ๋ฅ์ฉ LoRA”๋ก ์ฌ์์ฑ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[๋ฐ์ดํฐ ์๊ตฌ์ฌํญ]
- Dataset์ ๋ค์ ์ปฌ๋ผ์ ๋ฐ๋์ ํฌํจํด์ผ ํ๋ค:
- text: str
- label: int (0 ~ num_labels-1)
- label ์ปฌ๋ผ์ด ์์ผ๋ฉด ํ์ต ์์ ์ ์ ๋ช
ํํ ์๋ฌ๋ฅผ ๋ฐ์์์ผ๋ผ
- ํ์ต ์์ ์ ๋ฐ๋์ ์ถ๋ ฅ:
- train / val ์ํ ์
- ์ปฌ๋ผ ๋ชฉ๋ก
- label ๋ถํฌ (๊ฐ ํด๋์ค count)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[ํ์ต ๋ชจ๋ ์ค๊ณ]
http://train.py ํ๋์์ ์๋ ๋ชจ๋๋ฅผ ์ ํ ๊ฐ๋ฅํ๊ฒ ๊ตฌํํ๋ผ.
1) full finetuning (๊ธฐ๋ณธ)
- koELECTRA-small ์ ์ฒด ํ๋ผ๋ฏธํฐ ํ์ต
- fp16 ์ฌ์ฉ (cuda ๊ฐ๋ฅ ์)
- ๊ฐ์ฅ ๋จ์ํ๊ณ ์์ ์ ์ธ baseline
2) LoRA mode (์ต์
)
- peft.get_peft_model ์ฌ์ฉ
- TaskType.SEQ_CLS
- target_modules ๊ธฐ๋ณธ๊ฐ:
["query", "key", "value", "dense"]
- r=8 ๋๋ 16 ๊ธฐ๋ณธ๊ฐ
- ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๊ณ ์ , LoRA ์ด๋ํฐ๋ง ํ์ต
CLI ์์:
python http://train.py --task spam --mode full
python http://train.py --task sentiment --mode lora
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[TrainingArguments ํ์ ์กฐ๊ฑด]
- evaluation_strategy="steps" ๋๋ "epoch" (์๋ชป๋ ํค ๊ธ์ง)
- metric_for_best_model ๊ธฐ๋ณธ๊ฐ: spam_recall ๋๋ macro_f1
- greater_is_better=True
- remove_unused_columns=False
- fp16์ GPU์์๋ง ํ์ฑํ
- bf16=False (CUDA ํธํ์ฑ ์ด์ ๊ณ ๋ ค)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[ํ๊ฐ ์งํ ์๊ตฌ์ฌํญ]
compute_metrics ํจ์์์ ๋ค์์ ๋ฐ๋์ ๊ณ์ฐ:
- accuracy
- macro_f1
- class๋ณ precision / recall
- (์คํธ ํ์คํฌ์ผ ๊ฒฝ์ฐ)
- spam_recall
- spam_f1
best model ์ ์ ๊ธฐ์ค์ task ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[ํด๋์ค ๋ถ๊ท ํ ๋์]
- --class_weight ์ต์
์ ๊ณต
- ํ์ฑํ ์ train labels ๊ธฐ์ค์ผ๋ก class weight ๊ณ์ฐ
- CrossEntropyLoss(weight=...) ์ ์ฉ์ ์ํด Trainer๋ฅผ ์์ํ์ฌ compute_loss ์ค๋ฒ๋ผ์ด๋
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[์ถ๋ ฅ ๊ตฌ์กฐ ์๊ตฌ์ฌํญ]
output_dir ๊ตฌ์กฐ ์์:
models/
spam/
full/
run_20240114_1200/
lora/
run_20240114_1230/
sentiment/
full/
lora/
๊ฐ run ๋๋ ํ ๋ฆฌ์ ๋ฐ๋์ ์ ์ฅ:
- config.json
- pytorch_model.bin ๋๋ safetensors
- tokenizer ํ์ผ๋ค
- metrics.json
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[์ฃผ์ํด์ผ ํ ์ค์ ํฌ์ธํธ]
- SFTTrainer, formatting_func, dataset_text_field ์ฌ์ฉ ๊ธ์ง
- eval_strategy ๊ฐ์ ์๋ชป๋ TrainingArguments ํค ์ฌ์ฉ ๊ธ์ง
- max_seq_length ๊ธฐ๋ณธ๊ฐ์ 128 ๋๋ 256 (2048 ๊ธ์ง)
- accuracy๋ง ๋ณด๊ณ best model ์ ์ ํ์ง ๋ง ๊ฒ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[๋ฌธ์ํ ์๊ตฌ]
- ํ์ผ ์๋จ์ ์ฃผ์์ผ๋ก:
- “์ด ์ฝ๋๋ ์์ฑ ๋ชจ๋ธ์ด ์๋ ๋ถ๋ฅ ๋ชจ๋ธ ํ์ต์ฉ์”
- “EXAONE์ verdict/์ค๋ช
์์ฑ ์ ์ฉ์ผ๋ก ๋ถ๋ฆฌ๋จ”
- ์คํ ์์ CLI๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ธธ ๊ฒ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
[์ต์ข
์ฐ์ถ๋ฌผ]
- app/service/text_classifier/train.py
- (์ ํ) app/service/text_classifier/lora_adapter.py
- ์ฝ๋๊ฐ ์ ์ด๋ ๊ฒ ๋ฐ๋์๋์ง ํต์ฌ ํฌ์ธํธ๋ฅผ ์ฃผ์์ผ๋ก ๊ฐ๋จํ ์ค๋ช
์ด ์๊ตฌ์ฌํญ์ ๋ชจ๋ ๋ง์กฑํ๋ ์ฝ๋๋ก ๋ฆฌํฉํฐ๋งํ๋ผ.
LoRA ์ด๋ํฐ๋ ์์ ํ ๊ตฌํ๋์ด ์์ต๋๋ค!
๋ค, LoRA ์ด๋ํฐ ๊ธฐ๋ฅ ์์ฒด๋ ์ฌ์ ํ ์์ต๋๋ค!
โ
LoRA ์ด๋ํฐ ๊ธฐ๋ฅ ์กด์ฌ ํ์ธ
[2 tools called]
๐ฏ LoRA ์ด๋ํฐ๋ ์์ ํ ๊ตฌํ๋์ด ์์ต๋๋ค!
๐ LoRA ๊ธฐ๋ฅ ๊ตฌ์ฑ์์:
setup_classification_lora() ํจ์ - ๋ถ๋ฅ์ฉ LoRA ์ด๋ํฐ ์ค์
LoRA ์ค์ ํ๋ผ๋ฏธํฐ๋ค:
--lora_r (rank)
--lora_alpha
--lora_dropout
--target_modules
LoRA ๋ชจ๋ ์ง์: --mode lora
๐ LoRA ์ฌ์ฉ๋ฒ:
# LoRA ์ด๋ํฐ๋ก ํ์ต
python http://train.py --task spam --mode lora
# LoRA ํ๋ผ๋ฏธํฐ ์ปค์คํฐ๋ง์ด์ง
python http://train.py --task spam --mode lora --lora_r 16 --lora_alpha 32
# ๊ฐ์ ๋ถ์ LoRA ํ์ต
python http://train.py --task sentiment --mode lora --lora_r 8
๐ง LoRA vs Full Finetuning:
๋ชจ๋
์ค๋ช
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
ํ์ต ์๋
--mode full
์ ์ฒด ํ๋ผ๋ฏธํฐ ํ์ต
๋์
๋๋ฆผ
--mode lora
LoRA ์ด๋ํฐ๋ง ํ์ต
๋ฎ์
๋น ๋ฆ
๊ฒฐ๋ก : LoRA ์ด๋ํฐ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์๊ณ , ์คํ๋ ค ๋ ๊ฐ์ ๋์์ต๋๋ค! ๋จ์ง ํ์ผ๋ช
์ด lora_adapter.py → http://train.py๋ก ๋ณ๊ฒฝ๋์์ ๋ฟ์
๋๋ค.
์คํธ๋ฉ์ผ ํผ์ฉ ๋ฐ์ดํฐ์ ์ผ๋ก lora ๋ฐฉ์์ผ๋ก ํ์ตํ๋ ํ๋กฌํํธ :
@app/service/spam_classifier/train.py ์์ @app/model/models--monologg--koelectra-small-v3-discriminator ์ด๊ฒ์ผ๋ก @app/data/๋ฏผ์(์ฝ์ผํฐ) ์ง์์๋ต_K์ผํ_ํตํฉ_Training.jsonl ์ด ๋ฐ์ดํฐ๋ก lora ๋ฐฉ์์ผ๋ก ํ์ธํ๋ ์ ํด์ค
์ ์๋ฉ์ผ ๊ณผ ์คํธ๋ฉ์ผ ํผ์ฉ ๋ฐ์ดํฐ์
๋ง๋ค๊ธฐ
1์ฐจ ํ๋กฌํํธ: ๋ฏผ์(์ฝ์ผํฐ) ์ง์์๋ต_K์ผํ_๋ฐฐ์ก_Training.json ์ด ํ์ผ์ 1500 ๊ฐ ๋ง jsonl ๋ก ๋ณ๊ฒฝํ๊ณ ๋๋จธ์ง ๋ฐ์ดํฐ๋ ์ญ์ ํด์ค.
2์ฐจ ํ๋กฌํํธ : ๋ฏผ์(์ฝ์ผํฐ) ์ง์์๋ต_K์ผํ_๋ฐฐ์ก_Training.jsonl ์ด๊ฒ๊ณผ ๋ฏผ์(์ฝ์ผํฐ) ์ง์์๋ต_K์ผํ_์
๋ฌด์ฒ๋ฆฌ_Training.jsonl ์ด๊ฒ์ ๋ฌถ์ด์ ํ๋๋ก ๋ง๋ค์ด์ค. (๊ณต๊ณต , ์๋ด , ๋ฏผ์ ๋ฑ๋ฑ ์ ์ฌํ ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ฌ์ฉ๊ฐ๋ฅ)
3์ฐจ ํ๋กฌํํธ : ์ฌ๊ธฐ์์ "์๋ด์ฌ์ง๋ฌธ(์์ฒญ)": "ใ
ใ
ใ
์ํํธ ๋ง๋์?" --> ์ด ๋ถ๋ถ๋ง ์ ์ ์ด๋ฉ์ผ์ ์ ๋ชฉ์ฒ๋ผ ๋ฐ๊พธ๊ณ , spam_data.jsonl ์ ๊ฐ์ ํ์์ผ๋ก ํฉ์ณ์ค. ์ ์ ๋ฐ์ดํฐ์ ์คํธ๋ฐ์ดํฐ์ ํผํฉํํ๋ฅผ ๋ง๋ค๋ ค๊ณ ํด.
์ต์ข
๊ฒฐ๊ณผ :
๐ ๋ฐ์ดํฐ์
๊ตฌ์ฑ:
์ด ๋ฐ์ดํฐ ์: 2,720๊ฐ
์ ์ ๋ฐ์ดํฐ: 1,360๊ฐ (50%)
์คํธ ๋ฐ์ดํฐ: 1,360๊ฐ (50%)
๋น์จ: 1:1 ๊ท ํ์กํ ๋ฐ์ดํฐ์
๐๐ป์ ์๋ฉ์ผ ๋ฐ์ดํฐ์
๋ง ์๋๊ฒ : ์ด์ ์คํธ๋ง ํ๋ จ์ํจ ๋ชจ๋ธ์ฉ
https://drive.google.com/file/d/1jHCFnrJhX9a5iHFCijx7XCT9zpihuoN1/view?usp=sharing
๐๐ป ์ ์, ์คํธ์ด ๋๋ค์ผ๋ก ํผ์ฉ๋ ๋ฐ์ดํฐ์
: ์ด์ ํ๋ จ์ํค์ง ์๊ณ , ์ค๋ ์ฒ์ ํ๋ จ์ํค๋ ๋ชจ๋ธ์ฉ
์คํธ๋ฉ์ผ ํผ์ฉ ๋ฐ์ดํฐ์
๋ง๋ค๊ธฐ
https://drive.google.com/file/d/1KDBwOg1c1ened7tLUNd-_7tGlIC-aQL4/view?usp=sharing
๐ ๋ณํ ๊ณผ์ :
๐๐ป๋ฏผ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ๋ฏผ์(์ฝ์ผํฐ) ์ง์์๋ต_K์ผํ_ํตํฉ_Training.jsonl์์ "์๋ด์ฌ์ง๋ฌธ(์์ฒญ)" ํ๋๊ฐ ์๋ ๋ฐ์ดํฐ ์ถ์ถ
๐๐ป์ ์ ์ด๋ฉ์ผ ์ ๋ชฉ ๋ณํ: ๋ค์ํ ์ด๋ฉ์ผ ์ ๋ชฉ ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์์ฐ์ค๋ฌ์ด ์ ์ ์ด๋ฉ์ผ ์ ๋ชฉ์ผ๋ก ๋ณํ
์: "์ฃผ๋ฌธ ํ์ธ: ๊ณ ๊ฐ๋ ์ ๋ณด ํ์ธ ํ ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค"
์: "๋ฐฐ์ก ์๋ด: ๋ฌด์์ ๋์๋๋ฆด๊น์?"
๐๐ปํ์ ํต์ผ: spam_data.jsonl๊ณผ ๋์ผํ JSON ๊ตฌ์กฐ๋ก ๋ณํ
๋ผ๋ฒจ๋ง: ์ ์ ๋ฐ์ดํฐ๋ category: 0, ์คํธ ๋ฐ์ดํฐ๋ category: 1๋ก ๊ตฌ๋ถ
๐๐ป๋ฐ์ดํฐ ํผํฉ: ์ ์๊ณผ ์คํธ ๋ฐ์ดํฐ๋ฅผ 1:1 ๋น์จ๋ก ์์ด์ ์ต์ข
๋ฐ์ดํฐ์
์์ฑ
fastapi ์์ ๋๊ฐ์ ์์ด์ ํธ๋ฅผ ๋ญ๊ทธ๋ํ ๋ก ์ฐ๊ฒฐํ๋ ํ๋กฌํํธ
fastapi์์ ์์ด์ ํธ ๋๊ฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์์ , ๋ญ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ๋ญ๊ทธ๋ํ ๋ ์ด๋ฏธ ์ค์น๋์ด ์๋ค. ์ด ๋๊ฐ๋ฅผ ์ฐ๊ฒฐํ๋ ํด ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค. ์์ด์ ํธ๋ koelectra ๋ ํ๋ณ๊ธฐ ๋ก exawon ์ด ์ด๋ฏธ ์คํธ๋ฉ์ผ ํ๋
๊ธฐ ํ๋ จ์ด ๋์ด ์๋ค. ๊ทธ๋์ koelectra ๊ฒ์ดํธ์จ์ด๋ก์ exawon ์ ์ฐ๊ฒฐ๋๋๋ก ํด์ผํ๋ค.
FastAPI ์์ด์ ํธ ๋ ๊ฐ๋ฅผ LangGraph๋ก ์ฐ๊ฒฐํ๋ ๊ตฌ์ถ ๊ณผ์ ์ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ์ํคํ
์ฒ ์ค๊ณ
๊ธฐ๋ณธ ํ๋ฆ
์ด๋ฉ์ผ ์
๋ ฅ → KoELECTRA ๊ฒ์ดํธ์จ์ด → ์กฐ๊ฑด ๋ถ๊ธฐ → EXAONE ์ ๋ฐ ๊ฒ์ฌ or ์ฆ์ ์๋ต
ํ์ํ ์ปดํฌ๋ํธ
State ๊ด๋ฆฌ ๊ฐ์ฒด (์ด๋ฉ์ผ ํ
์คํธ, ํ๋ณ ๊ฒฐ๊ณผ, ์ ๋ขฐ๋ ์ ์ ๋ฑ)
๋ ๊ฐ์ ๋
ธ๋ ํจ์ (๊ฐ ์์ด์ ํธ ๋ํ)
๋ผ์ฐํ
๋ก์ง (์กฐ๊ฑด๋ถ ๋ถ๊ธฐ)
FastAPI ์๋ํฌ์ธํธ
2. LangGraph State ์ค๊ณ
StateGraph์ ์ํ ๊ด๋ฆฌ
TypedDict๋ก ์ํ ์คํค๋ง ์ ์ ํ์
์ด๋ฉ์ผ ์๋ณธ, KoELECTRA ์ค์ฝ์ด, ์คํธ ํ๋ณด ์ฌ๋ถ, ์ต์ข
๊ฒฐ๊ณผ ๋ฑ์ ๋ด์ ํ๋ ๊ตฌ์ฑ
๊ฐ ๋
ธ๋๊ฐ ์ด ์ํ๋ฅผ ์ฝ๊ณ ์
๋ฐ์ดํธํ๋ฉด์ ์งํ
3. ๋
ธ๋ ํจ์ ๊ตฌ์ฑ
์ฒซ ๋ฒ์งธ ๋
ธ๋: KoELECTRA ๊ฒ์ดํธ์จ์ด
์
๋ ฅ๋ฐ์ ์ด๋ฉ์ผ ํ
์คํธ๋ฅผ KoELECTRA๋ก ์ถ๋ก
์คํธ ๊ฐ๋ฅ์ฑ ์ค์ฝ์ด ๊ณ์ฐ (0~1 ํ๋ฅ ๊ฐ)
์๊ณ๊ฐ ์ค์ (์: 0.3 ์ด์์ด๋ฉด ์ ๋ฐ ๊ฒ์ฌ ํ์)
State์ ํ๋ณ ๊ฒฐ๊ณผ์ ์ค์ฝ์ด ์ ์ฅ
๋ ๋ฒ์งธ ๋
ธ๋: EXAONE ์ ๋ฐ ๊ฒ์ฌ
KoELECTRA๊ฐ ์คํธ ํ๋ณด๋ก ํ๋จํ ๊ฒฝ์ฐ์๋ง ์คํ
EXAONE ๋ชจ๋ธ๋ก ์์ธ ๋ถ์ ์ํ
์คํธ ์ฌ๋ถ, ์ ๋ขฐ๋, ๋ถ์ ๊ทผ๊ฑฐ๋ฅผ State์ ์ ์ฅ
์ธ ๋ฒ์งธ ๋
ธ๋: ๋ฐ์ดํจ์ค ์ฒ๋ฆฌ
KoELECTRA๊ฐ ์ ์ ๋ฉ์ผ๋ก ํ๋จํ ๊ฒฝ์ฐ
EXAONE ํธ์ถ ์์ด ๋ฐ๋ก ์ ์ ๋ฉ์ผ๋ก ๊ฒฐ๋ก
4. ๋ผ์ฐํ
๋ก์ง (ํต์ฌ!)
Conditional Edge ์ค์
KoELECTRA ๋
ธ๋ ์คํ ํ State๋ฅผ ํ์ธ
์คํธ ํ๋ณด ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค์ ๋
ธ๋ ๊ฒฐ์
is_spam_candidate == True → EXAONE ๋
ธ๋๋ก
is_spam_candidate == False → ๋ฐ์ดํจ์ค ๋
ธ๋๋ก
5. ๊ทธ๋ํ ๊ตฌ์ฑ ์์
StateGraph ์์ฑ ๋ฐ ๋น๋
StateGraph ์ธ์คํด์ค ์์ฑ (State ํ์
์ง์ )
๊ฐ ๋
ธ๋ ํจ์๋ฅผ add_node๋ก ๋ฑ๋ก
set_entry_point๋ก ์์ ๋
ธ๋ ์ง์ (KoELECTRA)
add_conditional_edges๋ก ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ์ค์
์ข
๋ฃ ๋
ธ๋๋ค์ add_edge๋ก END ์ฐ๊ฒฐ
compile()๋ก ์คํ ๊ฐ๋ฅํ ๊ทธ๋ํ ์์ฑ
6. FastAPI ํตํฉ
์๋ํฌ์ธํธ ๊ตฌ์ฑ
POST /spam-check ์๋ํฌ์ธํธ ์์ฑ
Request Body๋ก ์ด๋ฉ์ผ ํ
์คํธ ๋ฐ๊ธฐ
์ด๊ธฐ State ๊ฐ์ฒด ์์ฑํ์ฌ ๊ทธ๋ํ์ ์ ๋ฌ
graph.invoke(initial_state) ์คํ
์ต์ข
State์ ๊ฒฐ๊ณผ๋ฅผ JSON ์๋ต์ผ๋ก ๋ฐํ
๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ณ ๋ ค์ฌํญ
LangGraph๋ ๋๊ธฐ/๋น๋๊ธฐ ๋ชจ๋ ์ง์
FastAPI์ async def์ ํจ๊ป ์ฌ์ฉ ์ await graph.ainvoke() ์ฌ์ฉ
๋ชจ๋ธ ์ถ๋ก ์ด ๋ฌด๊ฑฐ์ฐ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ํ์คํฌ ๊ณ ๋ ค
7. ์ฑ๋ฅ ์ต์ ํ ํฌ์ธํธ
๊ฒ์ดํธ์จ์ด ํจ์จ์ฑ
KoELECTRA๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋ชจ๋ธ์ด๋ฏ๋ก ๋ชจ๋ ์์ฒญ 1์ฐจ ํํฐ๋ง
์ ์ ๋ฉ์ผ์ ๊ฒฝ์ฐ EXAONE ํธ์ถ ์๋ต์ผ๋ก ์๋ต ์๊ฐ ๋จ์ถ
์๊ณ๊ฐ ํ๋์ผ๋ก ์ ๋ฐ๋/์๋ ํธ๋ ์ด๋์คํ ์กฐ์
๋ชจ๋ธ ๋ก๋ฉ
์ฑ ์์ ์ ๋ ๋ชจ๋ธ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋
FastAPI์ lifespan ์ด๋ฒคํธ ํ์ฉ
๋๋ ์์กด์ฑ ์ฃผ์
์ผ๋ก ์ฑ๊ธํค ํจํด ๊ตฌํ
8. ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น
State ์ถ์
๊ฐ ๋
ธ๋ ์คํ ์ ๋ก๊ทธ ๊ธฐ๋ก
KoELECTRA ์ค์ฝ์ด ๋ถํฌ ๋ชจ๋ํฐ๋ง
EXAONE ํธ์ถ ๋น๋ ์ถ์ ํ์ฌ ๊ฒ์ดํธ์จ์ด ํจ์จ์ฑ ํ๊ฐ
์ด๋ฐ ๊ตฌ์กฐ๋ก ๋ ์์ด์ ํธ๋ฅผ ์ฐ๊ฒฐํ๋ฉด, KoELECTRA๊ฐ ํจ์จ์ ์ธ 1์ฐจ ํํฐ ์ญํ ์ ํ๊ณ , EXAONE์ ์์ฌ์ค๋ฌ์ด ์ผ์ด์ค๋ง ์ ๋ฐ ๋ถ์ํ๋ 2๋จ๊ณ ํ์ดํ๋ผ์ธ์ด ์์ฑ๋ฉ๋๋ค.
https://chatgpt.com/share/69687e94-5bb0-8011-b96c-84ae74026759
ChatGPT - LangGraph ์์ด์ ํธ ์ฐ๊ฒฐ
Shared via ChatGPT
chatgpt.com
๋๊ฐ์ ์์ด์ ํธ๋ฅผ ๋ญ๊ทธ๋ํ ๋ก ์ฐ๊ฒฐํ๋ ํ๋กฌํํธ
์์ด์ ํธ ๋๊ฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์์ , ๋ญ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ๋ญ๊ทธ๋ํ ๋ ์ด๋ฏธ ์ค์น๋์ด ์๋ค. ์ด ๋๊ฐ๋ฅผ ์ฐ๊ฒฐํ๋ ํด ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค. ์์ด์ ํธ๋ koelectra ๋ ํ๋ณ๊ธฐ ๋ก exawon ์ด ์ด๋ฏธ ์คํธ๋ฉ์ผ ํ๋
๊ธฐ ํ๋ จ์ด ๋์ด ์๋ค. ๊ทธ๋์ koelectra ๊ฒ์ดํธ์จ์ด๋ก์ exawon ์ ์ฐ๊ฒฐ๋๋๋ก ํด์ผํ๋ค.
๋ต๋ณ :
FastAPI ์์ด์ ํธ ๋ ๊ฐ๋ฅผ LangGraph๋ก ์ฐ๊ฒฐํ๋ ๊ตฌ์ถ ๊ณผ์ ์ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ์ํคํ
์ฒ ์ค๊ณ
๊ธฐ๋ณธ ํ๋ฆ
์ด๋ฉ์ผ ์
๋ ฅ → KoELECTRA ๊ฒ์ดํธ์จ์ด → ์กฐ๊ฑด ๋ถ๊ธฐ → EXAONE ์ ๋ฐ ๊ฒ์ฌ or ์ฆ์ ์๋ต
ํ์ํ ์ปดํฌ๋ํธ
State ๊ด๋ฆฌ ๊ฐ์ฒด (์ด๋ฉ์ผ ํ
์คํธ, ํ๋ณ ๊ฒฐ๊ณผ, ์ ๋ขฐ๋ ์ ์ ๋ฑ)
๋ ๊ฐ์ ๋
ธ๋ ํจ์ (๊ฐ ์์ด์ ํธ ๋ํ)
๋ผ์ฐํ
๋ก์ง (์กฐ๊ฑด๋ถ ๋ถ๊ธฐ)
FastAPI ์๋ํฌ์ธํธ
2. LangGraph State ์ค๊ณ
StateGraph์ ์ํ ๊ด๋ฆฌ
TypedDict๋ก ์ํ ์คํค๋ง ์ ์ ํ์
์ด๋ฉ์ผ ์๋ณธ, KoELECTRA ์ค์ฝ์ด, ์คํธ ํ๋ณด ์ฌ๋ถ, ์ต์ข
๊ฒฐ๊ณผ ๋ฑ์ ๋ด์ ํ๋ ๊ตฌ์ฑ
๊ฐ ๋
ธ๋๊ฐ ์ด ์ํ๋ฅผ ์ฝ๊ณ ์
๋ฐ์ดํธํ๋ฉด์ ์งํ
3. ๋
ธ๋ ํจ์ ๊ตฌ์ฑ
์ฒซ ๋ฒ์งธ ๋
ธ๋: KoELECTRA ๊ฒ์ดํธ์จ์ด
์
๋ ฅ๋ฐ์ ์ด๋ฉ์ผ ํ
์คํธ๋ฅผ KoELECTRA๋ก ์ถ๋ก
์คํธ ๊ฐ๋ฅ์ฑ ์ค์ฝ์ด ๊ณ์ฐ (0~1 ํ๋ฅ ๊ฐ)
์๊ณ๊ฐ ์ค์ (์: 0.3 ์ด์์ด๋ฉด ์ ๋ฐ ๊ฒ์ฌ ํ์)
State์ ํ๋ณ ๊ฒฐ๊ณผ์ ์ค์ฝ์ด ์ ์ฅ
๋ ๋ฒ์งธ ๋
ธ๋: EXAONE ์ ๋ฐ ๊ฒ์ฌ
KoELECTRA๊ฐ ์คํธ ํ๋ณด๋ก ํ๋จํ ๊ฒฝ์ฐ์๋ง ์คํ
EXAONE ๋ชจ๋ธ๋ก ์์ธ ๋ถ์ ์ํ
์คํธ ์ฌ๋ถ, ์ ๋ขฐ๋, ๋ถ์ ๊ทผ๊ฑฐ๋ฅผ State์ ์ ์ฅ
์ธ ๋ฒ์งธ ๋
ธ๋: ๋ฐ์ดํจ์ค ์ฒ๋ฆฌ
KoELECTRA๊ฐ ์ ์ ๋ฉ์ผ๋ก ํ๋จํ ๊ฒฝ์ฐ
EXAONE ํธ์ถ ์์ด ๋ฐ๋ก ์ ์ ๋ฉ์ผ๋ก ๊ฒฐ๋ก
4. ๋ผ์ฐํ
๋ก์ง (ํต์ฌ!)
Conditional Edge ์ค์
KoELECTRA ๋
ธ๋ ์คํ ํ State๋ฅผ ํ์ธ
์คํธ ํ๋ณด ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค์ ๋
ธ๋ ๊ฒฐ์
is_spam_candidate == True → EXAONE ๋
ธ๋๋ก
is_spam_candidate == False → ๋ฐ์ดํจ์ค ๋
ธ๋๋ก
5. ๊ทธ๋ํ ๊ตฌ์ฑ ์์
StateGraph ์์ฑ ๋ฐ ๋น๋
StateGraph ์ธ์คํด์ค ์์ฑ (State ํ์
์ง์ )
๊ฐ ๋
ธ๋ ํจ์๋ฅผ add_node๋ก ๋ฑ๋ก
set_entry_point๋ก ์์ ๋
ธ๋ ์ง์ (KoELECTRA)
add_conditional_edges๋ก ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ์ค์
์ข
๋ฃ ๋
ธ๋๋ค์ add_edge๋ก END ์ฐ๊ฒฐ
compile()๋ก ์คํ ๊ฐ๋ฅํ ๊ทธ๋ํ ์์ฑ
6. FastAPI ํตํฉ
์๋ํฌ์ธํธ ๊ตฌ์ฑ
POST /spam-check ์๋ํฌ์ธํธ ์์ฑ
Request Body๋ก ์ด๋ฉ์ผ ํ
์คํธ ๋ฐ๊ธฐ
์ด๊ธฐ State ๊ฐ์ฒด ์์ฑํ์ฌ ๊ทธ๋ํ์ ์ ๋ฌ
graph.invoke(initial_state) ์คํ
์ต์ข
State์ ๊ฒฐ๊ณผ๋ฅผ JSON ์๋ต์ผ๋ก ๋ฐํ
๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ณ ๋ ค์ฌํญ
LangGraph๋ ๋๊ธฐ/๋น๋๊ธฐ ๋ชจ๋ ์ง์
FastAPI์ async def์ ํจ๊ป ์ฌ์ฉ ์ await graph.ainvoke() ์ฌ์ฉ
๋ชจ๋ธ ์ถ๋ก ์ด ๋ฌด๊ฑฐ์ฐ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ํ์คํฌ ๊ณ ๋ ค
7. ์ฑ๋ฅ ์ต์ ํ ํฌ์ธํธ
๊ฒ์ดํธ์จ์ด ํจ์จ์ฑ
KoELECTRA๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ๋ชจ๋ธ์ด๋ฏ๋ก ๋ชจ๋ ์์ฒญ 1์ฐจ ํํฐ๋ง
์ ์ ๋ฉ์ผ์ ๊ฒฝ์ฐ EXAONE ํธ์ถ ์๋ต์ผ๋ก ์๋ต ์๊ฐ ๋จ์ถ
์๊ณ๊ฐ ํ๋์ผ๋ก ์ ๋ฐ๋/์๋ ํธ๋ ์ด๋์คํ ์กฐ์
๋ชจ๋ธ ๋ก๋ฉ
์ฑ ์์ ์ ๋ ๋ชจ๋ธ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋
FastAPI์ lifespan ์ด๋ฒคํธ ํ์ฉ
๋๋ ์์กด์ฑ ์ฃผ์
์ผ๋ก ์ฑ๊ธํค ํจํด ๊ตฌํ
8. ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น
State ์ถ์
๊ฐ ๋
ธ๋ ์คํ ์ ๋ก๊ทธ ๊ธฐ๋ก
KoELECTRA ์ค์ฝ์ด ๋ถํฌ ๋ชจ๋ํฐ๋ง
EXAONE ํธ์ถ ๋น๋ ์ถ์ ํ์ฌ ๊ฒ์ดํธ์จ์ด ํจ์จ์ฑ ํ๊ฐ
์ด๋ฐ ๊ตฌ์กฐ๋ก ๋ ์์ด์ ํธ๋ฅผ ์ฐ๊ฒฐํ๋ฉด, KoELECTRA๊ฐ ํจ์จ์ ์ธ 1์ฐจ ํํฐ ์ญํ ์ ํ๊ณ , EXAONE์ ์์ฌ์ค๋ฌ์ด ์ผ์ด์ค๋ง ์ ๋ฐ ๋ถ์ํ๋ 2๋จ๊ณ ํ์ดํ๋ผ์ธ์ด ์์ฑ๋ฉ๋๋ค.
๋ชจ๋ธ ์ ์ข ๋ฅ์ ๋ถ๋ฆฌํ๋ ํ๋กฌํํธ
.py (23-54) ์ด ์ค์์ ์ํ๊ด๋ฆฌ ๋ชจ๋ธ ์ @app/service/verdict_agent/state_model.py ๋ก ์ด๋ํ๊ณ , ํด๋์ค ์ด๋ฆ์ ์ ๋ฏธ์ฌ๋ฅผ state ๋ก ์ง์ ํด ์ฃผ๊ณ , ๋๋จธ์ง๋ ๊ทธ๋๋ก @app/service/verdict_agent/base_model.py ์ ์ด๋์ํค๊ณ , import ๋ ์๋ ์์ ํด์ค.
์์ด์ ํธ๋ฅผ ์์ฌ์์ ํด๋ก ๋ฉํํ๋ ์ฝ๋ @app/service/verdict_agent/graph.py ์ฌ๊ธฐ์ ๋ญ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ด๋ฐ @app/router/mcp_router.py ์์ด์ ํธ๋ฅผ ์์ฌ์์ ํด๋ก ๋ฉํํ๋ ์ฝ๋๋ฅผ ์ญ์ฑํด์ค.
'Project ESG+AI > [์ผ์ KPMG]ESG ๋ฐ์ดํฐ ํ์ฉ ํ์คํ ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 51์ผ์ฐจ. (0) | 2025.12.24 |
|---|---|
| 49์ผ์ฐจ. (0) | 2025.12.19 |
| 47์ผ์ฐจ. ํ๋ก์ ํธ์ ๋ง์ถฐ์ AI ๋ชจ๋ธ ์ ํํ๊ณ ์ค์ ํ๊ธฐ (1) | 2025.12.18 |
| 46์ผ์ฐจ. (1) | 2025.12.16 |
| 45์ผ์ฐจ. (0) | 2025.12.15 |