본문으로 건너뛰기

스트리밍 & 멀티 턴 대화

중급
What you'll learn
  • 응답을 토큰 단위로 스트리밍하여 사용자가 출력을 즉시 보게 하기
  • API가 무상태인 이유와 대화 히스토리를 직접 운반하는 법 이해하기
  • 이전 교환 전체를 다시 보내 멀티 턴 대화 이어가기
  • 긴 대화가 컨텍스트 창과 비용을 폭발시키지 않게 하기

API에서 채팅 같은 경험을 구축하는 것은 두 가지 실용적 현실로 귀결됩니다: 사용자가 출력을 즉시 보도록 스트리밍하기, 그리고 API가 무상태이므로 히스토리를 직접 관리하기. 둘 다 숙달하면 채팅 UX가 빠르게 느껴지고 모든 것을 기억합니다.

스트리밍

스트리밍 없이는 사용자가 전체 응답을 기다립니다. 스트리밍으로는 토큰이 생성되는 대로 도착합니다 — 훨씬 나은 체감 속도.

Pro tip
  • 원시 이벤트를 직접 파싱하는 대신 SDK의 스트리밍 헬퍼를 사용하세요 — 이벤트 생명 주기를 대신 관리해줍니다.
with client.messages.stream(
model="claude-sonnet-5", max_tokens=1024,
messages=[{"role": "user", "content": "Explain RAG in two sentences."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)

멀티 턴: 히스토리는 여러분이 보유한다

API는 호출 간에 기억이 없습니다 (이유). 대화를 이어가려면 매번 이전 교환 전체를 다시 보내세요.

Guided walkthrough1 of 4
  1. 첫 사용자 메시지를 messages 목록에 보냅니다.
messages = [{"role": "user", "content": "Hi, I'm planning a trip."}]
# ... get assistant reply, then append both turns:
messages.append({"role": "assistant", "content": assistant_text})
messages.append({"role": "user", "content": "Make it 3 days."})
# send the full `messages` list again

긴 대화는 창을 채운다

히스토리가 커지면 컨텍스트 창을 잠식하고 비용이 오릅니다. 그것을 억제하는 전략:

  • 오래된 턴을 앞으로 운반하는 짧은 요약으로 요약/압축하기.
  • 관련 없는 이전 턴 잘라내기.
  • 안정적인 접두부에 대한 재지불을 피하기 위해 **프롬프트 캐싱**과 결합하기.
Watch out
  • 모든 호출이 전체 히스토리를 다시 보냅니다 — 긴 대화는 비용이 더 들고, 압축하거나 잘라내지 않으면 결국 컨텍스트 창을 초과할 수 있습니다.
Key takeaways
  • 빠른 체감 속도를 위해 토큰을 스트리밍하세요; SDK 헬퍼가 이벤트 생명 주기를 처리합니다.
  • API는 무상태입니다 — 호출 간에 기억이 없습니다.
  • 각 턴을 추가하고 전체 messages 목록을 다시 보내 대화를 이어가세요.
  • 긴 대화의 비용과 크기를 제어하려면 압축하고, 잘라내고, 캐시하세요.

스스로 점검하기

0/3
  1. 스트리밍이 채팅 경험을 개선하는 이유는?
  2. 이 API에서 멀티 턴 대화를 어떻게 이어가나요?
  3. 긴 대화가 컨텍스트 창을 채우지 않게 하는 데 제안되지 않은 전략은?

다음