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

temperature 조절과 streaming으로 응답 품질·UX를 동시에 잡는 법

temperature 값 하나로 창의성과 일관성을 제어하고, streaming을 붙이면 체감 응답 속도를 극적으로 개선할 수 있습니다. 두 옵션을 조합하는 실전 패턴을 정리합니다.

api-optionsstreamingtemperature

temperature가 실제로 하는 일

temperature는 0~1 사이 값으로, 모델이 다음 토큰을 선택할 때 확률 분포를 얼마나 평탄하게(높은 값) 혹은 뾰족하게(낮은 값) 만들지 결정합니다.

| 값 범위 | 특성 | 적합한 작업 | |---|---|---| | 0.0 – 0.3 | 결정론적, 일관성 높음 | 코드 생성, 데이터 추출, 분류 | | 0.4 – 0.7 | 균형 잡힌 다양성 | 요약, Q&A, 번역 | | 0.8 – 1.0 | 창의적, 예측 불가 | 브레인스토밍, 소설, 마케팅 카피 |

같은 프롬프트라도 temperature에 따라 결과가 크게 달라지므로, 작업 유형마다 값을 고정해두는 것이 재현성 확보의 핵심입니다.

Streaming으로 UX 개선하기

긴 응답을 기다리게 하면 사용자는 앱이 멈췄다고 느낍니다. Streaming은 토큰이 생성되는 즉시 클라이언트로 전송해 체감 대기 시간을 90% 이상 줄일 수 있습니다.

import anthropic

client = anthropic.Anthropic()

def generate_creative_copy(product: str, temperature: float = 0.8) -> str:
    """마케팅 카피처럼 창의성이 필요한 작업에 높은 temperature + streaming 적용"""
    full_text = ""

    print(f"[temperature={temperature}] 생성 시작...\n")

    # streaming=True 대신 stream 컨텍스트 매니저 사용
    with client.messages.stream(
        model="claude-sonnet-4-6",
        max_tokens=512,
        temperature=temperature,
        messages=[
            {
                "role": "user",
                "content": (
                    f"{product}의 매력을 담은 SNS 마케팅 카피 3가지를 "
                    "각각 다른 톤(유머러스/감성적/직관적)으로 작성해줘."
                ),
            }
        ],
    ) as stream:
        for text_chunk in stream.text_stream:
            print(text_chunk, end="", flush=True)  # 실시간 출력
            full_text += text_chunk

    print("\n\n[완료]")
    return full_text


def extract_structured_data(text: str) -> str:
    """데이터 추출처럼 정확성이 필요한 작업에 낮은 temperature 적용"""
    result = ""

    with client.messages.stream(
        model="claude-haiku-4-5",  # 빠른 처리에 haiku 선택
        max_tokens=256,
        temperature=0.1,  # 낮은 temperature로 일관된 JSON 출력 유도
        messages=[
            {
                "role": "user",
                "content": (
                    f"다음 텍스트에서 이름, 이메일, 전화번호를 "
                    f"JSON으로만 추출해줘 (설명 없이):\n\n{text}"
                ),
            }
        ],
    ) as stream:
        for text_chunk in stream.text_stream:
            result += text_chunk

    return result


if __name__ == "__main__":
    # 창의적 작업: 높은 temperature + streaming
    generate_creative_copy("무선 노이즈캔슬링 이어폰", temperature=0.85)

    # 정밀 추출: 낮은 temperature + streaming
    sample = "안녕하세요, 저는 김민준(minjun@example.com, 010-1234-5678)입니다."
    print(extract_structured_data(sample))

조합 전략 요약

Streaming은 항상 켜두는 것이 좋습니다. 비용은 동일하고 UX만 개선됩니다. 단, 스트림을 중간에 끊을 수 있는 취소(abort) 로직도 함께 구현해두세요. Temperature는 작업 유형별로 환경변수나 설정 파일에 미리 정의해두면 실수를 줄일 수 있습니다.

TEMP_CREATIVE=0.85
TEMP_BALANCED=0.5
TEMP_PRECISE=0.1

체크리스트

  • [ ] 작업 유형(창의/균형/정밀)에 맞는 temperature 값을 미리 정의한다
  • [ ] 코드 생성·JSON 추출 등 구조화된 출력에는 temperature 0.1 이하를 쓴다
  • [ ] Streaming을 기본값으로 설정하고 실시간 출력을 구현한다
  • [ ] 스트림 중단(abort/cancel) 시나리오에 대한 예외 처리를 추가한다
  • [ ] 긴 텍스트 생성은 claude-sonnet-4-6, 빠른 분류/추출은 claude-haiku-4-5로 모델을 분리한다
  • [ ] temperature 값을 하드코딩하지 않고 환경 변수로 관리한다