스트리밍 응답 (Streaming)

스트리밍 응답 (Streaming)

긴 답변을 통째로 기다리면 사용자는 몇 초씩 빈 화면을 보게 돼요. 스트리밍은 모델이 글을 만들어내는 중간중간 그 내용을 조각조각 즉시 받아와서, 생성이 끝나길 기다리지 않고 출력을 채워 갈 수 있게 해줍니다. 이 글에서는 스트리밍을 켜는 파라미터와 SSE 응답의 구조를 다뤄볼게요.

출처: 流式消息 (Streaming) - 智谱开放平台 문서

켜는 방법과 응답 형식

요청에 stream: true를 넣으면 모델이 결과를 하나로 한꺼번에 주는 대신, SSE(Server-Sent Events)로 델타를 나눠 보내요. 각 이벤트에서 이렇게 받아요.

  • choices[0].delta.content — 점진적으로 도착하는 답변 텍스트
  • choices[0].delta.reasoning_content — 점진적인 생각(추론) 내용
  • choices[0].finish_reason — 생성 완료 이유 (마지막 chunk에만 등장)
  • usage — 토큰 사용 통계 (마지막 chunk에만 등장)

즉, 마지막 chunk를 만나기 전까지는 delta.content를 하나씩 이어 붙이면 완성된 답변이 됩니다.

호출 예시

cURL은 이렇게 생겼어요.

curl --location 'https://open.bigmodel.cn/api/paas/v4/chat/completions' \
  --header 'Authorization: Bearer ***' \
  --header 'Content-Type: application/json' \
  --data '{
      "model": "glm-5.2",
      "messages": [ { "role": "user", "content": "봄에 대한 시를 지어줘" } ],
      "stream": true
  }'

Python SDK(zai-sdk)에서는 응답이 작은 조각들의 이터러블로 돌아오니, chunk.choices[0].delta.content를 누적해 나가면 돼요.

data: {"id":"1","created":1677652288,"model":"glm-5.2","choices":[{"index":0,"delta":{"content":"봄"},"finish_reason":null}]}
...
data: {"id":"1","created":1677652288,"model":"glm-5.2","choices":[{"index":0,"finish_reason":"stop","delta":{"role":"assistant","content":""}}],"usage":{"prompt_tokens":8,"completion_tokens":262,"total_tokens":270}}
data: [DONE]

대화형 채팅, 긴 문서 생성, 그리고 깊은 사고의 생각 과정을 실시간으로 보여주고 싶은 인터페이스에서 특히 유용해요.

더 알아보기 (Learn more)