15

"왜 대화가 사라지죠?" - Streamlit 챗봇 3대 함정

Day 4: 제조 도메인 챗봇

학습 목표

Streamlit 챗봇 개발 시 흔한 실수를 미리 파악한다 각 문제의 원인과 해결법을 이해한다

Streamlit 챗봇 3대 함정


함정 1: 대화가 사라진다

# 나쁜 예: 전역 변수 사용
messages = []  # 매번 재실행될 때마다 초기화됨!

messages.append({"role": "user", "content": "질문"})
# → 다음 실행 시 messages는 다시 빈 리스트
# 좋은 예: session_state 사용
if "messages" not in st.session_state:
    st.session_state.messages = []

st.session_state.messages.append({"role": "user", "content": "질문"})
# → 세션 동안 유지됨

원인: Streamlit은 사용자 상호작용마다 전체 코드를 재실행한다. 해결: 모든 상태를 st.session_state에 저장한다.


함정 2: API 키가 노출된다

# 나쁜 예: 코드에 키 입력
client = OpenAI(api_key="sk-abc123")  # GitHub에 올라감!

# 나쁜 예: st.text_input으로 키 입력
api_key = st.text_input("API Key")  # 화면에 노출!
# 좋은 예: .env + dotenv
from dotenv import load_dotenv
load_dotenv()
client = OpenAI()  # 환경변수에서 자동 로드

# 또는 Streamlit secrets (배포 시)
# .streamlit/secrets.toml
# OPENAI_API_KEY = "sk-..."
# client = OpenAI(api_key=st.secrets["OPENAI_API_KEY"])

함정 3: 스트리밍이 안 된다

# 나쁜 예: st.write를 반복 호출
for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        st.write(content)  # 매번 새 줄에 출력됨!
# 좋은 예: st.write_stream 사용
def stream_generator():
    stream = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=messages,
        stream=True
    )
    for chunk in stream:
        content = chunk.choices[0].delta.content
        if content:
            yield content

with st.chat_message("assistant"):
    response = st.write_stream(stream_generator())

원인: st.write()는 호출할 때마다 새 요소를 만든다. 해결: st.write_stream()은 하나의 요소에 연속 출력한다.


개발 체크리스트

코딩 전:
□ .env 파일에 API 키 설정
□ .gitignore에 .env 추가
□ streamlit, openai, python-dotenv 설치

코딩 중:
□ 모든 상태는 st.session_state 사용
□ API 키는 환경변수로만 접근
□ 스트리밍은 st.write_stream 사용

테스트:
□ 대화 3회 이상 주고받기 (히스토리 유지 확인)
□ 분야 전환 후 답변 스타일 변화 확인
□ 대화 초기화 버튼 동작 확인
AI로 학습하기 — 꿀팁
Streamlit 대화 사라짐 원인 정확히 진단AI 학습 팁

Streamlit에서 대화가 사라지는 현상의 원인을 정확히 알지 못하면 같은 실수를 반복합니다. 원인별로 정밀하게 검증하세요.

Streamlit 챗봇 개발 중 '페이지를 새로고침하거나 사이드바 옵션을 변경하면 대화가 사라지는' 문제가 발생했습니다. 개발자는 'session_state를 쓰면 다 해결된다'고 생각합니다. 이 생각이 맞는지 검증해주세요: (1) session_state를 써도 대화가 사라지는 경우 3가지와 각각의 원인, (2) Streamlit의 리렌더링 사이클이 챗봇 상태 관리에 미치는 영향, (3) 제조 현장에서 교대 근무자(3교대)가 이어서 같은 챗봇을 사용할 때 대화 히스토리를 DB에 영속화하는 최소 구현 방법을 설명해주세요.
이 팁이 도움이 됐나요?