스트리밍 & 멀티 턴 대화
- 응답을 토큰 단위로 스트리밍하여 사용자가 출력을 즉시 보게 하기
- API가 무상태인 이유와 대화 히스토리를 직접 운반하는 법 이해하기
- 이전 교환 전체를 다시 보내 멀티 턴 대화 이어가기
- 긴 대화가 컨텍스트 창과 비용을 폭발시키지 않게 하기
API에서 채팅 같은 경험을 구축하는 것은 두 가지 실용적 현실로 귀결됩니다: 사용자가 출력을 즉시 보도록 스트리밍하기, 그리고 API가 무상태이므로 히스토리를 직접 관리하기. 둘 다 숙달하면 채팅 UX가 빠르게 느껴지고 모든 것을 기억합니다.
스트리밍
스트리밍 없이는 사용자가 전체 응답을 기다립니다. 스트리밍으로는 토큰이 생성되는 대로 도착합니다 — 훨씬 나은 체감 속도.
- 원시 이벤트를 직접 파싱하는 대신 SDK의 스트리밍 헬퍼를 사용하세요 — 이벤트 생명 주기를 대신 관리해줍니다.
- Python
- TypeScript
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)
const stream = client.messages.stream({
model: "claude-sonnet-5", max_tokens: 1024,
messages: [{ role: "user", content: "Explain RAG in two sentences." }],
});
for await (const event of stream) {
if (event.type === "content_block_delta") process.stdout.write(event.delta.text ?? "");
}
멀티 턴: 히스토리는 여러분이 보유한다
API는 호출 간에 기억이 없습니다 (이유). 대화를 이어가려면 매번 이전 교환 전체를 다시 보내세요.
Guided walkthrough1 of 4
- 첫 사용자 메시지를 messages 목록에 보냅니다.
- 결과에서 어시스턴트의 응답 텍스트를 읽습니다.
- 어시스턴트 응답과 다음 사용자 메시지를 같은 messages 목록에 추가합니다.
- 완전한 messages 목록을 다시 보냅니다 — 그것이 Claude가 교환을 '기억'하는 방식입니다.
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
긴 대화는 창을 채운다
히스토리가 커지면 컨텍스트 창을 잠식하고 비용이 오릅니다. 그것을 억제하는 전략:
- 오래된 턴을 앞으로 운반하는 짧은 요약으로 요약/압축하기.
- 관련 없는 이전 턴 잘라내기.
- 안정적인 접두부에 대한 재지불을 피하기 위해 **프롬프트 캐싱**과 결합하기.
- 모든 호출이 전체 히스토리를 다시 보냅니다 — 긴 대화는 비용이 더 들고, 압축하거나 잘라내지 않으면 결국 컨텍스트 창을 초과할 수 있습니다.
- 빠른 체감 속도를 위해 토큰을 스트리밍하세요; SDK 헬퍼가 이벤트 생명 주기를 처리합니다.
- API는 무상태입니다 — 호출 간에 기억이 없습니다.
- 각 턴을 추가하고 전체 messages 목록을 다시 보내 대화를 이어가세요.
- 긴 대화의 비용과 크기를 제어하려면 압축하고, 잘라내고, 캐시하세요.