feat: add memory system and troubleshoot agent

Memory System:
- Add category-based memory storage (company, tech, role, location, server)
- Silent background saving via saveMemorySilently()
- Category-based overwrite (same category replaces old memory)
- Server-related pattern detection (AWS, GCP, k8s, traffic info)
- Memory management tool (list, delete)

Troubleshoot Agent:
- Session-based troubleshooting conversation (KV, 1h TTL)
- 20-year DevOps/SRE expert persona
- Support for server/infra, domain/DNS, code/deploy, network, database issues
- Internal tools: search_solution (Brave), lookup_docs (Context7)
- Auto-trigger on error-related keywords
- Session completion and cancellation support

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-27 14:28:22 +09:00
parent 6392a17d4f
commit 860e36a688
13 changed files with 1328 additions and 58 deletions

162
MEMORY_FEATURE.md Normal file
View File

@@ -0,0 +1,162 @@
# 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)