docs: 대화 히스토리 문제 해결 과정 업데이트

- /api/messages → /api/history 교체 과정 추가
- LLM 의존성 제거 해결책 문서화
- 함수형 프로그래밍 원칙 적용 사례
- 교훈 섹션 대폭 보강
This commit is contained in:
happybell80 2025-08-18 17:00:11 +09:00
parent 2d8bb456da
commit 1e66ec541d

View File

@ -217,8 +217,83 @@ async def resolve_username(user_id: str) -> str:
- Slack, 이메일, username 모든 형태 지원
- Auth 서버와 통합하여 중앙 관리
- 5단계 우선순위로 안정적 해석
## 오후 4시 50분 - 대화 히스토리와 메모리 검색 분리
### 근본 문제 발견
- **설계 결함**: `/api/messages`가 히스토리 조회와 의미 검색을 같은 함수로 처리
- **부적절한 의존성**: 단순 히스토리 조회에 LLM(Mistral) 필요 없음
- **실수의 원인**: `search_memories()` 함수 재사용 시도 → 빈 query도 임베딩 생성 → LLM 호출
### 해결책: 완전 분리
1. **`get_chat_history()` 함수 신규 개발**
```python
async def get_chat_history(
username: str,
limit: int = None,
before: Optional[str] = None,
after: Optional[str] = None
) -> List[Dict]:
"""LLM 없이 ChromaDB에서 직접 대화 조회"""
# collection.get() 사용 (query 없음)
# timestamp 기준 정렬
# 페이지네이션 지원
```
2. **엔드포인트 교체**
- 삭제: `/api/messages` (잘못된 설계)
- 신규: `/api/history` (히스토리 전용)
- 유지: `/api/search` (의미 검색용 - 향후)
3. **프론트엔드 수정**
```javascript
// 변경 전: /api/messages
// 변경 후: /api/history
const response = await fetch(`${ROBING_API_URL}/api/history?${params}`)
```
### 함수형 프로그래밍 원칙 준수
- 환경변수 활용: `MESSAGE_BATCH_SIZE`, `SCROLL_THRESHOLD`
- 순수 함수: 부작용 없이 데이터만 조회
- 의존성 주입: collection을 파라미터로 전달
- 비동기 처리로 성능 유지
## 교훈
### 1. **"코드 재사용"의 함정**
- 목적이 다른 함수를 억지로 재사용하면 복잡도만 증가
- 히스토리 조회 ≠ 의미 검색 (완전히 다른 레이어)
- 처음부터 전용 함수를 만드는 것이 더 깔끔
### 2. **LLM 의존성 최소화**
- 단순 CRUD 작업에 AI 불필요
- 임베딩 생성은 검색이 필요할 때만
- 대화 히스토리는 timestamp 정렬이면 충분
### 3. **명확한 책임 분리**
| 기능 | 엔드포인트 | LLM 필요 | 용도 |
|------|-----------|---------|------|
| 히스토리 | /api/history | X | 시간순 대화 조회 |
| 검색 | /api/search | O | 의미 기반 검색 |
| 대화 | /api/chat | O | 새 대화 생성 |
### 4. **함수형 프로그래밍 효과**
- 환경변수로 설정 관리 → 하드코딩 제거
- 순수 함수 구현 → 테스트 용이
- 명확한 입출력 → 디버깅 간편
## 최종 결과
### 구현 완료
- `get_chat_history()`: LLM 없는 순수 조회 함수
- `/api/history`: 대화 히스토리 전용 엔드포인트
- 프론트엔드 경로 수정 완료
### 개선 효과
- **MISTRAL_API_KEY 없어도 정상 작동**
- 응답 속도 대폭 개선 (임베딩 생성 없음)
- 명확한 아키텍처로 유지보수 용이
## 오후 2시 07분 - 프론트엔드 localStorage 문제 해결
### 문제 발견