LLM API는 상태가 없는 Stateless(무상태성) 방식입니다. 즉, 이전에 내가 무슨 질문을 했는지 기억하지 못하므로, 개발자가 직접 이전 대화 기록(Chat History)을 축적해 전달해야 합니다.
1. 멀티턴(Multi-turn) 챗봇 파이썬 알고리즘
이전 user 질문과 assistant 답변을 파이썬 리스트에 순서대로 덧붙여(Append) 매 호출마다 함께 전달합니다.
history = [
{"role": "system", "content": "너는 DAVHAVE의 친절한 AI 고객상담원이야."}
]
def chat(user_input):
# 1. 사용자 질문을 이력에 추가
history.append({"role": "user", "content": user_input})
# 2. 전체 대화 이력을 포함하여 API 호출
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=history
)
bot_reply = response.choices[0].message.content
# 3. AI 답변을 이력에 추가
history.append({"role": "assistant", "content": bot_reply})
return bot_reply
print(chat("안녕하세요! 제 이름은 인상입니다."))
print(chat("제 이름이 뭔지 기억하시나요?")) # "네, 인상님!" 정답 출력
2. 토큰 누수 방지를 위한 슬라이딩 윈도우 (Sliding Window)
대화가 길어지면 대화 이력이 수만 토큰에 달해 API 비용이 폭증하고 컨텍스트 한계를 초과하게 됩니다.
- 슬라이딩 윈도우: 최근 N개(예: 최근 6개 대화)만 유지하고 오래된 이전 대화는 잘라내거나 요약(Summarization)하여 보관합니다.
3. 자주 묻는 질문 (Q&A)
Q. 대화 이력이 너무 길어지면 어떻게 요약하나요?
A. 대화 수가 10회가 넘어가면 별도의 LLM 호출을 통해 "이전 대화를 3줄로 요약해 줘"라고 청크화하여 system 메시지 뒤에 요약본으로 삽입하는 방식을 사용합니다.