Jump to content

한 토큰, 두 토큰 아껴쓰며 사용하는 토큰 절약의 기술


Recommended Posts

토큰(Tokenization) 이해하기
 
클로바 스튜디오를 잘 활용하려면 먼저 토큰이라는 개념에 대해서 이해하는 것이 좋습니다.
 
em_1.jpg.2f8bf1c488bac484bba083e7c7a16c06.jpg
 
하이퍼클로바 언어 모델은 토큰들의 배열을 나타내는 확률 기반의 모형입니다.
여기서 토큰은 문장(sentence)보다 작은 단위인데요. 한 문장은 여러 개의 토큰으로 구성됩니다.
토큰 분리 기준은 그때그때 다를  있으며, 문장을 띄어 쓰는 것만으로 나눌 수도 있고, 의미의 최소 단위인 형태소 단위로 분리할  있습니다. (p.27, BERT GPT 배우는 자연어 처리트랜스포머 핵심 원리와 허깅페이스 패키지 활용법이기창)
 
예제를 하나 보여드리겠습니다.
 
p-5-1.thumb.png.5228cc7d53451f81e360366be433709f.png
 
위 입력 문장을 토큰화한 작업의 결과는 다음과 같습니다. 작은 조각의 토큰이 모여 문장을 구성하는 원리입니다.
 
p-5-2.thumb.png.b88091e220ea83918a3cfbdef873e76d.png
 
토큰은 주로 형태소 단위의 1-2 토큰으로 나뉘게 됩니다. 따라서  글자가  1토큰은 아니지요.
 
 
토큰 절약하기
 
현재 클로바 스튜디오에서 제공하는 테스트 앱은 Completion API 형태로, 프롬프트와 실행 결과를 합산하여 토큰을 계산하는 방식입니다.
그래서 적은 양의 출력 결과를 얻더라도, 입력한 프롬프트의 토큰도 매번 함께 차감됩니다.
 
예를 들어, 70토큰 만큼의 프롬프트를 입력하고, 30토큰 만큼의 결과를 얻었다면 100토큰이 차감이 된 것이고,
실행을 다시 하더라도 30토큰만 차감되는 것이 아니라, 프롬프트를 포함하여 100토큰만큼이 또 차감되는 것입니다.
실행을 10번 하면 1,000토큰을 소비하는 것이죠.
 
매번 실행할 때마다 토큰 소비가 클 수밖에 없고 사용자 입장에서는 부담이 될 수밖에 없을텐데요.
그래서 저는 효율적인 토큰 소비에 대해서 고민하게 되었습니다.
 
em_2.jpg.0f33ea6b6992f5387ceccd1e998202f8.jpg
 
 
 아래는 문장의 문체를 바꾸어주는 프롬프트의 실행 결과입니다.
 
p-5-3.thumb.png.7965907bdeb11da79769973070320c06.png
 
프롬프트에는 총 19개의 예제(695토큰)가 쓰였으며, 1회 실행 시 생성 결과는 24토큰 정도 됩니다.
Completion API에서는 프롬프트와 실행 결과를 합산해서 토큰 계산해야 하므로,
1회 실행 시 평균 사용 토큰은 695토큰에 24토큰을 더해서 720토큰 정도 됩니다.
100 실행이라고 가정하면  72 토큰을 이용하게 된다고 추산이 됩니다.
 
지금부터 이 실행 토큰을 줄여보도록 하겠습니다.
 
 
① 형식 단순화하기
프롬프트에 쓰이는 형식들은 전부 토큰 소비에 영향을 줍니다. 프롬프트에는 ‘새로운 문장 :’ 형식으로 되어 있었는데요. 이걸 줄여봐야겠다는 생각이 들었습니다.
 
p-5-4.thumb.png.5bd2a78f5fef749b772efde6dabdde9a.png
 
그런데 한 가지 재미있는 사실을 알게 되었습니다.
‘새로운 문장 :’을 줄여볼 심산으로, ‘묘사:’로 통일시켰는데, 전체 토큰에서 변화가 없던 것입니다.
각각 8자, 3자로 글자 수도 차이가 있었는데 말이죠.
알고보니 ‘새로운 문장 :’은 3토큰으로 '묘사:'랑 같은 토큰 수 이었던 것입니다.
 
p-5-5.thumb.png.cbd3f15b00e744ab97203b3415cb8ae9.png
 
그래서 '변환'이라고 변경해 보았습니다.
‘변환:’은 ‘묘사’랑 같은 글자 수인데, 토큰은 각각 2토큰, 3토큰으로 차이가 있었습니다.
 
▼ 어쨌든 '변환:' 형식으로 예제들을 전부 맞추었으며, 전체 소비 토큰 686으로 ① 작업 대비 30 토큰 가량 아끼게 되었습니다. 
 
p-5-6.thumb.png.f9e271c488cadef013a96b23c594a961.png
 
차이가 크게 체감되지 않기 때문에다음 단계로 넘어가 봅시다.
 
 
 불필요한 출력 결과 없애기
 
현재 프리셋에 입력되어있는 Inject는 플레이그라운드에서 사용자의 이용 편의성을 위해서 적용된 것입니다.
사용자가 실행을 누른 , 다른 값을 바로 입력할  있게 하기 위함이죠.
 
p-5-7.thumb.png.8748255f41aa5fe71b294d20db735334.pngp-5-8.thumb.png.b6c75a4d95afd5ad599d8ca29f4c4f77.png
그런데 Inject는 프롬프트에 포함이 되므로 토큰을 차감시킵니다.
'### 문장:' 5토큰입니다. 실서비스에서 사용되지 않는 것이라면, 이걸 매번 낭비하게 되는 것이죠.
 
