[LLM] Streamlit + Ollama를 통해 LLM 기반 챗봇 웹 앱 구현

2025. 4. 14. 19:15·Data/AI
728x90

Streamlit 패키지

streamlit 패키지는 파이썬 패키지(라이브러리)로 오픈소스 웹 앱 프레임워크다.

누구나 사용할 수 있고, 웹 대시보드를 만들어 시각화할 때 활용하기 좋다.

 

Streamlit • A faster way to build and share data apps

Streamlit is an open-source Python framework for data scientists and AI/ML engineers to deliver interactive data apps – in only a few lines of code.

streamlit.io

 

특히 챗봇 구현을 지원하는 여러 명령어를 제공하는데,

  • st.chat_message(): 앱에 채팅 메시지 컨테이너를 삽입
  • st.chat_input(): 사용자가 채팅 메시지를 입력할 수 있는 입력 위젯을 표시

이 두 함수는 챗봇 구현에 거의 필수적으로 사용된다고 보면 된다.

 

LLM을 활용한 챗봇 웹 앱 만들기

Streamlit 세션 저장소를 초기화하는 함수

def init_session_state(keys: dict):
    for key, value in keys.items():
        if key not in st.session_state:
            st.session_state[key] = value
  • Streamlit은 기본적으로 상태(state)를 저장하지 않기 때문에, st.session_state에 필요한 키를 초기화 해준다.

사용자 메시지를 출력하는 함수

def chat_message_user(prompt: str) -> dict:
    with st.chat_message("user"):
        st.markdown(prompt)
        return dict(role="user", content=prompt)
  • 사용자의 입력 메시지를 UI로 보여주고, 메시지를 딕셔너리 형태로 변환한다.
  • 반환 형식: {"role": "user", "content": "사용자 입력"}

LLM 응답을 생성하는 함수

def chat_message_llm(role: str, model: str, messages: list) -> dict:
    with st.chat_message(role):
        with st.spinner("대화를 생성하는 중입니다 ..."):
            resp = ollama.chat(model = model, messages = messages)
            msg_llm = resp.get("message", {})
            st.markdown(msg_llm["content"])
            return msg_llm
  • Ollama의 LLM(gemma:2b) 모델을 사용해 응답을 생성
  • 대화 히스토리 messages를 전달하고, 최신 응답을 st.markdown()으로 출력
  • 반환 형식: {"role": "assistant", "content": "LLM의 응답"}
전체코드
import ollama
import streamlit as st

def init_session_state(keys: dict): # streamlit 세션 저장소를 초기화하는 함수
    for key, value in keys.items():
        if key not in st.session_state: # key가 세션 저장소에 없는 경우,
            st.session_state[key] = value # 새로운 세션을 생성해준다.

def chat_message_user(prompt: str) -> dict:  # 사용자 메시지를 출력하는 함수
    with st.chat_message("user"):
        st.markdown(prompt)
        return dict(role="user", content=prompt)
    
def chat_message_llm(role: str, model: str, messages: list) -> dict:
    with st.chat_message(role): #llm 메시지 출력
        with st.spinner("대화를 생성하는 중입니다 ..."):
            resp = ollama.chat(model = model, messages = messages)
            msg_llm = resp.get("message", {})
            st.markdown(msg_llm["content"])
            return msg_llm
        
if __name__ == "__main__":
    st.set_page_config(layout="wide") # 화면을 넓게 사용
    st.title("만들면서 배우는 챗봇")

init_session_state(dict(msgs=[])) # 세션 저장소 초기화
msgs: list = st.session_state["msgs"] # "msgs" 세션을 msgs 변수로 접근

for row in msgs: #msgs에 저장된 모든 메시지 기록을 하나씩 반복 출력
    with st.chat_message(row["role"]):
        st.markdown(row["content"])

if prompt := st.chat_input("여기에 대화를 입력하세요!"):
    msg_user = chat_message_user(prompt)
    msgs.append(msg_user) # 사용자 메시지 추가

    msg_llm = chat_message_llm("assistant", "gemma:2b", msgs)
    msgs.append(msg_llm) # llm 메시지 추가

 

 

