File size: 10,973 Bytes
180320d
 
 
 
 
 
 
 
 
 
 
 
 
 
0932047
0d4660b
180320d
4cc8030
0932047
 
180320d
4cc8030
0932047
4cc8030
0932047
 
 
51fc8f1
 
 
 
 
 
 
 
0932047
180320d
 
 
853fc95
fd5920f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86a8f44
 
fd5920f
 
 
 
 
 
 
 
 
86a8f44
1a49c3d
fd5920f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
853fc95
fd5920f
180320d
ed93c68
180320d
ed93c68
 
 
180320d
ed93c68
 
 
 
 
 
180320d
ed93c68
 
 
 
 
 
180320d
ed93c68
 
 
 
 
 
 
 
 
 
 
180320d
ed93c68
 
180320d
 
ed93c68
180320d
ed93c68
 
 
180320d
 
ed93c68
 
 
 
180320d
ed93c68
 
 
 
 
 
180320d
ed93c68
 
180320d
ed93c68
180320d
ed93c68
 
180320d
ed93c68
 
 
180320d
ed93c68
 
 
 
180320d
ed93c68
 
 
 
 
 
180320d
 
 
 
ed93c68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180320d
 
 
8c3d7f7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180320d
 
ed93c68
763d328
ed93c68
762b9a2
180320d
ed93c68
763d328
180320d
 
763d328
ed93c68
 
763d328
1d0fa87
763d328
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
---
library_name: transformers
---

# Model Card for Model ID

<!-- Provide a quick summary of what the model is/does. -->



## Model Details

### Model Description

```
์ด ๋ชจ๋ธ์€ Google์˜ ๊ฐ•๋ ฅํ•œ ์†Œํ˜• ์–ธ์–ด ๋ชจ๋ธ์ธ Gemma-3-1B-it์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ํ•œ๊ตญ์–ด ๋ฒ”์ฃ„ ์‚ฌ๊ฑด ๋ณด๊ณ ์„œ ๋ถ„์„ ํƒœ์Šคํฌ์— ๋งž๊ฒŒ ๋ฏธ์„ธ ์กฐ์ •(Fine-tuning)๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

# ์ฃผ์š” ๊ธฐ๋Šฅ
์‚ฌ๊ฑด ์žฌ๊ตฌ์„ฑ (Context Generation): ์‚ฌ๊ฑด ๋ณด๊ณ ์„œ์˜ ๋‚ด์šฉ๊ณผ ์‚ฌ์‹ค ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋‹น์‹œ ์ƒํ™ฉ์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ๊ฑด ์œ ํ˜• ๋ถ„๋ฅ˜ (Kind Classification): ์žฌ๊ตฌ์„ฑ๋œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ๊ฑด์˜ ์ข…๋ฅ˜๋ฅผ ์ •ํ™•ํžˆ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

# ํ•™์Šต ์ „๋žต
(QLoRA)๋ชจ๋ธ ํ•™์Šต์—๋Š” QLoRA (Quantized Low-Rank Adaptation) ๊ธฐ๋ฒ•์ด ์ ์šฉ๋˜์–ด, ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ๊ณผ ๋น ๋ฅธ ํ•™์Šต ์†๋„๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์–‘์žํ™”: 4-bit NF4 ์–‘์žํ™” (BitsAndBytes)
PEFT: LoRA ์ ์šฉ (Rank $r=16$, $\alpha=32$)
์ตœ์ ํ™”: adamw_torch, Learning Rate $2e-4$, Cosine Scheduler

ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ฒ„์ „์ด ๋ชจ๋ธ์˜ ํ•™์Šต ๋ฐ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „
transformers : 4.57.3
accelerate : 1.12.0
bitsandbytes : 0.48.2
peft : 0.15.2
torch : 2.9.0
```

## Uses

