LangChain 챗봇4장 · 대화형 챗봇과 메모리 전략21 / 22← 이전목차다음 →MetaContents

4장. 대화형 챗봇과 메모리 전략

정리

구조화된 출력, 대화 기억, 세 메모리 전략과 실습에서 본 숫자를 한 장에 모은 인포그래픽
  • 구조화된 출력은 모델의 답을 줄글 대신 정해 둔 칸으로 받는 것입니다. JsonOutputParser 는 JSON 글을 사전으로, with_structured_output(틀) 은 답을 틀의 객체로 돌려줍니다.
  • Pydantic 의 BaseModel 과 Field(description=…, ge=…) 로 칸과 조건을 정하면, 조건을 어긴 값은 ValidationError 로 걸러집니다. 실습 1에서 정답 조건 10행은 모두 통과했고, 음수 박수·0명 어른·글자 예산·빠진 목적지는 모두 걸렸습니다.
  • 틀을 건네면 모델은 칸을 빠짐없이 채우지만 값은 확인해야 합니다. 실습 2의 예상 출력에서는 다섯 칸 50개 가운데 48개가 맞았고, "제주"와 "일주일"처럼 사람이 정해 줄 표기에서 어긋났습니다.
  • 모델은 기억하지 않으므로 우리 코드가 기록을 들고 다닙니다. MessagesPlaceholder 가 프롬프트에 기록 자리를 만들고, RunnableWithMessageHistory 가 세션 id 마다 InMemoryChatMessageHistory 를 꺼내 넣고 덧붙입니다. 실습 3에서 두 손님과 번갈아 대화해도 각자의 둘째 요청에는 자기 기록만 끼워져 메시지 4개가 갔습니다.
  • Window 메모리(trim_messages)는 최근 기록만 토큰 상한까지 남깁니다. 실습 5에서 상한 100 은 317 토큰을 96 토큰으로 줄였지만, "2박 3일"과 "아이 둘"은 상한을 300 으로 올려야 남았습니다.
  • Summary 메모리는 오래된 기록을 요약 체인으로 줄여 시스템 메시지로 붙입니다. 조건은 지키지만 요약 호출이 따로 듭니다. 프로젝트의 예상 출력에서 열 번짜리 대화는 요약 호출까지 더하면 모두 보내기(1,786 토큰)보다 많은 2,300 토큰 안팎이었습니다.
  • 전략은 대화의 길이와 잊으면 안 되는 것으로 고릅니다. 짧은 상담은 모두 보내기, 긴 상담은 Summary, 앞의 일이 필요 없는 FAQ 는 Window 가 알맞습니다.
← 이전 절4장 · 프로젝트 1 — 메모리 전략 견주기다음 절 →4장 · 확인문제와 해답