AI 강의 정리 04 - Streamlit으로 AI 웹앱 만들기

3 분 소요

Streamlit이란?

Streamlit은 Python 코드만으로 간단한 웹앱을 만들 수 있게 해 주는 도구입니다.

일반적인 웹 개발은 HTML, CSS, JavaScript, 서버 프레임워크를 함께 알아야 합니다. 하지만 Streamlit은 Python 문법만으로 입력창, 버튼, 파일 업로드, 그래프, 챗봇 화면을 만들 수 있습니다.

강의 폴더에서는 다음 파일들이 Streamlit 실습에 해당합니다.

14_streamlit_20250415_01.py
14_streamlit_20250415_02_markdown.py
14_streamlit_20250415_03_form.py
14_streamlit_20250415_04_form.py
14_streamlit_20250415_05_form.py
15_streamlit_20250416_01_file.py
15_streamlit_20250416_02_tab.py
15_streamlit_20250416_03_sidebar.py
15_streamlit_20250416_04_sidebar.py
16_streamlit_20250417_01_file_upload.py
16_streamlit_20250417_03.py
16_streamlit_20250417_07_img_db.py
21_streamlit_20250423_04_ChatBot_session.py
22_streamlit_20250424_03_ChatBot_streamlit_chat_module.py

설치와 실행

Streamlit은 다음처럼 설치합니다.

pip install streamlit

실행은 python 파일명.py가 아니라 다음 명령을 사용합니다.

streamlit run 14_streamlit_20250415_01.py

실행하면 브라우저가 열리고 Python 코드로 만든 화면이 나타납니다.

가장 간단한 화면

import streamlit as st

st.title("나의 첫 AI 웹앱")
st.write("Streamlit으로 만든 화면입니다.")

st.title()은 큰 제목을 보여줍니다. st.write()는 텍스트, 숫자, 표, 데이터프레임 등을 화면에 출력합니다.

입력창 만들기

사용자에게 값을 입력받으려면 text_input, number_input, date_input 같은 함수를 사용합니다.

import streamlit as st

name = st.text_input("이름:")
age = st.number_input("나이:", min_value=0, max_value=100, step=1)

if st.button("확인"):
    st.write(f"이름: {name}, 나이: {age}")

비전공자 입장에서 중요한 점은 “입력창도 변수에 담긴다”는 것입니다.

name = st.text_input("이름:")

이 코드는 화면에 입력창을 만들고, 사용자가 입력한 값을 name 변수에 저장합니다.

form 사용하기

16_streamlit_20250417_03.py는 입력 폼과 SQLite 저장을 다룹니다.

폼은 여러 입력값을 한 번에 제출할 때 사용합니다.

import streamlit as st

with st.form("myform"):
    name = st.text_input("이름:")
    age = st.number_input("나이:", value=0, step=1, min_value=0, max_value=100)
    birth = st.date_input("생일:")
    submit = st.form_submit_button("확인")

    if submit:
        st.write(f"이름:{name} 나이:{age} 생일:{birth}")

with st.form("myform"): 아래에 있는 입력 요소들은 하나의 묶음이 됩니다. 사용자가 확인 버튼을 눌렀을 때 한 번에 처리됩니다.

SQLite에 저장하기

강의 코드에서는 입력값을 SQLite 데이터베이스에 저장합니다.

import sqlite3

conn = sqlite3.connect("test.db")

def insert_data(name, age, birth):
    sql = "insert into student(name, age, birth) values(?, ?, ?)"
    cur = conn.cursor()
    cur.execute(sql, (name, age, birth))
    conn.commit()
    return "추가성공"

여기서 중요한 부분은 ?입니다.

values(?, ?, ?)

사용자 입력값을 SQL 문자열에 직접 붙이지 않고 ? 자리에 안전하게 전달합니다. 이 방식은 SQL Injection 같은 문제를 줄이는 기본 습관입니다.

전체 흐름은 다음과 같습니다.

사용자가 화면에 입력
-> form 제출
-> insert_data 함수 실행
-> SQLite DB에 저장
-> 성공 메시지 출력

파일 업로드

AI 서비스에서는 사용자가 PDF, 이미지, CSV 파일을 업로드하는 경우가 많습니다. Streamlit에서는 file_uploader를 사용합니다.

uploaded_file = st.file_uploader("파일을 선택하세요")

if uploaded_file is not None:
    st.write(uploaded_file.name)
    st.write(uploaded_file.type)

활용 예시는 다음과 같습니다.

  • 이미지 업로드 후 설명 생성
  • PDF 업로드 후 요약
  • CSV 업로드 후 데이터 분석
  • 음성 파일 업로드 후 텍스트 변환

탭과 사이드바

화면이 복잡해지면 탭과 사이드바를 사용합니다.

tab1, tab2 = st.tabs(["요약", "상세"])

with tab1:
    st.write("요약 결과")

with tab2:
    st.write("상세 분석")

사이드바는 설정값을 넣을 때 좋습니다.

temperature = st.sidebar.slider("창의성", 0.0, 1.0, 0.3)
model_name = st.sidebar.selectbox("모델", ["기본 모델", "고급 모델"])

AI 앱에서는 보통 사이드바에 모델명, temperature, 업로드 옵션, 검색 개수 같은 설정을 둡니다.

챗봇 화면 만들기

Streamlit은 챗봇 UI도 쉽게 만들 수 있습니다.

import streamlit as st

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

user_input = st.chat_input("질문을 입력하세요")

if user_input:
    st.session_state.messages.append({"role": "user", "content": user_input})
    st.session_state.messages.append({"role": "assistant", "content": "AI 답변 예시입니다."})

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

여기서 st.session_state가 중요합니다.

Streamlit은 버튼을 누르거나 입력할 때마다 코드가 다시 실행됩니다. 그런데 대화 기록은 유지되어야 합니다. 이때 st.session_state에 메시지를 저장합니다.

AI 앱으로 확장하기

Streamlit과 OpenAI API를 연결하면 다음 구조가 됩니다.

사용자 질문 입력
-> Streamlit이 질문을 Python 변수로 받음
-> OpenAI API 호출
-> AI 답변을 Streamlit 화면에 출력

예시는 다음과 같습니다.

from openai import OpenAI
import streamlit as st

client = OpenAI()

question = st.chat_input("질문을 입력하세요")

if question:
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": question}],
    )
    st.write(response.choices[0].message.content)

강의 코드의 모델명은 수업 당시 기준이므로, 실습 시점에 계정에서 사용 가능한 모델명으로 바꾸면 됩니다.

정리

Streamlit은 AI 실습 결과를 사람에게 보여주는 가장 쉬운 방법 중 하나입니다.

  • st.write()로 출력합니다.
  • st.text_input()으로 입력을 받습니다.
  • st.form()으로 여러 값을 한 번에 제출합니다.
  • st.file_uploader()로 파일을 받습니다.
  • st.session_state로 대화 상태를 유지합니다.
  • SQLite와 연결하면 간단한 저장 기능도 만들 수 있습니다.

다음 글에서는 임베딩, 벡터 검색, RAG를 다룹니다. 이 내용은 문서 기반 챗봇을 만들 때 핵심이 됩니다.

댓글남기기