졸업프로젝트 마감일이 일주일 반 정도 남은 상태...
1년간의 여정이 끝나간다는게 아직 안믿긴다.
졸프를 끝내고있는 나의 상황이 어리벙벙할 따름
두번째 학기인 그로쓰에는 열심히 개발과 QA를 하고 디테일을 수정해나간다.
다행히 우리 팀은 방학 동안에 주제가 바뀌지 않았다.
본 포스팅에서는 내가 맡은 파트인 AI부분, 정확히는 네이버의 GPT 모델 하이퍼클로바를 우리 프로젝트에 활용한 과정을 다루고자 한다.
0. 우리의 서비스 - 우리두리
'우리둘이 만들어가는 이야기, 우리두리'는 아동용 릴레이 동화 창작 서비스로,
GPT를 이용해 아동과 AI가 한 문장씩 번갈아가며 동화를 만들어나간다는 틀을 가진다.
(사실 작년에는 챗GPT가 이렇게 유명해질 줄 몰랐지...ㅎ 스타트땐 아무도 GPT가 뭔지 몰랐다구! 겨울 방학동안 OpenAI사의 챗GPT가 인기를 타면서 대중들에게도 많이 알려진 기술이 되었다. 그로쓰 개강하고 나서도 관련 질문이 많이 들어왔다. 핫한 기술을 이용한다고 긍정적으로 생각하기로 함.)
서비스는 다음과 같은 순서로 진행된다.
a. 사용자는 주인공, 배경, 동화의 길이를 선택한다.
b. 사용자와 AI는 한문장씩 번갈아 가며 동화를 만든다. 이때 다음 문장 말하기, 질문에 답하기, 선택지 고르기 등 다양한 생각할
거리가 제공된다. 동시에 배경으로는 각 문장에 맞는 그림이 자동생성되어 나온다.
c. 동화가 완성되면 동화의 표지와 제목을 선정하고 티켓이 생성된다.
아동용 서비스인 만큼 사용자를 고려한 기능을 넣으려고 노력했다. 인터렉티브 요소가 많이 포함된 것도 그 이유.
- 녹음 기능
- 동화의 내용에 맞게 제공되는 그림
- 맞춤법 및 문법 교정
- 욕설 필터링
지금까지 나온 뷰는 이렇다.
디자인을 맡은 친구가 정말 능력자다... 덕분에 온갖 칭찬을 다 듣고 있다.
1. 기술 선정 이유
한국어 텍스트 제너레이팅 기술이 많이 시중에 존재하지는 않다.
스타트때까지는 카카오의 KoGPT를 이용했다. 모델을 직접 다운받을 수 있도록 오픈돼있어 접근성이 좋았던 것이 가장 큰 이유.
하지만 방학 동안 더 성능이 좋고 조절 가능한 파라미터가 많은 네이버의 하이퍼클로바로 갈아탔다.결과적으로는 좋은 선택이었던 것 같다. 하이퍼클로바가 학습시킨 한국어 모델이 압도적으로 크고, 이번 7월에 챗GPT와 대적하는 하이퍼클로바 X 모델을 공개 예정인 등 네이버가 꾸준히 연구에 투자를 하고 있는 기술 같았다.
2. 하이퍼클로바로 API 만들기
하이퍼클로바를 이용하려면 우선 네이버 클라우드 플랫폼에 가입을 해야 한다.
그다음 서비스 - AI 서비스 - CLOVA Studio 에 들어간다. 하이퍼클로바를 제공하는 서비스가 클로바스튜디오라고 보면 된다.
그러면 이렇게 이용 신청하기 탭이 있다. '기업 고객을 대상으로 Closed Beta 운영된다' 고 하는데, 그냥 실제 회사가 아니여도 지어내서 신청하면 된다. 1주일 정도 뒤에 승인 메일이 오면 그때부터 서비스를 이용할 수 있다.
하이퍼클로바의 기본 홈 화면은 위와 같다. 왼쪽에는 문구를 생성하기 위해 변경하는 값인 파라미터들이 있다.
예를 들어 Engine은 모델의 크기, 즉 성능을 나타내며 좋은 모델일수록 가격이 비싸진다.
Temperature은 문장의 다양성을 나타낸다.
우리 서비스는 동화를 만들어내기 때문에 이 값을 0.75정도로 높여서 사용했다.
더 자세한 설명은 사용가이드에 나와있으니 살펴보길 바란다.
이제 에디터 영역에 프롬프트를 작성해보자. 이 영역에 프롬프트를 입력하고 결과값도 받을 수 있다.
프롬프트는 세가지 요소로 구성된다.
1. 지시문 2. 예제 3. 요청입력
GPT는 기존의 언어모델에서 전통적으로 사용하는 Fine-Tuning 기법이 아닌, 소수의 예제만으로도 빠른 학습을 하는 Few-Shot-Learning 기법을 쓴다.
예를 들어 예제를 보고서 양식으로 쓰면 보고서 양식대로 결과가 출력된다.
엄청난 크기의 언어 모델은 소량의 잘 짜인 예시만으로 그 패턴을 이해하며, 작업을 수행할 수 있는 것이다.
내가 프로젝트에서 쓴 예시를 살펴보자.
이야기의 중간 부분에서 사용자에게 질문을 제공하는 API이다.
동화 다음 내용에 이어지도록 질문을 제시하시오.
동화: 앨리스는 들판에 앉아 아무것도 하지 않는 일상이 너무 지루했어요. 언니는 옆에서 책만 읽고 있었지요. 그 때, 하얀 토끼 한마리가 앨리스를 지나쳐 뛰어가며 말했어요. "에구구! 이러다 너무 늦겠네!" 앨리스는 호기심에 불타올라 토끼를 쫓아 들판을 가로질러 달리기 시작했어요.
질문: 토끼는 어디로 갔을까요?
###
동화: 눈이 몹시 내리는 추운 겨울 날, 마을에서 성냥팔이소녀가 외롭게 성냥을 팔고 있었어요. 소녀는 다 떨어진 옷에 신발도 신지 않은 맨발이었어요. 하루종일 성냥을 하나도 팔지 못한 소녀는 너무 배가 고파 눈 위에 털썩 주저 앉았어요. 갑자기 소녀 앞에 누군가 나타났어요.
질문: 소녀 앞에 나타난 사람은 누구일까요?
###
동화: 옛날 숲속에 신데렐라와 피터팬이 살았어요. 둘은 서로 친구였죠. 그러던 어느 날 신데렐라는 숲 속으로 놀러 갔다가 길을 잃고 말았어요. 한참을 헤매던 신데렐라는 그만 발을 헛디뎌서 연못에 빠지고 말았어요.
질문: 물에 빠진 신데렐라는 어떻게 되었을까요?
###
동화: 어느 한 왕국에 임금님이 살고 있었어요. 궁전이 너무 재미없었던 임금님은 신하들 몰래 마을로 나가 시장을 구경하곤 했답니다. 임금님은 옷을 무척 좋아해서 시장에서 새 옷을 많이 샀어요. 어느 날, 궁전에 낯선 사나이 두 명이 임금님을 찾아왔어요.
질문: 이 사나이들은 왜 임금님을 찾아왔을까요?
###
동화: 피터펜과 신데렐라는 바다 위에서 항상 새로운 모험을 겪었어요. 그들은 함께 바다를 항해하며 먼 섬을 찾아갔어요. 그곳에는 마법의 동굴이 있었고, 그곳에서 만난 마법사가 그들에게 고마운 마음으로 두 사람에게 각각 하나씩 소원을 들어주기로 했어요.
질문:
하이퍼클로바에 소속된 멘토님의 조언에 따르면,
1. 지시문과 예제 사이에는 한줄만 띈다.
2. 모든 주석을 제거한다. 프롬프트는 주석을 주석으로 인식하지 않는다.
3. 예제 사이에는 '###' 등 구분자를 넣고 파라미터 중 Stop Sequence에 이를 추가한다.
위 프롬프트의 결과는 다음과 같다.
피터팬과 신데렐라는 어떤 소원을 빌었을까요?
이정도면 결과가 잘 나오는 것을 확인할 수 있다.
예시들을 작성할 때 동화스럽게 만들려고 노력했다. 예를 들어 어미를 '~요', '~죠', '~했답니다', '~하지뭐예요?'와 같은 식으로 구성하면 결과도 비슷하게 나온다.
.
.
.
하지만 모든 실행 결과가 의도한 대로 잘 나오는 것은 아니다.
우리는 사전설정에서 선택한 주인공들과 배경이 첫 문단에 모두 들어갔어야 했는데, 이 과정이 쉽지 않았다.
주인공이 2명인데 1명만 나온다거나, 설정한 배경이 포함되지 않았다.
이때 하이퍼클로바의 튜닝을 이용할 수 있다.
튜닝은 사용자가 원하는 작업 형태에 맞게 추가 학습시키는 과정이라고 보면 된다.
이를 위해서는 최소 1000개의 데이터가 필요하다.
데이터 뻥튀기 기능도 써봤으나 결과가 마음에 들지 않았고...
결국 1000개의 열을 직접 수기로 채우고 만다. (멘토님이 반대했다. 그렇게까지 한다고?)
노가다...
이런식으로 열심히 채워준다. 나중에는 소재가 떨어져서 챗GPT의 도움을 받았다.
이를 재학습시키는 방식으로 조금 더 내 의도와 맞는 결과를 낼 수 있다.
우리두리에서 사용하는 API의 프롬프트 중 지시문만 알아보자. 동화의 흐름에 맞게 첫, 중간, 끝의 API를 따로 만들었다.
- 첫 문단
주인공과 배경을 모두 포함하여 소설의 첫 문단을 창작하시오.
주인공이 여러 명이면 전부 포함하시오.
- 중간
동화의 다음 내용에 이어지도록 질문을 제시하시오.
동화의 다음 문장을 생성하시오.
- 끝
동화의 결말 부분을 생성하시오.
간단해 보이지만 원하는 결과가 나오도록 프롬프트를 작성하는 일이 쉽지는 않다.
다양한 예시를 넣어보고 지시문을 바꿔가며 시험해보아야 한다.
프롬프트를 바탕으로 외부에서 이용할 수 있도록 테스트앱을 생성해 REST API를 발급받을 수 있다.
그러면 이런 식으로 필요한 곳에 헤더와 바디의 요소들을 넣어 사용하면 된다.
아, X-NCP-CLOVASTUDIO-REQUEST-ID라는 값은 수시로 바뀌는데 그 중 하나만 골라서 넣어도 잘 작동한다.
튜닝한 결과도 테스트 앱으로 생성할 수 있다.
정식으로 서비스를 출시하고 싶으면 테스트 앱이 아닌 '서비스앱'을 생성할 수 있는데, 테스트앱보다 TPS (초당 트렌젝션 수)가 높아서 더 많은 사용자가 이용할 수 있다.
서비스앱은 신청하고 네이버 측에서 승인이 날 때까지 1~2주 정도 소요된다.
발급받은 API를 테스트해보자.
위에 활용했던 질문 예시를 Postman에서 Header와 Body에 값을 잘 넣어주고 Send를 보내보자
결과가 "outputText"라는 변수에 담겨 잘 받아져오는 것을 확인할 수 있다.
이렇게 우리두리에서 쓰인 메인 기능, AI와 번갈아 가며 이야기를 만들어 나가는 기능에 쓰인 하이퍼클로바 구성 방법을 알아보았다.
이 외에도 우리 서비스에는 욕설 필터링, 문법 교정 API, 이미지 제너레이팅 DALLE-2를 이용했다.
사실 AI가 생성한 문구를 그대로 사용하지는 않고, 문맥에 맞게 후처리를 한다.
예를 들어 첫문단 생성 결과에 '결혼', '죽음', '사랑'과 같은 급전개 단어가 있으면 뺀다.
이번 학기 졸프를 하면서 '프롬프트 엔지니어'라는 직업이 있는 이유를 알게 되었다.
아직 AI는 사람이 말을 개떡같이 해도 찰떡같이 알아듣는 수준까지 못왔기 때문에...
제대로 활용하기 위해서는 그 모델과 작동 원리에 대한 깊은 이해가 필요하다.
네이버에서 공식 제공하는 가이드가 있으나 프롬프트를 어떻게 구체적으로 작성해야 좋은 결과를 얻는지에 대한 가이드라인이 없어서 다양한 시도를 해보느라 시간을 많이 보낸 기억이 난다.
이 포스팅이 추후 텍스트 제너레이팅을 주제로 삼는 졸프 후배 팀원들이나 하이퍼클로바를 이용해보고 싶은 사람에게 작게나마 도움이 되었길 바란다.
'졸업프로젝트' 카테고리의 다른 글
[GPT-3] 카카오 GPT-3 모델 KoGPT 분석! API를 이용해서 소설 첫 문단 만들기 (1) | 2022.11.24 |
---|