gemma2:9b 모델이 무거워서 내 맥북에선 응답이 너무 오래걸리길래.. 빠른 응답을 받기 위해 gemma:2b모델을 사용해봤다.

답변은 빠르게 받을 수 있었으나 .. 최신화되지 않은 느낌이 있었다 .. !

gemma:7b모델과도 비교해봐야지 .. 

 

📅 출시일 2024년 2월 2024년 6월
📦 파라미터 수 2B (20억개) 9B (90억개)
🧠 세대 Gemma 1세대 ✅ Gemma 2세대 (최신)
🔍 아키텍처 Transformer 기반 개선된 Transformer (GQA 등 최신 기법 포함)
💻 Ollama 지원 ✅ gemma:2b ✅ gemma2:9b
🚀 성능 가볍고 빠름 (엔트리급) GPT-3.5급 성능 (고성능)
🧪 학습 방식 오픈 데이터 기반, 공개 안 됨 강화학습 + SFT 포함, 더 정제된 학습
🧩 토큰 처리 기본 수준 (Context 2k ~ 4k) 확장된 컨텍스트 윈도우 (최대 8k 이상)
🖥️ 필요 사양 M1/M2 기본 사양으로 충분 고사양 GPU / M2 Pro 이상 권장

 

 

728x90

'Data > AI' 카테고리의 다른 글

완벽한 스미싱 분류 모델을 향해서 (1)  (3) 2025.05.27
[LLM] RAG와 Vector Database  (0) 2025.05.26
[NLP] 1. 텍스트 마이닝 기초  (0) 2025.05.01
[LLM] Ollama + gemma2로 간단한 챗봇 만들기  (0) 2025.04.14
[ML] 훈련세트와 테스트세트  (0) 2025.04.13
'Data/AI' 카테고리의 다른 글
  • [LLM] RAG와 Vector Database
  • [NLP] 1. 텍스트 마이닝 기초
  • [LLM] Ollama + gemma2로 간단한 챗봇 만들기
  • [ML] 훈련세트와 테스트세트
DROPDEW
DROPDEW
💻 Developer | 기록하지 않으면 존재하지 않는다
  • DROPDEW
    제 2장 1막
    DROPDEW
  • 전체
    오늘
    어제
    • Dev (417) N
      • App·Android (1)
      • BE (44)
        • HTTP 웹 기본 지식 (8)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (12)
        • 스프링부트와 JPA 활용 (11)
        • 스프링부트 시큐리티 & JWT (0)
        • PHP (6)
      • FE·Client (23)
        • HTML (1)
        • React (19)
        • Unity (1)
      • Data (17) N
        • AI (7) N
        • Bigdata (6)
        • Database (1)
        • 빅데이터분석기사 (2)
      • Infra (0)
      • Activity (0)
        • Education (0)
        • Intern (0)
        • 리모트 인턴십 6기 (0)
        • 구름톤 유니브 4기 (0)
        • SW교육기부단 15기 (0)
      • CS (8)
      • 취준 (13)
        • 자격증 (4)
        • 인적성·NCS (6)
        • 코테·필기·면접 후기 (3)
      • 코테 (270)
        • Algorithm (222)
        • SQL (35)
        • 정리 (13)
      • 인사이트 (27)
        • 회고 (0)
        • 금융경제뉴스 (7)
        • 금융용어·지식 (2)
        • 북마크 (7)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현
    오블완
    수학
    정렬
    너비우선탐색
    브루트포스 알고리즘
    그래프탐색
    문자열
    이분탐색
    그리디알고리즘
    투포인터
    다이나믹프로그래밍
    백준
    자료구조
    시뮬레이션
    매개변수탐색
    티스토리챌린지
    그래프이론
    누적합
    최단경로
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
DROPDEW
[LLM] Streamlit + Ollama를 통해 LLM 기반 챗봇 웹 앱 구현
상단으로

티스토리툴바