23장. Temperature, Top-p, Top-k
이 장의 목표 채팅 도구의 슬라이더들이 뭘 하는지 정확히 알게 됩니다.
“코드 작업엔 0.2, 글쓰기엔 0.7” 라는 말의 근거를 머릿속으로 그릴 수 있게 됩니다.
23.1 다음 토큰 예측의 진짜 모습
2장에서 봤습니다.
모델은 다음 토큰의 확률 분포를 만듭니다.
다음 토큰 후보:
"맑습니다" → 0.35
"흐립니다" → 0.22
"춥습니다" → 0.15
"비가" → 0.09
"치킨" → 0.0001
...
그러면 어떤 토큰을 고를까요?
이걸 정하는 게 샘플링(sampling) 입니다.
- 가장 확률 높은 거만 고르기 → 항상 같은 답, 따분함
- 다양하게 고르기 → 창의적이지만 들쭉날쭉
이 균형을 조절하는 손잡이가 Temperature, Top-p, Top-k 입니다.
23.2 Temperature — 창의성 손잡이
확률 분포를 얼마나 평평하게 / 뾰족하게 만들지 정합니다.
[Temperature 0.0] (가장 뾰족)
"맑습니다" 0.99
"흐립니다" 0.01
나머지 0
[Temperature 1.0] (원래 분포)
"맑습니다" 0.35
"흐립니다" 0.22
...
[Temperature 1.5] (평평)
"맑습니다" 0.18
"흐립니다" 0.16
"치킨" 0.05
...
한 줄 감각
| Temperature | 결과 |
|---|---|
| 0.0 | 거의 결정적. 같은 입력 → 같은 답 |
| 0.2 | 매우 보수적. 코드·정확성 |
| 0.5 | 균형. 일반 업무 |
| 0.7 | 창의적. 글쓰기 |
| 1.0 | 학습 분포 그대로 |
| 1.2+ | 산만해짐. 한국어 자주 깨짐 |
23.3 Top-k — 상위 k개만 고려
[Top-k = 5]
상위 확률 5개 후보만 남기고 나머지 무시
그 안에서 (Temperature 적용 후) 샘플
이상한 토큰이 우연히 고름당하는 것을 막아줍니다.
- 너무 작으면(k=1) → 항상 1등만 (Temperature=0과 비슷)
- 너무 크면(k=100) → 효과 거의 없음
보통 기본값(40~50) 그대로 두면 됨.
23.4 Top-p (Nucleus) — 누적 확률 컷오프
[Top-p = 0.9]
확률이 큰 순으로 더해가다가
누적 0.9가 될 때까지의 후보만 남김
예:
"맑습니다" 0.35 → 누적 0.35
"흐립니다" 0.22 → 누적 0.57
"춥습니다" 0.15 → 누적 0.72
"비가" 0.09 → 누적 0.81
"안개" 0.07 → 누적 0.88
"화창함" 0.06 → 누적 0.94 ← 여기까지
이 6개 중에서 (Temperature 적용 후) 샘플.
Top-p 가 Top-k 보다 똑똑한 이유: 확률이 들쭉날쭉한 상황에 자동 적응.
- 1등이 압도적으로 높으면 적은 후보만
- 비슷비슷하면 많은 후보를 다 고려
23.5 Top-p vs Top-k — 동시에 쓰면
대부분의 도구는 둘 다 적용합니다.
1. Top-k 로 N개로 줄임
2. Top-p 로 누적 확률 안의 후보만 남김
3. Temperature 적용해서 분포 조정
4. 그 분포에서 확률대로 하나 뽑음
둘 다 동시에 쓰는 게 표준.
23.6 그 외 자주 보는 손잡이
Repeat Penalty (Frequency Penalty)
같은 단어 반복을 막는 페널티.
0.0 → 페널티 없음 (모델이 같은 단어 반복할 수 있음)
1.1 → 약간 (기본)
1.3 → 강함 (반복 거의 없음)
Q4 양자화처럼 작은 모델에서 “같은 문장 무한 반복“이 나오면 Repeat Penalty 를 1.1 → 1.2 로 올려보세요.
Min-p
Top-p 의 변종. 1등 확률 대비 일정 비율 이상 후보만 남김.
새 모델이 추천하는 경우도 있음.
Seed
같은 시드 → 같은 결과. 재현 가능성이 필요할 때.
23.7 작업별 추천 조합
| 작업 | Temperature | Top-p | Top-k |
|---|---|---|---|
| 코드 작성·디버깅 | 0.1~0.3 | 0.9 | 40 |
| 회의록 요약 | 0.2~0.4 | 0.9 | 40 |
| 메일 초안 | 0.4~0.6 | 0.9 | 40 |
| 한국어 작문 | 0.5~0.7 | 0.95 | 40 |
| 브레인스토밍 | 0.7~0.9 | 0.95 | 60 |
| 시·소설 | 0.8~1.0 | 0.95 | 60 |
| 분류·태깅 (JSON) | 0.0~0.2 | 0.9 | 40 |
| Reasoning 모델 | 0.6~0.7 | 0.95 | 모델 권장값 |
Reasoning 모델 주의: Temperature 0으로 두면 추론 과정이 짧아지거나 망가질 수 있음. 모델 카드의 권장값을 따르세요.
23.8 도구별 설정 위치
LM Studio
채팅 화면 우측 Inference 패널.
- Temperature
- Top-P
- Top-K
- Repeat Penalty
Ollama
CLI에서 직접 변경:
$ ollama run qwen3:8b
>>> /set parameter temperature 0.3
>>> /set parameter top_p 0.9
Modelfile에 고정:
FROM qwen3:8b
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER repeat_penalty 1.1
OpenAI 호환 API
JSON 본문에 그대로 넣음:
{
"model": "qwen3:8b",
"messages": [...],
"temperature": 0.3,
"top_p": 0.9
}
23.9 같은 손잡이가 한국어에 미치는 영향
한국어는 영어보다 토큰 분포가 얇은 꼬리를 가집니다.
즉:
- Temperature를 올리면 영어보다 더 빨리 망가집니다.
- Top-p 를 너무 크게 두면 이상한 한자·영어 토큰 이 끼어듭니다.
권장:
한국어 작업 → Top-p 0.9~0.95, Temperature 0.7 이하
23.10 흔한 증상 대응
| 증상 | 손잡이 |
|---|---|
| 답이 너무 똑같음 | Temperature ↑ |
| 답이 산만함 | Temperature ↓, Top-p ↓ |
| 같은 단어 반복 | Repeat Penalty ↑ |
| 갑자기 영어 섞임 | Top-p ↓, Temperature ↓ |
| JSON 형식 깨짐 | Temperature 0.1~0.2 + 시스템 프롬프트 강화 |
| 한국어가 어색함 | 모델 자체 한계 — Temperature는 답이 아님 |
이 장에서 기억할 한 가지
Temperature: 창의성 조절. Top-p / Top-k: 후보 범위 제한.
- 코드·정확성 → 낮게 (0.1~0.3)
- 글쓰기 → 보통 (0.5~0.7)
- 창작 → 높게 (0.8+)
한국어는 영어보다 한 단계 낮게 잡으세요.
손으로 해볼 것
1. 같은 질문, Temperature 3종
LM Studio에서 같은 질문을 세 번 보내되, Temperature만 다르게.
질문: "맥북에서 로컬 AI 시작하는 법 알려줘"
- Temperature 0.0
- Temperature 0.5
- Temperature 1.0
답의 표현·길이·창의성 차이를 메모하세요.
2. JSON 출력 안정화
다음 시스템 프롬프트로 강제 JSON:
모든 답은 다음 JSON으로만:
{"summary": "...", "tags": ["...", "..."]}
다른 텍스트 절대 금지.
- Temperature 0.7 → 깨질 확률 높음
- Temperature 0.1 → 안정적
각각 5번씩 던져 형식이 얼마나 안정적인지 확인.
다음 장에서는 Stop 토큰, Max tokens, Streaming 같은 실전 옵션들을 정리합니다.
자동화 파이프라인을 만들 때 꼭 필요합니다.