17장. 장기 기억 관리
왜 장기 기억이 필요한가 — 16장이 남긴 두 가지 숙제
한 줄 요약
16장에서 만든 ChatSession은 대화 이력을 활용해 대화를 이어 갑니다. 이번 장에서는 여기에 두 가지 기억 관리 기능을 추가합니다. 오래된 대화는 삭제하는 대신 요약해 보관하고, 고객에 관한 정보는 대화가 끝난 뒤에도 활용할 수 있도록 저장합니다. 대화 원문을 모두 유지하지 않고도 중요한 정보를 간결하게 보관하고 활용하는 방법을 배웁니다.
1. 숙제 하나 — 오래된 턴도 줄여서 남기고 싶다
16장의 trim은 최근 max_turns개 턴만 남깁니다. 비용을 지키는 대신, 남긴 턴보다 오래된 내용은 모델에게 가지 않습니다.
상담에서 중요한 말은 초반에 나오는 경우가 많습니다. 원하는 사이즈, 교환 사유, 연락받고 싶은 방법 같은 것들입니다. 이런 말은 대화가 길어져도 들고 있고 싶습니다. 원문 그대로가 아니어도 됩니다. 줄거리만 남아 있으면 됩니다.
2. 숙제 둘 — 대화가 끝난 뒤에도 남기고 싶다
ChatSession의 이력은 프로그램이 도는 동안 메모리에만 있습니다. 지난주에 교환을 문의한 고객이 다시 찾아옵니다.
고객: 저번에 문의했던 교환 건 어떻게 됐는지 궁금해서요.
지금의 상담원은 이 고객을 처음 보는 사람으로 대합니다. 지난번에 무슨 상품을 어느 사이즈로 바꾸려 했는지 알고 시작하면 좋겠습니다.
3. 두 숙제의 답은 방향이 같다
| 숙제 | 지금 | 이번 장의 답 |
|---|---|---|
| 오래된 턴 | 버린다 (trim) | 요약해서 남긴다 — 요약 메모리 |
| 대화가 끝난 뒤 | 아무것도 남기지 않는다 | 핵심 사실만 파일에 남긴다 — 고객 프로필 |
둘 다 "원문 전부"와 "아무것도 없음" 사이의 길입니다. 중요한 것만 추려서 작게 만들어 둡니다.
그리고 그 "추리는 일"을 LLM에게 시킵니다. 모델은 상담을 하면서, 동시에 상담 내용을 정리하는 기록 담당도 맡습니다.
4. 이걸 모르면 무엇을 판단하지 못하는가
- 긴 대화에서 비용을 줄이려 할 때 버릴지, 줄일지 고르지 못합니다.
- "기억하는 AI"가 무엇을 어디에 저장하고 있는지 설명하지 못합니다. 저장하면 안 되는 것이 섞여 들어가도 알아채지 못합니다.
- 기억에 담긴 내용을 어디까지 믿고 말해도 되는지 정하지 못합니다. 기억은 대화에 있던 말을 옮겨 적은 것이라, 대화가 근거 위에서 이루어져야 기억도 믿을 수 있습니다.
5. 이번 장에서 만드는 것
| 만드는 것 | 한 줄 설명 |
|---|---|
summarize_history |
오래된 대화를 몇 줄로 요약하는 함수 |
SummaryMemoryChat |
이력이 길어지면 앞부분을 요약으로 바꾸는 대화 클래스 |
save_profile / load_profile |
대화에서 뽑은 사실을 고객별로 파일에 저장하고 다시 읽는 함수 |
이번 장의 코드는 기억의 구조만 또렷이 보려고 도구도 정책 검색도 쓰지 않습니다. 대신 상담원이 근거로 삼을 정책 발췌 두 줄을 시스템 프롬프트에 직접 적어 줍니다.
핵심 정리
- 16장에 두 가지를 더합니다. 오래된 턴을 줄여서 남기고, 대화가 끝난 뒤에도 사실을 남깁니다.
- 답은 둘 다 "추려서 작게 남긴다" 입니다. 대화 안에서는 요약 메모리, 대화를 넘어서는 고객 프로필입니다.
- 추리는 일은 LLM에게 시킵니다.
- 기억은 대화를 옮겨 적은 것입니다. 대화가 근거 위에 있어야 기억도 믿을 수 있습니다.