k
korAI
중급 전체
⚡ 중급2026-09-267분

응답이 너무 뻔하거나 너무 산만할 때 — temperature와 streaming을 조율하라

temperature 값 하나로 창의성과 일관성을 제어하고, streaming을 활성화해 사용자 체감 속도를 극적으로 개선하는 실전 방법을 다룹니다.

api-optionsstreamingtemperature

temperature란 무엇이고 언제 바꿔야 하나?

temperature는 모델이 다음 토큰을 선택할 때 얼마나 다양한 후보를 고려할지 결정하는 값입니다(범위 0.0 ~ 1.0).

| temperature | 특성 | 추천 사용 사례 | |---|---|---| | 0.0 ~ 0.3 | 결정론적·일관성 높음 | 코드 생성, 데이터 추출, 분류 | | 0.4 ~ 0.7 | 균형 (기본값 권장) | 요약, Q&A, 번역 | | 0.8 ~ 1.0 | 창의적·다양성 높음 | 브레인스토밍, 카피라이팅, 스토리 |

흔한 실수: 코드 리뷰에 temperature: 1.0을 쓰면 동일 코드에 대해 매번 다른 판단이 나옵니다. 반드시 낮게 고정하세요.

Streaming으로 UX 개선하기 (Python)

응답 전체가 완성될 때까지 기다리는 대신, 스트리밍으로 토큰이 생성되는 즉시 사용자에게 보여주면 체감 대기 시간이 70~80% 줄어듭니다.

import anthropic

client = anthropic.Anthropic()

def stream_creative_copy(topic: str, temperature: float = 0.8) -> str:
    """마케팅 카피를 스트리밍으로 생성합니다."""
    collected_text = ""

    # streaming=True 대신 stream() 컨텍스트 매니저 사용
    with client.messages.stream(
        model="claude-sonnet-4-6",
        max_tokens=512,
        temperature=temperature,
        system="당신은 감각적인 한국어 마케팅 카피라이터입니다.",
        messages=[
            {
                "role": "user",
                "content": f"'{topic}'을 주제로 SNS 광고 문구 3가지를 작성하세요.",
            }
        ],
    ) as stream:
        for text_chunk in stream.text_stream:
            print(text_chunk, end="", flush=True)  # 실시간 출력
            collected_text += text_chunk

    print()  # 줄바꿈

    # 최종 사용량 확인
    final_message = stream.get_final_message()
    usage = final_message.usage
    print(f"\n[토큰 사용] 입력: {usage.input_tokens} / 출력: {usage.output_tokens}")

    return collected_text


def stream_structured_data(query: str) -> str:
    """낮은 temperature로 일관된 JSON 추출 (스트리밍)."""
    result = ""

    with client.messages.stream(
        model="claude-haiku-4-5",
        max_tokens=256,
        temperature=0.1,  # 구조화 데이터 → 낮게 고정
        system="JSON만 출력하세요. 설명 텍스트 없이.",
        messages=[
            {
                "role": "user",
                "content": f"다음 문장에서 이름, 날짜, 금액을 추출하세요: {query}",
            }
        ],
    ) as stream:
        for chunk in stream.text_stream:
            result += chunk

    return result


# 실행
stream_creative_copy("친환경 텀블러", temperature=0.9)
print(stream_structured_data("홍길동이 2026년 9월 26일에 35만원을 결제했습니다."))

실전 조합 전략

상황별 권장 설정표

창의적 콘텐츠 생성:
  model: claude-sonnet-4-6
  temperature: 0.8 ~ 1.0
  streaming: True  ← 사용자가 기다리는 동안 내용 확인 가능

코드/데이터 처리:
  model: claude-haiku-4-5  ← 빠르고 저렴
  temperature: 0.0 ~ 0.2
  streaming: False  ← 후처리 파싱 안정성 우선

대화형 챗봇:
  model: claude-haiku-4-5
  temperature: 0.5
  streaming: True  ← 응답 체감 속도가 핵심

Streaming 사용 시 주의사항: 스트리밍 도중 네트워크가 끊기면 불완전한 텍스트가 저장될 수 있으므로, get_final_message()로 완료 여부를 반드시 확인하세요.

체크리스트

  • [ ] 작업 유형(창의/구조화)에 맞는 temperature 범위를 선택했는가?
  • [ ] 동일 프롬프트에서 temperature 0.0, 0.5, 1.0을 각각 3회씩 실행해 출력 분산을 직접 확인했는가?
  • [ ] 사용자 대면 인터페이스에 streaming을 적용해 첫 토큰 도달 시간(TTFT)을 측정했는가?
  • [ ] 스트리밍 종료 후 get_final_message()로 stop_reason이 "end_turn"인지 검증하는가?
  • [ ] 비용 절감이 필요한 반복 작업에 claude-haiku-4-5를 우선 적용했는가?