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 |