# Memory Feature Implementation ## Overview 사용자가 명시적으로 기억해달라고 요청한 정보를 저장하고 관리하는 기능입니다. ## Files Created/Modified ### 1. Migration (NEW) - `migrations/003_add_user_memories.sql` - user_memories 테이블 생성 - user_id, content, created_at 컬럼 - 인덱스: idx_memories_user (user_id, created_at DESC) ### 2. Memory Service (NEW) - `src/services/memory-service.ts` - `saveMemory(db, userId, content)` - 기억 저장 - `getMemories(db, userId)` - 모든 기억 조회 (최신순) - `deleteMemory(db, userId, memoryId)` - ID로 삭제 - `deleteMemoryByContent(db, userId, searchText)` - LIKE 검색으로 삭제 - `formatMemoriesForPrompt(memories)` - 시스템 프롬프트용 포맷팅 ### 3. Memory Tool (NEW) - `src/tools/memory-tool.ts` - Function Calling 도구 정의 - 키워드: 기억해줘, 기억해, 잊어줘, 지워줘, 내 기억, 저장된 정보, remember, forget - Actions: save, list, delete - 고정 형식 응답: - save: "✅ 기억했습니다: {content}" - list: "📋 저장된 기억 (N개)\n\n1. ... (ID: X)" - delete: "✅ N개의 기억을 삭제했습니다:\n\n1. ..." ### 4. Types (MODIFIED) - `src/types.ts` - `Memory` 인터페이스 추가 - `ManageMemoryArgs` 인터페이스 추가 ### 5. Tools Index (MODIFIED) - `src/tools/index.ts` - manageMemoryTool import - ManageMemoryArgsSchema 추가 (Zod validation) - tools 배열에 manageMemoryTool 추가 - TOOL_CATEGORIES에 memory 카테고리 추가 - CATEGORY_PATTERNS에 memory 패턴 추가 - executeTool에 manage_memory 케이스 추가 ### 6. Summary Service (MODIFIED) - `src/summary-service.ts` - generateAIResponse 함수 수정: - getMemories 호출로 사용자 기억 조회 - formatMemoriesForPrompt로 포맷팅 - 시스템 프롬프트에 "사용자가 기억해달라고 한 정보" 섹션 추가 - manage_memory 도구 사용 안내 추가 ## Database Schema ```sql CREATE TABLE IF NOT EXISTS user_memories ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, content TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); CREATE INDEX IF NOT EXISTS idx_memories_user ON user_memories(user_id, created_at DESC); ``` ## API Usage Examples ### 1. 기억 저장 **사용자**: "나는 Go 개발자야. 기억해줘." **AI**: manage_memory(action="save", content="Go 개발자") **응답**: "✅ 기억했습니다: Go 개발자" ### 2. 기억 조회 **사용자**: "내가 뭐라고 했지?" **AI**: manage_memory(action="list") **응답**: ``` 📋 저장된 기억 (2개) 1. Go 개발자 (ID: 1) 2. 서울 거주 (ID: 2) ``` ### 3. 기억 삭제 (ID) **사용자**: "1번 지워줘" **AI**: manage_memory(action="delete", memory_id=1) **응답**: "✅ 기억을 삭제했습니다 (ID: 1)" ### 4. 기억 삭제 (내용 검색) **사용자**: "Go 관련된 거 잊어줘" **AI**: manage_memory(action="delete", content="Go") **응답**: ``` ✅ 1개의 기억을 삭제했습니다: 1. Go 개발자 ``` ## System Prompt Integration 기억이 있는 경우 시스템 프롬프트에 다음과 같이 추가됩니다: ``` ## 사용자가 기억해달라고 한 정보 - Go 개발자 - 서울 거주 - 반려견 이름은 뭉치 위 정보들은 사용자가 명시적으로 기억해달라고 요청한 중요한 정보입니다. 대화 시 이를 참고하세요. ``` ## Deployment Steps 1. **D1 마이그레이션 실행** (로컬 테스트) ```bash wrangler d1 execute telegram-conversations --local --file=migrations/003_add_user_memories.sql ``` 2. **프로덕션 배포** (⚠️ 주의: 스키마 변경) ```bash wrangler d1 execute telegram-conversations --file=migrations/003_add_user_memories.sql ``` 3. **TypeScript 검증** ```bash npx tsc --noEmit ``` 4. **로컬 테스트** ```bash npm run dev ``` 5. **배포** ```bash npm run deploy ``` ## Testing Checklist - [ ] "기억해줘" → save action 호출 확인 - [ ] "내 기억" → list action 호출 확인 - [ ] "잊어줘" → delete action 호출 확인 - [ ] 저장된 기억이 시스템 프롬프트에 포함되는지 확인 - [ ] AI가 기억된 정보를 참고하여 응답하는지 확인 - [ ] 삭제 시 해당 기억이 더 이상 프롬프트에 나타나지 않는지 확인 ## Performance Considerations - **인덱스**: user_id + created_at DESC 복합 인덱스로 조회 최적화 - **캐싱**: getMemories는 매 AI 응답마다 호출되므로 향후 KV 캐싱 고려 가능 - **제한**: content 최대 1000자 (Zod validation) ## Future Enhancements - [ ] 기억 수 제한 (사용자당 최대 N개) - [ ] 기억 중요도/우선순위 설정 - [ ] 기억 카테고리/태그 기능 - [ ] 기억 검색 개선 (전문 검색, 유사도 검색) - [ ] 기억 자동 만료 (TTL)