LLM 개발 입문 (2) - 2

루나·2026년 2월 2일

LLM STUDY

목록 보기
3/31

본 포스팅은 "Do it! LLM을 활용한 AI 에이전트 개발 입문"을 독학하며 쓴 글입니다.
내돈내산 포스팅임을 참고해주시면 감사하겠습니다.
2026년 2월 2일 기준으로 작성되었습니다.


Chapter 2

OpenAI의 API로 챗봇 만들기

본 포스팅에서는 멀티턴 대화 방법에 대해서 다뤄보겠습니다

1. 멀티턴 대화하는 챗봇 만들기

일반적으로 GPT는 사용자와의 대화 내용을 기억하지 않는다
하지만, 이런 단점을 극복해서 여러 번 대화(턴) 할 때, 이전 대화를 기억하고 적절하게 반응하는 것을 멀티 턴이라고 한다

우선 GPT가 이전 대화 내용을 기억해서 답변하지 못한다는 것을 직접 확인해보려고 한다

(1) Single-turn 대화

# single_turn.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key = api_key)

while True:
  user_input = input("사용자 : ")

  if user_input == "exit":
    break

  response = client.chat.completions.create(
    model = "gpt-4o",
    temperature = 0.9,
    messages = [
      {"role" : "system", "content" : "너는 사용자를 도와주는 상담사야"},
      {"role" : "user", "content" : user_input}
    ],
  )

  print("AI : " + response.choices[0].message.content)

위와 같은 코드를 이용해서 GPT와 대화를 해보면 아래와 같은 결과를 확인할 수 있다

사용자 : 안녕 내 이름은 카일이야
AI : 안녕하세요, 카일! 만나서 반가워요. 어떻게 도와드릴까요?
사용자 : 내 이름이 뭐야?
AI : 죄송하지만, 저는 사용자님의 이름을 알 수 없습니다. 대신 궁금한 점이나 도움이 필요한 부분이 있다면 말씀해 주세요.
사용자 : exit 

이 결과에서 확인할 수 있듯이, 사용자는 자신의 이름을 알려줬지만 GPT는 이전 대화에서 입력받은 이름을 기억하지 못한다
이런 문제를 해결하기 위해 사용자의 입력값과 GPT가 생성한 답변을 messages에 추가해서 대화 내용을 포함해 GPT에 입력시키는 방법을 사용할 수 있다

(2) Multi-turn 대화

#multi_turn.py
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')

client = OpenAI(api_key = api_key)

# GPT의 대답을 받는 함수
def get_ai_response(messages):
  response = client.chat.completions.create(
    model = "gpt-4o",
    temperature = 0.9,
    messages = messages,
  )

  return response.choices[0].message.content

# 초기 시스템 메세지 설정
messages = [
  {"role" : "system", "content" : "너는 사용자를 도와주는 상담사야"},
]

while True:
  user_input = input("사용자 : ")

  if user_input == "exit":
    break

	# message 에 사용자의 입력값과 답변을 append 해서 반복적으로 전달
  messages.append({"role" : "user", "content" : user_input})
  ai_response = get_ai_response(messages)
  messages.append({"role" : "assistant", "content" : ai_response})
  print("AI : " + ai_response)

위의 코드에서 중점적으로 봐야할 부분은 다음과 같다

  • get_ai_response 라는 함수를 만들어 GPT에서 API로 답변을 받아오도록 한다
  • 리스트 형태로 초기 시스템 메세지를 설정한다
  • 사용자가 입력한 내용을 messages.append를 이용해서 기존 시스템 메세지에 추가한다
  • get_ai_response를 이용해서 얻은 답변도 기존 시스템 메세지에 추가한다

기존 Single-turn 대화에서는 사용자와 GPT의 답변을 저장해서 다시 입력값으로 사용하지 않았지만
Multi-turn 대화에서는 사용자와 GPT의 답변을 저장하는 것을 확인할 수 있다

위 코드에 대한 결과는 다음과 같다

사용자 : 한국에서 인기 있는 여자 솔로 가수는 누가있어?
AI : 한국에서 인기 있는 여자 솔로 가수로는 여러 명이 있지만, 몇몇 대표적인 아티스트를 소개하자면 다음과 같습니다:

1. **아이유 (IU)** - 감성적인 발라드부터 경쾌한 팝까지 다양한 장르를 소화하며 많은 사랑을 받고 있습니다.
2. **청하** - 강렬한 퍼포먼스와 중독성 있는 음악으로 인기를 얻고 있습니다.
3. **태연** - 소녀시대의 멤버로 시작해 솔로 가수로서도 큰 성공을 거두고 있습니다.
4. **제니 (Jennie)** - 블랙핑크의 멤버로서 솔로 활동에서도 큰 인기를 끌고 있습니다.
5. **선미** - 독특한 매력과 스타일리시한 음악으로 주목받고 있습니다.
6. **백예린** - 감미로운 목소리와 감성적인 음악으로 많은 팬층을 보유하고 있습니다.

이 외에도 많은 유능한 여자 솔로 가수들이 한국 음악 시장에서 활약하고 있습니다.

사용자 : 그럼 일본은 어때?
AI : 일본에서도 많은 인기 있는 여자 솔로 가수들이 활동하고 있습니다. 몇몇 대표적인 아티스트를 소개하자면 다음과 같습니다:

