ChatGPT API logit bias 쓰는 법

선아·2023년 10월 24일
0

생성하지 말아야 하는 단어

GPT-3.5 API를 사용하다보면, '나오지 않았으면 하는 단어' 에 대한 통제가 필요한 경우가 생긴다. 그래서인지, 처음 내가 받았던 프롬프트에는 '~ 단어 사용 금지'와 같은 주의 문구들이 포함되어 있었다.

그러나 지시문만 길어지고(토큰 사용량도 많아지고) 별로 효과가 없는 것 같았다. 이게 맞나... 싶어서 찾아보니 언어모델(LM)에서의 Negative Prompting에 대한 질의응답을 찾을 수 있었다.

Hi, I want to use gpt-35-turbo for text generation, I have a list of words that I don’t want it to use. I have passed this argument into the prompt in many different ways including the list of words to exclude. However the output always contains some of those words. I have also tried different temperatures. But it seems the model just cannot avoid using those common words/adjectives. Is there a negative prompt for text generation? or any work-around? Any help would be much appreciated.
Thank you in advance!!

gpt-3.5-turbo에 단어 리스트를 주고 사용하지 말라고 했지만, 여전히 그 리스트 안에 있는 단어들을 포함한 결과물을 내놓는다는 이야기였다.

그 아래 달린 답변들을 통해 언어모델에서는 대개 Negative Prompting이 권장되지 않는다는 것을 알 수 있었으며, 'Logit bias'의 존재 또한 알 수 있었다.

Logit Bias

openAI 공식 문서-logit bias

gpt 모델을 호출할 때에, logit_bias를 주면, 특정 토큰을 좀 더 자주 나오게 하거나, 거의 안나오게 할 수 있다.

예를 들어, pretty 라는 토큰의 id가 52이고, 아예 안나오게 하고 싶다면
logit_bias={'52':-100}
를 추가하면 된다.

좀 더 자주 나오게 하고 싶다면 양수값를 입력하면 되고,
좀 더 안나오게 하고 싶다면 음수값을 입력하면 되며,

아예 안나오게 하려면 -100 / 꼭 나오게 하려면 100을 사용하면 된다.

그러려면, 우리는 token ID를 알아야 한다.
이건 또 길어지지만,, tiktoken tokenizer의 encode / decode를 사용해 알아낼 수 있다.
-> ticktoken github

아래의 사이트를 사용해도 된다.
-> https://platform.openai.com/tokenizer

한국어의 한계

실제로 한국어 단어를 tokenizing 해보면 알겠지만, 영어랑 달리, 한국어 단어는 1개의 단어가 1개의 토큰인 경우가 거의 없다. 영어와 한국어의 데이터 양이 압도적으로 차이가 나기 때문이다.

즉, 아래와 같이 영어 단어인 'pizza'는 1개의 토큰이지만,
pizza tokenization

한국어 단어 '피자'는 무려 4개의 토큰이다.
피자 tokenization

4개의 토큰 모두 logit bias를 주면 되지 않느냐, 라고 생각할 수도 있지만,
문제는 logit bias가 key-value 가 mapping된 형태로 들어가기 때문이다.
따라서, Conditional하게 통제가 안되며, 위의 경우 '자'라는 글자 자체가 생성이 안된다.

다르게 얘기하면, 글자 간의 순서도 반영되지 않는다.

정중 token ID

'정중'이라는 단어를 생성하지 않게 하기 위해, 아래와 같이 '정중'의 모든 token id에 대해 logit_bias를 -100으로 주면 '정중' 뿐 아니라 '중정'도 생성되지 않는다는 이야기이다.

logit_bias={30381:-100, 59269:-100, 239:-100}

따라서, 한국어에서 logit bias를 쓸 때에는 주의해야한다.

profile
Junior ML Engineer

0개의 댓글