```python
from transformers import AutoModelForCausalLM, AutoTokenizer


base_model = "chyungwon/police-report-analysis-model"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
    base_model,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)


question = """๋‹ค์Œ ์‚ฌ๊ฑด ๋ณด๊ณ ์„œ๋ฅผ ํ†ตํ•ด์„œ ๋‹น์‹œ ๋ฒ”์ฃ„ ์‚ฌ๊ฑด์„ ์žฌ๊ตฌ์„ฑํ•ด์ฃผ๊ณ , ์‚ฌ๊ฑด ์œ ํ˜•์„ ๋ถ„๋ฅ˜ํ•ด์ค˜.

[์‚ฌ๊ฑด ๋ณด๊ณ ์„œ]
2024๋…„ 4์›” 25์ผ, ์„œ์šธ ์ˆญ์‹ค๋Œ€์ž…๊ตฌ์—ญ ์ธ๊ทผ์—์„œ ์ด์‚ฟ์ง ํ™”๋ฌผ์ฐจ๊ฐ€ ์ธ๋„๋กœ ๋Œ์ง„ํ•ด 60๋Œ€ ๋‚จ์„ฑ์„ ๋ถ€์ƒ์‹œํ‚จ ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค. 
ํ˜„์žฅ ์กฐ์‚ฌ ๊ฒฐ๊ณผ, ํ™”๋ฌผ์ฐจ ์šด์ „์ž ๊น€๋ฏผ์ˆ˜(35)๋Š” ์‚ฌ์ „์— ๋ธŒ๋ ˆ์ดํฌ ํŒจ๋“œ๋ฅผ ๋งˆ๋ชจ์‹œํ‚ค๊ณ  ๋ธŒ๋ ˆ์ดํฌ์•ก์— ๋ฌผ์„ ์„ž์–ด ๊ณ ์žฅ์„ ์œ ๋ฐœํ•œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ๋‹ค. 
์‚ฌ๊ณ  ์งํ›„ ๊น€์€ ์ฐจ ๋‚ด๋ถ€์— ์ˆจ๊ฒจ์ง„ ๊ธˆ๊ณ ์—์„œ ํ˜„๊ธˆ 200๋งŒ ์›๊ณผ ๊ฐ€์ฃฝ ๊ฐ€๋ฐฉ, ์Šค๋งˆํŠธํฐ์„ ๊บผ๋‚ด ์ƒ๊ฐ€ ์•ˆ๊ฒฝ์› ์ง์›์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ์€ํ–‰ ๊ณ„์ขŒ๋กœ ์†ก๊ธˆํ•˜์˜€๋‹ค. 
๊ฒฝ์ฐฐ์€ ์ฐจ๋Ÿ‰ GPS ๊ธฐ๋ก, ๋ธŒ๋ ˆ์ดํฌ ํŒจ๋“œ ๋งˆ๋ชจ ์ƒํƒœ, CCTV ์˜์ƒ ์กฐ์ž‘ ์—ฌ๋ถ€๋ฅผ ์กฐ์‚ฌ ์ค‘์ด๋ฉฐ, ๊น€์€ ๊ตํ†ต์‚ฌ๊ณ ์ฒ˜๋ฆฌํŠน๋ก€๋ฒ•์— ๋”ฐ๋ผ ์น˜์ƒ ํ˜์˜๋กœ ์ž…๊ฑด๋˜์—ˆ๋‹ค. 
ํ˜„์žฌ ์ˆ˜์‚ฌ๋Š” ๊น€์˜ ์€ํ–‰ ์†ก๊ธˆ ๊ธฐ๋ก๊ณผ ๊ธˆ๊ณ  ๋‚ด์šฉ๋ฌผ ํ™•๋ณด๋ฅผ ํ†ตํ•ด ๋ฒ”์ฃ„ ๋™๊ธฐ์™€ ๋ฒ”ํ–‰ ๋ฐฉ๋ฒ•์„ ํŒŒ์•… ์ค‘์ด๋‹ค. 
์‚ฌ๊ฑด์€ ์•„์ง ๊ฒฐ๋ง์ด ๋‚ด๋ ค์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ, ์ถ”๊ฐ€ ์ฆ๊ฑฐ ํ™•๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค."""


messages = [
    {"role": "system", "content": """๋‹น์‹ ์€ ๋ฒ”ํ–‰๋ถ„์„ AI ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์งˆ๋ฌธ์— ์ •ํ™•ํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•˜์„ธ์š”."""},
    {"role": "user", "content": question}
]

inputs = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    return_tensors="pt",
    return_dict=True,
).to(model.device)

model.eval()
outputs = model.generate(
    **inputs,
    max_new_tokens=1024 * 2,
    temperature=0.1,
    do_sample=True,
)

generated = outputs[0][inputs["input_ids"].shape[-1] :]
answer = tokenizer.decode(generated, skip_special_tokens=True)
print('์‚ฌ๊ฑด ์žฌ๊ตฌ์„ฑ : ', answer)


์‚ฌ๊ฑด ์žฌ๊ตฌ์„ฑ : 2024๋…„ 4์›” 25์ผ ์˜คํ›„ 1์‹œ 30๋ถ„, ์„œ์šธ ์ˆญ์‹ค๋Œ€์ž…๊ตฌ์—ญ ์ธ๊ทผ์—์„œ ๋ฐœ์ƒํ•œ ์ด์‚ฟ์ง ํ™”๋ฌผ์ฐจ ์‚ฌ๊ณ ๋Š” ๋‹จ์ˆœํ•œ ๊ตํ†ต์‚ฌ๊ณ ๊ฐ€ ์•„๋‹ˆ๋ผ ์ •๊ตํ•˜๊ฒŒ ๊ณ„ํš๋œ ์ ˆ๋„ ์‚ฌ๊ฑด์˜ ์ผํ™˜์ด์—ˆ๋‹ค. ํ™”๋ฌผ์ฐจ ์šด์ „์ž์ธ ๊น€๋ฏผ์ˆ˜(35)๋Š” 3๊ฐœ์›” ์ „๋ถ€ํ„ฐ ์ง€์—ญ ์ƒ๊ฐ€์—์„œ ์ผํ•˜๋Š” 60๋Œ€ ๋‚จ์„ฑ(ํ”ผํ•ด์ž)๊ณผ์˜ ๊ธˆ์ „์  ๊ฐˆ๋“ฑ์„ ํ’ˆ๊ณ  ์žˆ์—ˆ๋‹ค. ๊น€์€ ํ”ผํ•ด์ž๊ฐ€ ์ž์‹ ์ด ์šด์˜ํ•˜๋˜ ์ž‘์€ ๊ฐ€๊ฒŒ์—์„œ ๋ฌผ๊ฑด์„ ํ›”์ณ ๊ฐ€๋Š” ๊ฒƒ์„ ๋ชฉ๊ฒฉํ•˜๊ณ , ๊ทธ ์‚ฌ์‹ค์„ ํญ๋กœํ•˜๋ฉด ์ž์‹ ์˜ ์‚ฌ์—…์ด ๋ง๊ฐ€์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ์ด์— ๊น€์€ ํ”ผํ•ด์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋™์‹œ์— ๊ฐ€๊ฒŒ์—์„œ ํ›”์นœ ๋ฌผ๊ฑด์„ ํšŒ์ˆ˜ํ•˜๋ ค๋Š” ๊ณ„ํš์„ ์„ธ์› ๋‹ค.  

๊ณ„ํš ๋‹จ๊ณ„์—์„œ ๊น€์€ ํ™”๋ฌผ์ฐจ์˜ ๋ธŒ๋ ˆ์ดํฌ ํŒจ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋งˆ๋ชจ์‹œํ‚ค๊ณ , ๋ธŒ๋ ˆ์ดํฌ์•ก์— ๋ฌผ์„ ์„ž์–ด ๋ธŒ๋ ˆ์ดํฌ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ์กฐ์ž‘ํ–ˆ๋‹ค. ๋˜ํ•œ, ์ฐจ ๋‚ด๋ถ€์— ์ˆจ๊ฒจ์ง„ ์ž‘์€ ๊ธˆ๊ณ ์— ํ›”์นœ ๋ฌผ๊ฑด(ํ˜„๊ธˆ 200๋งŒ ์›, ๊ฐ€์ฃฝ ๊ฐ€๋ฐฉ, ์Šค๋งˆํŠธํฐ)์„ ๋ณด๊ด€ํ–ˆ๋‹ค. ์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ํ”ผํ•ด์ž๊ฐ€ ์ฐจ์— ๋ถ€๋”ชํ˜€ ๋ถ€์ƒ์„ ์ž…์œผ๋ฉด, ๊น€์€ ์ฆ‰์‹œ ์ฐจ๋ฅผ ๋ฉˆ์ถ”๊ณ  ๊ธˆ๊ณ ๋ฅผ ์—ด์–ด ๋ฌผ๊ฑด์„ ๊บผ๋‚ด์–ด ์ƒ๊ฐ€ ์•ˆ๊ฒฝ์› ์ง์›์—๊ฒŒ ์ „๋‹ฌํ–ˆ๋‹ค. ์ด ์ง์›์€ ๊น€์ด ์‚ฌ์ „์— ํ˜‘์ƒํ•œ ์ธ๋ฌผ๋กœ, ๋ฌผ๊ฑด์„ ์ˆ˜๊ฑฐํ•ด ๊น€์˜ ์€ํ–‰ ๊ณ„์ขŒ๋กœ ์†ก๊ธˆํ•˜๋„๋ก ํ–ˆ๋‹ค.  

์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ๊น€์€ ํ™”๋ฌผ์ฐจ๋ฅผ ์ˆญ์‹ค๋Œ€์ž…๊ตฌ์—ญ ์ธ๊ทผ ์ธ๋„์— ์ฃผ์ฐจํ•œ ๋’ค, ํ”ผํ•ด์ž๊ฐ€ ์ฐจ๋ฅผ ์ง€๋‚˜๊ฐ€๋˜ ์ˆœ๊ฐ„ ๋ธŒ๋ ˆ์ดํฌ๋ฅผ ๊ณ ์˜๋กœ ์ž‘๋™์‹œํ‚ค์ง€ ์•Š๋„๋ก ์กฐ์ž‘ํ–ˆ๋‹ค. ์ฐจ๊ฐ€ ์ธ๋„๋ฅผ ๋Œ์ง„ํ•˜๋ฉด์„œ ํ”ผํ•ด์ž๋Š” ์ฐจ์ฒด์— ๋ถ€๋”ชํ˜€ ๋‹ค๋ฆฌ๋ฅผ ํฌ๊ฒŒ ๋‹ค์ณค๊ณ , ์ฆ‰์‹œ ๋ณ‘์›์œผ๋กœ ์ด์†ก๋˜์—ˆ๋‹ค. ๊น€์€ ์‚ฌ๊ณ  ์งํ›„ ์ฐจ๋ฅผ ๋ฉˆ์ถ”๊ณ , ํ”ผํ•ด์ž๊ฐ€ ๋ถ€์ƒ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์—†๋‹ค๋Š” ์ƒํ™ฉ์„ ์ด์šฉํ•ด ๊ธˆ๊ณ ๋ฅผ ์—ด์–ด ๋ฌผ๊ฑด์„ ๊บผ๋ƒˆ๋‹ค. ๊ทธ๋Š” ๋ฌผ๊ฑด์„ ์ƒ๊ฐ€ ์•ˆ๊ฒฝ์› ์ง์›์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ์ง์›์€ ์ฆ‰์‹œ ํ˜„๊ธˆ๊ณผ ๋ฌผ๊ฑด์„ ๊น€์˜ ์€ํ–‰ ๊ณ„์ขŒ๋กœ ์†ก๊ธˆํ–ˆ๋‹ค.  

์€ํ ๋‹จ๊ณ„์—์„œ๋Š” ๊น€์€ ์‚ฌ๊ณ  ํ˜„์žฅ์„ ๋น ๋ฅด๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , ์ฐจ ๋‚ด๋ถ€์— ๋‚จ์€ ํ”์ ์„ ์ตœ์†Œํ™”ํ–ˆ๋‹ค. ๊ทธ๋Š” ์ฐจ๋ฅผ ๋‹ค๋ฅธ ์ง€์—ญ์œผ๋กœ ์ด๋™์‹œ์ผœ CCTV๊ฐ€ ๊ฐ์‹œ๋˜์ง€ ์•Š๋Š” ๊ณณ์— ์ฃผ์ฐจํ–ˆ๋‹ค. ๋˜ํ•œ, ์‚ฌ๊ณ  ๋‹น์‹œ ์ฐจ๊ฐ€ ์ •์ง€ํ•œ ์œ„์น˜์™€ ํ”ผํ•ด์ž์˜ ๋ถ€์ƒ ์ •๋„๋ฅผ ์ด์šฉํ•ด ๊ฒฝ์ฐฐ์ด ์‚ฌ๊ณ ๋ฅผ ๋‹จ์ˆœํ•œ ๊ตํ†ต์‚ฌ๊ณ ๋กœ ํŒ๋‹จํ•˜๋„๋ก ์œ ๋„ํ–ˆ๋‹ค. ๊น€์€ ์ดํ›„ ์€ํ–‰ ๊ณ„์ขŒ์—์„œ ๋ฌผ๊ฑด์„ ํ˜„๊ธˆ์œผ๋กœ ์ธ์ถœํ•ด ํ˜„์ง€ ํŽธ์˜์ ์—์„œ ํ˜„๊ธˆํ™”ํ•˜๊ณ , ๋‚จ์€ ๊ธˆ์•ก์€ ๊ฐ€์งœ ์‹ ๋ถ„์ฆ์œผ๋กœ ๋งŒ๋“  ๊ฐ€์ƒ ๊ณ„์ขŒ์— ์†ก๊ธˆํ–ˆ๋‹ค.  

์ˆ˜์‚ฌ ๊ณผ์ •์—์„œ ๊ฒฝ์ฐฐ์€ CCTV ์˜์ƒ์„ ๋ถ„์„ํ•ด ํ™”๋ฌผ์ฐจ๊ฐ€ ์ธ๋„๋ฅผ ๋Œ์ง„ํ•œ ์ˆœ๊ฐ„์„ ํ™•์ธํ–ˆ๊ณ , ๋ธŒ๋ ˆ์ดํฌ ํŒจ๋“œ ๋งˆ๋ชจ์™€ ๋ธŒ๋ ˆ์ดํฌ์•ก์— ๋ฌผ์ด ์„ž์ธ ํ”์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๋˜ํ•œ, ๊น€์ด ์‚ฌ์ „์— ์ƒ๊ฐ€ ์•ˆ๊ฒฝ์› ์ง์›๊ณผ ์—ฐ๋ฝ์„ ์ฃผ๊ณ ๋ฐ›์•˜๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ํ™•๋ณด๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊น€์€ ๊ตํ†ต์‚ฌ๊ณ ์ฒ˜๋ฆฌํŠน๋ก€๋ฒ•์— ๋”ฐ๋ผ ์น˜์ƒ ํ˜์˜๋กœ ์ž…๊ฑด๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” ๊ตฌ์†์˜์žฅ์ด ์‹ ์ฒญ ์ค‘์ด๋‹ค. ์‚ฌ๊ฑด์€ ์•„์ง ์ˆ˜์‚ฌ ๋‹จ๊ณ„์ด๋ฉฐ, ๊น€์ด ์‹ค์ œ๋กœ ๋ฌผ๊ฑด์„ ํ›”์ณค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”ผํ•ด์ž์™€์˜ ๊ฐˆ๋“ฑ์ด ๋ฒ”ํ–‰ ๋™๊ธฐ์— ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์‚ฌ๊ฑด์€ ์•„์ง ๊ฒฐ๋ง์ด ๋‚ด๋ ค์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ, ๊ฒฝ์ฐฐ์€ ๊น€์˜ ์€ํ–‰ ๊ณ„์ขŒ์™€ ์ƒ๊ฐ€ ์•ˆ๊ฒฝ์› ์ง์›์˜ ์ฆ์–ธ์„ ํ†ตํ•ด ๋ฒ”ํ–‰์˜ ์ „๋ชจ๋ฅผ ํŒŒ์•…ํ•˜๋ ค ํ•˜๊ณ  ์žˆ๋‹ค. 
์‚ฌ๊ฑด ์œ ํ˜• : ์ ˆ๋„
```


