15분
"왜 대화가 사라지죠?" - Streamlit 챗봇 3대 함정
Day 4: 제조 도메인 챗봇
"왜 대화가 사라지죠?" - Streamlit 챗봇 3대 함정
LLM 기초 > 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에 영속화하는 최소 구현 방법을 설명해주세요.
이 팁이 도움이 됐나요?