▼ Inject를 전부 지웠습니다. 깔끔하게 '변환:' 이후부터만 문장을 생성하고, 출력값 뒤에 텍스트도 붙지 않습니다.
소비 토큰은  680으로 이전  작업보다 6토큰 정도 절약하게 되었습니다.
 
p-5-9.thumb.png.60d562b226b759014a41ee5626dd45a8.png
 
아직도 큰 차이가 느껴지지 않고 '굳이?'라는 생각이 드네요.
방법을 찾아서  깊게 살펴봅니다.
 
 
 예제 사이의 ###  조절하기
 
▼ 예제에 쓰이고 있는 ###를 조절해서 토큰을 아낄 수 있습니다.
Stop sequence는 모델이 어디쯤에서 출력을 멈출지 알려주는 것인데요.
현재 프리셋의 예제에 쓰이고 있는 ### 다른 형식으로도 쓰일  있습니다.
 
p-5-10.thumb.png.849174c2bcbfc7cd485e9b618a160cc1.png
 
▼ 예를 들어, 아래와 같이 ## 바꾸어도, 성능의 차이가 없습니다
 
p-5-11.thumb.png.8c8965ba06e88dd16ef9ef6af36d71f4.png
 
#은 1토큰입니다. 이번 작업의 프롬프트에는 19개 정도의 예제가 들어가 있고 ###도 그만큼 반복되고 있습니다.
# 하나씩 지워도 20토큰 가까이 절약하게 됩니다.
 
▼ 실제로 프롬프트의 토큰은 640으로 이전 ③ 작업 대비 20토큰 가량 줄었습니다. 
전체 소비 토큰도 656 토큰으로 이전 680 토큰 보다 30 정도 절약된 것입니다. 
100회 실행을 한다고 치면, 65,680 토큰으로 이전보다 2,380 토큰이 세이브 됩니다.
결과 품질도 안정적으로 유지되고 있습니다.
 
p-5-12.thumb.png.f3a6976b75982075d23c7b88fba865cf.png
 
저는 프롬프트 작업을 할 때 띄어쓰기. 즉, 공백 토큰에 민감하게 반응합니다.
왜냐하면 하이퍼클로바 언어모델은 공백도 1토큰으로 카운트하기 때문이죠.
그럼 이번에는 공백을 살펴볼까요?

em_3.png.c8ae5fd5a58fe59f8dc7c060448e29ca.png

 

 공백 줄이기
 
▼ 프롬프트에 공백 토큰은 없나 둘러봅니다. 
문장 뒤에 반복적으로 쓰이고 있는 공백 토큰을 발견해서 지워줍니다.
고작 1토큰이라고 생각할  있지만, 프롬프트에 공백이 10 있다고 치면, 실행할 때마다 나도 모르게 10토큰씩 억울하게 날아가고 있는 것입니다.
 
p-5-13.png.29e98ec38d0738a06ca86f1681740eb0.png
 
여기부터 보여드릴 방식은 다소 실험적이라 굳이 따라하실 필요는 없습니다.
하지만 토큰 절약에는 효과적입니다.
 
▼ 만약 만들고자 하는 작업이 문장 변환처럼  문장씩으로만 이루어진 작업이라면, 마침표가 크게 중요하지 않다고 여겼습니다.
마침표를 찍을 일이 있다면, 서비스에서 직접 찍으면 되는 것이죠.
 
p-5-14.thumb.png.ae3a0730b6e21ecb1f0a79d689811b98.png
 
마침표는 1토큰입니다.
예제 19개에 문장, 변환 각각 2개씩 문장+마침표가 쓰이고 있으므로, 프롬프트에는  40여개의 마침표가 40 토큰으로 쓰이고 있으며, 실행할 때마다 40토큰씩 반복 소비되던 것입니다.
 
p-5-15.thumb.png.d4f3432ef0ffa785cd8e536e7722c708.png
 
▲ 마침표를 제거하여 프롬프트 토큰을 599까지 줄였습니다. ④ 작업 대비 40 토큰 정도 절약된 것이며 ➀ 작업과 비교하면 무려 100 토큰이 절약된 것입니다. 
작업의 품질도 초반 프롬프트와 크게 차이가 없으며, 결과 토큰은 10~20 사이를 유지하며, 글자  또한 60 이내로만 처리합니다.
100 실행으로 치면 사용 토큰은 61천으로 처음 작업과 비교하면 1 토큰 정도 차이가 있습니다.
 
p-5-16.png.ba62d74c1f1e98d9267e122fd0d77fd3.png
 
두둥! 토큰 계산기
 
작업을 하다 보면, 내가 입력한 글자 수와 토큰 수를 비교해야 하는 경우가 있는데요.
곧 업데이트될 예정인 ‘토큰 계산기’를 활용해보세요. 이제 입력한 문장의 토큰 수와 글자 수를 계산할 수 있습니다.
토큰 계산기를 활용해서 최적의 Maximum tokens 값을 찾거나, 효율적인 프롬프트를 만드실 수 있을 거예요. 
 
p-5-17.png.12738b87d0330b0ad5b1f285fab960ce.png
 
 
지금까지 토큰 이해하기와 토큰 절약하기에 대한 포스트였습니다.
 유용한 팁으로 찾아올게요!
 
em_4.gif.2e162f2569bc3866e56376f392ad88ea.gif
 
  • Like 1
  • Haha 1
  • Confused 1
링크 복사
다른 사이트에 공유하기

게시글 및 댓글을 작성하려면 로그인 해주세요.



로그인
×
×
  • Create New...