Skip to main content

스트림릿 (Streamlit) 사용법 2단계 - 챗GPT와 같은 대화형 챗봇 서비스 만들기 (LLM 어플리케이션 개발 가이드)

· 12 min read
코딩추월차선

안녕하세요! 이번 글에서는 Streamlit을 활용해 ChatGPT와 같은 챗봇 어플리케이션을 만드는 방법에 대해 알아보겠습니다. 최근 ChatGPT의 등장으로 자연어 처리 기술이 크게 주목받고 있는데요. 개발자라면 한 번쯤 챗봇을 직접 만들어보고 싶으셨을 겁니다. 이번 튜토리얼을 통해 Streamlit의 Chat Elements를 사용하여 Echo Bot부터 ChatGPT 수준의 챗봇까지 단계적으로 구현하는 과정을 배워볼 수 있습니다.

Streamlit 설치

Streamlit을 사용하기 위해서는 먼저 파이썬 개발 환경을 세팅해야 합니다. 터미널에서 다음 명령어를 실행하여 Streamlit을 설치할 수 있습니다:

Windows에서 설치하기

  1. 먼저 파이썬 개발 환경을 세팅합니다.
  2. 터미널에서 다음 명령어를 실행하여 Streamlit을 설치합니다:
pip install streamlit
  1. 설치가 잘 되었는지 확인하기 위해 hello 앱을 실행해 봅니다:
streamlit hello

MacOS와 Linux에서 설치하기

macOS와 Linux에서도 설치 과정은 동일합니다. 터미널에서 위와 동일한 pip 명령어를 사용하여 설치하면 됩니다.

도커와 GitHub Codespaces 활용하기

도커나 GitHub Codespaces를 사용하면 별도의 설치 과정 없이 바로 개발을 시작할 수 있습니다. 브라우저 상에서 코딩이 가능하기 때문에 환경 설정에 시간을 쓰지 않고 앱 개발에 집중할 수 있습니다.

Streamlit 사용법

앱 실행하기

앱을 만들려면 일반적인 파이썬 스크립트에 Streamlit 명령어를 추가한 뒤, streamlit run 을 사용하여 실행하면 됩니다:

streamlit run your_script.py

위 명령어를 실행하면 로컬 서버가 실행되고, 기본 웹 브라우저에서 새 탭으로 앱이 열립니다. 이제 이 캔버스에 차트, 텍스트, 위젯, 테이블 등을 그려나가면서 앱을 만들 수 있습니다.

Streamlit에 대한 정의와 설치 방법에 대해 궁금하면 스트림릿(Streamlit) 사용법 1단계 - 설치부터 기본 개념까지에서 확인 할 수 있습니다.

Streamlit Chat Elements 이란?

Streamlit은 파이썬 기반의 웹 어플리케이션 프레임워크로, 짧은 코드로도 인터랙티브한 데이터 사이언스나 머신러닝 프로젝트 앱을 쉽게 만들 수 있습니다.

Streamlit Chat Elements는 Streamlit 라이브러리의 일부로, 사용자가 파이썬을 이용하여 챗봇 인터페이스를 쉽고 빠르게 구현할 수 있도록 돕는 도구입니다. 이 기능은 특히 데이터 사이언스와 머신러닝 프로젝트에서 사용자와의 대화형 인터랙션을 위해 설계되었습니다.

그럼 이제 본격적으로 Streamlit의 Chat Elements를 사용해봅시다!

Streamlit Chat Elements 사용법

st.chat_message

st.chat_message를 사용하면 채팅 메시지를 담은 컨테이너를 앱에 삽입할 수 있습니다. 간단한 텍스트 메시지 뿐만 아니라 마크다운을 지원하고, 차트나 이미지 등 다양한 요소를 활용할 수 있죠. 다음은 환영 인사말을 보여주는 간단한 예시입니다.

import streamlit as st

with st.chat_message("assistant"):
st.write("안녕하세요! 무엇을 도와드릴까요?")

st.chat_input

st.chat_input을 사용하면 사용자의 텍스트 입력을 받을 수 있습니다. 입력된 메시지는 엔터를 누르거나 전송 버튼을 클릭하면 반환됩니다. 다음은 사용자 입력을 받아서 화면에 출력하는 코드입니다.

import streamlit as st

prompt = st.chat_input("메시지를 입력하세요")
if prompt:
st.write(f"당신: {prompt}")

간단한 챗봇 구현하기

자 이제 배운 것을 활용해 간단한 대화를 하는 Simple Chat을 만들어 보겠습니다.

랜덤 응답 생성 챗봇 아키텍처

Simple Chat은 사용자 입력에 따라 봇이 다양한 대답을 합니다. 미리 정의된 응답 풀에서 랜덤으로 선택하는 방식이죠. 파이썬의 random 모듈을 사용해 구현할 수 있습니다.

import random

def get_response():
responses = [
"안녕하세요! 무엇을 도와드릴까요?",
"오늘도 좋은 하루 되세요!",
"저는 당신의 질문에 최선을 다해 답변드리겠습니다."
]
return random.choice(responses)

