// education

대화형 AI 챗봇 구현과 대화 이력 관리

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 비용이 폭증하고 컨텍스트 한계를 초과하게 됩니다.


3. 자주 묻는 질문 (Q&A)

Q. 대화 이력이 너무 길어지면 어떻게 요약하나요? A. 대화 수가 10회가 넘어가면 별도의 LLM 호출을 통해 "이전 대화를 3줄로 요약해 줘"라고 청크화하여 system 메시지 뒤에 요약본으로 삽입하는 방식을 사용합니다.

← 이전구조화된 데이터 출력 (Structured Output & JSON) 다음 →LLM 외부 도구 연동 (Function Calling과 에이전트)