본문 바로가기

졸업프로젝트

[GPT-3] 카카오 GPT-3 모델 KoGPT 분석! API를 이용해서 소설 첫 문단 만들기

 

 

졸업프로젝트로 NLP를 선정한 우리...

나같은 경우는 작년 '인공지능' 수업에서 재귀신경망과 자연어처리를 2주에 걸쳐 배웠었다. CNN과 다르게 눈에 확실히 보이는 결과가 없고, 자연어라는 것이 고도의 비정형 데이터기 때문에 과제하는 데에 애먹었던 기억이 있다. 

 

 

본 포스팅에서는 우리 팀이 선정한 기술인 KoGPT와 내가 맡은 파트인 소설의 첫 문단 생성까지의 과정을 다루고자 한다.


 

 

1. '우리두리' 서비스 간략 소개

AI 기반 아동용 릴레이 동화 창작 프로그램

AI와 한 문장씩 번갈아가며 하나의 동화를 완성하는 서비스이다.

(Input으로 녹음 한 문장, output 으로 이어질 내용 한(두) 문장) 이 n번 반복되며 하나의 완결된 이야기가 완성된다. 

편견, 성역할 고착화 등 기존 전래동화의 단점을 수용하기보다, 아동이 동화 제작에 스스로 참여하면서 창의력과 국어 능력 향상을 기대한다.

 

 

 

2. GPT와 KoGPT 

2020년 일론머스크가 설립한 미국의 인공지능 연구소 OpenAIGPT-3 (Generative Pre-trained Transformer 3)를 공개했다. 그 이름에서 알 수 있듯이, Generative(생성하는) Pre-trained(사전 학습된) Transformer(트랜스포머 - 구글에서 제시된 기계번역을 위한 언어모델)이다.

 

- 1750억개의 파라미터를 이용하여 방대한 스케일을 바탕으로 GPT-2 모델보다 훨씬 향상된 성능을 보여주었다. 인간 뇌의 뉴런이 1000억 개 인데...

 

- 기존의 언어모델에서 사용한 Fine Tuning을 하지 않았다는 것 또한 GPT가 많은 관심을 받았던 이유.

 

 

그러나 우리는 한글 모델을 이용해야 하는 것... GPT-3 수준의 한국어 모델로는 

   1) 카카오에서 개발한 KoGPT (2021.11)와 

   2) 네이버에서 개발한 하이퍼클로바 (2021.05)

 

정도가 있었는데

 

네이버 Clova Studio는 아직 closed beta만 제공해서 기업 고객 대상으로만 운영됐다.

그나마 제일 최근 공개한 KoGPT를 사용하기로 했다. Github에 오픈 소스까지 공개돼서 활용하기 좋겠다 판단.

 

깃헙 주소 : https://github.com/kakaobrain/kogpt
 

GitHub - kakaobrain/kogpt: KakaoBrain KoGPT (Korean Generative Pre-trained Transformer)

KakaoBrain KoGPT (Korean Generative Pre-trained Transformer) - GitHub - kakaobrain/kogpt: KakaoBrain KoGPT (Korean Generative Pre-trained Transformer)

github.com

 

참고로 KoGPT는 다음과 같은 기능을 수행 가능하다.

  • 제시된 문장의 긍정, 부정 등 속성 판단 및 분류
  • 긴 문장의 주요 내용을 한 줄로 요약
  • 결론이 없는 문장을 추론하여 결론 예측
  • 질문에 맥락을 고려하여 답변
  • 주어진 문장의 다음 내용 생성

 

 

3. API로 KoGPT 사용해보기

카카오는 REST API만을 이용하여 KoGPT를 사용할 수 있게 제작했다. SDK는 미지원한다.

게다가 하나의 API로 한 달에 사용할 수 있는 요청 수가 200건으로 정해져있다..! (이건 몰랐는데)

 

 

 

 

200건 요청에 도달하면 결과가 출력되지 않고 이런 메세지가 뜬다.