## Training Details

```
base_model = "./gemma-3-1b-it"
tokenizer = AutoTokenizer.from_pretrained(base_model)

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4"
)

model = AutoModelForCausalLM.from_pretrained(
    base_model,
    quantization_config=bnb_config,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=[
        "q_proj", "k_proj", "v_proj", "o_proj",
        "gate_proj", "up_proj", "down_proj"
    ],
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM,
)

model2 = get_peft_model(model, lora_config)
```


#### Preprocessing [optional]

```
def format_prompt(ex, max_length=1775):
    global max_length_cal, row


    title = '๋‹ค์Œ ์‚ฌ๊ฑด ๋ณด๊ณ ์„œ๋ฅผ ํ†ตํ•ด์„œ ๋‹น์‹œ ์‚ฌ๊ฑด์„ ์žฌ๊ตฌ์„ฑํ•ด์ฃผ๊ณ , ์‚ฌ๊ฑด ์œ ํ˜•์„ ๋ถ„๋ฅ˜ํ•ด์ค˜\n'
    question = ex["report"]
    answer = ex["context"]
    kind = f'\n์‚ฌ๊ฑด ์œ ํ˜• : {ex["kind"]}'

    prompt = f"""<start_of_turn>system
๋‹น์‹ ์€ ๋ฒ”ํ–‰๋ถ„์„ AI ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
์งˆ๋ฌธ์— ์ •ํ™•ํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•˜์„ธ์š”.
<end_of_turn>
<start_of_turn>user
{title}

[์‚ฌ๊ฑด ๋ณด๊ณ ์„œ]
{question}\n<end_of_turn>\n<start_of_turn>model\n"""

    prompt_ids = tokenizer(prompt, add_special_tokens=False)["input_ids"]

    model_part = f"""{answer} {kind}<end_of_turn>"""
    answer_ids = tokenizer(model_part, add_special_tokens=False)["input_ids"]

    input_ids = prompt_ids + answer_ids
    labels = [-100] * len(prompt_ids) + answer_ids
    attention_mask = [1] * len(input_ids)

    pad_len = max_length - len(input_ids)
    input_ids += [tokenizer.pad_token_id] * pad_len
    attention_mask += [0] * pad_len
    labels += [-100] * pad_len

    return {
        "input_ids": input_ids,
        "attention_mask": attention_mask,
        "labels": labels,
    }
```


