6. 장기 메모리(3)(Long-term Memory) - Memory Layer 만들기
DB를 다루는 Memory Layer 자체를 먼저 완성하고 테스트한 다음 Agent에 붙이는 것이 가장 좋습니다.
1. 두 단계를 나누는 이유
지금 제시하신 두 단계는 사실 서로 다른 문제입니다.
1단계: Memory Layer 만들기
사용자 대화
↓
extract_memory()
↓
"이 내용 중 장기기억할 것이 무엇인가?"
↓
save_memory()
↓
PostgreSQL
↓
search_memory()
↓
관련 기억 검색
↓
build_memory_context()
↓
Agent가 사용할 문자열
여기서는 "기억 시스템 자체가 제대로 작동하는가?"를 배우는 것입니다.
2단계: Agent에 Memory Layer 연결
사용자
↓
Agent
↓
Memory 검색
↓
OpenAI
↓
답변
↓
중요한 정보 발견
↓
Memory 저장
여기서는 "Agent가 기억을 자동으로 사용하는가?"를 배우는 것입니다.
따라서 저는 다음 순서를 추천합니다.
현재 완료
│
▼
PostgreSQL 기본 CRUD
│
▼
★ 지금 단계
Memory Layer
│
├── extract_memory()
├── save_memory()
├── search_memory()
└── build_memory_context()
│
▼
Memory Layer 단독 테스트
│
▼
★ 다음 단계
Agent + Long-term Memory 통합
│
▼
실제 장기기억 Agent
2. 이번 단계에서 중요한 설계 원칙
이번에는 database.py를 없애지 않습니다.
오히려 역할을 분리합니다.
database.py
↓
"DB와 이야기하는 사람"
memory.py
↓
"기억을 관리하는 사람"
test_memory.py
↓
"기억 시스템을 시험하는 사람"
이렇게 만드는 것이 좋습니다.
최종 구조는:
agent_project/
│
├── .env
│
├── database.py
│
├── memory.py
│
└── test_memory.py
입니다.