{'code': -10, 'msg': 'quota exceeded'}

 

 

 

새로운 API 주소를 발급받아 다시 시도해보자.

다음 페이지를 참고했다.

 

 

 

 

1) 카카오 개발자 페이지에서 내 애플리케이션 만들기

 

 

카카오 디벨로퍼스에 접속하여 새로운 어플리케이션을 추가한다. 

'우리두리 Test'라는 이름으로 하나 만들었다. 참고로 캐릭터는 콩쥐다.

 

 

 

 

2) 플랫폼 설정하기

 

어플리케이션을 생성하면 첫 화면에 '플랫폼 설정하기' 버튼이 있다. 

여기에는 운영 중인 웹사이트 도메인 등을 입력할 수 있는데, 우리는 아직 어플 제작 단계 전이니 넘어가도록 한다. 

 

 

어플 개발 후에 플랫폼 등록할 예정

 

 

 

 

3) 발급받은 REST API 복사해서 적용하기

 

'앱 키' 탭에 들어가면 네이티브 앱 키, JavaScript 키 등 발급된 키가 있다.

여기서 REST API 를 복사하여 필요한 부분에 삽입하여 사용한다.

 

 

 

 


 

 

이제 발급받은 키로 KoGPT를 테스트해보자.

 

워낙 거대한 모델이다 보니, 하드웨어 requirement 만 32GB GPU RAM이다...ㅋ

정확도가 반인 더 가벼운 모델도 16GB...

학교에서 제공하는 Tencent Cloud 에서 돌려봤는데 다운받는 데에만 20분이 걸렸다.

 

그래서 API이용해서 CoLab환경에서 실행을 해보았다. API의 좋은 점이 모든 데이터셋을 다운받을 필요가 없다는 것이다.

 

 

 

<Python 코드>

import requests
import json
import math
import time

start = time.time()
REST_API_KEY = ${REST_API_KEY}

# KoGPT API 호출을 위한 메서드 선언
# 각 파라미터 기본값으로 설정
def kogpt_api(prompt, max_tokens = 1, temperature = 1.0, top_p = 1.0, n = 1):
    r = requests.post(
        'https://api.kakaobrain.com/v1/inference/kogpt/generation',
        json = {
            'prompt': prompt,
            'max_tokens': max_tokens,
            'temperature': temperature,
            'top_p': top_p,
            'n': n
        },
        headers = {
            'Authorization': 'KakaoAK ' + REST_API_KEY,
            'Content-Type': 'application/json'
        }
    )
    # 응답 JSON 형식으로 변환
    response = json.loads(r.content)
    return response

# KoGPT에게 전달할 명령어 구성
prompt = '''인공지능 성능을 테스트해봅니다. 내일 날씨가 어떨까요?'''

#파라미터를 전달해 kogpt_api()메서드 호출
response = kogpt_api(
    prompt = prompt,
    max_tokens =50,
    temperature = 0.8,
    top_p = 1.0,
    n = 3
)

print(response['generations'][0]['text'])
end = time.time()

print(f"{end - start:.1f} 초")

 

<결과>

내일은 전국이 대체로 맑겠습니다. 내일 아침 기온은 서울이 12도, 춘천은 9도, 강릉은 13도로 시작하겠고요.
7.4 초

 

결과가 잘 나오는 것을 확인할 수 있다. (근데 짜 내일 아침 기온 서울 12도던데...)


기본 동작은 KoGPT가 수행할 과제를 prompt 파라미터로 전달하고, 요청이 성공적으로 처리되면 처리 결과를 응답 바디의 JSON객체로 반환하는 것이다.

 

 

여기서 선택 파라미터 값을 조정하여 요구사항에 더 잘 부합하는 결과를 유도할 수 있다.

특히 KoGPT는 정제되지 않은 데이터기 때문에 '릴레이 동화'라는 과제를 달성하기 위해서는 이 과정이 중요하다.

 

 

