시리즈 AI채팅 중급자용 가이드


읽어 보면 좋은 글: [AIO] 비공식 프롬프팅 가이드


서론




프롬프트 프리셋을 적용받아 임포트/익스포트 하다 보면 이렇게 온도, Top P, 빈도 페널티, 프리센스 페널티를 볼 수 있다.

이놈들은 아주 러프하게 말하자면 샘플링에 관여해서 모델이 생성하는 텍스트의 다양성/예측 가능성을 조정하는 파라미터(하이퍼파라미터)다.

이 글에서는 각 수치가 응답에 어떤 효과를 가져오는지를 아주 간단하게 살펴보려 한다.

따라서 이해를 쉽게 할 수 있도록 많은 부분을 뭉개놓았기 때문에 실제 작동 원리 및 이론과는 괴리가 있다!

어디까지나 얼추 이런 역할을 하는구나~ 하는 정도의 도움만 받도록 하자.



샘플링이란?


일단 LLM은 주어진 토큰 시퀀스(예: 문장의 일부)에 기반하여 다음 토큰을 예측하는 방식으로 작동한다는 사실을 이해하는 것이 중요하다.


'지금 뭐 하고 있어?'라는 질문에 대한 응답을 생성한다고 해 보자.

이 때 응답의 첫 번째에 올 단어에 대한 무수한 가능성이 있다.


나는/우리는/유즈는/지금/...


이 무수한 가능성 중에서 모델은 한 단어(토큰)을 선택하게 되고, 이 과정을 반복해서 최종적으로 응답을 생성한다.



이 때 아무 단어(토큰)나 선택하면 어떻게 될까? '나는 점심을 가고 있습니다'와 같은 이상한 문장이 생성될 것이다.

이런 상황을 막기 위해 모델은 여러 가지 방식으로 그럴듯한 토큰을 선택하는데, 이 과정을 샘플링이라고 부른다.



온도


온도는 모델의 예측 확률 분포에 관여하는 파라미터이다.

쉽게 말하면, 온도가 높을 경우 더 다양한 가능성이 고려되고, 온도가 낮을 경우 더 확실한 가능성이 고려된다.



온도가 너무 낮으면 그럴듯하긴 하지만 너무 예측가능한, 뻔한 응답이 생성될 가능성이 높다.

하지만 온도가 너무 높으면 말이 안 되는 횡설수설이 생성될 가능성이 생긴다.

종종 봇이 이상한 외계어를 하는 경우 높은 확률로 온도 설정을 잘못 건드렸기 때문이다.

일반적으로 AI채팅에서는 0.9~1.0 정도의 온도가 선호되니, 적당히 온도를 조절해주면 된다.



Top P


Top P는 확률 분포에서 누적 확률이 P 이상인 상위 확률의 단어들만 고려하는 방식이다.

쉽게 말하면, 여러 가능한 단어 중에서 어느 범위까지를 선택할지에 영향을 준다.



Top P는 일반적으로 온도와 함께 사용된다. 높은 온도에서 완전히 이상한 토큰이 선택될 가능성을 없애주는 역할을 하기 때문이다.

온도를 적당한 범위에 뒀을 경우에는 Top P를 굳이 건드리지 않고 최대치인 1로 두어도 괜찮다.

하지만 한글 채팅을 사용할 경우에는 Top P 값을 낮추는 것이 권장되고 있다.


Top K


Top K는 확률 분포에서 가장 높은 확률을 가진 상위 K개의 단어를 선택하는 샘플링 방식이다.

결과적으로는 Top P와 비슷하게 단어의 선택 범위를 제한하는 역할을 하는데, Top P가 누적 확률에 따라 작동해서 좀 더 유동적인 반면 Top K는 선택 가능한 단어 갯수를 지정하는 정적인 방식이라는 차이가 있다.

리스에서는 클로드에서 Top K를 지원하고 있다. Top P와 마찬가지로 웬만하면 별로 건드릴 일은 없다.



빈도/프리센스 페널티

 

빈도/프리센스 페널티는 OpenAI의 모델, 즉 GPT에서 적용되는 파라미터이다.

따라서 클로드를 사용하는 경우에는 빈도/프리센스 페널티를 조정할 필요가 없다.

(미스트랄 등 기타 모델에서 적용되는지는 잘 모른다. 아는 챈럼이 있다면 댓글로 피드백 부탁!)


아무튼 이 빈도/프리센스 페널티는 모델이 같은 표현이나 주제를 반복하는 것을 막아 주는 역할을 하는데, 챈에 널리 퍼져 있는 오개념과는 달리 '모델이 생성하는 응답 자체'에만 관여한다.

