File size: 3,577 Bytes
362e048
17a0eec
 
 
 
 
 
 
 
 
 
 
362e048
 
17a0eec
362e048
17a0eec
362e048
17a0eec
362e048
17a0eec
362e048
17a0eec
362e048
17a0eec
 
 
 
362e048
17a0eec
362e048
17a0eec
 
 
 
 
 
362e048
17a0eec
362e048
17a0eec
 
 
362e048
17a0eec
 
 
362e048
17a0eec
 
 
362e048
17a0eec
 
 
 
 
 
 
362e048
17a0eec
 
362e048
17a0eec
 
 
 
 
 
 
362e048
17a0eec
362e048
17a0eec
 
362e048
17a0eec
 
 
362e048
17a0eec
 
362e048
17a0eec
 
362e048
17a0eec
 
362e048
17a0eec
 
 
 
 
 
 
362e048
17a0eec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
---
license: cc-by-nc-4.0
library_name: peft
base_model: naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-1.5B
tags:
- text-to-sql
- erp
- hyperclova
- korean
- nlp
- lora
- generated_from_trainer
---

# HyperCLOVAX-1.5B-ERP-SQL ๐Ÿš€

์ด ๋ชจ๋ธ์€ [naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-1.5B](https://huggingface.co/naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-1.5B)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **ํ•œ๊ตญ์–ด ERP ๋„๋ฉ”์ธ์˜ Text-to-SQL ์ž‘์—…**์„ ์œ„ํ•ด ํŒŒ์ธํŠœ๋‹๋œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

1.5B๋ผ๋Š” ์ดˆ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ํŒŒ์ธํŠœ๋‹ ํ›„ **0.5%์—์„œ 62.0%๋กœ ๊ทน์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ**์„ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณต์žกํ•œ ์ถ”๋ก (Lv 5) ์˜์—ญ์—์„œ๋Š” 2B๊ธ‰ ๋ชจ๋ธ๋“ค์„ ์ƒํšŒํ•˜๋Š” ํšจ์œจ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

## ๐Ÿ“Š ๋ชจ๋ธ ์„ฑ๋Šฅ (Dramatic Improvement)

์ž์ฒด ๊ตฌ์ถ•ํ•œ ERP-SQL ๋ฐ์ดํ„ฐ์…‹ ํ‰๊ฐ€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ „ ํ•™์Šต(Baseline) ์ƒํƒœ์—์„œ๋Š” ๋„๋ฉ”์ธ ์ง€์‹์ด ์—†์–ด ๊ฑฐ์˜ ์ •๋‹ต์„ ๋งžํžˆ์ง€ ๋ชปํ–ˆ์œผ๋‚˜, ํ•™์Šต ํ›„ ์‹ค๋ฌด ํˆฌ์ž… ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์œผ๋กœ ํ™˜๊ณจํƒˆํƒœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

| ๋ชจ๋ธ (Model) | ํ•™์Šต ์ƒํƒœ | ์ „์ฒด ์ •ํ™•๋„ | Lv 1 (์‰ฌ์›€) | **Lv 5 (๋งค์šฐ ์–ด๋ ค์›€)** |
| :--- | :--- | :--- | :--- | :--- |
| **HyperCLOVA X 1.5B** | Baseline | 0.5% | 2.5% | 0.0% |
| **HyperCLOVA X 1.5B** | **Fine-tuned (Ours)** | **62.0%** | **92.5%** | **47.5%** |

> **ํ•ต์‹ฌ ๋ถ„์„:** ์ „์ฒด ์ •ํ™•๋„๋Š” 2B๊ธ‰ ๋ชจ๋ธ ๋Œ€๋น„ ์†Œํญ ๋‚ฎ์„ ์ˆ˜ ์žˆ์œผ๋‚˜, **๊ณ ๋‚œ์ด๋„(Lv 5) ์ถ”๋ก  ์ •ํ™•๋„(47.5%)**๋Š” 2.1B ๊ฒฝ์Ÿ ๋ชจ๋ธ(45.0%)๋ณด๋‹ค ์˜คํžˆ๋ ค ๋†’๊ฒŒ ์ธก์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋ธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ€๋„๊ฐ€ ๋งค์šฐ ํšจ์œจ์ ์ž„์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

## ๐Ÿ”ง ํ•™์Šต ์ •๋ณด (Training Details)
* **๋ฒ ์ด์Šค ๋ชจ๋ธ:** naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-1.5B
* **ํ•™์Šต ๋ฐฉ๋ฒ•:** LoRA (Low-Rank Adaptation)
* **์ตœ์  ์—ํญ(Epoch):** 5 (์ง€์†์ ์ธ ์„ฑ๋Šฅ ์šฐ์ƒํ–ฅ ํ™•์ธ)
* **๋ฐ์ดํ„ฐ์…‹:** ์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ˜์˜๋œ ํ•ฉ์„ฑ(Synthetic) ํ•œ๊ตญ์–ด ERP ์งˆ๋ฌธ-์ฟผ๋ฆฌ ์Œ
* **ํ•˜๋“œ์›จ์–ด:** NVIDIA RTX 4060 Ti (16GB) x 2ea

## ๐Ÿ’ป ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (How to Use)

### 1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
```bash
pip install torch transformers peft accelerate

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel

# 1. ๋ชจ๋ธ ๋กœ๋“œ
base_model_id = "naver-hyperclovax/HyperCLOVAX-SEED-Text-Instruct-1.5B"
adapter_id = "yeongseok11/hyperclovax-1.5b-erp-nl2sql"

tokenizer = AutoTokenizer.from_pretrained(base_model_id, trust_remote_code=True)
base_model = AutoModelForCausalLM.from_pretrained(
    base_model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True
)

model = PeftModel.from_pretrained(base_model, adapter_id)
model.eval()

# 2. ํ”„๋กฌํ”„ํŠธ ์ •์˜
schema_context = """
[Tables]
employees(emp_id, name, dept_id, hire_date, salary)
departments(dept_id, dept_name, location)
"""
question = "์ธ์‚ฌํŒ€ ์ง์›๋“ค์˜ ์ด๋ฆ„์„ ์•Œ๋ ค์ค˜."

prompt = f"""Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

### Instruction:
์•„๋ž˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์งˆ๋ฌธ์„ SQL๋กœ ๋ณ€ํ™˜ํ•˜์„ธ์š”.

### Input:
### ์งˆ๋ฌธ:
{question}

### ์Šคํ‚ค๋งˆ:
{schema_context}

### Response:
"""

# 3. ์ถ”๋ก 
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(
        **inputs,
        max_new_tokens=256,
        do_sample=False,
        eos_token_id=tokenizer.eos_token_id
    )

print(tokenizer.decode(outputs[0], skip_special_tokens=True).split("### Response:")[-1].strip())