챗봇의 스트리밍

Sirius·2024년 8월 1일
0

어떻게 글자를 하나하나 웹에 찍을 수 있을까 라는 의문에서 시작

SSE 통신으로 스트리밍 형태 구현이 가능하다.

일반적으로, API 서버가 클라이언트에게 데이터를 실시간으로 전달할 수 있는 방법으론 1) WebSocket, 2) SSE, 3) Polling 등의 방식이 존재한다.

SSE 통신

Server-Sent Events (SSE)는 서버에서 클라이언트로 단방향 스트리밍 데이터를 전송하는 기술입니다. 이는 HTML5 표준의 일부로, 웹 애플리케이션에서 서버에서 실시간으로 업데이트를 수신할 수 있도록 설계되었습니다. SSE는 HTTP 프로토콜을 사용하며, 클라이언트와 서버 간의 지속적인 연결을 유지합니다.

일반적인 SSE 통신은 GET을 통해 서버에게 요청후 서버가 계속 데이터를 보내는것을 볼 수 있다.

장단점

1) 장점

  1. HTTP를 통해 통신하므로 다른 프로토콜은 필요가 없고, 구현이 굉장히 쉽다는 것이다.

  2. 네트워크 연결이 끊겼을 때 자동으로 재연결을 시도한다.

  3. 실시간으로 서버에서 클라이언트로 데이터를 전송할 수 있다. 폴링 같은 경우는 실시간이라고 보기 어려운 점이 있는데, 이러한 한계를 극복한다.

2) 단점

  1. GET 메소드만 지원하고, 파라미터를 보내는데 한계가 있다.
  2. 단방향 통신이며, 한 번 보내면 취소가 불가능하다는 단점이 있다.
  3. 클라이언트가 페이지를 닫아도 서버에서 감지하기가 어렵다는것도 단점이다.
  4. SSE는 지속적인 연결을 유지해야 하므로, 많은 클라이언트가 동시에 연결을 유지할 경우 서버 부담이 커질 수 있다.

챗봇에서의 SSE 통신

챗봇은 post 형태로 데이터를 먼저 전달하기 때문에 조금은 다른 방식으로의 구현이 필요하다.

1) 초기 POST 요청: 클라이언트는 데이터를 서버에 POST 요청으로 전송한다.

챗봇의 POST 요청이 성공적으로 완료된다면, 클라이언트에게 성공적이라는 응답을 보낸다.

2) SSE 연결: POST 요청에 대한 서버의 응답으로, 클라이언트가 SSE 연결을 시작한다. 클라이언트가 데이터를 보내는 과정과 서버가 데이터를 스트리밍하는 과정을 분리하여 관리할 수 있다.

클라이언트는 성공적이라는 응답을 받으면 약속된 특정 엔드포인트로 SSE 연결을 시작한다. (GET)
이때 URL에 user_id를 삽입하여 사용자를 구분한다.

llamaindex에서의 streamig

1) 스트리밍 형태로 계속 뽑으면서 회원 ID에 그 텍스트 계속 저장한다.
{회원ID: ["hi i'm ~"]}

2) SSE 통신으로 GET/{회원ID} 하면 계속 생성되고 있는 답변을 돌려준다.

0개의 댓글