즉, 모델이 이전 응답에서 썼던 표현을 재탕하는 것을 막는 데에는 아무 소용이 없다!


빈도/프리센스 페널티의 역할을 이해하기 위해 '지금 뭐 하고 있어?'라는 질문에 대한 응답으로 돌아가 보자.

첫 문장으로 '나는 점심을 먹고 있어.'가 생성되었다고 가정하고, 다음 전체 응답을 보자.


나는 점심을 먹고 있어. 점심을 먹으면서 넷플릭스를 보고 있어. 점심 메뉴는 피자야. 몇몇 사람들은 점심으로 샌드위치를 먹는 걸 선호하는데, 샌드위치는 빨리 먹을 수 있기 때문에 그 사람들은 점심을 벌써 다 먹고 사무실로 돌아갔어. 점심 식사를 빨리 하면 남는 시간에 운동을 할 수 있기 때문에 좋은 것 같아. 너는 점심 시간에 어떤 점심을 먹고 있어?


상당히 점심탈트가 온다.


빈도/프리센스 페널티는 이런 현상을 방지하기 위해 특정 토큰(단어)이 사용되었을 때 페널티를 부과해서 비슷한 토큰이 생성될 가능성을 줄이고, 새로운 토큰이 생성될 확률을 높여 준다.


'빈도 페널티'는 말 그대로 빈도에 따라 확률이 누적 적용된다.


나는 점심을 먹고 있어.
'점심' 1회 등장: '점심' 등장 확률 90%
점심을 먹으면서 넷플릭스를 보고 있어.
'점심' 2회 등장: '점심' 등장 확률 75%

점심 메뉴는 피자야.

'점심' 3회 등장: '점심' 등장 확률 50%


대충 이런 식이다.


'프리센스 페널티'는 말 그대로 토큰이 한 번이라도 등장(프리센스)하면 확률에 관여한다.


나는 점심을 먹고 있어. 점심을 먹으면서 넷플릭스를 보고 있어.
'점심' 등장 확률 하락
'먹다' 등장 확률 하락
'넷플릭스' 등장 확률 하락


대충 이런 식이다.


어, 그러면 빈도/프리센스 페널티를 높여 놓으면 웅답 안에서 계속 새로운 주제가 등장하니까 무조건 좋은 거 아닌가? 라고 생각할 수 있는데, 페널티가 '모든 토큰'에 대해 적용된다는 점을 고려해야 한다.


특히 빈도 페널티를 조심해야 하는데, 예를 들어 봇의 이름, 고유명사뿐 아니라 아주 일반적으로 많이 쓰이는 단어들에도 페널티가 적용되기 때문에, 빈도 페널티가 너무 높을 경우 태피스트리가 유발될 가능성이 높아진다. 응답의 후반부로 갈수록 모델이 사용할 수 있는 평범한 어휘의 폭이 점점 좁아지기 때문이다. 가령 '나는 점심으로 피자를 먹고 있다.'라는 문장을 써야 하는데 '점심'과 '먹다'가 봉인당했다고 생각해 보자. '나는 주찬으로 피자를 섭취하고 있다'가 튀어나올 수 밖에 없는 것이다.


따라서 빈도/프리센스의 경우 본인이 평소에 선호하는 응답의 길이에 따라 적당히 조정해 줄 필요가 있다.

일반적으로 긴 응답(고봉밥)을 선호하는 경우, 그리고 학술적인 목적 등 고유명사를 많이 사용해야 하는 경우 페널티를 낮춰서 사용하는 것이 좋다. 어느 정도 능지가 되는 모델의 경우 페널티를 굳이 적용하지 않아도 웬만하면 한 응답 내에서 과한 반복이 발생하는 경우는 잘 없기도 하다. 당장 빈/프가 없는 클로드를 생각해 보면 된다.



마무리

다시 말하지만 이건 아주 러프한 이해를 위해 작성된 글이고 나도 자세한 원리나 이론에 대해서는 잘 모른다!

그러니 이 글의 내용을 너무 맹신하지는 말고, 오개념 등이 발견될 경우에는 댓글로 알려 주면 바로 반영하겠다!

사실 프롬프트 프리셋 받아서 쓰면 온빈프를 건드릴 일은 잘 없긴 하다. 하지만 이 글에서도 설명했듯 종종 팻핑거/한글챗/고봉밥 등의 이슈 때문에 파라미터로 인해 문제가 발생하는 일이 생긴다. 이 글이 셀프찐빠수정에 도움이 되었으면 좋겠다.