파라미터 타입 설명 필수
prompt String KoGPT에 전달할 제시어. 하나의 한글 문자열로 작성해야 한다. 과제 설명, 예시, 입력 등을 조합해 다양하게 전달할 수 있다. O
max_tokens Integer 생성할 최대 토큰 수.  O
temperature Double 온도 값. 수치가 높을수록 더 창의적인 결과가 생성된다. X
top_p Double 상위확률 값. 수치가 높을수록 더 창의적인 결과가 생성된다. X
n Integer 생성할 결과 수. 한 달에 200번  X

 

 

 

이제부터는 prompt 값과 파라미터 값, 결과만을 쓰도록 하겠다.

 

소설 한 문장을 입력하고 다음 내용을 예측하는 예시를 넣어보자!

 

 

<코드>

prompt = '''소설의 다음에 올 문장을 생성합니다.
피터팬과 신데렐라는 친한 친구였어요. 그 둘은 같은 반이었는데 어느 날 같이 숲으로 산책을 나갔어요.
'''

response = kogpt_api(prompt, max_tokens=32, temperature = 0.3, top_p = 0.85)

 

<결과>

피터팬은 신데렐라가 좋아하는 꽃을 꺾어 주었어요. 신데렐라는 그 꽃을 보자 너무 좋아했어요.

 

보통 온도를 높일수록 max_tokens 수를 늘려야 하는 것을 알아냈다.


 

KoGPT가 동화의 다음 올 문장은 잘 만들어내는데, 우리가 추구하는 것은 등장인물 수와 배경을 정하면 자동으로 첫 문장을 만들어주는 것. 

그런데 아무 첫 문장 없이 등장인물, 배경만 전달해서 글을 지어달라고 하면 어떤 방법으로든 결과가 이상하게 나왔다.

결국 등장인물, 배경 풀을 만들고 그것을 문장에 넣어서 전달하는 형식으로 만들었더니 그럴듯한 첫 문단이 도출됐다.

 

 

<코드>

import random

main_char = ['피터팬', '신데렐라', '콩쥐','백설공주', '후크선장', '앨리스','라푼젤','헨젤','흥부']
background = ['바다', '학교','숲 속','궁전','시장','영화관']
char1 = random.choice(main_char)
main_char.remove(char1)
print(main_char)
char2 = random.choice(main_char)
bg1 = random.choice(background)

prompt = f'''
아주 먼 옛날 한 마을에 {char1}가 살고 있었어요. 어느 날 {bg1}에 가기로 한 {char1}는 {char2}을 마주쳤어요.
'''

response = kogpt_api(
    prompt = prompt,
    max_tokens =50,
    temperature = 0.3,
    top_p = 0.5
)

print(prompt, end = ' ')
print(response['generations'][0]['text'])
end = time.time()

print(f"{end - start:.1f} 초")

<결과>

아주 먼 옛날 한 마을에 앨리스가 살고 있었어요. 어느 날 궁전에 가기로 한 앨리스는 라푼젤을 마주쳤어요.
라푼젤은 궁전에 가기 싫었지만, 앨리스가 가자고 해서 어쩔 수 없이 궁전에 가게 되었어요.
궁전에 도착한 앨리스는 라푼젤을 보고 깜짝 놀랐어요.
라푼젤은 긴 머리
3.2 초

 

 


 

 

확실히 KoGPT2랑 비교해봤을 때 KoGPT3 수준에서는 더 그럴듯 한 결과를 보이는 것을 알 수 있었다.

이제 해야될 일은

 

  • 동화의 완결도를 어떻게 보완시킬 건지
  • 욕설, 부적절한 표현들 정제
  • 맞춤법, 문법 등 교정
  • 응답 시간 단축

등이 있겠다.

 

휴.. 그래도 우리가 흥미있어보이는 주제로 선정해서 지금까지는 재미있게 진행 중이다.

NLP가 꾸준히 발전, 투자 받는 중인 기술인 걸 알고 자신감도 생겼고!

방학까지 개발 끝내는게 목표인데... 화이팅해보자. 😎