출력 제어 파라미터
Temperature, Top-p, Top-k로 LLM의 창의성과 일관성을 조절합니다.
Temperature: 무작위성의 조절
확률 분포의 날카로움을 조절
Temperature는 다음 토큰을 선택할 때 확률 분포의 "날카로움"을 조절합니다. 높은 Temperature는 확률 분포를 평탄하게 만들어 다양한 토큰이 선택될 가능성을 높이고, 낮은 Temperature는 분포를 뾰족하게 만들어 높은 확률의 토큰이 선택될 가능성을 높입니다.
Softmax with Temperature
T = Temperature 값. T가 작을수록 높은 logit의 토큰에 확률이 집중됩니다.
🧪 Temperature 실험실
"오늘 날씨가" 다음에 올 토큰의 확률 분포:
❄️ 매우 낮은 Temperature
"오늘 날씨가 좋습니다. 오늘 날씨가 좋습니다. 오늘 날씨가 좋습니다."
🌤️ 균형잡힌 Temperature
"오늘 날씨가 정말 화창하네요. 산책하기 딱 좋은 날씨입니다."
🔥 높은 Temperature
"오늘 날씨가 마치 봄날의 유리창처럼 투명하고 반짝거려요!"
Top-k Sampling: 상위 K개만 고려
고정된 개수의 후보만 선택
Top-k는 다음 토큰을 선택할 때 확률이 가장 높은 K개의 토큰만 후보로 고려합니다. 나머지 토큰들은 아무리 적절해도 선택 대상에서 제외됩니다.
🎲 Top-k 시뮬레이션
"맛있는" 다음에 올 토큰 후보 (상위 10개 중 k개만 선택):
고정된 k값은 상황에 따라 부적절할 수 있습니다:
- "예/아니오로 답하세요" → k=50이면 불필요하게 많은 옵션
- "창의적인 이야기를 써줘" → k=5이면 너무 제한적
이 문제를 해결하기 위해 Top-p가 등장했습니다.
Top-p (Nucleus Sampling)
누적 확률 기반 동적 선택
Top-p는 누적 확률이 p에 도달할 때까지의 토큰들만 후보로 고려합니다. 확률 분포에 따라 동적으로 후보 수가 조절되어 상황에 맞는 다양성을 제공합니다.
📈 Top-p 시뮬레이션
"인공지능은" 다음에 올 토큰 (누적 확률 p까지):
Top-k vs Top-p 비교
| 특성 | Top-k | Top-p |
|---|---|---|
| 후보 선택 방식 | 고정된 개수 (k개) | 누적 확률 기반 (동적) |
| 장점 | 구현이 간단, 예측 가능 | 상황에 맞게 자동 조절 |
| 단점 | 상황 무관하게 고정 | 결과 예측이 어려움 |
| 일반적 값 | k = 40~100 | p = 0.9~0.95 |
| 추천 용도 | 일관된 출력 필요시 | 자연스러운 대화, 글쓰기 |
샘플링 과정 시각화
토큰 선택의 전체 흐름
LLM이 다음 토큰을 선택하는 전체 과정을 단계별로 살펴봅시다.
Temperature와 Top-p를 동시에 조절하지 않는 것이 좋습니다. 둘 중 하나만 조절하고 다른 하나는 기본값으로 두세요. 일반적으로 Temperature 또는 Top-p 중 하나만 사용합니다.
반복 방지: Frequency & Presence Penalty
반복되는 단어 억제하기
LLM은 같은 단어나 구문을 반복하는 경향이 있습니다. 이를 방지하기 위해 두 가지 페널티를 사용합니다.
📊 Frequency Penalty
토큰이 등장한 횟수에 비례하여 페널티 적용. 많이 나온 단어일수록 더 강하게 억제됩니다.
✓ Presence Penalty
토큰의 존재 여부만으로 페널티 적용. 1번 나왔든 10번 나왔든 동일한 페널티.
📝 페널티 효과 시각화
기존 출력: "오늘 날씨가 정말 좋아서 날씨 좋은 날에는..."
| 파라미터 | 페널티 방식 | 효과 | 사용 예 |
|---|---|---|---|
| Frequency | 등장 횟수에 비례 | 자주 쓴 단어 강하게 억제 | 글쓰기, 요약 |
| Presence | 존재 여부만 확인 | 새로운 주제 탐색 유도 | 브레인스토밍, 목록 생성 |
용도별 최적 설정 가이드
상황에 맞는 파라미터 조합
⚖️ 균형잡힌 설정
일반적인 대화와 글쓰기에 적합한 균형잡힌 설정입니다.
📊 상세 설정 가이드
| 용도 | Temp | Top-p | Freq P. | Pres P. | 특징 |
|---|---|---|---|---|---|
| 💬 일반 대화 | 0.7 | 0.9 | 0 | 0 | 자연스럽고 일관된 응답 |
| 🎨 창의적 글쓰기 | 1.0+ | 0.95 | 0.5 | 0.5 | 다양하고 독창적인 표현 |
| 📋 사실 기반 답변 | 0.2 | 0.5 | 0 | 0 | 정확하고 일관된 정보 |
| 💻 코드 생성 | 0.2 | 0.95 | 0 | 0 | 문법적으로 정확한 코드 |
| 📝 요약 | 0.3 | 0.8 | 0.3 | 0 | 핵심 내용 유지, 반복 방지 |
| 🧠 브레인스토밍 | 1.2 | 0.95 | 0.8 | 0.8 | 새로운 아이디어 탐색 |
API 사용 예제
실제 코드로 파라미터 적용하기
# OpenAI API 예제
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "창의적인 이야기를 써주세요."}
],
temperature=0.9, # 창의성 높임
top_p=0.95, # 다양한 토큰 허용
frequency_penalty=0.5, # 반복 단어 억제
presence_penalty=0.3, # 새 주제 탐색 유도
max_tokens=1000
)
print(response.choices[0].message.content)
# Anthropic Claude API 예제
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1000,
temperature=0.7, # Claude는 0~1 범위
top_p=0.9,
# Claude는 frequency/presence penalty 미지원
# 대신 프롬프트로 반복 방지 유도
messages=[
{
"role": "user",
"content": "다양한 표현을 사용해서 이야기를 써주세요."
}
]
)
print(response.content[0].text)
# Ollama (로컬 LLM) 예제
import ollama
response = ollama.chat(
model='llama3.2',
messages=[
{'role': 'user', 'content': '창의적인 이야기를 써주세요.'}
],
options={
'temperature': 0.9,
'top_k': 40,
'top_p': 0.95,
'repeat_penalty': 1.2, # Ollama의 반복 페널티
}
)
print(response['message']['content'])
- OpenAI: temperature, top_p, frequency_penalty, presence_penalty 모두 지원
- Anthropic: temperature, top_p, top_k 지원 (페널티 파라미터 없음)
- Ollama: repeat_penalty로 반복 억제, top_k도 지원
핵심 요약
🌡️ Temperature
- 확률 분포의 날카로움 조절
- 낮음: 결정적, 일관됨
- 높음: 무작위, 창의적
🎯 Top-k
- 고정된 개수의 후보만 고려
- 단순하지만 경직됨
- 보통 k=40~100 사용
📊 Top-p
- 누적 확률 기반 동적 선택
- 상황에 맞게 자동 조절
- 보통 p=0.9~0.95 사용
🚫 Penalties
- Frequency: 횟수 비례 억제
- Presence: 존재 여부로 억제
- 반복 방지, 다양성 확보
- Temperature 또는 Top-p 중 하나만 주로 조절하세요
- 사실 기반 작업은 낮은 Temperature (0.2~0.5)
- 창의적 작업은 높은 Temperature (0.8~1.2)
- 반복이 문제라면 Frequency Penalty 추가
- 새 아이디어가 필요하면 Presence Penalty 추가