응답 스트리밍 효과 구현

ChatGPT 등 실제 챗봇 서비스들은 응답을 한 번에 출력하지 않고, 마치 타자를 치듯이 한 글자씩 스트리밍 합니다. Streamlit에서는 st.write_stream을 사용해 이를 흉내낼 수 있습니다. 다음 코드를 보겠습니다.

import time

def stream_response(text):
for char in text:
with st.chat_message("assistant"):
st.markdown(char)
time.sleep(0.05)

Simple Chat 시연

import streamlit as st
import random
import time

st.title("Simple Chat")

def get_response():
responses = [
"안녕하세요! 무엇을 도와드릴까요?",
"오늘도 좋은 하루 되세요!",
"저는 당신의 질문에 최선을 다해 답변드리겠습니다."
]
return random.choice(responses)

def stream_response(text):
for char in text:
with st.chat_message("assistant"):
st.markdown(char)
time.sleep(0.05)

if "messages" not in st.session_state:
st.session_state.messages = []

for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])

if prompt := st.chat_input("메시지를 입력하세요"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)

response = get_response()
stream_response(response)
st.session_state.messages.append({"role": "assistant", "content": response})


Streamlit으로 ChatGPT 와 같은 대화형 챗봇 만들기

마지막으로 Streamlit과 OpenAI의 ChatGPT API를 활용한 대화형 AI 챗봇을 만들어 보겠습니다.

OpenAI API 설정

OpenAI 패키지를 설치하고 API 키를 발급받아 Streamlit 시크릿에 저장합니다.

pip install openai

# .streamlit/secrets.toml
openai_api_key = "your_api_key"

챗봇 구현

사용자 메시지를 프롬프트로 변환해 ChatGPT API에 요청을 보내고, 스트리밍 응답을 출력하는 코드는 다음과 같습니다.

import openai
openai.api_key = st.secrets["openai_api_key"]

if prompt := st.chat_input():
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.write(prompt)

response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=st.session_state.messages,
stream=True
)

generated_text = ""
for chunk in response:
if "delta" in chunk["choices"][0]:
if "content" in chunk["choices"][0]["delta"]:
generated_text += chunk["choices"][0]["delta"]["content"]
with st.chat_message("assistant"):
st.markdown(generated_text)

st.session_state.messages.append({"role": "assistant", "content": generated_text})

시연

Streamlit 앱을 실행하면 ChatGPT와 유사한 챗봇 인터페이스가 나타납니다. 사용자의 입력에 따라 ChatGPT API가 응답을 생성하고, 이를 스트리밍 형태로 출력합니다. 세션 스테이트를 통해 대화 컨텍스트가 유지되므로 마치 대화를 나누는 듯한 경험을 제공합니다.

Streamlit Chat 활용 가능성

지금까지 Streamlit Chat Elements를 활용해 다양한 챗봇을 개발하는 과정을 살펴보았습니다. Echo Bot으로 기본기를 익히고, Simple Chat으로 응답 생성과 스트리밍을 구현했으며, 마지막으로 OpenAI API를 통해 ChatGPT 수준의 대화형 AI 챗봇까지 만들어 보았는데요.

Streamlit Chat은 프로토타입 제작부터 상용 서비스 개발까지 활용 범위가 매우 넓습니다. LLM을 활용한 챗봇, 고객 서비스 봇, 음성 어시스턴트 등 다양한 어플리케이션을 쉽고 빠르게 구현할 수 있죠. 여기에 Streamlit의 다른 컴포넌트들을 결합하면 데이터 분석이나 시각화 기능을 갖춘 챗봇도 만들 수 있습니다.

여러분의 아이디어와 Streamlit의 조합으로 간단한 챗봇 서비스를 만들 수 있습니다. 개발이 막히거나 도움이 필요하다면 Streamlit 포럼과 문서를 참고해 보세요.

마무리

이번 튜토리얼에서는 Streamlit Chat Elements를 활용해 점진적으로 챗봇을 개발하는 과정을 살펴보았습니다. Simple Chat을 거쳐 ChatGPT API로 구현한 대화형 챗봇까지, Streamlit은 우리의 상상을 현실로 만드는 강력한 도구임을 확인할 수 있었습니다.

특히 최신 LLM 기술과 Streamlit을 접목하면 챗봇의 가능성은 무궁무진해집니다. 여러분도 관심 분야에 Streamlit 챗봇을 적용해 보는 건 어떨까요? 데이터 기반 의사결정을 돕는 챗봇 비서, 맞춤형 추천을 제안하는 쇼핑 챗봇 등 창의적인 아이디어로 인공지능 챗봇 시대를 여는 주역이 되어 보시기 바랍니다.

Streamlit 공식 웹사이트의 내용을 기반으로 작성 되었으며 블로그 및 커뮤니티에는 개발에 필요한 다양한 팁과 정보들이 공유 되고 있습니다.