Smoothie-Qwen3-8B-DTRO-Edition
๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ์ ๋ ฅ์ค๋น ์ ๋ฌธ๊ฐ AI ๋ชจ๋ธ
Fine-tuned for Daegu Metro Line 3 Power Facility Expert System
๐ฏ ๋ชจ๋ธ ๊ฐ์
๋ณธ ๋ชจ๋ธ์ ์ฅ์ ๋ถ์ ํ๋ก๊ทธ๋จ์์ RAG(๊ฒ์ ์ฆ๊ฐ ์์ฑ)์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์ ๋ ฅ์ค๋น ์ ๋ฌธ AI ๋ชจ๋ธ์ ๋๋ค.
๊ฐ๋ฐ ์๋
- ๋ฌธ์ ์ธ์: RAG๋ง์ผ๋ก๋ ์ ํ๋์ ์ ๋ฌธ์ฑ์ด ๋ถ์กฑ
- ํต์ฌ ์์ด๋์ด: ํ์ธํ๋ + RAG ๊ฒฐํฉ์ผ๋ก ์๋์ง ์ฐฝ์ถ
- ๋ชฉ์ : ์ฅ์ ๋ถ์ ํ๋ก๊ทธ๋จ์์ ํธ์ถ ์ ์ ๋ฌธ๊ฐ ์์ค์ ์ ํํ ๋ต๋ณ ์์ฑ
- ๊ฐ๋ฐ ์ฃผ์ฒด: ๊ฐ์ธ ์ฐ๊ตฌ ๊ฒฐ๊ณผ๋ฌผ (๋๊ตฌ๊ตํต๊ณต์ฌ ๊ณต์ ์ ์ฅ๊ณผ ๋ฌด๊ด)
์ฃผ์ ํน์ง
- โ ๋๋ฉ์ธ ์ ๋ฌธ์ฑ: ์ ๋ ฅ๊ณํต, ๊ธ์ ๊ณํต, ์ ์ฐจ์ ๋ก, ์๋ฐฐ์ ์ค๋น, ๋ณ์ ์ ์ด์ ๊ด๋ฆฌ
- โ ์ค์ ๊ฒ์ฆ ์๋ฃ: Gemma-3n-4EB ๋๋น ์ฐ์ํ ์ฑ๋ฅ ํ์ธ
- โ ํ์ฅ ํนํ: ์ค์ ์ฅ๋น๋ช (K50, DCP2, RTU HUB ๋ฑ) ๋ฐ ์ด์ ํ๋ผ๋ฏธํฐ ๋ฐ์
- โ ์ฆ์ ํ์ฉ ๊ฐ๋ฅ: ์ฅ์ ๋ถ์, ์์ธ ์ง๋จ, ์กฐ์น ๋ฐฉ๋ฒ ์๋ด
- โ ์์ ํ๊ธ ์๋ต: ํ์ ์์ด ์ดํดํ๊ธฐ ์ฌ์ด ํ๊ธ๋ก ๋ต๋ณ
๊ฐ๋ฐ ๋ฐฐ๊ฒฝ
4์ฐจ๋ก์ ํ์ธํ๋ ์๋ ๋์ ์ฑ๊ณตํ ๋ชจ๋ธ์ ๋๋ค:
| ์๋ | ๋ชจ๋ธ | ๊ฒฐ๊ณผ | ๋น๊ณ |
|---|---|---|---|
| 1์ฐจ | Gemma-3n-4EB | โ ์คํจ | ํ์ธํ๋ ์คํจ |
| 2์ฐจ | kanana-1.5-2.1b | โ ์คํจ | ๋ต๋ณ ํ์ง ๋ถ๋ |
| 3์ฐจ | Llama3 Bllossom-3B | โ ์คํจ | ๋ต๋ณ ๋ฏธ์์ฑ |
| 4์ฐจ | Smoothie-Qwen3-8B | โ ์ฑ๊ณต | Gemma-3n-4EB ๋๋น ์ฐ์ |
๐ธ ๊ฐ๋ฐ ๋นํ์ธ๋ ์คํ ๋ฆฌ
- ๊ฐ๋ฐ ํ๊ฒฝ: ์ง์์ ๊ฐ์ธ GPU๋ก ํ์ต
- ์ ๋ ฅ ์๋น: 1~3์ฐจ ์๋ ์ ์ 1,000kWh ์ ๊ธฐ ์ฌ์ฉ (์ ๊ธฐ๋ฃ ๋ถ๋ด)
- ์ค๋จ ๊ธฐ๊ฐ: ์ ๊ธฐ๋ฃ ๋ถ๋ด์ผ๋ก ํ๋์ ์๋ ์ค๋จ
- ์ฌ๊ฐ ๊ณ๊ธฐ: 2026๋ 1์ 11์ผ ๊ฒจ์ธ, ๋๋ฐฉ ๊ฒธ์ฉ์ผ๋ก GPU ๊ฐ๋ ๐
- 4์ฐจ ์๋: ๊ฒจ์ธ์ฒ ์ ๊ธฐ ํํฐ ๋์ GPU ํ์ต์ผ๋ก ์ผ์์ด์กฐ
- ์ต์ข ์ฑ๊ณต: RTX 3080 Ti๋ก ์ฝ 4์๊ฐ ํ์ต ์๋ฃ
ํต์ฌ ์ธ์ฌ์ดํธ (๊ฐ์ธ ์ฐ๊ตฌ ์ฑ๊ณผ)
"๊ธฐ์ ์ง์์ผ๋ก ํ์ธํ๋ + ๋์ผ ๊ธฐ์ ์ง์์ผ๋ก RAG ๋ถ์ = ์ต์ ์ ์๋์ง"
- ํ์ธํ๋: ๋๋ฉ์ธ ์ง์ ๋ด์ฌํ (Long-term Memory)
- RAG: ์ค์๊ฐ ์ปจํ ์คํธ ๋ณด๊ฐ (Short-term Memory)
- ์๋์ง: RAG ๋จ๋ ๋๋น ์ ํ๋ ๋ฐ ์ ๋ฌธ์ฑ ๋น์ฝ์ ํฅ์
- ์ ์ฉ: ์ฅ์ ๋ถ์ ํ๋ก๊ทธ๋จ์์ ์ค์๊ฐ ํธ์ถํ์ฌ ์ฌ์ธต ๋ถ์ ์ํ
๐ ์ฑ๋ฅ ๋น๊ต
์๋ณธ ๋ชจ๋ธ vs ํ์ธํ๋ ๋ชจ๋ธ
| ๋น๊ต ํญ๋ชฉ | ์๋ณธ ๋ชจ๋ธ | ํ์ธํ๋ ๋ชจ๋ธ |
|---|---|---|
| ์ฃผ์ ํน์ง | ๋ ผ๋ฆฌ์ ๊ตฌ์กฐ์ ํ์ค ๊ธฐ์ ์ฉ์ด ์ค์ฌ | ํ์ฅ ํนํ ๋ฐ์ดํฐ ๋ฐ ์ด์ ํ๋ผ๋ฏธํฐ ์ค์ฌ |
| ์ฅ์น ๋ช ์นญ | HSCB, SCADA, PLC ๋ฑ ์ผ๋ฐ ๋ช ์นญ | K50, K10/K11 Port, DCP2, S-RTU ๋ฑ ์์ธ ๋ช ์นญ |
| ๋ถ์ ๊น์ด | ์ ๊ธฐ๊ณตํ์ ํ์ ์ค๋ช ์์ฃผ | ์์คํ ๊ฐ ๋ก์ง ๋ฐ ์ํ์ค ์ํฅ ๋ถ์ |
| ์ค์ฉ์ฑ | ์ ์ /์ผ๋ฐ ์ ๋น์ ๊ต์ก์ฉ์ผ๋ก ์ ํฉ | ์๋ จ๋ ํ์ฅ ์ ๋ฌธ๊ฐ ๋ฐ ์ด์ ์ค๊ณ์ฉ์ผ๋ก ์ ํฉ |
๐ ์์ธ ๋น๊ต ๋ณด๊ณ ์: model_comparison_report.md
ํ ์คํธ ๊ฒฐ๊ณผ ์์
์ง๋ฌธ: "PLC ํต์ ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?"
์๋ณธ ๋ชจ๋ธ:
- ์ผ๋ฐ์ ์ธ ์ ๊ธฐ๊ณตํ ์๋ก ๊ธฐ๋ฐ ๋ต๋ณ
- "๊ณ ์๋์ฐจ๋จ๊ธฐ(HSCB)", "์ ์ฐ ์ ํญ" ๋ฑ ํ์ค ์ฉ์ด ์ฌ์ฉ
ํ์ธํ๋ ๋ชจ๋ธ:
- Master PLC(K50)์ RTU HUB(CU-A) ๊ฐ์ ์ ์ฒด ๋ก์ง ์์ธ ์ค๋ช
- SCADA-FEP-RTU ์ฐ๋ ์ฒด๊ณ ๋ถ์
- "๊ด์ ์์ 89-M_PLC ์ ์ OFF ๋ช ๋ น์ ํตํ ์ ์ฒด ์๋" ๋ฑ ๊ตฌ์ฒด์ ์ด์ ํ ์ ๊ณต
๐ ์ฌ์ฉ๋ฒ
1. Ollama (๊ถ์ฅ)
๊ฐ์ฅ ๊ฐ๋จํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋๋ค.
# ๋ชจ๋ธ ๋ค์ด๋ก๋
ollama pull bluejude10/smoothie-qwen3-8b-dtro
# ์คํ
ollama run bluejude10/smoothie-qwen3-8b-dtro
# ๋ํ ์์
>>> PLC ํต์ ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?
>>> ํ์์ ๋์ ํญ์ฅ์น ์ฅ์ ๋ฐ์ ์ ์ด๋ป๊ฒ ํด์ผ ํ๋์?
>>> DCP2 ์ค์ ๊ฐ์ ์ด๋ป๊ฒ ๋๋์?
2. llama.cpp
GGUF ํ์ผ์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
# GGUF ํ์ผ ๋ค์ด๋ก๋
wget https://huggingface.co/bluejude10/Smoothie-Qwen3-8B-DTRO-Edition/resolve/main/Smoothie-Qwen3-8B-DTRO-Edition-Q4_K_M.gguf
# ์คํ
./llama-cli -m Smoothie-Qwen3-8B-DTRO-Edition-Q4_K_M.gguf \
-p "PLC ํต์ ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?" \
--temp 0.7 \
--top-p 0.9 \
--repeat-penalty 1.1
3. Python (Transformers + PEFT)
LoRA ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ ์ถ๋ก ์ ๋๋ค.
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import torch
# ๋ฒ ์ด์ค ๋ชจ๋ธ ๋ก๋
base_model = AutoModelForCausalLM.from_pretrained(
"dnotitia/Smoothie-Qwen3-8B",
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
)
# ํ ํฌ๋์ด์ ๋ก๋
tokenizer = AutoTokenizer.from_pretrained(
"dnotitia/Smoothie-Qwen3-8B",
trust_remote_code=True
)
# LoRA ์ด๋ํฐ ๋ก๋ (์ ํ์ฌํญ - ์ด๋ํฐ๊ฐ ์
๋ก๋๋ ๊ฒฝ์ฐ)
# model = PeftModel.from_pretrained(base_model, "bluejude10/Smoothie-Qwen3-8B-DTRO-Edition")
# ์ถ๋ก
prompt = """<|im_start|>system
๋น์ ์ ๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ์ ๋ ฅ์ค๋น ์ ๋ฌธ๊ฐ AI ์ด์์คํดํธ์
๋๋ค.
<|im_end|>
<|im_start|>user
ํ์์ ๋์ ํญ์ฅ์น ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?<|im_end|>
<|im_start|>assistant
"""
inputs = tokenizer(prompt, return_tensors="pt").to(base_model.device)
outputs = base_model.generate(
**inputs,
max_new_tokens=512,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.1,
do_sample=True
)
response = tokenizer.decode(outputs[0], skip_special_tokens=False)
print(response)
4. Python (Ollama API)
Ollama๊ฐ ์คํ ์ค์ผ ๋ Python์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import ollama
def analyze_fault(fault_description: str) -> str:
"""์ ๋ ฅ์ค๋น ์ฅ์ ๋ถ์"""
response = ollama.chat(
model='bluejude10/smoothie-qwen3-8b-dtro',
messages=[{
'role': 'user',
'content': f"๋ค์ ์ฅ์ ์ํฉ์ ๋ถ์ํ๊ณ ์กฐ์น ๋ฐฉ๋ฒ์ ์๋ดํด์ฃผ์ธ์:\n\n{fault_description}"
}]
)
return response['message']['content']
# ์ฌ์ฉ ์์
fault = "89-M ๋ณ์ ์์์ PLC ํต์ ์ด์ ์๋์ด ๋ฐ์ํ์ต๋๋ค."
result = analyze_fault(fault)
print(result)
๐ ํ์ต ๋ฐ์ดํฐ
๋ฐ์ดํฐ์ ์ ๋ณด
- ๋ฐ์ดํฐ์ : ๋๊ตฌ๊ตํต๊ณต์ฌ ์ ๋ ฅ์ค๋น ๊ด๋ จ QnA ๋ฐ ๊ด๋ จ ์ฌ๊ท
- ํญ๋ชฉ ์: 1,273๊ฑด
- ํฌ๋งท: Alpaca (instruction, input, output)
- ๋ด์ฉ:
- ์ ๋ ฅ์ค๋น ์ฅ์ ์ ํ ๋ฐ ์์ธ
- ์ ๋ ฅ๊ณํต ์ด์๊ท์ ๋ฑ ๊ด๋ จ ์ฌ๊ท
- ์ฅ์ ๋ฐ์ ์ ์กฐ์น ๋ฐฉ๋ฒ
- ์์ ์์น ๋ฐ ์ด์ ์ ์ฐจ
- ์ฅ๋น๋ณ ์ด์ ํ๋ผ๋ฏธํฐ
๋ฐ์ดํฐ ์์
{
"instruction": "PLC ํต์ ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์ ์ค๋ช
ํ์ธ์.",
"input": "",
"output": "PLC ํต์ ์ฅ์ ๋ฐ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์กฐ์นํฉ๋๋ค:\n\n1. ํ์ฅ ์ํ ํ์ธ\n- ํ์ฅ ์ฅ๋น์ ๋์ ์ํ ํ์ธ\n- ์ ์ด๋ฐ ๋ด PLC ๋ฐ I/O ๋ชจ๋์ LED ์ ๋ฑ ์ํ ํ์ธ\n\n2. PLC ์ ์ฒด ๋ฐ ์ด์คํ ์ ์ฒด\n- Master PLC(K50)์ RTU HUB(CU-A) ๊ฐ ํต์ ์ํ ํ์ธ\n- ํ์ ์ ๊ด์ ์์ 89-M_PLC ์ ์ OFF ๋ช
๋ น์ผ๋ก ์ ์ฒด ์๋\n\n3. ์์ธ ํ์
๋ฐ ์กฐ์น\n- PLC ์ด์ ์ ์ ์กฐ์ฌ ์ฐ๋ฝํ์ฌ ๋ถํ ๊ต์ฒด\n- ํ์ฅ ์ฅ๋น ์ด์ ์ ์ ๊ฒ ๋ฐ ๋ถํ ๊ต์ฒด\n\nโป ์ฃผ์: ์์
์ ์์ ์์น์ ์ฒ ์ ํ ์ค์ํด์ผ ํฉ๋๋ค."
}
๐ง ํ์ธํ๋ ์์ธ
๊ธฐ์ ์คํ
- ๋ฒ ์ด์ค ๋ชจ๋ธ: dnotitia/Smoothie-Qwen3-8B
- ํ์ธํ๋ ๋ฐฉ๋ฒ: QLoRA (4-bit Quantized Low-Rank Adaptation)
- ํ๋ ์์ํฌ:
- TRL 0.26.2
- Transformers 4.57.3
- PEFT (latest)
- BitsAndBytes (latest)
- ํ๋์จ์ด: NVIDIA RTX 3080 Ti (12GB VRAM)
- OS: Windows 11
ํ์ดํผํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ๊ฐ | ์ค๋ช |
|---|---|---|
| LoRA Rank (r) | 16 | LoRA ํ๋ ฌ์ ๋ญํฌ |
| LoRA Alpha | 32 | LoRA ์ค์ผ์ผ๋ง ํฉํฐ (๋ณดํต r์ 2๋ฐฐ) |
| LoRA Dropout | 0.05 | ๋๋กญ์์ ๋น์จ |
| Target Modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj | LoRA ์ ์ฉ ๋ ์ด์ด |
| Batch Size | 1 | ๋๋ฐ์ด์ค๋น ๋ฐฐ์น ํฌ๊ธฐ |
| Gradient Accumulation | 16 | ํจ๊ณผ์ ๋ฐฐ์น ํฌ๊ธฐ: 16 |
| Learning Rate | 2e-4 | ํ์ต๋ฅ |
| Epochs | 20 | ์ ์ฒด ์ํญ ์ |
| Max Sequence Length | 1024 | ์ต๋ ์ํ์ค ๊ธธ์ด |
| Optimizer | paged_adamw_8bit | 8๋นํธ AdamW ์ตํฐ๋ง์ด์ |
| LR Scheduler | cosine | ์ฝ์ฌ์ธ ํ์ต๋ฅ ์ค์ผ์ค๋ฌ |
| Warmup Steps | 50 | ์๋ฐ์ ์คํ ์ |
์์ํ ์ค์
BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat4
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # ์ด์ค ์์ํ
)
ํ์ต ๊ฒฐ๊ณผ
- Trainable Parameters: 43,646,976 (0.53% of total 8.2B)
- Total Steps: 1,600
- Training Time: ~4 hours (RTX 3080 Ti)
- Final Loss: ์๋ ด ํ์ธ
- Model Size:
- LoRA Adapter: ~87MB
- Merged FP16: ~16GB
- Q4_K_M GGUF: ~5GB
๐ ์์ธ ํ์ธํ๋ ๊ฐ์ด๋: FINETUNE_GUIDE.md
๐ GitHub ํ๋ก์ ํธ ์ฐ๋
๋ณธ ๋ชจ๋ธ์ ๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ์ ๋ ฅ๊ด์ ์ฅ์ ๊ด๋ฆฌ ํตํฉ ํ๋ซํผ์์ ํต์ฌ AI ์์ง์ผ๋ก ํ์ฉ๋ฉ๋๋ค.
๐ค ๊ฐ๋ฐ์ ์ ๋ณด
- ์์: ๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ๊ฒฝ์ ์ฒ ๊ด์ ํ ์ ๋ ฅ๊ด์
- ์ฑ๋ช : ๊ฐ๋์ฐ (GitHub: @aremany)
- ๋น๊ณ :
- ๋ณธ ๋ชจ๋ธ์ ๊ฐ๋ฐ์ ๊ฐ์ธ์ ์ฐ๊ตฌ ๊ฒฐ๊ณผ๋ฌผ์ ๋๋ค.
- ๋๊ตฌ๊ตํต๊ณต์ฌ์ ๊ณต์ ์ ์ฅ ๋ฐ ์์ง์ ๋ฌด๊ดํ๋ฉฐ, ๊ฐ์ธ์ ์์ง์ ์์ด๋์ด๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
- ๋ชจ๋ ๊ฐ๋ฐ ๊ณผ์ ๋ฐ ์ฑ๊ณผ๋ ๊ฐ์ธ ์ฐ๊ตฌ ํ๋์ ๊ฒฐ๊ณผ์ ๋๋ค.
๐ ๊ฐ๋ฐ ๋ฐฐ๊ฒฝ ๋ฐ ํ์คํ ๋ฆฌ
๋ณธ ๋ชจ๋ธ์ ์ฝ 9๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๊ณผ์ (2025.04 ~ 2026.01)์ ๊ฑฐ์ณ ์์ฑ๋์์ต๋๋ค:
| ์๊ธฐ | ์ฃผ์ ํ๋ | ์ฑ๊ณผ |
|---|---|---|
| 2025.04-06 | ๋ฐ์ดํฐ ๋์งํธํ | HWP ์ฅ์ ๋ณด๊ณ ์ โ DB ๋ณํ |
| 2025.07-08 | ์๋ฎฌ๋ ์ดํฐ ๊ฐ๋ฐ | Inkscape ๋ ํ โ ๊ณํต ์๋ฎฌ๋ ์ดํฐ ์ ์ |
| 2025.09-10 | ํตํฉ ํ๋ซํผ ๊ตฌ์ถ | RAG + Fine-tuning ๊ฒฐํฉ |
| 2025.11 | AI ๊ฒฝ์ง๋ํ ์ถํ | ์์ฑํ ํ๋ซํผ (์ฑ๋ด ์ ์ธ) |
| 2026.01.03 | GraphRAG ์ฑ๋ด ์์ฑ | ์ต์ข ํผ์ฆ ์์ฑ |
| 2026.01.11 | Qwen3-8B ํ์ธํ๋ (4์ฐจ ์๋) | 4์ฐจ ๋ง์ ์ฑ๊ณต - Gemma-3n-4EB ๋๋น ์ฐ์ |
๐ก ํต์ฌ ์ฒ ํ
"์ฅ์ ๋ 100% ์๋ฐฉํ ์ ์๋ค. ๊ทธ๋ฌ๋ 100% ๋๋นํ ์๋ ์๋ค."
- ์์ธก: GRU/KNN/์ ํํ๊ท ๊ธฐ๋ฐ ์ฅ์ ๋ฐ์ ์์ธก
- ํ๋ จ: ์๋ฎฌ๋ ์ดํฐ๋ฅผ ํตํ ์ด๋ฏธ์ง ํธ๋ ์ด๋
- ๋ถ์: ํ์ธํ๋ ๋ชจ๋ธ + RAG ๊ธฐ๋ฐ ์ฌ์ธต ๋ถ์
1. ์ฅ์ ๋ถ์๊ธฐ (Failure Analyzer)
๋ ๋ฆฝ ์คํํ ์ฅ์ ์์ธ ๋ถ์ ์์คํ
- ๋ ํฌ์งํ ๋ฆฌ: github.com/aremany/failure-analyzer
- ๊ธฐ๋ฅ:
- ํต๊ณ ๋ถ์: ์ฅ์ ๋ฐ์ ๋น๋, ์ฐ๊ฐ ์ถ์ด, ์ฃผ์ ์์ธ ํต๊ณ
- AI ์ฌ์ธต ๋ถ์: LLM + RAG ๊ธฐ๋ฐ ์์ธ ๋ถ์ ๋ณด๊ณ ์ ์์ฑ
- ๋ฐ์ดํฐ:
incident_reports.db: ์ฅ์ ์ด๋ ฅ ๋ฐ์ดํฐ๋ฒ ์ด์คdataset_from_data_txt.json: RAG ์ฐธ์กฐ ์ง์ ๋ฐ์ดํฐ
ํตํฉ ์์:
import ollama
from qdrant_client import QdrantClient
# RAG ๊ฒ์
def search_knowledge_base(query: str) -> str:
"""๊ธฐ์ ๋ฌธ์ ๊ฒ์"""
client = QdrantClient(host="localhost", port=6333)
results = client.search(
collection_name="power_facility_docs",
query_text=query,
limit=3
)
return "\n".join([r.payload['text'] for r in results])
# ์ฅ์ ๋ถ์
def analyze_with_rag(fault_description: str) -> str:
"""ํ์ธํ๋ ๋ชจ๋ธ + RAG ๊ธฐ๋ฐ ์ฅ์ ๋ถ์"""
# 1. RAG๋ก ๊ด๋ จ ๋ฌธ์ ๊ฒ์
context = search_knowledge_base(fault_description)
# 2. ํ์ธํ๋ ๋ชจ๋ธ๋ก ๋ถ์
prompt = f"""๋ค์ ์ฐธ๊ณ ์๋ฃ๋ฅผ ๋ฐํ์ผ๋ก ์ฅ์ ๋ฅผ ๋ถ์ํ์ธ์:
์ฐธ๊ณ ์๋ฃ:
{context}
์ฅ์ ์ํฉ:
{fault_description}
๋ถ์ ๊ฒฐ๊ณผ:"""
response = ollama.chat(
model='bluejude10/smoothie-qwen3-8b-dtro',
messages=[{'role': 'user', 'content': prompt}]
)
return response['message']['content']
# ์ฌ์ฉ ์์
if __name__ == "__main__":
fault = "89-M ๋ณ์ ์์์ PLC ํต์ ์ด์ ์๋์ด ๋ฐ์ํ์ต๋๋ค."
result = analyze_with_rag(fault)
print(result)
2. ํตํฉ ํ๋ซํผ (Integrated Platform)
๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ์ ๋ ฅ๊ด์ ์ฅ์ ๊ด๋ฆฌ ํตํฉ ํ๋ซํผ
- ๋ ํฌ์งํ ๋ฆฌ: github.com/aremany/integrated-platform
- ์ฃผ์ ๋ชจ๋:
- ์ฅ์ ์์ธก๊ธฐ: GRU/KNN/์ ํํ๊ท ๊ธฐ๋ฐ ์๊ณ์ด ์์ธก
- ์ฅ์ ๋ถ์๊ธฐ: ๋ณธ ํ์ธํ๋ ๋ชจ๋ธ + RAG ๊ธฐ๋ฐ ์ฌ์ธต ๋ถ์
- ์๋ฎฌ๋ ์ดํฐ: Inkscape ๊ธฐ๋ฐ ๊ณํต ์๋ฎฌ๋ ์ดํฐ (ํ๋ จ์ฉ)
- ์ง์ ๊ฒ์๊ธฐ: RAG ๊ธฐ๋ฐ ๊ธฐ์ ๋ฌธ์ ๊ฒ์
- GraphRAG ์ฑ๋ด: ๋ํํ ์ฅ์ ์๋ด ์ธํฐํ์ด์ค
- ๋ณด๊ณ ์ ๋ทฐ์ด: ๊ณผ๊ฑฐ ์ฅ์ ์ด๋ ฅ ์กฐํ
์์คํ ์ํคํ ์ฒ:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ํตํฉ ํ๋ซํผ (FastAPI + Streamlit) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ ์ฅ์ ์์ธก โ โ ์๋ฎฌ๋ ์ดํฐโ โ ์ง์๊ฒ์ โ โ ์ฑ๋ด โ โ
โ โโโโโโฌโโโโโโ โโโโโโโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโ โ
โ โ โ โ โ
โ โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ ์ฅ์ ๋ถ์๊ธฐ (Core) โ โ
โ โ Fine-tuned Model โ โ
โ โ + RAG Engine โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Data Layer: incident_reports.db + knowledge_base.json โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ฐ ๊ฐ๋ฐ ์ฑ๊ณผ (Value)
- โ ์ ์ฌ์ ์ต์ ํ: i3-13100, No GPU ํ๊ฒฝ์์๋ ์ํํ Local LLM ๊ตฌ๋
- โ ์์ฐ ์ ๊ฐ: 1์ธ ๊ฐ๋ฐ๋ก ํตํฉ ํ๋ซํผ ๊ตฌ์ถ (์ธ์ฃผ ๋น์ฉ ์์ต ์ ์ ๊ฐ)
- โ ์ค๋ฌด ์ ์ฉ: ์ค์ ํ์ฅ์์ ์ฆ์ ํ์ฉ ๊ฐ๋ฅํ ์์ค์ ๋ต๋ณ ํ์ง
๐ฏ ์ปค์คํฐ๋ง์ด์ง ๊ฐ์ด๋
๋ณธ ๋ชจ๋ธ๊ณผ ํตํฉ ํ๋ซํผ์ ๋๊ตฌ๋ ์์ ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- ๋ชจ๋ธ ๊ต์ฒด:
ollama pull bluejude10/smoothie-qwen3-8b-dtro - ๋ฐ์ดํฐ ๊ต์ฒด:
incident_reports.db: ๋ณธ์ธ์ ์ฅ์ ์ด๋ ฅ ๋ฐ์ดํฐ๋ก ๊ต์ฒดdataset_from_data_txt.json: ์์ฒด ๋งค๋ด์ผ/๊ธฐ์ ๋ฌธ์๋ก ๊ต์ฒด
- UI ์ปค์คํฐ๋ง์ด์ง:
index.html: ํ์ฌ๋ช /ํ์ดํ ์์ io.png: ๋ก๊ณ ํ์ผ ๊ต์ฒด
๐ก ์ฌ์ฉ ์์
์ค์ ์์: ์ฅ์ ๋ถ์ ํ๋ก๊ทธ๋จ ํตํฉ
๋ณธ ๋ชจ๋ธ์ ์ฅ์ ๋ถ์ ํ๋ก๊ทธ๋จ์์ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถ๋ฉ๋๋ค:
import ollama
def generate_fault_analysis_report(
fault_type: str,
causes_text: str,
actions_text: str,
qa_text: str = ""
) -> str:
"""
์ฅ์ ๋ถ์ ํ๋ก๊ทธ๋จ์์ ํธ์ถํ๋ ์ค์ ํจ์
Args:
fault_type: ์ฅ์ ์ ํ (์: "PLC ํต์ ์ฅ์ ")
causes_text: ํต๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ฃผ์ ์์ธ
actions_text: ํต๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ฃผ์ ์กฐ์น
qa_text: RAG๋ก ๊ฒ์๋ ๊ณผ๊ฑฐ ์ ์ฌ ์ฌ๋ก Q&A
Returns:
์์ธ ๊ธฐ์ ์ข
ํฉ ๋ณด๊ณ ์
"""
# ์ค์ ํ๋ก๋์
ํ๋กฌํํธ
prompt = f"""๋น์ ์ 30๋
๊ฒฝ๋ ฅ์ ์ฒ ๋ ์ ๋ ฅ ์ค๋น(๋ชจ๋
ธ๋ ์ผ/๊ฒฝ์ ์ฒ ์๋ณ์ ๋ฐ ์ ์ฐจ์ ) ์ฅ์ ๋ถ์ ์ ๋ฌธ๊ฐ์
๋๋ค.
๋น์ ์ ์๋ฌด๋ ์ ๊ณต๋ [ํต๊ณ ๋ฐ์ดํฐ]์ [๊ณผ๊ฑฐ ์ฌ๋ก(Q&A)]๋ฅผ ์ข
ํฉํ์ฌ, ๋ชจ๋
ธ๋ ์ผ ๊ฒฝ์ ์ฒ ์ ๋ ฅ ์์คํ
์์ ๋ฐ์ํ '{fault_type}' ์ฅ์ ์ ๋ํ '์์ธ ๊ธฐ์ ์ข
ํฉ ๋ณด๊ณ ์'๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค.
### 1. ๋ถ์ ๋์ ์ ๋ณด
- **์ฅ์ ์ ํ**: {fault_type}
- **๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ฃผ์ ์์ธ**:
{causes_text}
- **๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ฃผ์ ์กฐ์น**:
{actions_text}
### 2. ์ฐธ๊ณ ์ง์ (๊ณผ๊ฑฐ ์ ์ฌ ์ฌ๋ก Q&A)
{qa_text if qa_text else "(์ฐธ๊ณ ํ ๋งํ ์ ์ฌ ์ฌ๋ก Q&A ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค. ์ ๋ ฅ ๊ณตํ์ ์ง์๊ณผ ๊ฒฝ์ ์ฒ ์ค๋น ํน์ฑ์ ๊ธฐ๋ฐํ์ฌ ๋ถ์ํ์ญ์์ค.)"}
### 3. ์์ฑ ์ง์นจ
- **์์ธ์ฑ ๊ฐํ**: ์์ฝํ์ง ๋ง๊ณ , ๊ฐ ํญ๋ชฉ์ ๋
ผ๋ฆฌ์ ๊ทผ๊ฑฐ์ ํจ๊ป ์ต๋ํ ์์ธํ๊ณ ๊ธธ๊ฒ ์์ ํ์ญ์์ค. (๋จ๋ตํ ์ง์, ์์ ํ ์งํฅ)
- **์ ๋ฌธ์ฑ**: ์ ๋ ฅ์ค๋น ์ด์ํ๊ณผ ๊ฒฝ์์ง์ด ์ ๋ขฐํ ์ ์๋๋ก ์ ๋ฌธ์ ์ธ ๊ธฐ์ ์ฉ์ด(์: ๋ณดํธ๊ณ์ ๊ธฐ, ์ ๋ฅ๊ธฐ, SCADA, ์ ์ฐํ๊ดด, ๊ณ ์กฐํ ๋ฑ)๋ฅผ ์ ๊ทน ์ฌ์ฉํ์ญ์์ค.
- **๋๋ฉ์ธ ํนํ**: ์ผ๋ฐ์ ์ธ ์ ์ฐ ์ฅ์ ๊ฐ ์๋, '์ ๋ ฅ ๊ณต๊ธ ๋ฐ ๋ฐฐ์ ์์คํ
'์ ๊ด์ ์์ ๋ฌผ๋ฆฌ์ /์ ๊ธฐ์ ์์ธ์ ์ฌ์ธต ๋ถ์ํ์ญ์์ค.
- **ํฌ๋งท ์ค์**: ์๋์ [์ถ๋ ฅ ํ์]์ ๊ทธ๋๋ก ๋ฐ๋ฅด์ญ์์ค.
### 4. ์ถ๋ ฅ ํ์ (์ด ํ์์ ์๊ฒฉํ ๋ฐ๋ฅผ ๊ฒ)
# [{fault_type}] ์ ๋ ฅ ์ค๋น ์ฅ์ ์์ธ ๋ถ์ ๋ณด๊ณ ์
## 1. ์ ๊ธฐ๊ณตํ์ ์์ธ ๋ถ์ (Root Cause Analysis)
(๋จ์ ๋์ด์ด ์๋, ์ฅ์ ๋ฐ์ ๋ฉ์ปค๋์ฆ์ ์๋ก -๋ณธ๋ก -๊ฒฐ๋ก ๊ตฌ์กฐ๋ก **์ต์ 15๋ฌธ์ฅ ์ด์** ์์ฃผ ์์ธํ ๊ธฐ์ ํ์ญ์์ค. ํต๊ณ์ ์์ธ๊ณผ ์ ๊ธฐ์ ํน์ฑ์ ๊ฒฐํฉํ์ฌ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ค๋ช
ํ์ญ์์ค.)
## 2. ๋จ๊ณ๋ณ ํ์ฅ ๋์ ๋ฐ ๋ณต๊ตฌ ๊ฐ์ด๋
(ํ์ฅ ์ ์ง๋ณด์ ์์์ด ์ํํด์ผ ํ ์กฐ์น๋ฅผ ๋จ๊ณ๋ณ๋ก ์์ธํ ๊ธฐ์ ํ์ญ์์ค. ๊ฐ ๋จ๊ณ๋ง๋ค ๊ตฌ์ฒด์ ์ธ ์์
๋ด์ฉ๊ณผ ์์ ์์น์ ํฌํจํ์ฌ ์์ฑํ์ญ์์ค.)
- **ํ์ฅ ์กฐ์น ๋งค๋ด์ผ(์๊ธ/๋ณต๊ตฌ)**: ...
- **์ฌ๋ฐ ๋ฐฉ์ง ๋์ฑ
(์ค๋น ๋ณด๊ฐ/๊ต์ฒด)**: ...
## 3. ์ค๋น ์ด์ ์ ๋ฌธ๊ฐ ์ ์ธ
(์ ๋ ฅ ์ค๋น์ ์ฅ๊ธฐ์ ์์ ์ฑ ํ๋ณด ๋ฐฉ์, ์๋ฐฉ ์ ๋น ์ฃผ๊ธฐ ์ต์ ํ, ์ต์ ์ง๋จ ๊ธฐ๋ฒ ๋์
๋ฑ ์ด์ ํจ์จํ๋ฅผ ์ํ ์ฌ๋ ์๋ ์ ์ธ์ **์ฅ๋ฌธ์ผ๋ก** ์์ฑํ์ญ์์ค.)
"""
# Ollama๋ก ๋ชจ๋ธ ํธ์ถ
response = ollama.chat(
model='bluejude10/smoothie-qwen3-8b-dtro',
messages=[{
'role': 'user',
'content': prompt
}],
options={
'temperature': 0.7,
'top_p': 0.9,
'num_ctx': 8192 # ๊ธด ๋ณด๊ณ ์ ์์ฑ์ ์ํ ์ปจํ
์คํธ
}
)
return response['message']['content']
# ์ค์ ์ฌ์ฉ ์์
if __name__ == "__main__":
# ํต๊ณ ๋ฐ์ดํฐ (DB์์ ์กฐํ)
causes = """
1. PLC ํต์ ์ผ์ด๋ธ ๋
ธํํ (35%)
2. ์ ์ ๊ณต๊ธ ๋ถ์์ (25%)
3. ํ๊ฒฝ ์์ธ (์จ์ต๋, ๋จผ์ง) (20%)
4. ์ํํธ์จ์ด ์ค๋ฅ (15%)
5. ๊ธฐํ (5%)
"""
actions = """
1. PLC ์ฌ๋ถํ
๋ฐ ํต์ ์ผ์ด๋ธ ์ ๊ฒ
2. ์ ์ ๊ณต๊ธ ์ฅ์น ์ ๊ฒ ๋ฐ ๊ต์ฒด
3. ํ๊ฒฝ ๊ฐ์ (์ฒญ์, ์จ์ต๋ ์กฐ์ )
4. ํ์จ์ด ์
๋ฐ์ดํธ
"""
# RAG๋ก ๊ฒ์๋ ๊ณผ๊ฑฐ ์ฌ๋ก (Qdrant์์ ๊ฒ์)
qa_cases = """
Q: PLC ํต์ ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?
A: Master PLC(K50)์ RTU HUB(CU-A) ๊ฐ ํต์ ์ํ๋ฅผ ํ์ธํ๊ณ ,
ํ์ ์ ๊ด์ ์์ 89-M_PLC ์ ์ OFF ๋ช
๋ น์ผ๋ก ์ ์ฒด๋ฅผ ์๋ํฉ๋๋ค...
Q: SCADA-FEP-RTU ์ฐ๋ ์ฒด๊ณ๋?
A: SCADA๋ ์ค์ ๊ด์ ์์คํ
์ด๋ฉฐ, FEP๋ ํ๋ก ํธ์๋ ํ๋ก์ธ์๋ก
RTU์์ ํต์ ์ ์ค๊ณํฉ๋๋ค...
"""
# ๋ณด๊ณ ์ ์์ฑ
report = generate_fault_analysis_report(
fault_type="PLC ํต์ ์ฅ์ ",
causes_text=causes,
actions_text=actions,
qa_text=qa_cases
)
print(report)
์ถ๋ ฅ ์์ (์ผ๋ถ):
# [PLC ํต์ ์ฅ์ ] ์ ๋ ฅ ์ค๋น ์ฅ์ ์์ธ ๋ถ์ ๋ณด๊ณ ์
## 1. ์ ๊ธฐ๊ณตํ์ ์์ธ ๋ถ์ (Root Cause Analysis)
PLC(Programmable Logic Controller) ํต์ ์ฅ์ ๋ ๋ชจ๋
ธ๋ ์ผ ๊ฒฝ์ ์ฒ ์ ๋ ฅ ์์คํ
์์
๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ฅ์ ์ ํ ์ค ํ๋๋ก, ๊ทธ ๊ทผ๋ณธ ์์ธ์ ๋ณตํฉ์ ์ด๊ณ ๋ค์ธต์ ์
๋๋ค.
ํต๊ณ ๋ฐ์ดํฐ์ ๋ฐ๋ฅด๋ฉด PLC ํต์ ์ผ์ด๋ธ ๋
ธํํ๊ฐ ์ ์ฒด ์ฅ์ ์ 35%๋ฅผ ์ฐจ์งํ๋ ๊ฒ์ผ๋ก
๋ํ๋ฌ๋๋ฐ, ์ด๋ ๊ฒฝ์ ์ฒ ์์คํ
์ ํน์ฑ์ ์ง๋๊ณผ ์จ๋ ๋ณํ๊ฐ ์ฌํ ํ๊ฒฝ์ ์ผ์ด๋ธ์ด
์ง์์ ์ผ๋ก ๋
ธ์ถ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ํนํ RS-485 ํต์ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ตฌ๊ฐ์์๋
์ผ์ด๋ธ์ ํน์ฑ ์ํผ๋์ค ๋ณํ๊ฐ ์ ํธ ๊ฐ์ ๋ฅผ ์ ๋ฐํ๋ฉฐ, ์ด๋ ๊ฒฐ๊ตญ ํต์ ์ค๋ฅ๋ก
์ด์ด์ง๋๋ค.
์ ์ ๊ณต๊ธ ๋ถ์์ (25%)์ ๋ ๋ฒ์งธ ์ฃผ์ ์์ธ์ผ๋ก, Master PLC(K50)์ Slave PLC ๊ฐ์
์ ์ ํ์ง ์ฐจ์ด๊ฐ ํต์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค. ํนํ ๋ณ์ ์์์ ๊ณต๊ธ๋๋ DC 110V
์ ์์ ๋ฆฌํ ์ ์์ด ํ์ฉ ๋ฒ์๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ, PLC์ ๋ด๋ถ ํต์ ๋ชจ๋์ด ์ค๋์ํ์ฌ
SCADA-FEP-RTU ์ฐ๋ ์ฒด๊ณ ์ ์ฒด์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค...
(์ดํ 15๋ฌธ์ฅ ์ด์ ๊ณ์...)
## 2. ๋จ๊ณ๋ณ ํ์ฅ ๋์ ๋ฐ ๋ณต๊ตฌ ๊ฐ์ด๋
### ํ์ฅ ์กฐ์น ๋งค๋ด์ผ(์๊ธ/๋ณต๊ตฌ)
**1๋จ๊ณ: ์ฆ์ ์กฐ์น (0~5๋ถ)**
- ๊ด์ ์ค์ ์ฆ์ ๋ณด๊ณ ํ๊ณ ์ฅ์ ๋ฐ์ ์๊ฐ ๋ฐ ์์น๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- SCADA ํ๋ฉด์์ ํด๋น PLC์ ํต์ ์ํ(Online/Offline)๋ฅผ ํ์ธํฉ๋๋ค.
- Master PLC(K50)์ LED ์ํ๋ฅผ ์๊ฒฉ์ผ๋ก ํ์ธํฉ๋๋ค (RUN, ERR, COMM ๋จํ).
**2๋จ๊ณ: ์๊ฒฉ ์ง๋จ (5~15๋ถ)**
- ๊ด์ ์์ 89-M_PLC ์ ์ OFF ๋ช
๋ น์ ํตํ ์ํํธ ๋ฆฌ์
์ ์๋ํฉ๋๋ค.
- RTU HUB(CU-A)์ ํต์ ๋ก๊ทธ๋ฅผ ํ์ธํ์ฌ ํจํท ์์ค๋ฅ ์ ๋ถ์ํฉ๋๋ค.
- ์ด์คํ ์ ์ฒด ๊ธฐ๋ฅ์ด ์ ์ ์๋ํ๋์ง ํ์ธํฉ๋๋ค...
(์ดํ ์์ธ ๋จ๊ณ๋ณ ๊ฐ์ด๋ ๊ณ์...)
## 3. ์ค๋น ์ด์ ์ ๋ฌธ๊ฐ ์ ์ธ
์ฅ๊ธฐ์ ๊ด์ ์์ PLC ํต์ ์ฅ์ ์ ๊ทผ๋ณธ์ ํด๊ฒฐ์ ์ํด์๋ ์๋ฐฉ ์ ๋น ์ฒด๊ณ์
๊ณ ๋ํ์ ์ค๋น ํ๋ํ๊ฐ ํ์์ ์
๋๋ค. ํ์ฌ ์ด์ ์ค์ธ RS-485 ํต์ ๋ฐฉ์์
1980๋
๋ ๊ธฐ์ ๋ก, ๋
ธ์ด์ฆ์ ์ทจ์ฝํ๊ณ ์ ์ก ์๋๊ฐ ์ ํ์ ์
๋๋ค.
๋ฐ๋ผ์ ์ฐจ์ธ๋ ํต์ ํ๋กํ ์ฝ์ธ Profinet ๋๋ EtherCAT์ผ๋ก์ ๋จ๊ณ์ ์ ํ์
๊ฒํ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํต์ ์๋๋ฅผ 100๋ฐฐ ์ด์ ํฅ์์ํค๊ณ ,
์ง๋จ ๊ธฐ๋ฅ์ ๊ฐํํ์ฌ ์ฅ์ ์์ธก์ด ๊ฐ๋ฅํด์ง๋๋ค...
(์ดํ ์ฅ๋ฌธ์ ์ ๋ฌธ๊ฐ ์ ์ธ ๊ณ์...)
์์ 1: PLC ํต์ ์ฅ์ (๊ฐ๋จํ ์ง๋ฌธ)
์ ๋ ฅ:
PLC ํต์ ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?
์ถ๋ ฅ:
PLC(Programmable Logic Controller) ์ฅ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
### 1. ํ์ฅ ์ํ ํ์ธ
- ํ์ฅ ์ฅ๋น(์: ์์ ๋ฐ, ์ฐ๊ณ๋ฐ, ์ถ์ ์ง ๋ฑ)์ ๋์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- ์ ์ด๋ฐ ๋ด PLC ๋ฐ I/O ๋ชจ๋์ LED ์ ๋ฑ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
### 2. PLC ์ ์ฒด ๋ฐ ์ด์คํ ์ ์ฒด
- PLC๊ฐ ์ด์ ์์ ๊ฒฝ์ฐ ํ์ฅ ์ฅ๋น์ ์ด์์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- PLC ์ ์ฒด ๋ฐ ์ด์คํ ์ ์ฒด๋ฅผ ํตํด ์ ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
### 3. ์์ธ ํ์
๋ฐ ์กฐ์น
- PLC์ ์ด์์ด ์์ ๊ฒฝ์ฐ ์ ์กฐ์ฌ์ ์ฐ๋ฝํ์ฌ ๋ถํ ๊ต์ฒด๋ฅผ ์์ฒญํฉ๋๋ค.
- PLC์ ์ด์์ด ์์ ๊ฒฝ์ฐ ํ์ฅ ์ฅ๋น๋ฅผ ์ ๊ฒํ๊ณ ํ์ ์ ๋ถํ ๊ต์ฒด๋ฅผ ํฉ๋๋ค.
### 4. ์์คํ
์ ๊ฒ ๋ฐ ๋ชจ๋ํฐ๋ง
- PLC ๋ฐ ๊ด๋ จ ์์คํ
์ ๋ค์ ์ ๊ฒํฉ๋๋ค.
- ์ฅ์ ์๋ฐฉ์ ์ํด ์์คํ
๋ชจ๋ํฐ๋ง์ ๊ฐํํฉ๋๋ค.
โป ์ฃผ์: ์์
์ ์์ ์์น์ ์ฒ ์ ํ ์ค์ํด์ผ ํฉ๋๋ค.
์์ 2: ํ์์ ๋์ ํญ์ฅ์น ์ฅ์
์ ๋ ฅ:
ํ์์ ๋์ ํญ์ฅ์น ์ฅ์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?
์ถ๋ ฅ:
ํ์์ ๋์ ํญ์ฅ์น(Regenerative Braking Resistor)๋ ์ ๋์ฐจ์ ํ์์ ๋์ผ๋ก ์ธํ
์ ์ฐจ์ ๊ธ์ ์ ์ ์์น์ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค์ํ ์ค๋น์
๋๋ค.
์ฅ์ ๋ฐ์ ์ ์ฆ์ ์ ์ ์ํ๋ก ์ ํํ๊ณ ํ์ฅ ์ ๊ฒ์ ์ง์ํด์ผ ํฉ๋๋ค.
์ฅ์ ์ข
๋ฅ ๋ฐ ์กฐ์น ๋ฐฉ์:
โข ํ์์ ํญ๊ธฐ ์ ์ฐ์ ํญ ์ ํ
- ๊ณ ์ฅํํ: ํ์์ ํญ๊ธฐ ์ ์ฐ์ ํญ ์ ํ
- ์์ธ๋ถ์: ํ์์ ํญ๊ธฐ ์ ์ฐ์ ํญ ์ ํ
- ์กฐ์น๋ฐฉ๋ฒ: ํ์์ ํญ๊ธฐ ์ ์ฒด ๋ฐ ์ ์ฐ์ ํญ ์ธก์ / ํ์์ ํญ๊ธฐ ๋ถ๋ ์ ๊ต์ฒด
โข ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์ฒ ๊ตฌ ์ดํ
- ๊ณ ์ฅํํ: ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์ฒ ๊ตฌ ์ดํ
- ์์ธ๋ถ์: ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์ฒ ๊ตฌ ์ดํ
- ์กฐ์น๋ฐฉ๋ฒ: ์ฒ ๊ตฌ ์ดํ ์ํ ํ์ธ ๋ฐ ํ์ ์ ๊ต์ฒด
โข ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์ ์ฐ๋ฌผ ์ดํ
- ๊ณ ์ฅํํ: ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์ ์ฐ๋ฌผ ์ดํ
- ์์ธ๋ถ์: ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์ ์ฐ๋ฌผ ์ดํ
- ์กฐ์น๋ฐฉ๋ฒ: ์ ์ฐ๋ฌผ ์ํ ํ์ธ ๋ฐ ํ์ ์ ๊ต์ฒด
โข ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์จ๋๊ณ ์ด์
- ๊ณ ์ฅํํ: ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์จ๋๊ณ ์ด์
- ์์ธ๋ถ์: ํ์์ ํญ๊ธฐ ๋ฐ๋ด ์จ๋๊ณ ์ด์
- ์กฐ์น๋ฐฉ๋ฒ: ์จ๋๊ณ ๋์์ํ ํ์ธ ๋ฐ ํ์ ์ ๊ต์ฒด
์์ 3: 64P ์ง๋ฝ ๊ณ์ ๊ธฐ ๋์
์ ๋ ฅ:
64P ์ง๋ฝ ๊ณ์ ๊ธฐ ๋์ ์ ์กฐ์น ๋ฐฉ๋ฒ์?
์ถ๋ ฅ:
64P ์ง๋ฝ ๊ณ์ ๊ธฐ๋ ๋ณ์ ์ NBF๋ฐ์์ ์ ์ฐจ์ ๋ก์ ์ง๋ฝ ์ฌ๊ณ ๋ฅผ ๊ฐ์งํ๋
๋ณดํธ ์ฅ์น์
๋๋ค. ๋์ ์ ๋ค์๊ณผ ๊ฐ์ด ์กฐ์นํฉ๋๋ค:
### 1. ์ฆ์ ์กฐ์น
- ๊ด์ ์ ์ฆ์ ๋ณด๊ณ
- ํด๋น ๊ตฌ๊ฐ ์ด์ฐจ ์ดํ ์ค์ง
- ํ์ฅ ์์ ํ๋ณด (ํจ๋ ์ ์ด ๊ธ์ง ์ง์)
### 2. ์ค์ ๊ฐ ํ์ธ
- DCP2 ์ค์ ๊ฐ: 150V, 0.4S
- TD B21 ๋์ ํ์ธ
- ๋ณ์ ์ NBF๋ฐ ์ํ ํ์ธ
### 3. ์์ธ ํ์
- ์ ์ฐจ์ ๋ก ์ ์ฐ ์ํ ์ ๊ฒ
- ์ ์ง BUS์ Negative BUS ๊ฐ ์ ํญ๊ฐ ์ธก์
- ๊ฐ์ฐ, ๊ฐ์ค ๋ฑ ๊ธฐ์ ์กฐ๊ฑด ํ์ธ
### 4. ๋ณต๊ตฌ ์กฐ์น
- ์ง๋ฝ ์์ธ ์ ๊ฑฐ ํ ์ ์ฐ ์ ํญ ์ธก์
- ์ ์ ํ์ธ ํ ์ํ ์ก์
- ์ด์ ์์ ์ ์ดํ ์ฌ๊ฐ
โป ์ฃผ์: 64P ๋์ ์ ๋ฐ๋์ ํ์ฅ ์์ ํ๋ณด ํ ์์
์ ์งํํด์ผ ํฉ๋๋ค.
โ ๏ธ ์ ํ์ฌํญ
๋๋ฉ์ธ ํนํ
- ๋ณธ ๋ชจ๋ธ์ ๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ์ ๋ ฅ์ค๋น์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ๋ค๋ฅธ ๋๋ฉ์ธ(์: ์๋ฃ, ๋ฒ๋ฅ , ๊ธ์ต)์์๋ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
- ๋ค๋ฅธ ์ฒ ๋ ๋ ธ์ ์ด๋ ์ ๋ ฅ ์์คํ ์์๋ ์ผ๋ถ ์ฑ๋ฅ ์ ํ๊ฐ ์์ ์ ์์ต๋๋ค.
์ธ์ด
- ํ๊ตญ์ด ์ ์ฉ: ํ๊ตญ์ด ์๋ต์ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ์์ด๋ ๋ค๋ฅธ ์ธ์ด๋ก ์ง๋ฌธ ์ ๋ต๋ณ ํ์ง์ด ๋ฎ์ ์ ์์ต๋๋ค.
Thinking ๋ชจ๋
- Qwen3์
<think>ํ๊ทธ๊ฐ ์ถ๋ ฅ๋ ์ ์์ต๋๋ค. - Modelfile์์
enable_thinking=false์ค์ ์ผ๋ก ๋นํ์ฑํ ๊ฐ๋ฅํฉ๋๋ค.
์์ ์ฑ
- ๋ณธ ๋ชจ๋ธ์ ๋ต๋ณ์ ์ฐธ๊ณ ์ฉ์ ๋๋ค.
- ์ค์ ํ์ฅ ์์ ์ ๋ฐ๋์ ๊ณต์ ๋งค๋ด์ผ ๋ฐ ์์ ๊ท์ ์ ์ค์ํด์ผ ํฉ๋๋ค.
- ์ค์ํ ์์ฌ๊ฒฐ์ ์ ๋ฐ๋์ ์ ๋ฌธ๊ฐ์ ๊ฒํ ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
๐ ๋ผ์ด์ ์ค
๋ชจ๋ธ ๋ผ์ด์ ์ค
- ๋ผ์ด์ ์ค: Apache 2.0
- ์์ ์ ์ด์ฉ: ๊ฐ๋ฅ
- ์์ ๋ฐ ์ฌ๋ฐฐํฌ: ๊ฐ๋ฅ (๋ผ์ด์ ์ค ๋ช ์ ํ์)
๋ฒ ์ด์ค ๋ชจ๋ธ
- dnotitia/Smoothie-Qwen3-8B: ํด๋น ๋ชจ๋ธ์ ๋ผ์ด์ ์ค ์ค์ ํ์
- Qwen3: Alibaba Cloud์ Qwen ๋ผ์ด์ ์ค ์ค์ ํ์
ํ์ต ๋ฐ์ดํฐ
- ๋๊ตฌ๊ตํต๊ณต์ฌ ๋ด๋ถ ์๋ฃ: ๊ณต๊ฐ ๋ถ๊ฐ
- ๋ชจ๋ธ ๊ฐ์ค์น: ์ผ๋ฐํ๋ ์ง์๋ง ํฌํจ (์๋ณธ ๋ฐ์ดํฐ ๋ฏธํฌํจ)
๐ ๊ฐ์ฌ์ ๋ง
๊ธฐ์ ์ ๊ณต
- Qwen Team (Alibaba Cloud): ์ฐ์ํ ๋ฒ ์ด์ค ๋ชจ๋ธ ์ ๊ณต
- dnotitia: Smoothie-Qwen3-8B ํ๊ธ ์ต์ ํ ๋ฒ์ ์ ๊ณต
- HuggingFace: TRL, PEFT, Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ณต
- Microsoft: BitsAndBytes ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๊ณต
- ggerganov: llama.cpp ๋ฐ GGUF ํฌ๋งท ์ ๊ณต
์ปค๋ฎค๋ํฐ
- Korean NLP Community: ํ๊ตญ์ด AI ๋ฐ์ ์ ๊ธฐ์ฌ
- Open Source Community: ์คํ์์ค ์ํ๊ณ ๋ฐ์
๐ง ๋ฌธ์ ๋ฐ ํผ๋๋ฐฑ
๊ฐ๋ฐ์
- ์ฑ๋ช : ๊ฐ๋์ฐ
- ์์: ๋๊ตฌ๊ตํต๊ณต์ฌ 3ํธ์ ๊ฒฝ์ ์ฒ ๊ด์ ํ ์ ๋ ฅ๊ด์
- GitHub: @aremany
- HuggingFace: @bluejude10
- Email: bluejude10@naver.com
ํ์ ๋ฐ ๊ธฐ์ฌ
- ์ด๊ฑดํฌ ์ฃผ์: ํ๋ จ ์๋ฎฌ๋ ์ดํฐ ๊ฒฝ๋ณด์ ๋ฐ ์ฅ์ ์๋๋ฆฌ์ค ์์ด๋์ด ์ ์ ๋ฐ ์ด๊ธฐ ๊ตฌํ ๊ธฐ์ฌ
์ด์ ๋ฐ ๊ฐ์ ์ ์
- GitHub Issues๋ฅผ ํตํด ๋ฒ๊ทธ ๋ฆฌํฌํธ ๋ฐ ๊ธฐ๋ฅ ์ ์์ ํ์ํฉ๋๋ค.
- HuggingFace Discussions์์ ๋ชจ๋ธ ์ฌ์ฉ ๊ด๋ จ ์ง๋ฌธ์ ํ ์ ์์ต๋๋ค.
๐ ๋ฒ์ ํ์คํ ๋ฆฌ
v1.0 (2026-01-11)
- โ ์ด๊ธฐ ๋ฆด๋ฆฌ์ฆ
- โ QLoRA ํ์ธํ๋ ์๋ฃ (1,273๊ฑด ๋ฐ์ดํฐ)
- โ Q4_K_M GGUF ๋ณํ
- โ Ollama ์ง์
- โ ์ฑ๋ฅ ๊ฒ์ฆ ์๋ฃ (Gemma-3n-4EB ๋๋น ์ฐ์)
๐ ์ฐธ๊ณ ์๋ฃ
๊ด๋ จ ๋ชจ๋ธ
- dnotitia/Smoothie-Qwen3-8B - ๋ฒ ์ด์ค ๋ชจ๋ธ
- bluejude10/Smoothie-Qwen3-8B-Original - ์๋ณธ ๋น๊ต์ฉ
๊ณผ๊ฑฐ ์๋ (ํ์ธํ๋ ์คํจ ์ด๋ ฅ)
- 1์ฐจ ์๋: Gemma-3n-4EB (ํ์ธํ๋ ์คํจ)
- 2์ฐจ ์๋: bluejude10/kanana-1.5-2.1b-DTRO-3LINE-POWER-q4-k-m (๋ต๋ณ ํ์ง ๋ถ๋)
- 3์ฐจ ์๋: bluejude10/Bllossom-3B-DTRO-3LINE-POWER-Q6 (๋ต๋ณ ๋ฏธ์์ฑ)
- 4์ฐจ ์๋: Smoothie-Qwen3-8B (์ฑ๊ณต) โ
๋ฌธ์
- Downloads last month
- 28
4-bit