⚡ 중급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 정확도 우선)
- [ ] 정확도 우선 작업에
temperature를0.1~0.3으로 낮췄는가? - [ ] 응답 길이가 200토큰 이상 예상되는 경우 Streaming을 적용했는가?
- [ ] Streaming 사용 시
get_final_message()로 usage를 별도 수집하는가? - [ ] 비용 최적화를 위해 짧은 분류·추출 작업엔
claude-haiku-4-5를 사용하는가? - [ ]
max_tokens를 작업에 맞게 적절히 제한했는가? (무제한 방치 금지)