LLM API는 자체적으로 이전 대화를 기억하지 않는 Stateless(무상태성) 통신 방식을 사용합니다. 따라서 챗봇이 대화 맥락을 기억하게 하려면 개발자가 이전 대화 기록(Chat History)을 배열에 유지하여 매 요청마다 전달해야 합니다.
1. 대화 이력 용어 사전 (Glossary)
- Stateless (무상태성): API 요청과 요청 사이의 상태나 이전 입력값을 서버가 보관하지 않는 독립적 통신 특성입니다.
- Multi-turn (멀티턴 대화): 한 번의 질의응답으로 끝나지 않고, 이전 대화 맥락을 계속 참조하며 연속적으로 이어지는 대화 형태입니다.
- Sliding Window Memory: 대화 턴(Turn)이 늘어날 때 토큰 수 한도를 넘지 않도록 최신 N개의 대화 이력만 잘라서 유지하는 전략입니다.
- Summary Memory: 오래된 대화 이력을 LLM을 통해 축약 문장으로 요약하여 컨텍스트 상단에 주입하는 메모리 절약 전략입니다.
2. 슬라이딩 윈도우 대화 메모리 파이썬 챗봇 클래스
class MemoryChatbot:
def __init__(self, client, max_history_turns=5):
self.client = client
self.max_turns = max_history_turns
self.system_message = {"role": "system", "content": "너는 DAVHAVE의 다정한 AI 상담사야."}
self.history = [] # 대화 기록 저장소
def chat(self, user_input):
# 1. 사용자 메시지 추가
self.history.append({"role": "user", "content": user_input})
# 2. 슬라이딩 윈도우 적용 (최신 N개 턴만 슬라이싱)
recent_history = self.history[-(self.max_turns * 2):]
full_messages = [self.system_message] + recent_history
# 3. API 호출
response = self.client.chat.completions.create(
model="gpt-4o-mini",
messages=full_messages
)
bot_reply = response.choices[0].message.content
self.history.append({"role": "assistant", "content": bot_reply})
return bot_reply
# 챗봇 사용 테스트
bot = MemoryChatbot(client, max_history_turns=3)
print(bot.chat("안녕! 나는 서울에 사는 개발자 인상이야."))
print(bot.chat("내가 어디에 산다고 했지?")) # "서울에 사신다고 하셨어요!" 정답 출력
3. 자주 묻는 질문 (Q&A)
Q. 다수의 웹 사용자가 동시에 접속할 때 대화 이력은 어떻게 구분하나요?
A. 사용자별로 고유한 session_id (UUID)를 발급하고, Redis나 데이터베이스에 session_id를 키로 하여 대화 기록 리스트를 분리 관리해야 합니다.