3. 각 파일의 역할
database.py
이미 만든 파일입니다.
PostgreSQL
▲
│
database.py
DB의 CRUD만 담당합니다.
memory.py
이번에 만들 파일입니다.
LLM
│
▼
extract_memory()
│
▼
save_memory()
│
▼
PostgreSQL
│
▼
search_memory()
│
▼
build_memory_context()
즉 "무엇을 기억할 것인가?"와 "어떻게 기억을 사용할 것인가?"를 담당합니다.
4. 먼저 memory.py부터 만들겠습니다
여기서 중요한 부분이 하나 있습니다.
우리가 단순히 LLM에게:
"이 내용을 요약해줘."
라고 하는 것이 아닙니다.
이번에는:
"이 대화에서 장기기억으로 저장할 가치가 있는 정보가 있는가?"
를 판단하게 합니다.
예를 들어:
사용자:
오늘 점심은 김치찌개를 먹었어.
→ 장기기억할 필요 없음.
반면:
사용자:
나는 Python으로 AI Agent를 개발하고 있어.
→ 장기기억할 가치가 있음.
또:
사용자:
코드를 설명할 때 전체 흐름을 먼저 설명해주는 방식을 좋아해.
→ 장기기억할 가치가 있음.
이 차이를 LLM에게 판단시키는 것입니다.
5. memory.py
다음 코드를 그대로 만들어보세요.
6. 여기서 아주 중요한 구조
이제 memory.py 안에서 데이터가 이렇게 흐릅니다.
사용자 대화
│
▼
extract_memory()
│
▼
┌────────────────────┐
│ 중요한 기억인가? │
└─────────┬──────────┘
│
기억할 가치 있음
│
▼
save_memory()
│
▼
database.py
│
▼
PostgreSQL
반대로 기억을 사용할 때는:
PostgreSQL
│
▼
search_memory()
│
▼
build_memory_context()
│
▼
"사용자 장기기억:"
│
▼
OpenAI Agent
입니다.
7. 그런데 지금 바로 Agent에 붙이면 안 됩니다
여기가 중요합니다.
지금은 test_memory.py를 먼저 만들어서 Memory Layer만 테스트하겠습니다.
왜냐하면 문제가 생겼을 때:
LLM 문제인가?
DB 문제인가?
Memory 문제인가?
Agent 문제인가?
를 구분할 수 있어야 하기 때문입니다.
8. test_memory.py 만들기
9. 실행
폴더 구조가 다음과 같은지 확인하세요.
agent_project/
│
├── .env
│
├── database.py
│
├── memory.py
│
└── test_memory.py
그리고:
python test_memory.py
를 실행합니다.
10. 가장 중요한 테스트 결과
LLM이 정상적으로 판단한다면 대략 이런 기억들이 나올 것입니다.
[interest]
사용자는 Python과 AI Agent 개발에 관심이 있다.
[project]
사용자는 실제 업무에서 사용할 수 있는 AI Agent를 만들고 싶어 한다.
[preference]
사용자는 코드 설명을 받을 때 전체 흐름을 먼저 설명하고
그 다음 세부 내용을 자세하게 설명받는 것을 선호한다.
반면:
오늘 점심에는 김치찌개를 먹었어.
는 기억에서 제외될 가능성이 높습니다.
바로 이것이 이번 단계의 핵심 테스트입니다.
11. build_memory_context()는 무엇인가?
예를 들어 PostgreSQL에서:
memory 1
Python과 AI Agent에 관심
memory 2
실제 업무용 Agent 개발 목표
memory 3
전체 흐름을 먼저 설명받는 것을 선호
를 가져왔다고 합시다.
build_memory_context()가 이것을:
다음은 사용자의 장기기억입니다.
답변에 도움이 될 경우 자연스럽게 활용하세요.
- [interest] 사용자는 Python과 AI Agent 개발에 관심이 있다. (중요도: 8)
- [project] 사용자는 실제 업무에서 사용할 수 있는 AI Agent를 만들고 싶어 한다. (중요도: 10)
- [preference] 사용자는 코드 설명을 받을 때 전체 흐름을 먼저 설명하고 그 다음 세부 내용을 자세하게 설명받는 것을 선호한다. (중요도: 9)
라는 하나의 문자열로 만들어 줍니다.
이 문자열을 다음 단계에서 Agent에게 전달하는 것입니다.
12. 그런데 search_memory()가 아직 진짜 "검색"은 아닙니다
여기서 하나 짚고 넘어가겠습니다.
현재:
search_memory()
는 실제로는:
SELECT ...
FROM memories
WHERE user_id = ?
ORDER BY importance DESC
LIMIT ?
입니다.
즉:
"이 사용자의 기억을 중요도 순으로 가져와라."
입니다.
아직:
"사용자의 질문과 관련된 기억만 찾아라."
는 아닙니다.
이 차이가 매우 중요합니다.
13. 진짜 Memory Search는 다음 단계에서 발전시킵니다
예를 들어 사용자가:
"내가 Python을 왜 공부하고 있었지?"
라고 하면 모든 기억을 가져오는 것이 아니라:
질문
↓
"Python"
↓
관련 Memory 검색
↓
Python / AI Agent 관련 기억
↓
OpenAI
가 되어야 합니다.
이것이 나중에 Embedding + Vector Search로 발전합니다.
구조가:
현재
PostgreSQL
↓
중요도 기반 검색
다음
PostgreSQL + Vector
↓
의미 기반 검색
최종
PostgreSQL + pgvector
↓
Embedding
↓
Semantic Search
로 발전합니다.
14. 지금 단계에서는 이것만 확실히 이해하면 됩니다
현재 우리가 만든 것은:
MEMORY SYSTEM
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
Extract Save Search
│ │ │
▼ ▼ ▼
LLM PostgreSQL PostgreSQL
│
▼
Memory Context
입니다.
이것을 먼저 독립적으로 성공시키는 것이 중요합니다.
15. 그리고 다음 단계에서 Agent와 연결
이번 단계가 성공하면 그때 비로소:
👤 사용자
"내가 어떤 공부를 하고 있었지?"
│
▼
Agent
│
▼
search_memory()
│
▼
PostgreSQL
│
▼
"Python / AI Agent 공부"
│
▼
build_memory_context()
│
▼
OpenAI
│
▼
"Python으로 AI Agent를
공부하고 계셨습니다."
그리고 새로운 대화에서:
👤
"앞으로 업무용 Agent를 만들고 싶어."
라고 하면:
↓
extract_memory()
↓
"업무용 Agent 개발 목표"
↓
save_memory()
↓
PostgreSQL
이 자동으로 일어나도록 만들 것입니다.
지금 단계의 학습 목표
지금은 Agent를 만들었다고 생각하지 마시고, 다음 4개를 완전히 이해하는 데 집중하세요.
① extract_memory()
→ 무엇을 기억할지 판단
② save_memory()
→ 기억을 DB에 저장
③ search_memory()
→ 저장된 기억 가져오기
④ build_memory_context()
→ AI가 사용할 수 있는 형태로 변환
이 4개가 제대로 돌아가면 다음 단계에서 Agent Loop에 이 Memory Layer를 끼워 넣는 작업은 생각보다 간단합니다.
그리고 한 가지는 기억해 두시면 좋습니다. 지금 search_memory()는 "관련성 검색"이 아니라 "사용자의 기억 목록 조회" 단계입니다. 이 차이를 일부러 남겨둔 것입니다. 다음 단계에서 Agent를 연결한 뒤, 그 다음 발전 단계로 pgvector + Embedding을 붙이면 "Python에 관한 기억", "프로젝트에 관한 기억"처럼 의미를 이해해서 관련 기억을 찾는 장기 메모리로 발전시킬 수 있습니다.