개념
온도(temperature)는 대규모 언어 모델(LLM)이 다음 토큰을 고를 때 쓰는 설정값이다. 모델은 매 순간 다음에 올 토큰 후보마다 확률을 매기는데, 온도는 그 확률 분포의 모양을 조절한다. 온도를 낮추면 분포가 뾰족해져 확률이 가장 높은 후보로 선택이 몰리고, 온도를 높이면 분포가 평평해져 덜 유력한 후보도 뽑힐 기회를 얻는다.
그래서 낮은 온도는 같은 질문에 거의 같은 답을 내놓는 일관된 동작으로 나타나고, 높은 온도는 실행할 때마다 표현이 달라지는 다양한 동작으로 나타난다. 0에 가깝게 두면 사실상 매번 가장 확률이 높은 토큰만 고르는 방식이 되어 출력이 거의 고정된다.
주의할 점은 온도가 정확성을 조절하는 값이 아니라는 것이다. 온도가 바꾸는 것은 후보들 사이의 선택 폭이지 모델이 아는 내용의 옳고 그름이 아니다. 온도를 0으로 두어도 모델이 잘못 알고 있는 사실은 그대로 잘못 나온다. 함께 쓰이는 설정으로 상위 확률 후보만 남기는 top-p나 top-k가 있으며, 보통 온도와 이들 중 하나를 주로 조절한다. 세 값을 동시에 건드리면 무엇이 무엇을 바꿨는지 알기 어려워지기 때문이다.
설정할 수 있는 범위는 제공사와 모델에 따라 다르고, 같은 값이라도 체감이 달라진다. 어떤 모델의 0.7과 다른 모델의 0.7이 같은 정도의 다양성을 뜻하지는 않는다. 모델을 교체하거나 버전을 올릴 때는 이 값도 다시 맞춰 보아야 한다.
쓰임새
정답이 하나로 정해진 작업에서는 온도를 낮게 둔다. 정보 추출, 분류, 코드 생성, JSON 같은 정해진 형식의 출력, 그리고 RAG처럼 주어진 문서에 근거해 답해야 하는 작업이 여기 해당한다. 반대로 카피 문구 후보를 여러 개 뽑거나 브레인스토밍을 시킬 때는 온도를 올려 표현의 폭을 넓힌다.
평가와 디버깅 국면에서는 온도를 낮게 고정하는 편이 유리하다. 출력이 매번 달라지면 프롬프트를 고쳤을 때 그 변화가 수정 덕분인지 무작위성 때문인지 구분할 수 없기 때문이다.
후보를 여러 개 만들어 그중 하나를 고르는 구성에서는 단계마다 값을 나눠 쓰기도 한다. 후보를 생성할 때는 온도를 올려 서로 다른 답이 나오게 하고, 그중 무엇이 나은지 판단하는 단계에서는 온도를 낮춰 일관된 기준으로 고르게 하는 식이다. 하나의 값으로 전체를 맞추려 하기보다, 각 단계가 무엇을 필요로 하는지를 보고 따로 정하는 편이 낫다.
자주 하는 오해
온도를 0으로 두면 출력이 완전히 똑같이 재현되나?
확률이 비슷한 후보가 맞붙었을 때의 처리나 연산 순서 차이 때문에 미세하게 달라질 수 있다. 재현성이 필요하다면 완전 고정을 전제하지 말고 검증 절차를 따로 두는 편이 안전하다.
온도를 낮추면 환각이 사라지나?
표현이 안정될 뿐이다. 근거가 없어서 생기는 환각은 검색으로 근거를 대 주거나 출력을 검증하는 장치를 붙여야 줄어든다.
온도가 높을수록 창의적인 것 아닌가?
어느 선을 넘으면 문맥에 맞지 않는 단어가 섞여 문장이 무너진다. 사람이 보기에 참신한 발상과, 확률이 낮은 토큰이 섞여 들어간 문장은 같은 것이 아니다. 창의성과 붕괴 사이의 적정선은 모델마다 다르므로 직접 확인해야 한다.