티스토리 뷰
이 글은 이 전에 작성한, Chat API에서 stream 설정의 연장선상의 글이다.
먼저 SSE(Server-Sent Events)에 대해 알아보기 전에 서버-클라이언트의 통신 방식에 대해 간단히 짚고 넘어가는게 좋을 것 같다.
일반적인 서버-클라이언트 네트워크는 폴링(Polling) 방식을 이용한다.
폴링(Polling) 이란?
클라이언트가 서버에 요청을 보내고 응답을 받는 가장 일반적인 형태의 네트워크 방식이다.
HTTP 프로토콜 기반으로 주로 구현되면서 사용되고, 서버의 데이터의 업데이트 속도가 느리거나 실시간성이 요구되지 않는 경우에 유용하게 사용할 수 있다.
다만, 데이터가 업데이트 되지 않았는데 불필요한 요청이 발생하는 경우가 있을 수 있으며, 실시간으로 데이터를 주고 받는데 어려움이 있다는 단점이 있다.
때문에, 롱 폴링(Long Polling) 등 다양한 폴링 전략이 생겨났지만, 폴링 전략에 대해서는 따로 언급하고 넘어가진 않겠다.
그러나 ChatGPT 홈페이지에서 GPT와 대화를 해보면, 폴링으로 데이터를 주고 받는 방식이 아니라는 걸 알 수 있다.
한글자씩 폴링 방식으로 서버와 클라이언트 주고받는다?
서버에는 감당할 수 없는 트래픽이 발생할 것이다.
그렇기 때문에 폴링은 채용할 수 없다.
Chat GPT에서 사용하는 방식은 SSE(Server-Sent Events)라는 통신 방식이다.
SSE(Server-Sent Events) 이란?
SSE(Server-Sent Events)는 서버와 클라이언트 간의 단방향 비동기 데이터 전송을 위한 기술이다.
클라이언트는 서버에게 HTTP 요청(text/event-stream 형태)을 보내고, 서버는 해당 요청에 대해 데이터를 비동기적으로 전송한다.
이 과정에서 초기 연결 시도를 한 이후에, 클라이언트는 서버로 추가 요청을 보낼 수 없고 서버는 주기적으로 이벤트를 발생시켜, 실시간 데이터를 클라이언트로 전송한다.
이러한 형태를 이벤트 스트림 형태로 클라이언트에 데이터를 전송한다 라고 한다.
그리고 이벤트가 모두 종료되면, 일방적으로 연결을 종료한다.
GPT에서는 [Done] 이라는 스트링을 보내, 이벤트가 종료되었음을 전달한다.
소켓 통신과 차이점?
사용 용도가 다르기 때문에 비교할 필요가 있을까 싶다.
굳이 비교 하자면, 양방향 통신인 소켓 통신과 다르게 SSE는 단방향 통신이라는 게 가장 큰 차이점이다.
SSE 방식은 서버와 초기 연결을 위한 요청을 주고 받은 후에, 클라이언트는 서버로 다시 요청을 보낼 수 없다.
이외에 통신 프로토콜의 차이(TCP/IP 기반 HTTP 기반), 지원되는 브라우저 범위(SSE는 나름 최신 기술이라 지원되지 않는 브라우저가 있다고 한다.) 등이 있다.
마치며
사실 OpenAI API의 completion, chat API를 써보면 왜 OpenAI가 chat GPT의 응답 방식에 SSE를 적용했는지 알 수 있다.
왜냐?
전체 답변을 완성하는데 생각보다 오래걸리기 때문이다.
그래서 전체 답변이 완성되기 전에 일부 답변이라도 내려줘서, 사용자가 기다리는 시간을 덜 부담스럽게 느끼게 만들어 사이트에 붙잡아 두려는 것이다.
사용자를 묶어두기 위해서 상업적으로 영악하게 잘 만든 구조라보면 된다.
기술적으로 접근하면, 서버-클라이언트 통신에 실시간성을 보장하기 위해서 SSE 방식만 존재하는게 아니다. WebSocket도 실시간성을 보장하기 위한 방식으로 많이 사용되는 방식이다.
기회가 된다면 따로 다뤄보도록 하겠다...
'개발 > chatGPT' 카테고리의 다른 글
Chat GPT API에서 이전 대화 기억하게 하기 (9) | 2023.06.25 |
---|---|
Chat GPT의 입력 Token 수를 세보자(Jtokkit 소개) (0) | 2023.05.24 |
ChatGPT API의 새기능? chat API를 써보자 - 2 (프롬프트와 SSE) (1) | 2023.05.13 |
ChatGPT API의 새기능? chat API를 써보자 - 1 (간단 사용법) (0) | 2023.04.24 |
ChatGPT API를 스프링 프레임워크에서 써보기 (0) | 2023.02.05 |
- Total
- Today
- Yesterday
- terraform
- 티스토리챌린지
- docker
- 오블완
- S3
- springboot
- 후쿠오카
- AWS EC2
- Spring
- EKS
- openAI API
- cache
- Kotlin
- OpenAI
- elasticsearch
- OpenFeign
- lambda
- java
- AWS
- 스프링부트
- serverless
- ChatGPT
- GIT
- 람다
- Elastic cloud
- AOP
- CloudFront
- JWT
- Log
- MySQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |