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 가 알맞습니다.