본문 바로가기
Data & AI Intelligence/▶AI & Agent

Streamlit + OpenAI API로 만드는 챗봇

by 류딩이2025. 12. 10.

Streamlit + OpenAI API로 만드는 역사 전문 챗봇 완성 가이드

이 글에서는 StreamlitOpenAI ChatCompletion API를 활용하여 브라우저에서 동작하는 역사 전문 챗봇을 만드는 방법을 정리합니다.
아래 제공된 코드를 그대로 실행하면, WSL · Docker · 로컬환경 어디서든 즉시 작동하는 대화형 챗봇 UI를 구축할 수 있습니다.

1. 프로젝트 개요

본 챗봇은 system prompt를 통해 “역사 전문 AI” 역할을 부여받으며,
세계사·한국사·근현대사 등 다양한 역사 주제를 정확하고 정중하게 설명하도록 설계되었습니다.

  • 사용 기술: Streamlit, Python, OpenAI API
  • 기능: 대화 저장, 프롬프트 기반 응답 생성, UI 렌더링
  • 구동 환경: 로컬 / WSL / Docker 모두 가능

2. 핵심 기능 설명

2-1. 시스템 프롬프트(System Prompt)

ChatGPT 모델에게 역할을 부여하는 부분입니다.
아래 프롬프트는 챗봇이 역사 전문 분석가처럼 행동하도록 만듭니다.

  • 세계사 / 한국사 / 동서양 고대사 / 근현대사 대응
  • 모호한 질문 시 추가 설명 요청
  • 추측과 사실 구분
  • 정중한 한국어로 답변

2-2. Streamlit 대화 저장 구조

대화는 st.session_state.messages에 누적 저장되어 챗봇이 문맥을 유지하며 자연스러운 응답을 할 수 있도록 설계되어 있습니다.

2-3. rerun()을 통한 UI 갱신

메시지 전송 후 UI가 즉시 갱신되도록 st.rerun()을 사용합니다.

3. 전체 코드

아래 코드를 chatbot.py로 저장 후 실행하면 챗봇이 정상 동작합니다.


import streamlit as st
from openai import OpenAI

# OpenAI 클라이언트 생성
client = OpenAI(api_key="YOUR_API_KEY")  # 자신의 키로 교체

st.title("챗봇")

# 세션 상태 메시지 저장 공간 초기화
if "messages" not in st.session_state:
    st.session_state.messages = []

# 기존 대화 메시지 렌더링
for msg in st.session_state.messages:
    with st.chat_message(msg["role"]):
        st.write(msg["content"])

# 사용자 입력
user_input = st.chat_input("메시지를 입력하세요")

if user_input:
    # 사용자 메시지 추가
    st.session_state.messages.append({
        "role": "user",
        "content": user_input
    })

    # 시스템 프롬프트 (역사 전문 챗봇 역할)
    system_prompt = {
        "role": "system",
        "content": """
        너는 역사 전문 챗봇이다.
        세계사, 한국사, 동서양 고대사, 근현대사 등 다양한 역사 분야의 지식을 정확하고 명확하게 설명한다.
        질문이 모호하면 추가 정보를 요청하고, 사실과 추측을 반드시 구분해서 답한다.
        잘못된 정보는 제공하지 않으며, 근거 기반으로 설명하되 너무 어렵지 않게 전달한다.
        답변은 한국어로 정중하고 이해하기 쉽게 작성한다.
        """
    }

    # OpenAI API 호출
    res = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[system_prompt] + st.session_state.messages
    )

    bot_msg = res.choices[0].message.content

    # AI 메시지 저장
    st.session_state.messages.append({
        "role": "assistant",
        "content": bot_msg
    })

    # 화면 출력
    with st.chat_message("assistant"):
        st.write(bot_msg)

    st.rerun()

4. 실행 방법

4-1. 가상환경 실행

source venv/bin/activate

4-2. 패키지 설치

pip install streamlit openai

4-3. Streamlit 서버 실행

streamlit run chatbot.py --server.port 8501 --server.address 0.0.0.0

5. 마무리

이 역사 전문 챗봇은 프롬프트 기반으로 매우 다양하게 확장할 수 있습니다.
예: 한국사 전문 챗봇, 근현대사 분석 챗봇, 초등학생용 역사 설명 챗봇 등
필요하시다면 프롬프트 설계나 기능 확장도 도와드릴 수 있습니다.