25분
Streamlit 챗봇의 4가지 핵심 패턴
Day 4: 제조 도메인 챗봇
Streamlit 챗봇의 4가지 핵심 패턴
LLM 기초 > Day 4: 제조 도메인 챗봇
학습 목표
session_state 기반 대화 관리 패턴을 이해한다 chat_message와 chat_input 사용법을 익힌다 st.write_stream으로 스트리밍을 구현하는 법을 배운다 사이드바 설정 패턴을 활용한다
Streamlit 챗봇 4대 패턴
패턴 1: session_state로 대화 관리
import streamlit as st
# 세션 초기화 (앱 최초 실행 시 1회)
if "messages" not in st.session_state:
st.session_state.messages = []
if "total_tokens" not in st.session_state:
st.session_state.total_tokens = 0
# 대화 추가
st.session_state.messages.append({
"role": "user",
"content": "SV0401 알람이 뭔가요?"
})
# 대화 초기화
def clear_chat():
st.session_state.messages = []
st.session_state.total_tokens = 0
왜 session_state인가? Streamlit은 코드가 위에서 아래로 매번 다시 실행된다. session_state에 저장하지 않으면 대화 내용이 사라진다.
패턴 2: chat_message로 말풍선 표시
# 저장된 대화 히스토리 표시
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])
# 새 메시지 표시
with st.chat_message("user"):
st.markdown("CNC에서 채터링이 발생합니다")
with st.chat_message("assistant"):
st.markdown("채터링은 가공 중 진동이...")
패턴 3: 스트리밍 응답
from openai import OpenAI
client = OpenAI()
def stream_response(messages):
"""OpenAI 스트리밍 응답을 Streamlit에 표시"""
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
stream=True,
temperature=0.3
)
# st.write_stream을 사용하면 자동으로 스트리밍 표시
# generator를 넘기면 됨
def generate():
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
yield content
return generate()
# 사용법
with st.chat_message("assistant"):
response = st.write_stream(stream_response(messages))
패턴 4: 사이드바 설정
with st.sidebar:
st.header("설정")
# 분야 선택
domain = st.selectbox(
"전문 분야",
["CNC 가공", "PLC 제어", "품질관리", "설비 보전"]
)
# 모델 선택
model = st.selectbox(
"AI 모델",
["gpt-4o-mini", "gpt-4o"]
)
# Temperature
temp = st.slider("Temperature", 0.0, 1.0, 0.3, 0.1)
# 대화 초기화 버튼
if st.button("대화 초기화"):
st.session_state.messages = []
st.rerun() # 페이지 새로고침
# 사용량 표시
st.divider()
st.caption(f"사용 토큰: {st.session_state.get('total_tokens', 0)}")
전체 구조 (뼈대)
import streamlit as st
from openai import OpenAI
st.set_page_config(page_title="제조 AI", page_icon="🏭")
client = OpenAI()
# 1. 세션 초기화
if "messages" not in st.session_state:
st.session_state.messages = []
# 2. 사이드바 설정
with st.sidebar:
domain = st.selectbox("분야", ["CNC", "PLC", "품질", "보전"])
# 3. 히스토리 표시
for msg in st.session_state.messages:
with st.chat_message(msg["role"]):
st.markdown(msg["content"])
# 4. 사용자 입력
if prompt := st.chat_input("질문을 입력하세요"):
# 사용자 메시지 저장 & 표시
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# AI 응답 (스트리밍)
with st.chat_message("assistant"):
response = st.write_stream(...) # 스트리밍 응답
# 응답 저장
st.session_state.messages.append({"role": "assistant", "content": response})AI로 학습하기 — 꿀팁
🤖session_state 설비 챗봇 코드 스니펫AI 학습 팁
Streamlit session_state 기반 대화 관리 패턴을 제조 설비 챗봇에 바로 적용할 수 있는 코드로 만들어 놓으면 실습 속도가 빨라집니다.
Streamlit을 이용한 제조 설비 트러블슈팅 챗봇의 핵심 코드 스니펫을 작성해주세요. 요구사항: (1) st.session_state로 대화 히스토리 관리(최대 10턴 유지, 초과 시 오래된 것 삭제), (2) st.chat_message와 st.chat_input으로 채팅 UI 구현, (3) 설비 유형(압출기/사출기/컨베이어) 선택 사이드바로 System Prompt 동적 변경, (4) 각 응답에 토큰 사용량과 예상 비용 표시. 실제 실행 가능한 완성 코드로 주석 포함해 작성해주세요.
이 팁이 도움이 됐나요?
핵심 포인트
- • session_state: Streamlit 앱의 "메모리" (대화 저장)
- • chat_message: 챗봇 말풍선 UI
- • st.write_stream: 스트리밍 응답 자동 표시
- • 사이드바: 설정 패널 (분야, 모델, 온도)