PART 3 · 강의 4/4

출력 제어 파라미터

Temperature, Top-p, Top-k로 LLM의 창의성과 일관성을 조절합니다.

01

Temperature: 무작위성의 조절

확률 분포의 날카로움을 조절

Temperature는 다음 토큰을 선택할 때 확률 분포의 "날카로움"을 조절합니다. 높은 Temperature는 확률 분포를 평탄하게 만들어 다양한 토큰이 선택될 가능성을 높이고, 낮은 Temperature는 분포를 뾰족하게 만들어 높은 확률의 토큰이 선택될 가능성을 높입니다.

Softmax with Temperature

P(token_i) = exp(logit_i / T) / Σ exp(logit_j / T)

T = Temperature 값. T가 작을수록 높은 logit의 토큰에 확률이 집중됩니다.

🧪 Temperature 실험실

Temperature 0.7
결정적 (0) 균형 (1) 창의적 (2)

"오늘 날씨가" 다음에 올 토큰의 확률 분포:

Temperature 효과 설명
Temperature 0.7은 약간의 다양성을 허용하면서도 합리적인 선택을 유지합니다.
T=0

❄️ 매우 낮은 Temperature

"오늘 날씨가 좋습니다. 오늘 날씨가 좋습니다. 오늘 날씨가 좋습니다."

⚠️ 항상 가장 확률 높은 토큰만 선택 → 반복 발생 가능
T=0.7

🌤️ 균형잡힌 Temperature

"오늘 날씨가 정말 화창하네요. 산책하기 딱 좋은 날씨입니다."

✅ 자연스럽고 다양하면서도 일관된 출력
T=1.5

🔥 높은 Temperature

"오늘 날씨가 마치 봄날의 유리창처럼 투명하고 반짝거려요!"

⚠️ 창의적이지만 때로 이상한 표현 가능
02

Top-k Sampling: 상위 K개만 고려

고정된 개수의 후보만 선택

Top-k는 다음 토큰을 선택할 때 확률이 가장 높은 K개의 토큰만 후보로 고려합니다. 나머지 토큰들은 아무리 적절해도 선택 대상에서 제외됩니다.

🎲 Top-k 시뮬레이션

Top-k 값 5
매우 제한적 (1) 보통 (5) 다양함 (10)

"맛있는" 다음에 올 토큰 후보 (상위 10개 중 k개만 선택):

Top-k 효과
k=5일 때, 상위 5개 토큰만 샘플링 대상이 됩니다.
⚠️ Top-k의 한계

고정된 k값은 상황에 따라 부적절할 수 있습니다:

  • "예/아니오로 답하세요" → k=50이면 불필요하게 많은 옵션
  • "창의적인 이야기를 써줘" → k=5이면 너무 제한적

이 문제를 해결하기 위해 Top-p가 등장했습니다.

03

Top-p (Nucleus Sampling)

누적 확률 기반 동적 선택

Top-p는 누적 확률이 p에 도달할 때까지의 토큰들만 후보로 고려합니다. 확률 분포에 따라 동적으로 후보 수가 조절되어 상황에 맞는 다양성을 제공합니다.

📈 Top-p 시뮬레이션

Top-p 값 0.9
집중적 (0.1) 균형 (0.5) 다양함 (1.0)

"인공지능은" 다음에 올 토큰 (누적 확률 p까지):

Top-p 효과
p=0.9일 때, 누적 확률 90%에 도달할 때까지의 토큰만 선택됩니다.

Top-k vs Top-p 비교

특성 Top-k Top-p
후보 선택 방식 고정된 개수 (k개) 누적 확률 기반 (동적)
장점 구현이 간단, 예측 가능 상황에 맞게 자동 조절
단점 상황 무관하게 고정 결과 예측이 어려움
일반적 값 k = 40~100 p = 0.9~0.95
추천 용도 일관된 출력 필요시 자연스러운 대화, 글쓰기
04

샘플링 과정 시각화

토큰 선택의 전체 흐름

LLM이 다음 토큰을 선택하는 전체 과정을 단계별로 살펴봅시다.

1
Logit 생성
모델이 각 토큰에 대한 점수(logit)를 계산
2
Temperature 적용
logit을 Temperature로 나눠 분포 조절
3
Softmax
logit을 확률로 변환 (합=1)
4
Top-k 필터
상위 k개 토큰만 남기고 제외
5
Top-p 필터
누적 확률 p까지만 유지
6
샘플링
남은 후보 중 확률에 따라 선택
💡 권장 사항

Temperature와 Top-p를 동시에 조절하지 않는 것이 좋습니다. 둘 중 하나만 조절하고 다른 하나는 기본값으로 두세요. 일반적으로 Temperature 또는 Top-p 중 하나만 사용합니다.

05

반복 방지: Frequency & Presence Penalty

반복되는 단어 억제하기

LLM은 같은 단어나 구문을 반복하는 경향이 있습니다. 이를 방지하기 위해 두 가지 페널티를 사용합니다.

📊 Frequency Penalty

범위: -2.0 ~ 2.0 (기본값: 0)

토큰이 등장한 횟수에 비례하여 페널티 적용. 많이 나온 단어일수록 더 강하게 억제됩니다.

✓ Presence Penalty

범위: -2.0 ~ 2.0 (기본값: 0)

토큰의 존재 여부만으로 페널티 적용. 1번 나왔든 10번 나왔든 동일한 페널티.

📝 페널티 효과 시각화

Frequency Penalty 0.5
Presence Penalty 0.5

기존 출력: "오늘 날씨가 정말 좋아서 날씨 좋은 에는..."

페널티 적용 결과
"날씨"(2회 등장)는 frequency penalty로 강하게 억제되고, "날"(1회 등장)도 presence penalty로 약하게 억제됩니다.
파라미터 페널티 방식 효과 사용 예
Frequency 등장 횟수에 비례 자주 쓴 단어 강하게 억제 글쓰기, 요약
Presence 존재 여부만 확인 새로운 주제 탐색 유도 브레인스토밍, 목록 생성
06

용도별 최적 설정 가이드

상황에 맞는 파라미터 조합

⚖️ 균형잡힌 설정

Temperature
0.7
Top-p
0.9
Top-k
50
Freq. Penalty
0
Pres. Penalty
0

일반적인 대화와 글쓰기에 적합한 균형잡힌 설정입니다.

📊 상세 설정 가이드

용도 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 새로운 아이디어 탐색
07

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'])
🔍 API별 차이점
  • OpenAI: temperature, top_p, frequency_penalty, presence_penalty 모두 지원
  • Anthropic: temperature, top_p, top_k 지원 (페널티 파라미터 없음)
  • Ollama: repeat_penalty로 반복 억제, top_k도 지원
SUMMARY

핵심 요약

🌡️ 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 추가