실무 Multi-Agent 오케스트레이션 16장 · 멀티턴 대화와 세션 관리 6 / 7 ← 이전목차다음 → TechLead Cro

16장. 멀티턴 대화와 세션 관리

정리와 체크리스트

16장에서 배운 것

  • 상태 없음(stateless) — LLM은 앞선 호출을 기억하지 않습니다. 호출마다 처음 만남입니다.
  • 대화 이력 — 오간 메시지의 리스트. 우리가 보관하고 매번 contents=로 다시 보냅니다.
  • 턴 — 고객 문의 하나와 그 처리 전체. 도구를 쓰면 메시지 네 개(고객의 말, 도구 호출, 도구 결과, 최종 답변)입니다.
  • 스레드 — 섞이면 안 되는 대화 하나의 단위. ChatSession 객체 하나가 스레드 하나입니다.
  • 신원 세션과 대화 스레드 — 앞의 것은 권한을, 뒤의 것은 문맥을 정합니다.
  • trim — 최근 몇 턴만 남기고 오래된 턴을 버립니다. 턴이 시작되는 자리에서만 자릅니다.

한눈에 보는 핵심

self.history.append(types.Content(role="user", parts=[...]))    # 새 문의를 붙이고
response = client.models.generate_content(
    model=MODEL, contents=self.history, config=...)             # 이력 전체를 보내고
self.history = list(response.automatic_function_calling_history)  # 도구 왕복을 남기고
self.history.append(response.candidates[0].content)             # 답변을 남기고
self._trim()                                                    # 길면 오래된 턴을 버린다
이력이 맡는 것 다른 곳이 맡는 것
"그거", "아까 말한 상품"의 해석 사실 확인 — 도구와 정책 문서 (6~15장)
앞 턴에서 조회한 값(주문번호)의 재사용 대화가 끝난 뒤의 기억 — 고객 프로필 (17장)
같은 대화 안의 문맥 유지 오래된 턴을 줄여서 남기기 — 요약 메모리 (17장)

체크리스트

  • [ ] 이력 없이 "그거 다른 색상도 있어요?"를 보내면 모델이 왜 되묻는지 설명할 수 있다.
  • [ ] 5장·9장의 contents 누적과 이번 장의 이력이 어떻게 다른지 말할 수 있다.
  • [ ] 도구를 쓰는 턴 하나가 어떤 메시지 네 개로 이루어지는지, 각각의 role이 무엇인지 말할 수 있다.
  • [ ] 도구 왕복을 이력에서 빼면 무엇을 잃는지 설명할 수 있다.
  • [ ] 신원 세션(CustomerSession)과 대화 스레드(ChatSession)의 차이를 설명할 수 있다.
  • [ ] 입력 토큰이 턴마다 커지는 것을 실행 결과로 확인했다.
  • [ ] trim이 왜 턴이 시작되는 자리에서만 자르는지 설명할 수 있다.
  • [ ] 턴의 시작을 role과 글의 유무로 함께 찾는 이유를 설명할 수 있다.
  • [ ] max_turns가 무엇과 무엇을 맞바꾸는 값인지 말할 수 있다.
  • [ ] 스레드 두 개의 이력이 섞이지 않는 것을 실행으로 확인했다.

한 줄 핵심

모델은 기억하지 않습니다. 기억은 우리가 보관한 이력이고, 그 이력은 매 턴 다시 나가는 비용입니다.

← 이전 절따라하기 — 세 턴짜리 멀티턴 상담다음 절 →실습문제와 해답
오명운 · macro@prag-ai.com