본문 바로가기

ChatGPT/Backend

[Typescript][Express] OpenAI와 SSE를 사용한 챗봇 서버 구현하기

반응형

소개

이 글에서는 OpenAI API와 SSE(Server-Sent Events) 스트림을 사용하여 챗봇 서버를 구현하는 방법에 대해 알아보겠습니다. 구현에 사용된 기술 스택은 Node.js, Express, openai-chat-session-manager 입니다.

openai-chat-session-manager는 https://tobelinuxer.tistory.com/70에서 구현하였습니다.

 

[OpenAI][ChatGPT] Session Manager with TypeScript and AWS DynamoDB

https://github.com/gboysking/openai-chat-session-manager GitHub - gboysking/openai-chat-session-manager: OpenAI Chat Session Manager is a TypeScript module designed to manage chat sessi OpenAI Chat Session Manager is a TypeScript module designed to manage

tobelinuxer.tistory.com

npm install openai-chat-session-manager

본 글에서는 Node.js와 Express를 사용하여 챗봇 서버를 구현하는 방법에 대해 다루고 있습니다. OpenAI API를 사용하여 챗봇 기능을 구현하고, SSE 스트림을 사용하여 실시간으로 클라이언트와 채팅할 수 있는 챗봇 서버를 구현해보겠습니다.

먼저 openai-chat-session-manager 라이브러리를 사용하여 챗봇 세션을 관리하는 방법을 살펴볼 것입니다. 이를 통해 챗봇 세션 데이터를 메모리 상에 저장하고 관리할 수 있습니다. 그 후에는 Express를 사용하여 챗봇 서버를 구현하고, SSE 스트림을 사용하여 클라이언트와 채팅을 할 수 있는 서버를 구현해보겠습니다.

서버 구현하기

이번 섹션에서는 챗봇 서버를 구현해보겠습니다. MockChatSession 클래스를 구현하여 챗봇 세션 데이터를 관리하고, Express를 사용하여 서버 애플리케이션을 구현합니다. 마지막으로 SSE(Server-Sent Events) 스트림을 사용하여 클라이언트에게 챗봇 응답을 전송하는 방법에 대해 살펴보겠습니다.

MockChatSession 클래스 구현하기

MockChatSession 클래스는 메모리에서 챗봇 세션 데이터를 저장하고 관리하는 클래스입니다. putItem(), getItem(), deleteItem() 메서드를 구현하여 챗봇 세션 데이터를 관리할 수 있습니다.

class MockChatSession extends ChatSession {
  private data: { [key: string]: ChatData } = {};

  async putItem(sessionId: string, data: Omit<ChatData, 'sessionId'>): Promise<void> {
    this.data[sessionId] = { sessionId, ...data };
  }

  async getItem(sessionId: string): Promise<ChatData | null> {    
    return this.data[sessionId] || null;
  }

  async deleteItem(sessionId: string): Promise<void> {
    delete this.data[sessionId];
  }
}

Express 애플리케이션 구현하기

Express를 사용하여 서버 애플리케이션을 구현합니다. 서버는 클라이언트 요청을 처리하고, 챗봇 응답을 생성하여 SSE 스트림으로 클라이언트에게 전송합니다.

/chat/:sessionId 엔드포인트 구현하기

/chat/:sessionId 엔드포인트를 사용하여 클라이언트는 챗봇과 대화를 시작할 수 있습니다. 클라이언트는 POST 요청을 보내어 챗봇과 대화를 시작하며, 요청 바디에는 챗봇에게 전달할 메시지인 message 필드가 포함됩니다.

서버는 SSE 스트림을 사용하여 챗봇 응답을 클라이언트에게 전송합니다. 클라이언트는 SSE 스트림을 구독하여 챗봇과 실시간으로 대화할 수 있습니다.

반응형
let session = new MockChatSession();
let chatSessionManager = new ChatSessionManager({ session: session });

// Body parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/chat/:sessionId', async (req, res) => {
  const sessionId = req.params.sessionId as string;
  const question = req.body.message as string;

  // set up SSE headers
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  // create the answerStream and pipe it to the response stream
  const answerStream = await chatSessionManager.getAnswerStream(sessionId, question);
  answerStream.pipe(res);

  // handle errors
  answerStream.on('error', (err) => {
    console.error(err);
    res.status(500).end();
  });

  // handle the end of the answerStream
  answerStream.on('end', async () => {
    console.log(await session.getItem(sessionId));
    console.log("end");
    res.end();
  });
});

마치며

이번 글에서는 OpenAI API와 SSE(Server-Sent Events) 스트림을 사용하여 챗봇 서버를 구현하는 방법에 대해 알아보았습니다. 구현에 사용된 기술 스택은 Node.js, Express, openai-chat-session-manager 이었습니다.

openai-chat-session-manager 라이브러리를 사용하여 챗봇 세션을 관리하는 방법과, Express를 사용하여 챗봇 서버를 구현하는 방법에 대해 살펴보았습니다. 마지막으로 SSE 스트림을 사용하여 클라이언트와 채팅할 수 있는 챗봇 서버를 구현해보았습니다.

챗봇 서버를 구현하는 것은 매우 복잡한 작업일 수 있습니다. 하지만, 이번 글에서 소개한 기술 스택과 방법을 사용하면 비교적 쉽게 챗봇 서버를 구현할 수 있습니다. 이번 글이 챗봇 서버 구현에 도움이 되었기를 바랍니다.

 

이글은 ChatGPT의 도움을 받아 작성되었습니다.

반응형