스트리밍 (Streaming)

스트리밍 — 토큰이 생성되는 대로 내보내기

스트리밍은 모델 출력 전체를 기다린 뒤 한 번에 돌려주는 대신, 생성되는 토큰을 하나씩 순서대로 클라이언트에 내보내는 방식이에요. 호출자는 출력이 만들어지는 과정을 그대로 읽을 수 있어서, 첫 토큰은 전체 응답이 끝나기를 기다리는 게 아니라 시간-첫-토큰(TTFT) 이후 바로 도착합니다.

Baseten은 Model APIs(호스팅된 OpenAI/Anthropic 호환 엔드포인트), BIS-LLM, 그리고 Truss로 패키징한 전용 배포 등 다양한 추론 표면에서 스트리밍을 지원해요. vLLM이나 SGLang처럼 OpenAI 호환 API를 노출하는 커스텀 Docker 컨테이너도 같은 방식으로 스트리밍합니다. 특히 챗 애플리케이션처럼 완성에 시간이 걸리고 첫 토큰부터 유용한 경우에 큰 체감 차이를 만들어 주죠.

출처: Baseten - Streaming

스트리밍 켜기

스트리밍은 요청마다 켜는 플래그예요. 호출에 stream=True를 붙이면 응답을 도착하는 대로 읽으면 됩니다. base URL과 모델 슬러그만 다를 뿐, 플래그 설정 방식은 모든 인터페이스에서 동일해요.

# Model APIs: OpenAI 호환 엔드포인트
from openai import OpenAI
import os

client = OpenAI(
    base_url="https://inference.baseten.co/v1",
    api_key=os.environ["BASETEN_API_KEY"],
)
stream = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Pro",
    messages=[{"role": "user", "content": "Write a haiku about the ocean."}],
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="", flush=True)

자체 배포 Truss 모델이라면 /production/predict 엔드포인트에 json={"prompt": "...", "stream": True}를 주고 stream=True로 HTTP 응답을 스트리밍 읽으면 돼요. Anthropic SDK를 쓴다면 base URL을 https://inference.baseten.co로 두고 client.messages.stream(...)으로 호출합니다. cURL로는 "stream": true를 body에 넣고 --no-buffer로 연결을 유지하면 되고요.

스트리밍이 바꾸는 것

스트리밍은 모델이 만들어내는 양이 아니라, 호출자가 출력을 언제 보는지를 바꿔요. 프리필이 끝나면 토큰이 차례로 채워지는 스트리밍 레인과, 같은 생성 동안 비어 있다가 끝에서 한꺼번에 도착하는 비스트리밍 레인을 하나의 시계에 겹쳐 보면 분명해지죠. 둘 다 같은 시점에 끝나니, 차이는 오직 "호출자가 처음 출력을 보는 시점"뿐이에요.

더 알아보기