
본 포스팅은 "Do it! LLM을 활용한 AI 에이전트 개발 입문"을 독학하며 쓴 글입니다.
내돈내산 포스팅임을 참고해주시면 감사하겠습니다.
2026년 2월 2일 기준으로 작성되었습니다.
본 포스팅에서는 멀티턴 대화 방법에 대해서 다뤄보겠습니다
일반적으로 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)
위의 코드에서 중점적으로 봐야할 부분은 다음과 같다
기존 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
한국에서 인기있는 여자 솔로가수를 질문하고 '일본은 어때?'라고 물어봤지만 앞 대화의 맥락을 파악해서
일본에서 유명한 여자 솔로가수를 알려주는 것을 확인할 수 있다
지금까지는 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)"
"[](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
를 이용해서 해당 파일을 실행할 수 있다

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

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

이렇게 대화를 나눌 수 있습니다!!
이렇게 간단하게 GPT API와 파이썬을 이용해서 간단한 대화를 할 수 있는 챗봇을 만들고,
스트림릿을 이용해서 깔끔한 UI를 가진 챗봇까지 만들었습니다
책을 따라하면서 velog도 동시에 적으려다 보니 생각보다 속도가 나지 않네요
다음 포스팅부터는 챗봇이 아닌 PDF파일을 활용하는 방법을 공부해보겠습니다!