17장 · 장기 기억 관리왜 장기 기억이 필요한가 — 16장이 남긴 두 가지 숙제요약 메모리 — 버리지 말고 줄여서 남긴다기억의 세 층과 고객 프로필 — 대화가 끝나도 남는 것기억하면 안 되는 것과 기억의 근거따라하기 — 요약 메모리와 고객 프로필정리와 체크리스트실습문제와 해답
17장. 장기 기억 관리
정리와 체크리스트
17장에서 배운 것
- 요약 메모리 — 오래된 이력을 버리는 대신 LLM으로 요약해 남깁니다.
- 손실 압축 — 요약은 줄이는 과정에서 무언가를 잃습니다. 원문 보존이 아닙니다.
- 기억의 세 층 — 단기(최근 원문), 중기(대화 안의 요약), 장기(고객 프로필 파일).
- 고객 프로필 — 대화가 끝날 때 JSON으로 뽑아 고객 ID별로 저장하고, 재방문 때 시스템 프롬프트에 붙입니다.
- 민감정보 — 저장하지 않습니다. 프롬프트와 코드 검사 두 겹으로 막습니다.
- 기억의 근거 — 요약과 추출은 대화를 옮겨 적습니다. 그래서 상담원에게 근거를 주고, 기억은 그 위에 얹습니다.
한눈에 보는 핵심
# 대화 안: 과거는 요약, 최근은 원문
context = f"[이전 상담 요약]\n{self.summary}\n\n" + 최근_원문 + f"고객: {text}"
# 대화가 끝날 때: 사실만 뽑아 파일에
profiles[customer_id] = json.loads(r.text) # JSON 모드로 뽑은 프로필 (덮어쓴다)
# 다음 방문: 프로필을 시스템 프롬프트에
system2 = (SYSTEM_BASE
+ "\n\n[이 고객에 대한 기억] 지난 상담에서 적어 둔 기록입니다. "
"현재 처리 상태는 아니므로, 지난 상담 내용으로만 말하고 "
"현재 상태는 확인 후 안내드린다고 답합니다.\n"
+ profile_txt)
| 층 | 모양 | 수명 | 담는 것 |
|---|---|---|---|
| 단기 | 원문 | 대화 안 | 최근 몇 턴의 세부 |
| 중기 | 요약 몇 줄 | 대화 안 | 오래된 턴의 줄거리 |
| 장기 | 세 칸짜리 JSON | 대화가 끝난 뒤에도 | 다음 방문에 쓸 사실 |
| 기억이 맡는 것 | 다른 곳이 맡는 것 |
|---|---|
| 지난번에 무엇을 문의했는지 이어받기 | 그 건이 지금 어떤 상태인지 — 주문 데이터 조회 |
| 고객의 선호를 다음 방문에 반영하기 | 금액·기간 같은 사실 — 정책 문서 |
체크리스트
- [ ] trim과 요약 메모리의 차이를 한 문장으로 말할 수 있다.
- [ ] 요약 프롬프트에 "사실 위주", "반드시 포함"을 적은 이유를 설명할 수 있다.
- [ ]
keep_recent=2일 때 몇 번째 턴에서 요약이 일하는지 손으로 따라갈 수 있다. - [ ] 기억의 세 층이 각각 다른 모양인 이유를 설명할 수 있다.
- [ ] 프로필을 JSON 모드로 뽑는 이유를 말할 수 있다.
- [ ] 재방문 때 프로필이 모델에게 어떤 경로로 들어가는지 설명할 수 있다.
- [ ] 같은 고객의 프로필을 다시 저장하면 어떻게 되는지 안다.
- [ ] 민감정보를 프롬프트와 코드 두 겹으로 막는 이유를 설명할 수 있다.
- [ ] 정책 발췌의 6,000원이 세션 2의 답까지 가는 길을 단계별로 말할 수 있다.
- [ ] 프로필을 프롬프트에 넣을 때 "지난 상담의 기록"이라고 함께 적는 이유를 설명할 수 있다.
한 줄 핵심
기억은 대화에 있던 말을 옮겨 적습니다. 그래서 대화가 근거 위에 있어야 하고, 기억은 그 위에 얹습니다.