본문 바로가기
AI2026년 6월 22일3분 읽기

LLM 스트리밍 응답 구현 — SSE로 체감 속도 올리기

YS
김영삼
조회 968
LLM 스트리밍 응답 구현 — SSE로 체감 속도 올리기

핵심 요약

LLM 응답은 길어서 다 기다리면 답답하다. SSE(Server-Sent Events)로 생성되는 토큰을 즉시 흘려보내면 체감 속도가 확 좋아진다. 핵심은 ① 청크를 바로 flush, ② 프록시(nginx) 버퍼링 끄기, ③ 클라이언트 중단(abort) 시 생성 취소.

1. 서버(개념)

res.setHeader('Content-Type','text/event-stream')
res.setHeader('Cache-Control','no-cache')
res.setHeader('Connection','keep-alive')
for await (const chunk of llmStream) {
  res.write(`data: ${JSON.stringify(chunk)}\n\n`)
}
res.write('data: [DONE]\n\n'); res.end()

2. 체크포인트

  • nginx: proxy_buffering off(안 그러면 모아서 한 번에 도착)
  • 클라이언트 연결 끊김 감지 → LLM 호출 abort로 비용 절약
  • 에러도 이벤트로 전송해 UI가 처리

3. 함정

  • 중간 버퍼링(프록시·압축)이 있으면 스트리밍 효과가 사라진다
  • SSE는 단방향 — 양방향 필요하면 WebSocket
  • 서버리스 환경은 응답 스트리밍 지원 여부 확인

자주 묻는 질문

토큰이 실시간으로 안 오고 한꺼번에 옵니다.

중간 프록시나 압축이 버퍼링하기 때문입니다. nginx의 proxy_buffering을 끄고, 응답 압축(gzip)이 스트림을 모으지 않는지 확인하세요.

사용자가 창을 닫으면 비용이 계속 나가나요?

연결 종료를 감지해 LLM 호출을 abort하지 않으면 생성이 계속됩니다. 요청 취소 시 업스트림 호출도 중단하도록 연결하세요.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록