1. **나카시마 미카 (Nakashima Mika)** - 독특한 목소리와 감성적인 발라드로 유명합니다.
2. **우타다 히카루 (Utada Hikaru)** - 1990년대 말부터 큰 인기를 얻었으며, 다양한 명곡을 보유하고 있습니다.
3. **니시노 카나 (Nishino Kana)** - 젊은 세대에게 큰 인기를 끌었던 가수로, 귀엽고 발랄한 곡들이 특징입니다.
4. **아무로 나미에 (Amuro Namie)** - J-Pop의 대표적인 아이콘으로, 은퇴하기 전까지 큰 영향력을 발휘했습니다.
5. **LiSA** - 애니메이션 주제가로 큰 인기를 얻은 가수로, 강렬한 보컬과 에너제틱한 무대가 특징입니다.
6. **이시카와 사유리 (Ishikawa Sayuri)** - 엔카 장르의 대표적인 가수로, 오랜 시간 사랑받고 있습니다.

이 외에도 일본 음악 시장에서는 다양한 장르와 스타일을 가진 여자 솔로 가수들이 활발히 활동 중입니다.
사용자 : exit

한국에서 인기있는 여자 솔로가수를 질문하고 '일본은 어때?'라고 물어봤지만 앞 대화의 맥락을 파악해서
일본에서 유명한 여자 솔로가수를 알려주는 것을 확인할 수 있다

2. 스트림릿으로 챗봇 완성하기

지금까지는 VS CODE를 이용해서 Python 코드를 실행시키고, 이 실행 결과를 터미널 창에서 확인했다
이제 터미널 창에서 실행한 결과를 깔끔한 UI에서 볼 수 있도록 하는 스트림릿을 이용해보려고 한다

우선 스트림릿 라이브러리를 사용하기 위해 가상환경을 활성화 시킨 후에 터미널에서 라이브러리를 다운로드 해야한다

pip install streamlit

위 코드를 이용하여 라이브러리를 다운로드 한다

스트림릿 라이브러리를 활용하여 아래와 같은 코드를 작성하고 그 결과를 확인해보자
원본 코드는 다음 링크에서 확인할 수 있다
https://github.com/streamlit/llm-examples/blob/main/Chatbot.py

# streamlit_basic.py
import streamlit as st
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()

with st.sidebar:
  openai_api_key = os.getenv('OPENAI_API_KEY')

  "[GET an OpenAI API Key](https://platform.openai.com/account/api-keys)"
  "[View the source code](https://github.com/streamlit/llm-examples/blob/main/Chatbot.py)"
  "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/streamlit/llm-examples?quickstart=1)"

st.title("💬 Chatbot")
st.caption("🚀 A Streamlit chatbot powered by OpenAI")

if "messages" not in st.session_state:
    st.session_state["messages"] = [{"role": "assistant", "content": "How can I help you?"}]

for msg in st.session_state.messages:
    st.chat_message(msg["role"]).write(msg["content"])

if prompt := st.chat_input():
    if not openai_api_key:
        st.info("Please add your OpenAI API key to continue.")
        st.stop()

    client = OpenAI(api_key=openai_api_key)
    st.session_state.messages.append({"role": "user", "content": prompt})
    st.chat_message("user").write(prompt)
    response = client.chat.completions.create(model="gpt-4o", messages=st.session_state.messages)
    msg = response.choices[0].message.content
    st.session_state.messages.append({"role": "assistant", "content": msg})
    st.chat_message("assistant").write(msg)

위 코드에서 확인해야 할 부분은 다음과 같다

  • with st.sidebar
    스트림릿은 사이브다에 내용을 추가하는 기능인 st.sidebar를 제공한다
    원본 예시코드에서는 사용자가 직접 API KEY를 입력하도록 되어있지만 위 코드에서는 dotenv를 이용해서 자동으로 API KEY를 입력한다
  • st.session_state
    스트림릿에서 사용자의 세션 상태를 관리하는 기능을 한다
    사용자가 웹 브라우저에서 상호 작용하는 동안 그 상태를 유지하고 업데이트한다
    위 코드에서는 st.session_state에 messages가 없으면 'How can I help you?' 라는 메세지를 출력하도록 설정하였다
  • st.chat_message.write
    대화 기록을 웹 브라우저에 보여주는 역할을 한다
    st.chat_message()는 메세지를 출력하는 역할을 하고, 각 메세지에는 역할이 있다(코드에서는 assistant와 role)
    이 메세지를 write()를 이용해서 화면에 내용을 출력한다
  • st.chat_input
    사용자가 입력한 텍스트를 받아온다
  • st.session_state.messages.append()
    사용자의 질문과 답변을 딕셔너리 형태로 추가한다
    멀티턴 대화를 위해서 필수적인 부분이다

이제 터미널 창에서

streamlit run 파일명.py

를 이용해서 해당 파일을 실행할 수 있다


처음 실행하면 이메일 주소를 물어보는 창이 뜨는데 간단히 엔터로 무시하면 된다


위와 같은 창이 뜨면 성공적으로 스트림릿을 활용해서 챗봇을 구현한 것!!


이렇게 대화를 나눌 수 있습니다!!

3. 마무리

이렇게 간단하게 GPT API와 파이썬을 이용해서 간단한 대화를 할 수 있는 챗봇을 만들고,
스트림릿을 이용해서 깔끔한 UI를 가진 챗봇까지 만들었습니다

책을 따라하면서 velog도 동시에 적으려다 보니 생각보다 속도가 나지 않네요

다음 포스팅부터는 챗봇이 아닌 PDF파일을 활용하는 방법을 공부해보겠습니다!

profile
Per ardua ad astra

0개의 댓글