[AI Study] Day 1 완성 - CLI 챗봇에서 Streamlit UI까지
터미널 CLI부터 Streamlit 웹 UI까지, Python으로 만드는 첫 AI 챗봇
🎯 오늘 만든 것
1. CLI 챗봇 (main.py)
- 터미널에서 대화하는 AI 챗봇
- 대화 기억 기능
- 토큰/비용 추적
2. Streamlit 웹 UI (app.py)
- 브라우저에서 사용하는 ChatGPT 스타일 UI
- 대화 저장/불러오기
- 실시간 비용 모니터링
🛠️ 기술 스택
- Python 3.11+
- OpenAI API (GPT-4o-mini)
- Streamlit (웹 UI)
- python-dotenv (환경 변수 관리)
📦 Step 1. 환경 설정
1-1 가상환경 생성
python3 -m venv venv
source venv/bin/activate
1-2 패키지 설치
pip install openai python-dotenv streamlit
1-3 환경 변수 설정
프로젝트 폴더에 .env 파일 생성:
OPENAI_API_KEY=sk-proj-YOUR_KEY_HERE
💻 Step 2. CLI 챗봇 구현
main.py
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 대화 히스토리
conversation = [
{"role": "system", "content": "너는 학습을 도와주는 AI 튜터야"}
]
def chat(message: str) -> str:
"""사용자 메시지를 받아서 AI 응답 반환"""
# 사용자 메시지 추가
conversation.append({"role": "user", "content": message})
# API 호출
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=conversation,
max_tokens=500
)
# AI 응답 저장
ai_message = response.choices[0].message.content
conversation.append({"role": "assistant", "content": ai_message})
return ai_message
if __name__ == "__main__":
print("=== AI 학습 비서 ===")
print("종료하려면 'exit' 입력\n")
while True:
user_input = input("질문: ")
if user_input == "exit":
break
answer = chat(user_input)
print(f"답변: {answer}\n")
실행
python main.py
결과
=== AI 학습 비서 ===
종료하려면 'exit' 입력
질문: Python 리스트란?
답변: 리스트는 순서가 있는 데이터 모음입니다...
질문: exit
🎨 Step 3. Streamlit UI 추가
app.py
import streamlit as st
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 페이지 설정
st.set_page_config(
page_title="AI 학습 비서",
page_icon="🤖",
layout="wide"
)
st.title("🤖 AI 학습 비서")
st.markdown("---")
# 세션 상태 초기화
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
# 사이드바
with st.sidebar:
st.header("📊 통계")
st.metric("총 토큰", st.session_state.total_tokens)
cost = st.session_state.total_tokens * 0.0000004
st.metric("예상 비용", f"${cost:.6f}")
st.markdown("---")
if st.button("🗑️ 대화 초기화", use_container_width=True):
st.session_state.messages = []
st.session_state.total_tokens = 0
st.rerun()
# 대화 표시
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# 입력
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"):
system_msg = {"role": "system", "content": "학습을 도와주는 AI 튜터"}
messages = [system_msg] + [
{"role": m["role"], "content": m["content"]}
for m in st.session_state.messages
]
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
max_tokens=500
)
answer = response.choices[0].message.content
st.markdown(answer)
st.session_state.messages.append({
"role": "assistant",
"content": answer
})
st.session_state.total_tokens += response.usage.total_tokens
실행
streamlit run app.py
브라우저가 자동으로 열립니다! 🎉
🎨 Streamlit 핵심 개념
세션 상태 (st.session_state)
문제:
count = 0 # 일반 변수
if st.button("증가"):
count += 1 # 버튼 누르면 페이지 새로고침 → count는 다시 0!
해결:
# st.session_state 사용
if "count" not in st.session_state:
st.session_state.count = 0
if st.button("증가"):
st.session_state.count += 1 # 새로고침해도 유지!
st.write(f"카운트: {st.session_state.count}")
주요 위젯
# 텍스트 표시
st.write("일반 텍스트")
st.title("큰 제목")
st.header("헤더")
# 입력
name = st.text_input("이름")
age = st.number_input("나이")
# 버튼
if st.button("클릭"):
st.write("눌렸어요!")
# 사이드바
with st.sidebar:
st.header("설정")
# 채팅 UI
with st.chat_message("user"):
st.write("안녕하세요")
💰 비용 분석
GPT-4o-mini 요금:
- 입력: $0.150 / 1M 토큰
- 출력: $0.600 / 1M 토큰
실제 사용 예시:
질문 1회: 약 200 토큰
비용: $0.00008 (0.1원)
100회 질문: 약 20,000 토큰
비용: $0.008 (10원)
→ 커피 한 잔보다 저렴! ☕
✅ Day 1 완료 체크리스트
- Python 가상환경 설정
- OpenAI API 키 설정
- CLI 챗봇 구현
- 대화 기억 기능
- Streamlit UI 구현
- 세션 상태 관리
- 비용 추적 기능
🚀 다음 단계
다음 포스팅: [AI Study] 청크, 벡터DB, RAG란? - 개념 쉽게 이해하기
내 문서를 업로드하고, AI가 그 내용을 기반으로 답변하게 만들기!
반응형
'AI' 카테고리의 다른 글
| [AI Study] 청크, 벡터DB, RAG란? - 개념 쉽게 이해하기 (0) | 2026.01.15 |
|---|---|
| [AI Study] Kotlin + Langfuse로 OpenAI API 모니터링하기 (0) | 2026.01.14 |