#### Training Hyperparameters

```
training_args = TrainingArguments(
  output_dir=model_path,
  per_device_train_batch_size=16,
  gradient_accumulation_steps=2,
  num_train_epochs=4, 
  learning_rate=2e-4, 
  bf16=True,
  fp16=False,
  gradient_checkpointing = False,
  logging_steps=5,
  eval_steps=300,                  
  save_strategy="steps",
  save_steps=300,                              
  save_total_limit=2,
  report_to="none",
  lr_scheduler_type="cosine",
  warmup_ratio=0.05, 
  optim="adamw_torch"
)
```

#### Speeds, Sizes, Times [optional]

```
[4844/4844 5:28:09, Epoch 4/4]
Step	Training Loss
10	2.668900
20	2.386700
30	2.226000
40	2.026500
50	1.896800
60	1.778100
70	1.733700
80	1.678000
90	1.622100
100	1.583400
200	1.399400
300	1.343400
400	1.290700
500	1.286000
600	1.229200
700	1.226100
800	1.216800
900	1.204500
1000	1.158700
1100	1.153700
1200	1.157400
1300	1.106100
1400	1.114300
1500	1.091600
1600	1.087400
1700	1.087200
1800	1.093100
1900	1.082200
2000	1.084200
2100	1.090000
2200	1.084300
2300	1.058100
2400	1.062100
2500	1.021800
2600	1.028800
2700	1.034700
2800	1.040300
2900	1.033000
3000	1.016200
3100	1.015800
3200	0.983400
3300	1.010900
3400	1.015900
3500	1.028600
3600	1.019400
3700	0.971100
3800	0.947100
3900	0.984500
4000	0.965500
4100	0.973800
4200	0.968100
4300	0.969000
4400	0.953500
4500	0.988400
4505	0.942400
4510	0.931300
4515	0.973200
4520	0.989900
4525	0.979900
4530	0.963000
4535	0.981700
4540	0.953700
4545	0.963700
4550	0.961500
4555	0.972000
4560	0.958600
4565	0.970500
4570	0.987800
4575	0.974500
4580	0.968700
4585	0.982000
4590	0.961300
4595	0.968400
4600	0.966000
4700	0.998300
4800	0.966200
4805	0.973900
4810	0.975200
4815	0.974400
4820	0.973400
4825	0.972000
4830	0.960200
4835	0.961700
4840	0.974000


Evaluation Result : 
{'eval_loss': 1.062408447265625, 'eval_runtime': 15.7428, 'eval_samples_per_second': 24.9, 'eval_steps_per_second': 3.113, 'epoch': 4.0}


Best checkpoint :
4510	0.931300
```


## Model Card Authors [optional]
```
(์ฃผ)์ธ์ •๋ณด
ํ™ˆํŽ˜์ด์ง€ : http://www.ijbinfo.com

์ •๋ณดํ†ต์‹ ์‚ฐ์—…์ง„ํฅ์›์˜ ์ง€์›์„ ๋ฐ›์•„์„œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
```

## Model Card Contact
```
(์ฃผ)์ธ์ •๋ณด
์ฃผ์†Œ : ์„œ์šธ์‹œ ๊ธˆ์ฒœ๊ตฌ ๊ฐ€์‚ฐ๋™ 60-5 ๊ฐ‘์˜ฌ๊ทธ๋ ˆ์ดํŠธ๋ฐธ๋ฆฌA๋™ 805ํ˜ธ
์—ฐ๋ฝ์ฒ˜ : TEL : 02-3397-7765 FAX : 02-3397-7769 E-mail : sales@injungbo.co.kr
๋‹ด๋‹น์ž : ์žฅํ˜•์›(chyungwon@ijbinfo.com)
```