본문 바로가기

AI

[AI Study] Python + OpenAI로 AI 챗봇 만들기

[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가 그 내용을 기반으로 답변하게 만들기!


 

반응형