25

Streamlit 챗봇의 4가지 핵심 패턴

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: 스트리밍 응답 자동 표시
  • 사이드바: 설정 패널 (분야, 모델, 온도)