temperature — 일관성과 다양성 사이
한 줄 요약
temperature(온도) 는 답의 들쭉날쭉함을 조절하는 손잡이입니다. 0에 가까우면 매번 거의 같은 답, 높으면 매번 다른 답이 나옵니다. 에이전트를 만들 때는 거의 항상 0을 씁니다.
1. 1장에서 봤던 그 현상
1장 마지막 「스스로 해 보기」에서 같은 질문을 두 번 실행해 보라고 했습니다. 답이 똑같지 않았을 겁니다.
왜 그럴까요?
LLM은 "다음에 올 말"을 확률로 계산합니다. "환불은" 다음에 올 말의 후보가 이렇다고 해 봅시다.
"접수일로부터" 45%
"영업일" 30%
"보통" 15%
"카드사" 10%
여기서 매번 가장 높은 것만 고를지, 확률에 따라 골라 볼지를 정하는 것이 temperature 입니다.
| temperature | 고르는 방식 | 결과 |
|---|---|---|
| 0 | 항상 1등만 | 매번 거의 같은 답 |
| 0.3 | 대체로 1등, 가끔 2등 | 조금씩 다른 표현 |
| 1.0 | 확률대로 골고루 | 매번 다른 답 |
| 2.0 | 낮은 확률도 자주 | 창의적이지만 산만·부정확 |
넣을 수 있는 값은 0.0 부터 2.0 까지입니다. 아무것도 안 적으면 1.0 이 쓰입니다. 범위를 벗어난 값을 넣으면 답이 오는 게 아니라 요청 자체가 거부됩니다.
temperature=2.1 → 400 INVALID_ARGUMENT
temperature must be in the range [0.0, 2.0]
모델마다 상한이 다릅니다.
gemini-2.5-flash는 2.0 이지만, 다른 모델은 1.0 인 것도 있습니다. 확인하려면 모델에게 직접 물어보면 됩니다.
python m = client.models.get(model="gemini-2.5-flash") print(m.temperature, m.max_temperature) # 1.0 2.0 ← 기본값, 상한"온도"라는 이름은 물리학에서 왔습니다. 온도가 높으면 분자가 활발하게 움직이듯, 값이 높으면 모델의 선택이 다양해집니다. 이름의 유래를 몰라도 쓰는 데 지장은 없습니다.
2. 코드에서는 이렇게
아래는 개념 설명용 코드입니다 — 실습 파일에 넣지 않습니다.
config=types.GenerateContentConfig(
system_instruction=system,
temperature=0.3, # ← 여기
)
이 과정의 chat() 함수는 기본값을 0.3 으로 두고, 필요하면 바꿔 쓸 수 있게 해 뒀습니다.
아래는 4절에서 만들 code/ch02_chat.py 의 일부를 미리 보는 것입니다 — 지금 붙여 넣지 않아도 됩니다.
def chat(system: str, user: str, temperature: float = 0.3) -> str:
...
3. 언제 무엇을 쓰나
| 하는 일 | 권장값 | 왜 |
|---|---|---|
| 에이전트 판단 (어느 도구를 쓸까) | 0 | 같은 상황엔 같은 판단이어야 한다 |
| 데이터 집계·계산 | 0 | 답이 흔들리면 안 된다 |
| 문서 기반 답변(RAG) | 0 | 근거대로만 말해야 한다 |
| 고객 응대 문구 | 0.3 ~ 0.7 | 표현에 자연스러운 변화가 있는 편이 낫다 |
| 마케팅 문구·아이디어 | 0.9 ~ 1.2 | 다양한 후보가 필요하다 |
이 과정의 3~8장 실습 코드는 거의 전부
temperature=0입니다. 이유는 하나입니다 — 에이전트는 "판단"을 하는 프로그램이기 때문입니다. "재고를 물었으니 CSV 도구를 쓰자"는 판단이 실행할 때마다 달라지면, 그건 버그를 찾을 수 없는 프로그램입니다.
4. 0으로 해도 완전히 똑같지는 않습니다
주의할 점이 있습니다.
temperature=0은 "항상 1등을 고른다"는 뜻이지, "결과가 100% 동일하다"는 보장이 아닙니다.
서버 쪽 계산 방식·모델 업데이트·아주 근소한 확률 차이 때문에 가끔 다른 답이 나옵니다. 거의 같지만 완전히 같지는 않다 — 이 정도로 이해하세요.
그래서 이 교재의 「예상 출력」도 여러분 화면과 글자 단위로 같지는 않습니다. 숫자와 구조가 맞으면 성공입니다.
5. 다른 손잡이들 (참고만)
temperature 말고도 몇 가지가 더 있습니다. 이 과정에서는 쓰지 않지만 문서에서 보게 될 이름들입니다.
| 이름 | 무엇을 하나 | gemini-2.5-flash 기본값 |
|---|---|---|
top_p |
확률 상위 몇 %까지만 후보로 볼지 | 0.95 |
top_k |
후보를 상위 몇 개로 제한할지 | 64 |
max_output_tokens |
답변 길이 상한 | 65,536 |
stop_sequences |
이 문자열이 나오면 멈춤 | 없음 |
대개 temperature 하나만 조절해도 충분합니다. 여러 개를 동시에 만지면 서로 간섭해서 원인을 알기 어려워집니다.
6. 예측해 보기
다음 절에서 실습 코드를 돌리기 전에, 예측을 적어 보세요.
질문: 같은 질문 "환불하면 언제 입금되나요?" 를
temperature=0으로 세 번,temperature=1.5로 세 번 던지면 각각 어떤 결과가 나올까요?
temperature=0: 세 답이 ______temperature=1.5: 세 답이 ______
예측을 적었으면, 다음 절 실습 뒤에 직접 바꿔 실행해 보고 맞았는지 확인하세요. 틀렸다면 왜 틀렸는지를 한 문장으로 적어 보는 것까지가 이 연습입니다.
핵심 정리
temperature는 답의 들쭉날쭉함을 조절합니다. 낮으면 일관되고, 높으면 다양합니다.- LLM은 "다음에 올 말"을 확률로 계산하고,
temperature는 그 확률을 얼마나 따를지를 정합니다. - 넣을 수 있는 값은
0.0~2.0(gemini-2.5-flash기준), 안 적으면1.0입니다. 벗어나면 400 오류로 거부됩니다. - 에이전트 실습에서는 거의 항상
0을 씁니다. 판단이 흔들리면 디버깅이 불가능해집니다. 0이어도 완전히 동일한 답을 보장하지는 않습니다. 교재의 예상 출력과 글자가 달라도 정상입니다.- 손잡이는 여러 개지만
temperature하나로 충분합니다.