k
korAI
중급 전체
중급2026-07-298분

Temperature 조절과 Streaming으로 API 응답을 완전히 내 것으로 만들기

Temperature 값 하나로 창의성과 일관성을 오가고, Streaming으로 사용자 이탈률을 줄이는 실전 API 옵션 조합을 알아봅니다.

api-optionsstreamingtemperature

Temperature란 무엇이고 왜 중요한가?

temperature는 모델이 다음 토큰을 선택할 때의 '무작위성 강도'입니다.

| 값 | 특성 | 적합한 상황 | |---|---|---| | 0.0 | 거의 결정론적, 매번 같은 답 | 코드 생성, 데이터 추출, 분류 | | 0.3 ~ 0.5 | 약간의 변화, 안정적 | 요약, 번역, Q&A | | 0.7 ~ 1.0 | 창의적, 다양성 높음 | 카피라이팅, 브레인스토밍 | | 1.0+ | 매우 랜덤, 예측 불가 | 실험적 창작 (주의 필요) |

핵심 원칙: 정답이 하나인 태스크엔 낮게, 정답이 여러 개인 태스크엔 높게.


Streaming이 UX를 바꾸는 이유

기본 API 호출은 응답 전체가 완성될 때까지 기다립니다. 긴 텍스트라면 사용자는 5~10초를 멍하니 기다려야 합니다. Streaming을 켜면 첫 토큰부터 즉시 화면에 출력되어 체감 대기 시간이 90% 이상 줄어듭니다.

실제로 ChatGPT, Claude.ai 등 모든 주요 AI 서비스가 Streaming을 기본으로 씁니다.


Python으로 Temperature + Streaming 조합 구현

아래 코드는 태스크 유형에 따라 temperature를 동적으로 선택하고, Streaming으로 결과를 실시간 출력합니다. 비용 절감을 위해 claude-haiku-4-5를 사용합니다.

import anthropic
from enum import Enum

class TaskType(Enum):
    FACTUAL = "factual"      # 코드, 데이터 추출
    BALANCED = "balanced"    # 요약, Q&A
    CREATIVE = "creative"    # 카피라이팅, 아이디어

TEMPERATURE_MAP = {
    TaskType.FACTUAL: 0.1,
    TaskType.BALANCED: 0.5,
    TaskType.CREATIVE: 0.9,
}

client = anthropic.Anthropic()

def stream_response(
    prompt: str,
    task_type: TaskType = TaskType.BALANCED,
    max_tokens: int = 512,
) -> str:
    """태스크 유형에 맞는 temperature로 Streaming 응답을 출력합니다."""
    temperature = TEMPERATURE_MAP[task_type]
    print(f"\n🌡️  Temperature: {temperature} ({task_type.value})")
    print("─" * 50)

    full_text = ""
    input_tokens = 0
    output_tokens = 0

    with client.messages.stream(
        model="claude-haiku-4-5",
        max_tokens=max_tokens,
        temperature=temperature,
        messages=[{"role": "user", "content": prompt}],
    ) as stream:
        for text in stream.text_stream:
            print(text, end="", flush=True)  # 실시간 출력
            full_text += text

        # 스트림 종료 후 usage 정보 접근
        final_message = stream.get_final_message()
        input_tokens = final_message.usage.input_tokens
        output_tokens = final_message.usage.output_tokens

    print(f"\n\n📈 토큰 사용량 — 입력: {input_tokens}, 출력: {output_tokens}")
    return full_text


if __name__ == "__main__":
    # 1) 사실형: 낮은 temperature로 일관된 코드 생성
    stream_response(
        "Python에서 리스트 중복 제거하는 함수를 작성해줘.",
        task_type=TaskType.FACTUAL,
    )

    # 2) 창의형: 높은 temperature로 다양한 슬로건 생성
    stream_response(
        "친환경 텀블러 브랜드를 위한 슬로건 3개를 만들어줘.",
        task_type=TaskType.CREATIVE,
    )

실행 결과 예시 (창의형):

🌡️  Temperature: 0.9 (creative)
──────────────────────────────────────────────────
1. 한 번 채우면, 지구가 한 번 숨 쉽니다.
2. 당신의 선택이 내일의 파도를 만듭니다.
3. 비우고 채우는 것, 그것이 지속 가능함입니다.

📈 토큰 사용량 — 입력: 38, 출력: 67

실전 적용 체크리스트

  • [ ] 코드·SQL·JSON 추출 태스크에는 temperature를 0.0~0.2로 설정한다
  • [ ] 마케팅 카피, 아이디어 생성엔 0.8~1.0을 시도하고 결과를 비교한다
  • [ ] 사용자 대면 서비스라면 반드시 Streaming을 켠다
  • [ ] stream.get_final_message()로 토큰 사용량을 모니터링해 비용을 추적한다
  • [ ] claude-haiku-4-5는 빠르고 저렴해 Streaming 프로토타이핑에 최적이다
  • [ ] 같은 프롬프트를 temperature만 바꿔 A/B 테스트해 최적값을 찾는다