rmdetect / ARCHITECTURE.md
reasonofmoon's picture
Upload folder using huggingface_hub
dba8f4c verified
|
Raw
History Blame Contribute Delete
9.22 kB
# RM-DETECT โ€” ๊ธฐ์ˆ  ์•„ํ‚คํ…์ฒ˜ ์„ค๋ช…์„œ
> AI ์ž‘์„ฑ ํ…์ŠคํŠธ ํŒ๋ณ„๊ธฐ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ๋ฐ์ดํ„ฐ ํ๋ฆ„, ํ”ผ์ฒ˜ ์‚ฌ์–‘, ๋ชจ๋ธ, API, ๋ฐฐํฌ๋ฅผ ์ •๋ฆฌํ•œ ๊ธฐ์ˆ  ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.
> ๊ฐœ์š”๋Š” [README](README.md)๋ฅผ, ์•„๋ž˜๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
![RM-DETECT architecture](docs/architecture.png)
---
## 1. ๊ฐœ์š”
RM-DETECT๋Š” ์ž…๋ ฅ ํ…์ŠคํŠธ๊ฐ€ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด๋ชจ๋ธ(LLM)๋กœ ์ž‘์„ฑ๋์„ ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”์ •ํ•˜๋Š” **๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ํŒ๋ณ„๊ธฐ**์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์ƒํ˜ธ ๋ณด์™„์  ์‹ ํ˜ธ๋ฅผ ํ•˜๋‚˜์˜ ๋ถ„๋ฅ˜๊ธฐ๋กœ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค:
- **ํ† ํฐ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ(perplexity)** โ€” LLM์ด ๋งŒ๋“  ๊ธ€์€ ๋” "์˜ˆ์ธก ๊ฐ€๋Šฅ"ํ•˜๋‹ค๋Š”, AI ํ…์ŠคํŠธ ํƒ์ง€ ๋ฌธํ—Œ(GLTR, DetectGPT ๋“ฑ)์—์„œ ํ™•๋ฆฝ๋œ ์›๋ฆฌ
- **๋ฌธ์ฒดยทํ†ต๊ณ„ ๋ถ„์„(stylometry)** โ€” ์–ธ์–ด๋ชจ๋ธ ์—†์ด ๊ณ„์‚ฐํ•˜๋Š” ๋ฌธ์žฅ ๋ฆฌ๋“ฌยท์–ดํœ˜ยท๋ฌธ์žฅ๋ถ€ํ˜ธยท์–ด๋ฏธ ํŠน์ง•
ํ•œ๊ตญ์–ด์™€ ์˜์–ด๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฉฐ, ๋ฌธ์„œ ์ „์ฒด ์ ์ˆ˜์™€ **๋ฌธ๋‹จ๋ณ„ ์ ์ˆ˜**๋ฅผ ๋™์‹œ์— ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ถ”๋ก ์ด ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜์–ด **์™ธ๋ถ€ ์œ ๋ฃŒ API๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
---
## 2. ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ
```
rmdetect/
โ”œโ”€โ”€ app.py # FastAPI ๋ฐฑ์—”๋“œ + RMDetector ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
โ”œโ”€โ”€ aidetect/ # ํƒ์ง€ ์—”์ง„ (ํ”„๋ ˆ์ž„์›Œํฌ ๋…๋ฆฝ)
โ”‚ โ”œโ”€โ”€ perplexity.py # โ‘  ํ† ํฐ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ (GPT-2 / KoGPT2)
โ”‚ โ”œโ”€โ”€ stylometry.py # โ‘ก ๋ฌธ์ฒดยทํ†ต๊ณ„ ํ”ผ์ฒ˜ (model-free)
โ”‚ โ”œโ”€โ”€ langid.py # ์–ธ์–ด ๊ฐ์ง€ (Hangul-ratio router)
โ”‚ โ”œโ”€โ”€ features.py # โ‘ +โ‘ก ๋ณ‘ํ•ฉ โ†’ 28์ฐจ์› ๋ฒกํ„ฐ
โ”‚ โ””โ”€โ”€ __init__.py
โ”œโ”€โ”€ ai_detector_model.joblib # ํ•™์Šต๋œ ๋ถ„๋ฅ˜๊ธฐ (StandardScaler + LogReg)
โ”œโ”€โ”€ static/ # ๋‹จ์ผ ํŽ˜์ด์ง€ ์›น UI
โ”‚ โ”œโ”€โ”€ index.html
โ”‚ โ”œโ”€โ”€ app.js
โ”‚ โ””โ”€โ”€ style.css
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ run.sh # ๋กœ์ปฌ ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ
โ””โ”€โ”€ Dockerfile # ์ปจํ…Œ์ด๋„ˆ/HF Spaces ๋ฐฐํฌ
```
๊ณ„์ธต์€ ์„ธ ๊ฒน์ž…๋‹ˆ๋‹ค: **UI(static) โ†’ API(app.py) โ†’ ์—”์ง„(aidetect)**. ์—”์ง„์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ CLIยท๋ฐฐ์น˜ยท๋‹ค๋ฅธ ์„œ๋น„์Šค์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
---
## 3. ์š”์ฒญ ์ฒ˜๋ฆฌ ํ๋ฆ„ (`POST /detect`)
1. **์–ธ์–ด ๊ฐ์ง€** โ€” `langid.detect_lang()` ๊ฐ€ ํ•œ๊ธ€/๋ผํ‹ด ๋ฌธ์ž ๋น„์œจ๋กœ `ko`/`en` ํŒ์ • (์š”์ฒญ์— `lang`์ด ๋ช…์‹œ๋˜๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ).
2. **๋ฌธ๋‹จ ๋ถ„ํ• ** โ€” ๋นˆ ์ค„ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ๋‹จ์„ ๋‚˜๋ˆ„๋˜, ๊ฐ ๋ฌธ๋‹จ์˜ **์›๋ฌธ ๋ฌธ์ž ์˜คํ”„์…‹ `(start, end)`** ์„ ๋ณด์กด. ์ด ์˜คํ”„์…‹ ๋•๋ถ„์— UI๊ฐ€ ์›๋ฌธ์˜ ์ •ํ™•ํ•œ ๊ตฌ๊ฐ„์„ ํ•˜์ด๋ผ์ดํŠธํ•  ์ˆ˜ ์žˆ์Œ.
3. **ํ”ผ์ฒ˜ ์ถ”์ถœ** โ€” ๋ฌธ์„œ ์ „์ฒด์™€ ๊ฐ ๋ฌธ๋‹จ์— ๋Œ€ํ•ด `features.full_features()` ๋ฅผ ํ˜ธ์ถœํ•ด 28์ฐจ์› ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“ฆ.
4. **๋ถ„๋ฅ˜** โ€” `StandardScaler โ†’ LogisticRegression` ํŒŒ์ดํ”„๋ผ์ธ์ด AI ํ™•๋ฅ ์„ ์‚ฐ์ถœํ•˜๊ณ , ํŒ์ • ๋ฐด๋“œ์— ๋งคํ•‘.
5. **๊ธฐ์—ฌ ์‹ ํ˜ธ ๊ณ„์‚ฐ** โ€” ๊ฐ ํ”ผ์ฒ˜์˜ ํ‘œ์ค€ํ™” ๊ฐ’ ร— ํšŒ๊ท€ ๊ณ„์ˆ˜๋กœ "์ด ํŒ์ •์„ AI/์ธ๊ฐ„ ์ชฝ์œผ๋กœ ๋ฏผ ์ƒ์œ„ ์‹ ํ˜ธ"๋ฅผ ์ถ”์ถœ.
6. **์‘๋‹ต ์ง๋ ฌํ™”** โ€” ๋ฌธ์„œ ์ ์ˆ˜ + ๋ฌธ๋‹จ ๋ฐฐ์—ด(์˜คํ”„์…‹ยทํ™•๋ฅ ยทํŒ์ •ยทflaggedยท์ƒ์œ„ ์‹ ํ˜ธ)์„ JSON์œผ๋กœ ๋ฐ˜ํ™˜.
๋ฌธ๋‹จ์ด `paragraph_min_chars`(๊ธฐ๋ณธ 30์ž)๋ณด๋‹ค ์งง์œผ๋ฉด `low_confidence=true`๋กœ ํ‘œ์‹œํ•˜๊ณ  flagged ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
---
## 4. ์‹ ํ˜ธ ๊ณ„์—ด โ‘  โ€” ํ† ํฐ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ (`perplexity.py`)
์ž‘์€ causal LM์„ ์–ธ์–ด๋ณ„๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค: ์˜์–ด **GPT-2**, ํ•œ๊ตญ์–ด **KoGPT2(skt/kogpt2-base-v2)**, ๊ฐ๊ฐ ~125M ํŒŒ๋ผ๋ฏธํ„ฐ.
- **์›๋ฆฌ** โ€” LLM์€ ๋‹ค์Œ ํ† ํฐ์œผ๋กœ ๋†’์€ ํ™•๋ฅ ์˜ ํ† ํฐ์„ ๊ณ ๋ฅด๋ฏ€๋กœ, ๊ธฐ๊ณ„ ์ƒ์„ฑ ํ…์ŠคํŠธ๋Š” perplexity๊ฐ€ ๋‚ฎ๊ณ  ๋ชจ๋ธ์ด ์ƒ์œ„๋กœ ๊ผฝ์•˜์„ ํ† ํฐ์˜ ๋น„์œจ(top-k ์ ์ค‘๋ฅ )์ด ๋†’์Œ. ์ธ๊ฐ„ ๊ธ€์€ "burstier"ํ•ด์„œ ๋‚ฎ์€ ํ™•๋ฅ ์˜ ๋‹จ์–ด๋ฅผ ๋” ์ž์ฃผ ์”€.
- **์‚ฐ์ถœ ํ”ผ์ฒ˜** (6๊ฐœ): `ppl`, `log_ppl`, `mean_logprob`, `std_logprob`, `median_logprob`, `topk_hit_rate`
- **๊ธด ๋ฌธ์„œ ์ฒ˜๋ฆฌ** โ€” ์ปจํ…์ŠคํŠธ ์ฐฝ(โ‰ค1024 ํ† ํฐ)์„ ๋„˜๋Š” ํ…์ŠคํŠธ๋Š” **sliding window**๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒน์น˜๋Š” ๊ตฌ๊ฐ„์„ ๋งˆ์Šคํ‚นํ•ด ์ค‘๋ณต ์ง‘๊ณ„๋ฅผ ๋ฐฉ์ง€.
- **๋ชจ๋ธ ๋กœ๋”ฉ** โ€” ๋กœ์ปฌ `models/gpt2`ยท`models/kogpt2`๊ฐ€ ์žˆ์œผ๋ฉด ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋กœ๋“œ, ์—†์œผ๋ฉด HuggingFace ํ—ˆ๋ธŒ์—์„œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ(์˜ˆ: HF Spaces ์ฒซ ์‹คํ–‰).
---
## 5. ์‹ ํ˜ธ ๊ณ„์—ด โ‘ก โ€” ๋ฌธ์ฒดยทํ†ต๊ณ„ (`stylometry.py`)
์–ธ์–ด๋ชจ๋ธ์ด ํ•„์š” ์—†๋Š” 22๊ฐœ ํ”ผ์ฒ˜. ํ•œ๊ตญ์–ดยท์˜์–ด ๋ชจ๋‘์— ๋™์ž‘ํ•˜๋Š” ์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ๋ฌธ์žฅ ๋ถ„ํ• ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
| ๊ทธ๋ฃน | ํ”ผ์ฒ˜ | ์‹ ํ˜ธ ๋ฐฉํ–ฅ |
|---|---|---|
| ๋ฌธ์žฅ ๋ฆฌ๋“ฌ | `burstiness`, `cv_sent_len`, `std_sent_len`, `mean_sent_len`, `mean_succ_diff`, `n_sents` | ์ธ๊ฐ„์€ ๋ฌธ์žฅ ๊ธธ์ด ๋ณ€๋™์ด ํผ; AI๋Š” ๊ท ์ผ |
| ์–ดํœ˜ | `type_token_ratio`, `rep_bigram_rate`, `word_entropy`, `avg_word_len` | AI๋Š” ์ ‘์† ๊ตฌ์กฐ๋ฅผ ๋ฐ˜๋ณต |
| ๋ฌธ์žฅ๋ถ€ํ˜ธ | `excl_per100`, `ques_per100`, `ellipsis_per100`, `comma_per100`, `quote_per100`, `emoji_per100`, `punct_variety` | ์ธ๊ฐ„์€ `!!`, `โ€ฆ`, ์ด๋ชจ์ง€ ์‚ฌ์šฉ โ†‘ |
| ๊ตฌ์–ด์ฒด | `informal_per100` (ใ…‹ใ…‹, lol, ์ง„์งœโ€ฆ) | ์ธ๊ฐ„ ์‹ ํ˜ธ |
| ์ ‘์†์–ด | `connective_per100` (์ข…ํ•ฉ์ ์œผ๋กœ, ๋”ฐ๋ผ์„œ, furthermoreโ€ฆ) | AI ์‹ ํ˜ธ |
| ํ•œ๊ตญ์–ด ์–ด๋ฏธ | `ko_formal_per100`, `ko_casual_per100`, `ko_formal_minus_casual` | ๊ฒฉ์‹์ฒด(ํ•˜์˜€์Šต๋‹ˆ๋‹ค)๋Š” AI ์ชฝ, ๊ตฌ์–ด์ฒด(~ํ–ˆ์Œ)๋Š” ์ธ๊ฐ„ ์ชฝ |
---
## 6. ๋ถ„๋ฅ˜๊ธฐ (`ai_detector_model.joblib`)
- **๊ตฌ์กฐ** โ€” scikit-learn `Pipeline([StandardScaler, LogisticRegression(class_weight="balanced")])`
- **์ž…๋ ฅ** โ€” `FEATURE_ORDER`๋กœ ๊ณ ์ •๋œ **28์ฐจ์›** ๋ฒกํ„ฐ (perplexity 6 + stylometry 22)
- **์„ฑ๋Šฅ** โ€” ๋ณด์ • ๋ฐ์ดํ„ฐ์…‹์—์„œ **5-fold ๊ต์ฐจ๊ฒ€์ฆ ์ •ํ™•๋„ 97.2%, AUC 0.994** (ํ•œ๊ตญ์–ด 100%, ์˜์–ด 93.8%)
- **์„ค๋ช… ๊ฐ€๋Šฅ์„ฑ** โ€” ์„ ํ˜• ๋ชจ๋ธ์ด๋ผ ๊ฐ ํ”ผ์ฒ˜์˜ (ํ‘œ์ค€ํ™” ๊ฐ’ ร— ๊ณ„์ˆ˜) ๊ธฐ์—ฌ๋„๋ฅผ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ. ์ธก์ •๋œ ์ƒ์œ„ ์‹ ํ˜ธ: ์ธ๊ฐ„ ์ชฝ์€ ๊ตฌ์–ด์ฒดยท์ธ์šฉ๋ถ€ํ˜ธยท๋ง์ค„์ž„ํ‘œ ๋ฐ€๋„์™€ ๋ฌธ์žฅ burstiness, AI ์ชฝ์€ ํ•œ๊ตญ์–ด ๊ฒฉ์‹ ์–ด๋ฏธยท๊ธด ๋‹จ์–ดยท๊ท ์ผํ•œ ๋ฌธ์žฅ ๋ฆฌ๋“ฌ.
---
## 7. ํŒ์ • ๋ฐด๋“œ
| AI ํ™•๋ฅ  | verdict | ๋ฌธ๋‹จ flagged |
|---|---|---|
| โ‰ฅ 0.85 | AI-generated | โœ“ |
| โ‰ฅ 0.60 | Likely AI | โœ“ |
| โ‰ฅ 0.40 | Mixed | |
| โ‰ฅ 0.15 | Likely human | |
| < 0.15 | Human-written | |
๋ฌธ๋‹จ์€ `ai_probability โ‰ฅ 0.60` ์ด๊ณ  `low_confidence`๊ฐ€ ์•„๋‹ ๋•Œ **flagged**(์˜์‹ฌ ์˜์—ญ)๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
---
## 8. API ๋ ˆํผ๋Ÿฐ์Šค
### `GET /health`
```json
{ "status": "ok", "model_loaded": true, "load_error": null, "uptime_s": 159.9, "max_chars": 20000 }
```
### `POST /detect`
์š”์ฒญ:
```json
{ "text": "๊ฒ€์‚ฌํ•  ๊ธ€ ...", "lang": "ko" }
```
`lang`์€ ์„ ํƒ(`"ko"` | `"en"` | ์ƒ๋žต ์‹œ ์ž๋™ ๊ฐ์ง€). ์‘๋‹ต(์š”์•ฝ):
```jsonc
{
"language": "ko",
"overall_ai_probability": 0.50,
"verdict": "Mixed",
"n_paragraphs": 3,
"n_flagged": 1,
"top_features": [ {"feature": "informal_per100", "contribution": -1.17, "direction": "human"} ],
"paragraphs": [
{ "index": 0, "start": 0, "end": 40, "text": "...",
"ai_probability": 0.35, "verdict": "Likely human",
"flagged": false, "low_confidence": false, "top_features": [ ... ] }
],
"elapsed_ms": 2640.3
}
```
**์˜ค๋ฅ˜ ์‘๋‹ต**: ๋นˆ ์ž…๋ ฅ `400` ยท ์ž˜๋ชป๋œ `lang` `400` ยท 20000์ž ์ดˆ๊ณผ `413` ยท ๋ชจ๋ธ ๋ฏธ๋กœ๋”ฉ `503`.
---
## 9. ์›น UI (`static/`)
์˜์กด์„ฑ ์—†๋Š” ์ˆœ์ˆ˜ HTML/CSS/๋ฐ”๋‹๋ผ JS. ํ…์ŠคํŠธ ์ž…๋ ฅ โ†’ `fetch("/detect")` โ†’ ๊ฒฐ๊ณผ ๋ Œ๋”:
- ์ „์ฒด AI ํ™•๋ฅ ์„ SVG ๋„๋„› ๊ฒŒ์ด์ง€ + verdict๋กœ ํ‘œ์‹œ
- ๋ฌธ์„œ ์ˆ˜์ค€ ์ƒ์œ„ ๊ธฐ์—ฌ ์‹ ํ˜ธ๋ฅผ ์นฉ์œผ๋กœ ํ‘œ์‹œ
- ๋ฌธ๋‹จ์„ ํ™•๋ฅ ์— ๋”ฐ๋ผ ์ดˆ๋กโ†’๋…ธ๋ž‘โ†’๋นจ๊ฐ•์œผ๋กœ ์ƒ‰์ƒ ๋“ฑ๊ธ‰ํ™”ํ•œ ์นด๋“œ๋กœ ์žฌํ˜„, ์นด๋“œ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๊ทธ ๋ฌธ๋‹จ์˜ ์ƒ์œ„ ์‹ ํ˜ธ๊ฐ€ ํŽผ์ณ์ง
- ํ•œ๊ตญ์–ดยท์˜์–ด ๋ผ๋ฒจ ๋ณ‘๊ธฐ, Cmd/Ctrl+Enter ๋‹จ์ถ•ํ‚ค
---
## 10. ๋ฐฐํฌ
### ๋กœ์ปฌ
```bash
pip install -r requirements.txt
./run.sh # http://127.0.0.1:8000
```
๋กœ์ปฌ `models/`๊ฐ€ ์žˆ์œผ๋ฉด ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ฆ‰์‹œ ๋กœ๋“œ, ์—†์œผ๋ฉด ํ—ˆ๋ธŒ์—์„œ ๋ชจ๋ธ์„ ๋ฐ›์Œ.
### Docker / Hugging Face Spaces
`Dockerfile`์€ HF Spaces ๊ทœ๊ฒฉ(๋น„๋ฃจํŠธ UID 1000, ํฌํŠธ 7860, HF ์บ์‹œ ๊ฒฝ๋กœ)์— ๋งž์ถฐ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. `README.md` ์ƒ๋‹จ์˜ YAML ํ—ค๋”(`sdk: docker`, `app_port: 7860`)๋กœ Spaces๊ฐ€ ์„ค์ •์„ ์ฝ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—๋Š” ์ฝ”๋“œ๋งŒ ๋‹ด๊ณ , ์–ธ์–ด๋ชจ๋ธ์€ ์ฒซ ์‹คํ–‰ ์‹œ ํ—ˆ๋ธŒ์—์„œ ๋ฐ›์•„ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค.
---
## 11. ํ•œ๊ณ„
- **์ž‘์€ ๋ณด์ •์…‹(n=36)** ๊ณผ **LLM์ด ๋ชจ์‚ฌํ•œ "์ธ๊ฐ„" ์ƒ˜ํ”Œ** โ€” ํ˜•์‹์ ์ธ ์‹ค์ œ ์ธ๊ฐ„ ๊ธ€(๋…ผ๋ฌธ, ์ •์ œ๋œ ์ž๊ธฐ์†Œ๊ฐœ์„œ)์€ ์‹ค์ œ๋ณด๋‹ค ๋” ์ž์ฃผ ์˜คํƒ๋  ์ˆ˜ ์žˆ์Œ.
- **์ž‘์€ ์ฐธ์กฐ LM(GPT-2/KoGPT2, ~125M)** โ€” ๋” ํฌ๊ฑฐ๋‚˜ instruction-tuned ๋ชจ๋ธ์ด๋ฉด perplexity ์‹ ํ˜ธ๊ฐ€ ๋” ์„ ๋ช…ํ•ด์ง.
- **ํŒจ๋Ÿฌํ”„๋ ˆ์ด์ฆˆ์— ์ทจ์•ฝ** โ€” burstinessยท๊ตฌ์–ด์ฒด์— ๋ฐ˜์‘ํ•˜๋ฏ€๋กœ, ๊ตฌ์–ด์ฒด๋ฅผ ์„ž๊ณ  ๋ฌธ์žฅ ๊ธธ์ด๋ฅผ ํฉ๋œจ๋ฆฌ๋Š” "ํœด๋จธ๋‚˜์ด์ง•" ํŽธ์ง‘์ด AI ์ ์ˆ˜๋ฅผ ๋‚ฎ์ถค.
- **CPU ์ง€์—ฐ** โ€” ๋ฉ€ํ‹ฐ์ฝ”์–ด์—์„œ ์š”์ฒญ๋‹น 1~2์ดˆ, ๊ณต์œ  ๋ฌด๋ฃŒ CPU์—์„œ๋Š” ๋” ๋А๋ฆผ.
RM-DETECT๋Š” **์—ฐ๊ตฌ์šฉ ํ”„๋กœํ† ํƒ€์ž…**์ด๋ฉฐ ํ™•๋ฅ ์  ์ถ”์ •์ž…๋‹ˆ๋‹ค. ํ•™๋ฌธ์  ๋ถ€์ •ํ–‰์œ„ยท์ฑ„์šฉ ๋“ฑ ์ค‘๋Œ€ํ•œ ๊ฒฐ์ •์˜ ๋‹จ๋… ๊ทผ๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ , ์—ฌ๋Ÿฌ ์‹ ํ˜ธ ์ค‘ ํ•˜๋‚˜๋กœ๋งŒ ํ™œ์šฉํ•˜์„ธ์š”.