핵심 요약
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