day5_practice/checkpointer_basic.pyday5_practice/sqlite_chat.pyday5_practice/memory_chat.pyday5_practice/auto_memory.py

대화 기록과 기억: 두 저장소

체크포인터가 thread(대화방) 단위로 쌓는 대화 원문과, 우리 코드가 사용자 단위로 별도 테이블에 적는 기억은 서로 다른 저장소입니다. 새 대화방을 열면 원문은 따라오지 않고 기억만 system 프롬프트로 따라온다는 것을 네 개의 실습으로 한 단계씩 확인합니다. 사용자가 입력한 문장과 모델의 답, uuid 값은 (예시) 입니다.

대화 원문 · thread 단위 사용자 기억 · 사용자 단위 memory.sqlite · memories user | memory | created Agent (이번 실행) system_prompt messages 읽기 쓰기

이번 실행

노란 줄이 이번 단계에서 바뀐 값

체크포인터 저장소

thread_id 별 messages (파란 테두리 = 이번 실행의 방)

memory.sqlite · memories 테이블

user 열로 사용자를 구분

터미널

두 저장소의 범위 차이

대화 기록 (단기 기억)기억 (장기 기억)
단위thread (대화방) 하나. 열쇠는 config["configurable"]["thread_id"]사용자 한 명. 열쇠는 memories.user 열 (입력한 이름)
내용주고받은 메시지 원문 전체 (State 전체)골라낸 사실 몇 문장
저장하는 것체크포인터(SqliteSaver)가 자동으로우리 코드가 정한 시점에 (save_memory 도구, MemoryMiddleware)
모델에게 가는 방식같은 thread_id 로 invoke 하면 messages 로 다시 실려 감시작할 때 읽어 system_prompt 문자열에 끼워 넣음
이 날의 저장소checkpoints.sqlite (기초), chat_memory.sqlite (대화 실습 셋)memory.sqlite 의 memories (user, memory, created)
새 대화방을 열면따라오지 않음 (빈 방에서 시작)따라옴 (같은 이름이면)

세 대화 실습이 같은 파일을 나눠 씁니다

파일체크포인터 파일thread_id 모양기억 테이블
sqlite_chat.pychat_memory.sqlitechat_{이름} (이름마다 고정 → 다시 켜면 이어짐)쓰지 않음
memory_chat.pychat_memory.sqlite{이름}_{uuid 8자리} (실행마다 새 방)읽기: 시작 시 load_memories · 쓰기: save_memory 도구
auto_memory.pychat_memory.sqlite{이름}_{uuid 8자리} (실행마다 새 방)읽기: 시작 시 · 쓰기: MemoryMiddleware.before_model

thread_id 모양이 달라 세 프로그램의 대화방은 섞이지 않고, 기억 테이블은 memory_chat.py 와 auto_memory.py 가 함께 씁니다. 한쪽에서 저장한 기억을 다른 쪽이 읽습니다.

7일차로 이어지는 것

테이블 하나와 함수 둘로 만든 이 기억 저장소는 7일차에 LangGraph 가 제공하는 Store 로 다시 만듭니다. 저장과 검색을 누가 대신해 주느냐가 달라질 뿐, 무엇을 언제 기억할지 정하는 숙제는 그대로 남습니다.

함정과 주의

관련 파일