ChatGPT ์คํธ๋ฆฌ๋ฐ์ ์ด๋ป๊ฒ ๋์ํ๋?
SSE๋ก ํ ํฐ ๋จ์ ์ค์๊ฐ ์๋ต ์ ๋ฌ
OpenAI์ Chat Completions API์ stream: true๋ฅผ ์ค์ ํ๋ฉด, ์๋ต์ด ํ๊บผ๋ฒ์ ์ค์ง ์๊ณ SSE(Server-Sent Events) ํ์์ผ๋ก ํ ํฐ์ด ์์ฑ๋ ๋๋ง๋ค ์ ์ก๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ EventSource๋ fetch + ReadableStream์ผ๋ก ์ด ์คํธ๋ฆผ์ ์์ ํ๋ฉฐ, ๊ฐ chunk๋ data: {"choices":[{"delta":{"content":"์"}}]} ํ์์ ๋๋ค. ๋ง์ง๋ง์ data: [DONE]์ด ์ค๋ฉด ์คํธ๋ฆผ ์ข ๋ฃ. ์ฌ์ฉ์๋ LLM์ด ์๊ฐํ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
๊ตฌ์กฐ ๋ค์ด์ด๊ทธ๋จ
data: {"delta":{"content":"์"}}
data: {"delta":{"content":"๋
"}}
data: {"delta":{"content":"ํ"}}
data: {"delta":{"content":"์ธ"}}
data: [DONE]
- ์์ฒญ์ 1ํ(POST), ์๋ต๋ง ์คํธ๋ฆฌ๋ฐ → ๋จ๋ฐฉํฅ์ด๋ฉด ์ถฉ๋ถ
- HTTP ๊ธฐ๋ฐ์ด๋ผ CDN/ํ๋ก์ ํธํ์ฑ ์ข์
- ์ฐ๊ฒฐ ๋๊น ์ ์ ์์ฒญ์ผ๋ก ์ฌ์๋ (stateless)
- WebSocket ๋๋น ์๋ฒ ๊ตฌํ์ด ๋จ์
๋์ ํ๋ฆ
ํด๋ผ์ด์ธํธ๊ฐ POST /v1/chat/completions์ stream: true๋ก ์์ฒญ
์๋ฒ๊ฐ Content-Type: text/event-stream์ผ๋ก ์๋ต ์์
LLM์ด ํ ํฐ ์์ฑ โ data: {"delta":{"content":"์"}} ์ฆ์ ์ ์ก
ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ chunk๋ฅผ ๋ฐ์ UI์ append
๋ชจ๋ ํ ํฐ ์์ฑ ์๋ฃ โ data: [DONE] ์ ์ก
ํด๋ผ์ด์ธํธ๊ฐ ์คํธ๋ฆผ ์ข ๋ฃ ์ฒ๋ฆฌ
์ฅ์
- ✓ ์ฒด๊ฐ ์๋ต ์๋ ๋ํญ ํฅ์ (TTFT ์ต์ํ)
- ✓ LLM ์ ์ฒด ์์ฑ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆด ํ์ ์์
- ✓ HTTP ๊ธฐ๋ฐ์ด๋ผ ๊ตฌํ ๋จ์
- ✓ ์ค๊ฐ์ ์ทจ์ ๊ฐ๋ฅ (AbortController)
๋จ์
- ✗ ํ ํฐ ๋จ์ ์ฒ๋ฆฌ ๋ก์ง ํ์
- ✗ ์๋ฌ ์ฒ๋ฆฌ ๋ณต์ก (์ค๊ฐ ๋๊น)
- ✗ ์ด ํ ํฐ ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์์
- ✗ ํด๋ผ์ด์ธํธ ๋ฒํผ๋ง ๊ด๋ฆฌ ํ์