k
korAI
중급 전체
중급2026-05-047분

temperature 조절과 Streaming으로 Claude API 응답 품질·UX 동시에 잡기

temperature 값 하나로 창의성과 정확성을 조율하고, Streaming API를 적용하면 긴 응답에서도 사용자가 기다리지 않는 경험을 만들 수 있습니다.

api-optionsstreamingtemperature

temperature란 무엇인가?

temperature는 모델이 다음 토큰을 선택할 때 확률 분포의 날카로움을 조절하는 파라미터입니다.

| 값 범위 | 특성 | 추천 사용 사례 | |---|---|---| | 0.0 ~ 0.3 | 결정론적, 반복 재현 가능 | SQL 생성, 코드 디버깅, 분류 | | 0.4 ~ 0.7 | 균형 잡힌 출력 | 요약, Q&A, 번역 | | 0.8 ~ 1.0 | 창의적, 다양한 출력 | 카피라이팅, 스토리, 브레인스토밍 |

⚠️ claude-sonnet-4-6 기준 기본값은 1.0입니다. 정확도가 중요한 작업에서는 반드시 낮춰야 합니다.

Streaming API 적용하기

Streaming 없이는 Claude가 응답 전체를 생성한 후에야 클라이언트에 전달합니다. 500토큰 응답이면 수 초의 공백이 생깁니다. Streaming을 켜면 첫 단어부터 즉시 표시됩니다.

import anthropic

client = anthropic.Anthropic()

def generate_creative_copy(product: str, tone: str = "energetic") -> str:
    """
    마케팅 카피 생성: 창의적 작업이므로 temperature 높게 설정
    Streaming으로 실시간 출력
    """
    full_response = ""

    print(f"[{product}] 카피 생성 중...\n")
    print("-" * 40)

    with client.messages.stream(
        model="claude-sonnet-4-6",
        max_tokens=512,
        temperature=0.9,  # 창의적 카피 → 높은 temperature
        system=f"당신은 {tone} 톤의 시니어 카피라이터입니다. 짧고 임팩트 있는 문구를 만드세요.",
        messages=[
            {
                "role": "user",
                "content": f"'{product}'의 마케팅 슬로건 3개와 각 슬로건의 SNS 캡션을 작성하세요.",
            }
        ],
    ) as stream:
        for text_chunk in stream.text_stream:
            print(text_chunk, end="", flush=True)  # 실시간 출력
            full_response += text_chunk

    print("\n" + "-" * 40)

    # 스트림 종료 후 최종 메시지로 usage 확인
    final_message = stream.get_final_message()
    print(f"\n총 토큰: {final_message.usage.input_tokens} in / {final_message.usage.output_tokens} out")

    return full_response


def classify_sentiment(text: str) -> str:
    """
    감성 분석: 정확도 우선 → temperature 낮게 설정
    짧은 응답이므로 Streaming 불필요
    """
    response = client.messages.create(
        model="claude-haiku-4-5",
        max_tokens=64,
        temperature=0.1,  # 분류 작업 → 낮은 temperature
        messages=[
            {
                "role": "user",
                "content": f"다음 리뷰의 감성을 '긍정', '부정', '중립' 중 하나만 답하세요:\n\n{text}",
            }
        ],
    )
    return response.content[0].text


if __name__ == "__main__":
    # 창의적 작업: Streaming + 높은 temperature
    generate_creative_copy("스마트 러닝화", tone="energetic")

    print("\n")

    # 분류 작업: 낮은 temperature
    review = "배송은 빠른데 제품 품질이 기대 이하였어요."
    sentiment = classify_sentiment(review)
    print(f"감성 분석 결과: {sentiment}")

Streaming 적용 시 주의사항

Streaming 중에는 response.usage에 바로 접근할 수 없습니다. stream.get_final_message()로 스트림이 완전히 끝난 후 메타데이터를 가져와야 합니다. 에러 발생 시 with 블록이 자동으로 스트림을 닫아주므로 리소스 누수 걱정은 없습니다.

설정 전 체크리스트

  • [ ] 작업 유형을 먼저 분류했는가? (창의적 vs 정확도 우선)
  • [ ] 정확도 우선 작업에 temperature0.1~0.3으로 낮췄는가?
  • [ ] 응답 길이가 200토큰 이상 예상되는 경우 Streaming을 적용했는가?
  • [ ] Streaming 사용 시 get_final_message()로 usage를 별도 수집하는가?
  • [ ] 비용 최적화를 위해 짧은 분류·추출 작업엔 claude-haiku-4-5를 사용하는가?
  • [ ] max_tokens를 작업에 맞게 적절히 제한했는가? (무제한 방치 금지)