-
Notifications
You must be signed in to change notification settings - Fork 0
/
chatGPT.qmd
634 lines (488 loc) · 38.2 KB
/
chatGPT.qmd
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
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
---
output: html_document
editor_options:
chunk_output_type: console
---
# 챗GPT
기술채택(소비) 속도가 가파라지는 현대 사회에서 챗GPT는 전기, 냉장고, 세탁기, 에어콘, 컴퓨터, 전화기, 휴대폰처럼 혁신적인 와해기술의 한 예라고 할 수 있다. 전화기가 50%의 가정에 보급되기까지 수십 년이 걸렸던 것과 대비해, 휴대폰은 1990년에 동일한 보급율을 달성하는 데 몇년 걸리지 않았다. 혁신적인 기술의 수용기간이 점점 짧아지고 있다는 것이 최근들어 뚜렷하게 나타나고 있다. [@McGrath2013]
![더 빠르게 확산되는 소비(수용)](images/gpt_adoption_hbr.png)
챗GPT 역시 이러한 빠른 채택 속도흐름을 따르고 있다. 2022년 11월 30일에 출시된 이후 단 5일 만에 100만 명의 사용자를 확보했는데 이는 넷플릭스(Netflix), 페이스북(Facebook), 트위터(Twitter)와 같은 대형 플랫폼보다도 빠른 수용율을 보이고 있다. 특히, 백만 사용자를 획득기간이 단 5일에 불과하여 최근 인기를 얻고 있는 스포티파이(Spotify) 150일, 인스타그램(Instagram) 75일을 한참 뛰어넘는 엄청난 수용속도다.
챗GPT, 즉 인공지능(AI)을 빠르게 채택하는 것은 단순히 새로운 기술 트렌드에 빠르게 대응하는 것을 넘어, 챗GPT를 빠르게 수용하여 내재화 하는 사람과 그렇지 않은 사람 사이에 정보 접근성, 편의성, 시간 효율성 등에서 큰 격차를 만들어 내고 있다. 이러한 격차는 개인뿐만 아니라 정부, 기업 차원에서도 중요하기 때문에 빠른 도입을 통해 경험하고 내재화하는 것이 더욱 중요하다고 할 수 있다.
## 생성형 AI
### JPEG 압축
챗GPT는 웹의 무수한 데이터를 학습한 하나의 압축저장소로 볼 수 있다. 압축을 풀게되면 원본을 정확히 복원할 수 있는 경우도 있지만, 그렇지 않은 경우도 불가피하게 존재한다[@Chiang2023] .
챗GPT는 **"웹의 흐릿한 JPEG"**라는 비유로 설명된다. JPEG 기술은 손실 압축 기술로, 무손실 압축 기술인 PNG와 대조된다. 흐릿한 이미지가 선명하지 않거나 정확하지 않은 것처럼, 챗GPT 역시 항상 완벽한 답변을 제공하거나 모든 질문을 정확히 이해하는 것은 아니다. 그러나 사용자와의 상호작용을 통해 지속적인 학습을 통해 개선되고 있다. 더 많은 사람들이 챗GPT를 사용하면 할수록, 그만큼 더 정교하게 사람의 언어를 이해하고 대화할 수 있는 기술로 발전하게 된다.
챗GPT를 비롯한 유사 인공지능(AI)이 너무 강력해져 인간을 대체할 것이라는 우려도 있지만, 챗GPT는 결국 인간의 작업을 더 쉽고 효율적으로 수행할 수 있는 강력한 도구에 불과하기 때문에, 인간을 능가하거나 지배할 가능성은 거의 없다. 챗GPT 즉, 인공지능을 책임감 있고 윤리적으로 사용하는 것은 결국 가계, 기업, 정부, 우리 모두의 책임이다.
챗GPT가 간단한 사칙연산 계산에서 어려움을 겪는 것은 웹에 퍼져 있는 숫자 계산 데이터를 기반으로 학습하여 계산을 모방할 뿐이기 때문이다. 만약 사칙연산에 대한 일반적 원칙을 제대로 이해한다면, 웹에서 발견되는 사칙연산 문제뿐만 아니라 다른 계산 문제도 정확히 해결할 수 있지만 현재로는 그렇지 못하기 때문에 플러그인(Plugin)을 통해 해결하고 있다.
![JPEG와 PNG 비교](images/jpeg-vs-png-file-size.jpg){fig-align="center" width="375"}
[자료출처: [WHAT'S THE DIFFERENCE BETWEEN JPEG AND PNG: BEGINNER GUIDE](https://fixthephoto.com/tech-tips/difference-between-jpeg-and-png.html)]{.aside}
### 기초모형
기초모형(Foundation Model)이라는 새로운 패러다임은 인공지능(AI) 시스템 구축에 혁신적인 변화를 가져왔다. 이러한 모델은 광범위한 데이터에 대해 사전에 학습되어 있어, 다양한 실무하위 작업에 적용할 수 있는 범용성을 가지고 있다. BERT, GPT-3, CLIP 등이 대표적인 예로, 이들 모델은 텍스트, 이미지, 음성 등 다양한 형태의 데이터에 대한 처리가 가능하다.
기초모형의 등장은 기존의 특정 작업에 특화된 모델을 개발하는 방식을 넘어, 하나의 모델로 여러 작업을 수행할 수 있는 새로운 접근법을 제시한다. 이로 인해, 모델 개발과 학습에 드는 비용과 시간이 크게 절감되며, 더 빠르고 효율적인 AI 시스템 구축이 가능해진다.
또한, 기초모형은 미세조정(fine-tuning)을 통해 특정 작업에 적합하게 만들 수 있다. 이는 기초모형이 가진 범용성을 더욱 강화하며, 실무하위 작업에 대한 성능도 향상시킨다. 예를 들어, BERT 모델은 자연어 처리 작업에, CLIP 모델은 이미지와 텍스트를 연결하는 작업에 미세조정을 통해 효과적으로 활용될 수 있다.
이러한 기초모형의 패러다임은 AI의 미래를 크게 밝혀준다. 다양한 분야와 작업에서 활용될 수 있는 이러한 모델은 AI 기술의 적용 범위를 더욱 확장시키며, 그 가능성을 무궁무진하게 만든다. 이는 결국 AI가 사회와 산업의 다양한 분야에서 더욱 깊게 활용될 수 있음을 의미한다.
![기초 모형](images/foundation_model.png){fig-align="center" width="390"}
## 거대언어모형 데이터
### 인터넷 데이터
GPT 모델 개발에 있어 언어 데이터는 중요한 자원으로 위키백과 [Languages used on the Internet](https://en.wikipedia.org/wiki/Languages_used_on_the_Internet) 페이지에서 웹사이트 제작에 사용된 언어 비중을 살펴보는 것은 챗GPT를 이해하는데 도움이 된다. 2023년 9월 16일 기준 위키백과에 따르면, 영어(English)가 웹사이트 제작에 가장 많이 사용되는 언어로, 비중이 53.3%에 달한다. 이는 영어 중심으로 GPT 모델이 개발된 이유를 잘 설명한다. 그 다음으로 스페인어(Spanish)가 5.3%, 러시아어(Russian)가 4.7%, 독일어(German)가 4.5%, 프랑스어(French)가 4.3%로 이어진다. 아시아 언어 중에서 일본어(Japanese)가 4.0%로 가장 높은 비중을 차지하며, 중국어(Chinese)는 1.4%, 한국어(Korean)는 0.7%로 나타난다
```{r}
#| eval: false
#| echo: false
library(tidyverse)
library(rvest)
## 언어 콘텐츠
contents_raw <- read_html(x = 'https://en.wikipedia.org/wiki/Languages_used_on_the_Internet') %>%
html_element(xpath = '//*[@id="mw-content-text"]/div[1]/table[1]') %>%
html_table() %>%
set_names(c("순위", "언어", "비중_old", "비중"))
언어번역 <- c("영어(English)", "기타(기타)", "스페인어(Spanish)", "러시아어(Russian)", "독일어(German)", "프랑스어(French)", "일본어(Japanese)", "포르투갈어(Portuguese)", "이탈리아어(Italian)", "터키어(Turkish)", "네덜란드어(Dutch, Flemish)", "페르시아어(Persian)", "폴란드어(Polish)", "중국어(Chinese)", "베트남어(Vietnamese)", "인도네시아어(Indonesian)", "체코어(Czech)", "한국어(Korean)", "아랍어(Arabic)", "우크라이나어(Ukrainian)")
contents_tbl <- contents_raw %>%
select(순위, 언어, 비중) %>%
mutate(비중 = parse_number(비중)) %>%
## 대한민국 이하 기타 ------------
mutate(언어 = ifelse(순위 >=20, "기타", 언어)) %>%
group_by(언어) %>%
summarise(비중 = sum(비중)) %>%
ungroup() %>%
arrange(desc(비중)) |>
mutate(언어 = 언어번역) |>
mutate(순위 = row_number()) |>
relocate(순위, .before = 언어)
top_lang_gt <- contents_tbl |>
filter(순위 <= 10) |>
## 표
gt() %>%
gt_theme_hangul() %>%
tab_options(table.width = pct(50)) |>
cols_align(
align = "center",
columns = c(언어, 비중)) %>%
fmt_number(
columns = c(비중),
decimals = 1
) %>%
cols_label(
비중 = "비중(%)"
) |>
tab_footnote(
footnote = "한국어보다 비중 낮은 인도네이사, 체코, 우크라이나 등",
locations = cells_body(columns = 언어, rows = 2)
)
gtsave(top_lang_gt, "images/top_lang_gt.png")
bottom_lang_gt <- contents_tbl |>
filter(순위 >= 11) |>
## 표
gt() %>%
gt_theme_hangul() %>%
tab_options(table.width = pct(50)) |>
cols_align(
align = "center",
columns = c(언어, 비중)) %>%
fmt_number(
columns = c(비중),
decimals = 1
) %>%
cols_label(
비중 = "비중(%)"
) |>
data_color(
columns = everything(),
rows = str_detect(언어, "한국어"),
method = "auto",
palette = c("blue"),
alpha = 0.9
) |>
tab_source_note(
source_note = "출처:https://en.wikipedia.org/wiki/Languages_used_on_the_Internet")
gtsave(bottom_lang_gt, "images/bottom_lang_gt.png")
# 표 합치기
# top_bottom_gt <- gt_two_column_layout(list(top_lang_gt, bottom_lang_gt))
# gtsave_extra(top_bottom_gt, "images/llm_contents_gt.png")
library(cowplot)
top_ggdraw <- ggdraw() + draw_image("images/top_lang_gt.png", scale = 0.8)
bottom_ggdraw <- ggdraw() + draw_image("images/bottom_lang_gt.png", scale = 0.8)
top_bottom_ggdraw <- plot_grid(top_ggdraw, bottom_ggdraw)
ragg::agg_jpeg("images/llm_contents_gt.jpg",
width = 10, height = 4, units = "in", res = 600)
top_bottom_ggdraw
dev.off()
```
![인터넷 콘텐츠 상위 언어별 통계](images/llm_contents_gt.jpg)
### GPT-3 훈련 데이터
GPT-3 언어모형 데이터셋 구성을 살펴보면, 영어 문서수가 약 2억 3천만개로 전체의 93.7% 압도적으로 높은 비중을 차지하여 GPT-3 언어모형 학습 데이터가 주로 영어로 구성되어 있음을 의미하며, 이로 인해 영어에 대한 처리 능력이 뛰어날 가능성이 높다. 다음으로 많은 언어는 독일어와 프랑스어로, 각각 전체의 1.2%와 1.02%를 차지하지만 영어와 언어적 유사성이 다른 문화권 언어보다 높아 처리 능력이 높을 것으로 기대할 수 있다.
아시아 언어로 일본어와 중국어가 상위에 랭크되어 있다. 일본어는 약 61만 9천 5백 82개의 문서로 전체의 0.246%를, 중국어는 약 29만 2천 9백 76개의 문서로 0.116%를 차지한다. 한국어는 48,852개의 문서로 전체의 0.0194%를 차지해 GPT-3가 한국어에 대한 처리 능력이 다른 언어와 비교하여 상대적으로 떨어질 수 있음을 시사한다.
```{r}
#| eval: false
#| echo: false
library(tidyverse)
library(gt)
library(countrycode)
library(rvest)
library(gtExtras)
## 언어 코드
lang_tbl <- read_html(x = 'http://www.lingoes.net/en/translator/langcode.htm') %>%
html_element(css = 'body > table') %>%
html_table() %>%
set_names(c("언어", "언어명"))
gpt_raw <- read_csv("https://raw.githubusercontent.com/openai/gpt-3/master/dataset_statistics/languages_by_document_count.csv")
gpt_lang_vec <- c("영어(English)", "독일어(German)", "프랑스어(French)", "포르투갈어(Portuguese)", "이탈리아어(Italian)", "스페인어(Spanish)", "네덜란드어(Dutch)", "폴란드어(Polish)", "일본어(Japanese)", "덴마크어(Danish)", "노르웨이어(Norwegian)", "루마니아어(Romanian)", "핀란드어(Finnish)", "중국어(Chinese)", "러시아어(Russian)", "체코어(Czech)", "스웨덴어(Swedish)", "헝가리어(Hungarian)", "번체 중국어(Traditional Chinese)", "인도네시아어(Indonesian)", "크로아티아어(Croatian)", "터키어(Turkish)", "카탈로니아어(Catalan)", "베트남어(Vietnamese)", "슬로베니아어(Slovenian)", "에스토니아어(Estonian)", "슬로바키아어(Slovak)", "한국어(Korean)")
gpt_tbl <- gpt_raw %>%
set_names(c("언어", "문서수", "비중")) %>%
mutate(비중 = parse_number(비중) / 100) %>%
mutate(누적문서 = cumsum(문서수)) %>%
mutate(누적비중 = 누적문서 / sum(문서수)) %>%
top_n(문서수, n = 28) |>
left_join(lang_tbl, by = "언어") %>%
select(언어, 언어명, 문서수, 비중, 누적비중) |>
mutate(언어명 = ifelse(언어 == "no", "Norwegian", 언어명),
언어명 = ifelse(언어 == "zh-Hant", "Traditional Chinese", 언어명)) |>
mutate(언어명 = gpt_lang_vec) |>
mutate(순위 = row_number()) |>
relocate(순위, .before = 언어)
## 상위 14개 언어
top_gpt_gt <- gpt_tbl %>%
filter(row_number() <= 14) %>%
## 표
gt() %>%
gt_theme_hangul() %>%
tab_options(table.width = pct(75)) %>%
tab_source_note(
source_note = "자료출처: https://github.com/openai/gpt-3/blob/master/dataset_statistics/languages_by_document_count.csv") %>%
tab_spanner(
label = "언어코드와 언어명",
columns = c(언어, 언어명)) %>%
tab_spanner(
label = "통계수치",
columns = c(문서수, 비중, 누적비중)) %>%
cols_align(
align = "center",
columns = c(언어, 언어명)) %>%
fmt_percent(
columns = c(비중, 누적비중),
decimals = 2
) %>%
fmt_number(
columns = 문서수,
decimals = 0,
sep_mark = ","
) %>%
gt_highlight_rows(
rows = c(1),
fill = "lightgrey",
font_weight = "bold",
font_color = "blue",
target_col = 언어
) %>%
sub_missing(
columns = everything(),
missing_text = "-"
) %>%
cols_width(
순위 ~ px(5),
언어 ~ px(10),
언어명 ~ px(20),
문서수 ~ px(20),
비중 ~ px(15),
누적비중 ~ px(15)
)
gtsave(top_gpt_gt, "images/top_gpt_gt.png")
bottom_gpt_gt <- gpt_tbl %>%
filter(row_number() > 14) %>%
## 표
gt() %>%
gt_theme_hangul() %>%
tab_options(table.width = pct(75)) %>%
tab_spanner(
label = "언어코드와 언어명",
columns = c(언어, 언어명)) %>%
tab_spanner(
label = "통계수치",
columns = c(문서수, 비중, 누적비중)) %>%
cols_align(
align = "center",
columns = c(언어, 언어명)) %>%
fmt_percent(
columns = c(비중, 누적비중),
decimals = 2
) %>%
fmt_number(
columns = 문서수,
decimals = 0,
sep_mark = ","
) %>%
gt_highlight_rows(
rows = c(14),
fill = "lightgrey",
font_weight = "bold",
font_color = "blue",
target_col = 언어
) %>%
sub_missing(
columns = everything(),
missing_text = "-"
) %>%
cols_width(
순위 ~ px(5),
언어 ~ px(10),
언어명 ~ px(20),
문서수 ~ px(20),
비중 ~ px(15),
누적비중 ~ px(15)
)
gtsave(bottom_gpt_gt, "images/bottom_gpt_gt.png")
### 결합
library(cowplot)
top_gpt_ggdraw <- ggdraw() + draw_image("images/top_gpt_gt.png", scale = 0.9)
bottom_gpt_ggdraw <- ggdraw() + draw_image("images/bottom_gpt_gt.png", scale = 0.9)
top_bottom_gpt_ggdraw <- plot_grid(top_gpt_ggdraw, bottom_gpt_ggdraw)
ragg::agg_jpeg("images/llm_gpt_gt.jpg",
width = 10, height = 4, units = "in", res = 600)
top_bottom_gpt_ggdraw
dev.off()
```
![GPT-3 언어모형 개발에 사용된 언어별 문서 통계](images/llm_gpt_gt.jpg)
## 거대언어모형
언어모형이 시간이 지남에 따라 크기가 커져 거대언어모형(Large Language Models, LLMs)이 언어모형을 지칭하는 용어로 자리를 잡아가고 있다. 특히 트랜스포머(Transformer) 기반 사전 훈련된 언어 모형(Pre-trained Language Models, PLMs)은 모형 크기를 확장하면 성능이 향상되고, 특정 규모를 초과하면 거대언어모형에서는 작은 언어모형에서 볼 수 없는 특별한 능력을 발현함을 증명했다. [@zhao2023survey]
![거대언어모형(LLM)](images/llm_g.png)
2023년 3월에 발표된 조사에서 10억 이상 패러미터를 가진 거대언어모형이
공개형(Open Source), 폐쇄형(Closed Source)으로 나눠진다. 공개형 거대언어모형은 연구자나 개발자가 자유롭게 접근하여 모형 내부 구조를 이해하거나 수정할 수 있어, 커뮤니티 발전을 촉진하고 다양한 응용 분야에서 활용될 수 있지만 폐쇄형 거대언어모형에 비해 성능이 떨어진다. 반면에 폐쇄형 거대언어모형은 상업적 이익을 목적으로 개발되어 내부 알고리즘에 대한 접근이 제한되지만, 공개형 거대언어모형에 비해 더 뛰어난 성능을 보인다.
학술연구 목적으로 거대언어모형을 사용하려는 경우 공개형 모형이 더 유용할 수 있지만 상업적 활용에서는 폐쇄형 모형이 더 뛰어난 성능을 보이기 더 적합할 수 있다. 거대언어모형이 사회, 정치, 경제, 문화 등 다양한 분야에 영향을 미칠 수 있기 때문에, 거대언어모형 공개여부는 윤리적, 정치적, 사회적 영향을 평가하는 데도 중요한 잣대가 된다.
### NLP 활용
거대언어모형은 자연어처리 분야에서 다양한 응용을 가능하게 한다. 특히 텍스트 생성, 기계번역, 질의응답, 요약, 감정분석, 텍스트 분류, 텍스트 유사도 측정 등의 응용이 가능하다.
자연어 처리(NLP)는 텍스트 데이터를 통해 가치를 창출하는 분야에서 중요한 역할을 수행한다. 과거 감정 분석, 텍스트 분류, 개체명 인식(NER) 등 다양한 자연어 처리 작업을 각각 독립적으로 수행하면서 중복되고 파편화된 작업 흐름이 발생했다. 예를 들어, 텍스트 분류 작업을 수행한 후에 감정 분석을 별도 작업으로 수행해야 할 경우, 공통으로 필요한 텍스트 전처리나 피처 추출 과정이 중복된다.
이러한 문제를 해결하기 위해 자연어 처리 작업들을 통합적으로 설계하고 연결하는 것이 중요했다. 텍스트 분류 모형이 특정 주제(예: 스포츠, 정치)에 대한 텍스트를 분류한 후, 해당 주제에 맞는 감정 분석을 적용하거나, 개체명 인식(NER)을 통해 특정 인물이나 조직의 이름을 식별한 후, 이를 기반으로 텍스트 요약이나 질의 응답 시스템을 구축하는 방식이 거대언어모형 출현 이전 많이 사용된 방식이다.
감정 분석, 텍스트 분류, 개체명 인식(NER), 품사(POS) 태깅, 의존성 구문 분석, 기계 번역, 질의 응답, 텍스트 요약, 상호참조해결(Coreference Resolution), 텍스트 생성 등 자연어 처리 작업은 거대언어모형 등장과 함께 한차원 높은 성능 향상을 경험하고 있다. 또한, 기초모형을 활용한 파인튜닝과 프롬프트 공학의 결합으로, 과거 각각의 작업에 특화된 모델을 따로 개발하고 훈련해야 했던 방식과는 대비되고 있다.
1. 감정 분석: 긍정, 부정, 중립 등 주어진 텍스트에 표현된 감정을 파악.
2. 텍스트 분류: 텍스트 데이터를 미리 정의된 클래스 또는 주제(예: 스포츠, 정치, 연예 등)로 분류.
3. 개체명 인식(NER): 텍스트 내에서 사람, 조직, 위치, 날짜 등의 명명된 개체(entity)를 식별하고 분류.
4. 품사(POS) 태깅: 주어진 텍스트의 단어에 문법적 레이블(예: 명사, 동사, 형용사)을 할당.
5. 의존성 구문 분석: 문장 내 단어 간의 문법 구조와 관계를 식별.
6. 기계 번역: 영어에서 스페인어로 또는 중국어에서 프랑스어로와 같이 한 언어에서 다른 언어로 텍스트를 번역.
7. 질의 응답: 자연어로 제기된 질문을 이해하고 답변할 수 있는 시스템을 개발.
8. 텍스트 요약: 주요 아이디어와 정보를 보존하면서 주어진 텍스트에 대한 간결한 요약을 생성.
9. 상호참조해결(Coreference Resolution): 텍스트에서 두 개 이상의 단어나 구가 동일한 개체 또는 개념을 지칭하는 경우 식별.
10. 텍스트 생성: 주어진 입력, 컨텍스트 또는 일련의 조건에 따라 일관되고 의미 있는 텍스트를 생성.
### NLP 기계학습
자연어처리(NLP) 기계학습은 통계모형과 거의 비슷한 작업흐름을 갖는다. 차이점이 있다면 데이터 관계의 설명보다 예측에 더 중점을 둔다는 점이라고 볼 수 있다. 감성 분석 및 텍스트 분류 등 텍스트를 데이터로 하는 전통적인 자연어 처리 작업은 다음과 같은 작업흐름을 갖게 된다.
먼저, 데이터 수집 단계에서 분석할 텍스트 데이터를 수집한다. 소셜 미디어, 웹사이트, 뉴스 기사 등 다양한 출처에서 데이터를 가져온다. 데이터 전처리 단계에서는 텍스트를 정제하고 필요한 형태로 변환하는데 불필요한 문자나 단어를 제거하고, 텍스트를 토큰화한다.
특성(Feature) 추출 단계에서는 텍스트 데이터에서 기계학습에 사용될 유용한 특성을 추출한다. 단어 빈도수, TF-IDF 값, 단어 임베딩 등을 예로 들 수 있으며 이렇게 추출된 특성은 기계학습에 사용된다.
기계학습 단계에서는 추출된 특성을 기반으로 분류나 회귀예측 모형을 학습한다. 기계학습모형은 텍스트가 어떤 범주에 속하는지, 어떤 감정을 표현하는지 등을 예측하는 데 사용된다. 기계학습모형 평가 단계에서는 시험 데이터를 사용해 모형성능을 평가한다.
거대언어모형의 등장은 앞선 기계학습 작업흐름에 큰 변화를 가져왔다. 특성 추출과 기계학습 단계를 통합함으로써 자연어 처리 작업 복잡성이 크게 줄어 단순해졌지만 성능은 오히려 향상되는 결과를 가져왔다.
::: columns
::: {.column width="40%"}
```{mermaid}
graph TD
A[데이터 수집] --> B[데이터 전처리]
B --> C[피쳐 추출]
C --> D[훈련-테스트 데이터셋 분할]
D --> E[모형 선택]
E --> F[모형 학습]
F --> G[모형 평가]
G --> H[하이퍼파라미터 튜닝]
H --> I[모형 배포]
I --> J[모니터링 및 유지보수]
```
:::
::: {.column width="60%"}
1. 데이터 수집: 텍스트 데이터와 해당 레이블이 포함된 데이터셋을 수집한다. 감성 분석의 경우, 라벨은 '긍정', '부정' 또는 '중립'이 되고, 텍스트 분류의 경우 레이블은 다양한 주제나 카테고리를 나타낼 수 있다. 즉, 자연어 처리 목적에 맞춰 라벨을 특정하고 연관 데이터를 수집한다.
2. 데이터 전처리: 텍스트 데이터를 정리하고 전처리하여 추가 분석에 적합하도록 작업하는데 소문자화, 토큰화, 불용어 제거, 특수문자 제거, 어간 단어 기본형으로 줄이기 등이 포함된다.
3. 피쳐 추출:사전 처리된 텍스트를 기계 학습 알고리즘에 적합한 숫자 형식으로 변환하는 과정으로 BoW, TF-IDF, 단어 임베딩 등이 흔히 사용되는 기법이다.
4. 훈련-시험 데이터셋 분할: 일반적으로 70-30, 80-20 또는 기타 원하는 분할 비율을 사용하여 데이터셋을 훈련과 시험 데이터셋으로 구분한다.
5. 모형 선택: 적합한 통계, 머신 러닝, 딥러닝 모델을 선정한다.
6. 모형 학습: 적절한 최적화 알고리즘과 손실 함수를 사용하여 훈련 데이터셋에서 선택한 모델을 학습시킨다.
7. 모형 평가: 정확도, 정밀도, 리콜, F1 점수 또는 ROC 곡선 아래 영역과 같은 관련 메트릭을 사용하여 시험 데이터셋에서 학습 모형의 성능을 평가한다.
8. 하이퍼파라미터 튜닝: 격자 검색 또는 무작위 검색과 같은 기술을 사용하여 모형의 하이퍼파라미터를 최적화하여 성능을 개선한다.
9. 모형 배포: 모형을 학습하고 최적화한 후에는 실제 환경에서 사용할 수 있도록 실제 운영 환경에 배포하여 가치를 창출한다.
10. 모니터링 및 유지 관리: 배포된 모형의 성능을 지속적으로 모니터링하고 필요에 따라 새로운 학습데이터로 업데이트하여 정확성과 효율성을 유지한다.
:::
:::
## GPT-4 성능과 가격
GPT-4는 대규모 멀티 모달(Multi Modal) 언어모형으로 트랜스포머(Transformer) 기반 사전훈련되어 텍스트에서 다음 토큰을 생성하는 생성형 AI다. 이전 버전 GPT-3.5와 비교하여 더 뛰어난 성능을 보이며 멀티 모달을 지원하여 컴퓨터와 여러가지 형태(텍스트, 이미지 등)로 의사소통하는 채널을 통해 상호작용할 수 있다.
### GPT-4 성능
GPT-4는 인공지능 성장과 능력을 객관적으로 평가하기 위해 다양한 시험과 평가를 수행한다. 모형의 언어 이해, 문제 해결 능력, 논리적 추론 등 다양한 능력을 측정하여 결과를 반영한다. Advanced Placement (AP), AMC 10, AMC 12와 같은 시험들은 원래 학생들의 지식과 능력을 측정하기 위해 만들어졌지만, 인공지능이 시험을 풀게함으로써 GPT-4 능력을 객관적으로 평가할 수도 있다. 시험을 통해, 인공지능이 어려운 문제를 얼마나 효과적으로 해결할 수 있는지, 또 다양한 주제와 문맥에서 어떻게 작동하는지 평가 결과를 통해 객관적으로 확인할 수 있다.
Advanced Placement (AP)는 미국 College Board에 의해 운영되는 프로그램으로 고등학생에게 대학 수준의 교육 과정과 평가를 제공한다. 높은 점수를 얻은 학생은 미국의 다양한 대학에서 학점 인정을 받을 수 있다. 고등학생은 AP를 통해 고등학교 재학기간 동안 대학 수준의 학업을 경험하고, 학점을 얻을 수 있는 기회가 제공된다.
AMC 10은 미국 수학 협회가 주관하는 수학 대회이며, 미국기준 10학년 이하의 학생을 대상으로 한다. 고등학교 교육 과정 중 10학년까지 수학문제를 다루며, 미국에서 국제 수학 올림피아드 (IMO)에 참가하는 팀을 선발하는 일련의 시험 중 첫번째 시험이다.
AMC 12도 마찬가지로 미국 수학 협회가 주관하는 수학 대회로 12학년 이하 학생들을 대상으로 하며, 고등학교 전체 교육 과정을 다루지만, 미적분학은 제외된다. AMC 12는 AMC 10과 함께 국제 수학 올림피아드 (IMO) 참가 팀을 선발하기 위한 시험 중 하나이다.
GPT-4는 다양한 시험에서 이전 GPT-3.5보다 전반적으로 높은 성능을 보였다.
법률, 대학 입학 시험, 과학 시험 등에서 특히 뛰어난 결과를 보였지만 코딩 능력에 대한 시험에서는 상대적으로 낮은 성능을 보였다.
특히 미국 변호사 시험(Uniform Bar Exam)에서 상위 10% 점수를 얻어 GPT-3.5보다 훨씬 나아졌고, LSAT과 SAT 같은 대학 입학 시험에서도 상위 20% 이상 점수를 기록했다. 대학원 입학 시험인 GRE에서 수리영역(Quantitative)과 언어영역(Verbal) 부분에서 상위를 차지했고, 과학 관련 시험인 USABO와 USNCO에서도 높은 백분위를 기록했다. 의학 지식을 평가하는 자가 평가 프로그램(Medical Knowledge Self-Assessment Program, MK-SAP)에서는 75% 점수를 얻었다.
코딩 능력을 평가하는 코드포스(Codeforces)와 리트 코드(Leetcode)에서 상대적으로 낮은 점수를 보였지만, 대부분의 AP 시험에서 상위 20% 이상의 높은 점수를 얻었고 소믈리에 관련 시험에서도 이론 지식 부분에서 77% ~ 92% 사이 점수를 얻었다. [@openai2023gpt4]
```{r}
#| eval: true
#| echo: false
# PDF --> DOCX 변환 ------------------------------
library(Convert2Docx)
# Converter(pdf_file = "data/2303.08774.pdf",
# docx_filename = "data/2303.08774.docx")
# DOCX --> 표추출 --------------------------------
library(docxtractr)
gpt_docx <- docxtractr::read_docx("data/2303.08774.docx")
tbl_01 <- docx_extract_tbl(gpt_docx, 3) %>%
janitor::clean_names()
# GT 표 제작 --------------------------------
library(tidyverse)
library(gt)
library(gtExtras)
tbl_01 %>%
select(-3) %>%
mutate(type = case_when( str_detect(exam, "Bar|LSAT") ~ "법",
str_detect(exam, "SAT ") ~ "수능",
str_detect(exam, "GRE") ~ "대학원",
str_detect(exam, "USABO|USNCO") ~ "고등 경진대회",
str_detect(exam, "Medical") ~ "헬스케어",
str_detect(exam, "Codeforces|Leetcode") ~ "코딩",
str_detect(exam, "Sommelier") ~ "소믈리에",
str_detect(exam, "^AP ") ~ "AP 시험",
str_detect(exam, "^AMC ") ~ "수학시험",
TRUE ~ "기타"
)) %>%
group_by(type) %>%
gt( rowname_col = "exam") %>%
gt_theme_nytimes() %>%
tab_header(
title = "GPT-4 성능",
subtitle = "OpenAI GPT-4 Technical Report") %>%
cols_align(
align = "center",
columns = everything()) %>%
gt_highlight_rows(
rows = type == "코딩",
fill = "lightgrey",
bold_target_only = TRUE,
target_col = gpt_4
) %>%
gt_highlight_rows(
rows = type == "수학시험",
fill = "lightgrey",
bold_target_only = TRUE,
target_col = gpt_4
) %>%
gt_highlight_rows(
rows = str_detect(exam, "English|\\) Writing|USNCO"),
fill = "lightgrey",
bold_target_only = TRUE,
target_col = gpt_4
) %>%
opt_table_font(
font = list(
google_font(name = 'Gowun Dodum')
)
)
```
### 로스쿨 입학시험
GPT-4 LSAT(미국 로스쿨 입학 시험) 성적은 163으로, 대략 88번째 백분위에 해당되어 미국 로스쿨 대학별 입학점수[^lsat]와 비교하면, 상위 10개 대학을 제외하고는 대부분의 로스쿨에 입학하는 데 큰 문제가 없을 것으로 보이기 때문에 GPT-4가 로스쿨 입학 시험을 잘 풀고 있다는 반증이다.
[^lsat]: publiclegal 웹사이트 [2020 Raw Data Law School Rankings](https://www.ilrg.com/rankings/law/) 데이터와 결합
반면에, GPT-3.5 LSAT 성적은 149로, 대략 40번째 백분위에 해당하여 GPT-4와 비교하면 상대적으로 낮아 대부분의 미국 로스쿨에 입학하기에는 충분한 실력을 갖췄다고 보기 어렵다.
Uniform Bar Exam(미국 변호사 자격증 시험)의 경우, GPT-4는 298/400으로 약 90번째 백분위 성적을 보이고 있어 변호사 자격증을 얻기 위한 충분한 실력을 보여주고 있지만, GPT-3.5는 213/400으로 GPT-4에 훨씬 미치지 못하고 있다.
```{r}
#| eval: false
#| echo: false
library(rvest)
extrafont::loadfonts()
lsat_raw <- read_html('https://www.ilrg.com/rankings/law/')
lsat_tbl <- lsat_raw %>%
html_elements('.table-responsive') %>%
html_table(header = TRUE) %>%
.[[1]] %>%
janitor::row_to_names(1) %>%
janitor::clean_names()
lsat_rank <- lsat_tbl %>%
pull(law_school) %>% dput()
lsat_g <- lsat_tbl %>%
select(no, law_school, lsat_low, lsat_median, lsat_high) %>%
mutate(law_school = factor(law_school, levels = lsat_rank) %>% fct_rev) %>%
mutate_if(is.character, as.integer) %>%
ggplot(aes(x = law_school, y = lsat_median, group=law_school)) +
geom_point() +
geom_linerange(aes(ymin = lsat_low, ymax= lsat_high), colour = "blue") +
geom_hline(yintercept=163, linetype='dotted', col = 'red')+
annotate("text", x = "New York University", y = 163, size =5, label = "GPT-4", hjust = 1.1,
color = "red") +
coord_flip() +
theme_bw(base_family = "MaruBuri Bold") +
labs(x = "",
y = "",
title = "미국 변호사 입학시험 점수(LSAT)",
subtitle = "LSAT 중위점수 및 하한과 상한",
caption = "2020 Law School Rankings, https://www.ilrg.com/rankings/law/")
ragg::agg_png("images/lsat_g.png", width = 297, height = 210, units = "mm", res = 600)
lsat_g
dev.off()
```
![미국 변호사 입학시험 GPT-4 성능](images/lsat_g.png)
### GPT-4 가격
2023년 7월 기준으로 OpenAI API의 가격을 원화(1,300원)로 환산해 보면 여러 특징을 파악할 수 있다. GPT-4는 8K와 32K 컨텍스트(context)에서 1K 토큰당 각각 39원과 78원의 가격을 가지며, 이는 높은 성능과 대용량 처리 능력을 반영한 고가의 언어 모델이다. 반면에 GPT-3.5 터보는 4K와 16K 컨텍스트에서 1K 토큰당 3.9원과 5.2원의 비교적 저렴한 가격을 가지고 있으며, 이는 중간 수준의 성능을 가성비 좋게 제공한다.
세부 튜닝 모형(Fine-tuning models)에는 Ada, Babbage, Curie, Davinci 등이 있으며, 이들은 특정 작업에 최적화되어 성능별로 다양한 가격대를 보인다. 특히 텍스트 임베딩에 특화된 Ada v2 모형은 1K 토큰당 0.13원으로 매우 저렴한 가격으로 제공된다.
이미지 모형 DALL·E 시리즈는 이미지 크기에 따라 20.8원에서 26원 사이의 가격을 가지며, 텍스트 프롬프트에 따른 이미지 생성 작업에 사용된다. 오디오 모형 위스퍼(Whisper)는 분당 7.8원의 가격을 가지고 있으며, 다양한 언어 음성 오디오 처리 작업에 특화되어 있다.
```{r}
#| eval: false
#| echo: false
library(readxl)
library(tidyverse)
price_today <- read_excel("data/openai_pricing.xlsx", sheet="price_230721")
price_tbl <- price_today %>%
janitor::clean_names(ascii = FALSE) %>%
separate(가격, into = c("가격", "단위"), sep = "/") %>%
mutate(가격 = parse_number(가격) *1300, # 환율 1,300 / 달러 적용
단위 = str_squish(단위))
# price_tbl %>%
# gt::gt() %>%
# gtExtras::gt_theme_espn()
extrafont::loadfonts()
pricing_20230621_g <- price_tbl %>%
mutate(모형상세 = glue::glue("{모형구분} / {model} / {작업}") %>% as.character(.)) %>%
mutate(모형구분 = factor(모형구분, levels=c("GPT-4", "GPT-3.5 Turbo", "Fine-tuning models",
"Embedding models",
"Image models", "Audio models") )) %>%
ggplot(aes(x = fct_reorder(모형상세, 가격), y = 가격, fill = 모형구분)) +
geom_col(width = 0.5) +
# facet_wrap(~모형구분, scales = "free_y") +
coord_flip() +
geom_text(aes(x = 모형상세, y = 가격, label = glue::glue("{가격} 원") ), nudge_y = 5) +
theme_bw(base_family = "MaruBuri Bold") +
labs(title = "OpenAI 챗GPT API 호출 가격",
subtitle = "환율 1,300 원/달러 적용 (텍스트 1,000 토큰, 이미지는 크기별, 오디오는 1분 기준)",
x = "",
y = "가격(원)",
caption = "OpenAI 가격표: https://openai.com/pricing") +
theme(legend.position = c(0.8, 0.3),
legend.title=element_text(size=rel(2.5), family = "MaruBuri"),
legend.text=element_text(size=rel(1.5), family = "MaruBuri"))
ragg::agg_png("images/pricing_20230621_g.png", width = 297, height = 210, units = "mm", res = 600)
pricing_20230621_g
dev.off()
```
![OpenAI API별 가격](images/pricing_20230621_g.png)
## 가자 프롬프트 공학
기계학습과 자연어 처리 분야에서는 시간이 지남에 따라 다양한 공학 기법이 등장하고 발전해왔다. 이러한 공학 기법들은 대체로 피처 공학, 아키텍처 공학, 목적 공학, 그리고 프롬프트 공학으로 구분할 수 있다. 각 기법은 특정 시기에 주목받았으며, 그에 따라 다양한 모델과 알고리즘이 개발되었다. 이러한 공학 기법들의 진화 과정을 살펴보면, 기계학습과 자연어 처리가 어떻게 발전해왔는지 이해할 수 있다.
첫 번째로, 피처 공학의 시대는 대략 2015년까지 이어졌으며, 이 기간 동안 비신경망 지도학습이 주로 사용되었다. 이 단계에서는 수작업으로 특징(Feature)을 추출하고, 그 특징을 기반으로 SVM(Support Vector Machine)이나 CRF(Conditional Random Fields) 같은 비신경망 기계학습 모델을 학습시켰다. 이 방법은 당시에는 효과적이었지만, 수작업으로 특징을 추출하는 과정이 복잡하고 시간이 많이 소요되었다.
두 번째로, 2013년부터 2018년까지는 아키텍처 공학이 주목받았다. 이 시기에는 신경망 지도학습이 대두되면서, 수작업으로 특징을 추출할 필요가 줄었다. 대신, 신경망 아키텍처를 설계하고 수정하는 작업이 중요해졌다. 예를 들어, 텍스트 분류 작업에는 CNN(Convolutional Neural Networks)이 주로 사용되었다. 이 단계에서는 아키텍처의 중요성이 강조되었으며, 사전학습된 언어 모델이나 임베딩 같은 얕은 특징도 사용되기 시작했다.
마지막으로, 2017년부터 현재까지는 목적 공학과 프롬프트 공학이 주를 이루고 있다. 사전학습된 언어 모델을 사용하여 초기 모델을 설정하고, 목적함수를 엔지니어링하는 것이 이 단계의 특징이다. BERT와 같은 모델이 미세조정을 통해 다양한 작업에 적용되고 있다. 또한, 2019년부터는 프롬프트 공학이 두각을 나타내고 있으며, GPT-3와 같은 모델은 프롬프트를 통해 다양한 NLP 작업을 수행할 수 있다. 이 단계에서는 언어 모델에 대한 의존도가 높아져, 아키텍처나 특징 추출에 대한 부담이 줄어들었다. [@Amatriain2023]
```{mermaid}
graph LR;
%% Styling
style A fill:#f9d79c,stroke:#f39c12,stroke-width:2px;
style B fill:#aed6f1,stroke:#3498db,stroke-width:2px;
style C fill:#d5f5e3,stroke:#27ae60,stroke-width:2px;
style D fill:#f5b7b1,stroke:#e74c3c,stroke-width:2px;
%% Subgraph for Feature Engineering
subgraph A["피처(Feature) 공학"]
A1["패러다임: 비신경망 지도학습 <br>전성기: ~2015 <br>특징: 수작업 Feature, 비신경망 사용 <br>대표작: SVM, CRF"]
end
%% Subgraph for Architecture Engineering
subgraph B["아키텍처 공학"]
B1["패러다임: 신경망 지도학습 <br>전성기: 2013~2018 <br>특징: 신경망 의존, 네트워크 수정 필요 <br>대표작: 텍스트 분류에 CNN"]
end
%% Subgraph for Objective Engineering
subgraph C["목적(Objective) 공학"]
C1["패러다임: 사전학습, 미세조정 <br>전성기: 2017~현재 <br>특징: 사전학습 LLM 사용, 목적함수 공학 필요 <br>대표작: BERT → Fine Tuning"]
end
%% Subgraph for Prompt Engineering
subgraph D["프롬프트 공학"]
D1["패러다임: 사전학습, 프롬프트, 예측 <br>전성기: 2019~현재 <br>특징: LLM 전적 의존, 프롬프트 공학 필요 <br>대표작: GPT3"]
end
%% Connections
A --> B
B --> C
C --> D
```