# Vector DB 통합 시스템 테스트 가이드

## 목차
1. [사전 준비](#사전-준비)
2. [환경 설정](#환경-설정)
3. [데이터베이스 설정](#데이터베이스-설정)
4. [데이터 로딩 테스트](#데이터-로딩-테스트)
5. [API 서버 실행](#api-서버-실행)
6. [API 엔드포인트 테스트](#api-엔드포인트-테스트)
7. [자동화 테스트](#자동화-테스트)
8. [문제 해결](#문제-해결)

---

## 사전 준비

### 필수 소프트웨어
- Python 3.9 이상
- PostgreSQL 14 이상 (pgvector 확장 지원)
- Redis (선택사항, 캐싱용)

### Azure 서비스
- Azure OpenAI Service (임베딩 생성용)
- Azure AI Search (관련 문서 검색용)

---

## 환경 설정

### 1. 가상환경 생성 및 활성화

```bash
cd vector
python -m venv venv

# Linux/Mac
source venv/bin/activate

# Windows
venv\Scripts\activate
```

### 2. 의존성 설치

```bash
pip install -r requirements.txt
```

### 3. 환경 변수 설정

`.env.example` 파일을 `.env`로 복사하고 실제 값으로 수정:

```bash
cp .env.example .env
```

`.env` 파일 수정 예시:

```bash
# PostgreSQL
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DATABASE=meeting_db
POSTGRES_USER=postgres
POSTGRES_PASSWORD=your_actual_password

# Azure OpenAI
AZURE_OPENAI_API_KEY=your_actual_api_key
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com

# Azure AI Search
AZURE_SEARCH_ENDPOINT=https://your-search-service.search.windows.net
AZURE_SEARCH_API_KEY=your_actual_api_key

# Claude AI
CLAUDE_API_KEY=your_actual_claude_api_key

# Redis
REDIS_PASSWORD=your_redis_password
```

---

## 데이터베이스 설정

### 1. PostgreSQL 데이터베이스 생성

```sql
CREATE DATABASE meeting_db;
```

### 2. pgvector 확장 설치

PostgreSQL에 연결 후:

```sql
CREATE EXTENSION IF NOT EXISTS vector;
```

### 3. 데이터베이스 초기화

용어 데이터 로딩 스크립트를 실행하면 자동으로 테이블이 생성됩니다:

```bash
python scripts/load_terms.py
```

---

## 데이터 로딩 테스트

### 1. 데이터 로딩 검증 테스트

환경 설정 없이도 데이터 파일 로드를 검증할 수 있습니다:

```bash
python tests/test_data_loading.py
```

**예상 출력:**
```
============================================================
Vector DB 데이터 로딩 테스트
============================================================

============================================================
설정 로드 테스트
============================================================
✓ 설정 로드 성공
  - PostgreSQL 호스트: localhost
  - Azure OpenAI 모델: text-embedding-ada-002
  ...

============================================================
용어 데이터 로드 테스트
============================================================
✓ terms-01.json 로드 완료: XX개 용어
✓ terms-02.json 로드 완료: XX개 용어
...

총 XXX개 용어 로드 완료
```

### 2. 용어집 데이터 로딩

```bash
python scripts/load_terms.py
```

**예상 출력:**
```
============================================================
용어집 데이터 로딩 시작
============================================================
✓ 설정 로드 완료
✓ PostgreSQL 연결 완료
✓ 데이터베이스 초기화 완료
✓ 임베딩 생성기 초기화 완료
✓ 총 XXX개 용어 로드 완료
✓ 임베딩 생성 완료
✓ 삽입 완료: 성공 XXX, 실패 0

============================================================
용어집 통계
============================================================
전체 용어: XXX개
평균 신뢰도: X.XX

카테고리별 통계:
  - 기술용어: XX개
  - 비즈니스용어: XX개
  ...
```

### 3. 관련자료 데이터 로딩

```bash
python scripts/load_documents.py
```

**예상 출력:**
```
============================================================
관련자료 데이터 로딩 시작
============================================================
✓ 설정 로드 완료
✓ Azure AI Search 연결 완료
✓ 인덱스 생성 완료
✓ 임베딩 생성기 초기화 완료
✓ 총 XX개 문서 로드 완료
✓ 총 XXX개 청크 생성 완료
✓ XXX개 청크 업로드 완료

============================================================
관련자료 통계
============================================================
전체 문서: XX개
전체 청크: XXX개

문서 타입별 통계:
  - 회의록: XX개
  - 참고자료: XX개
  ...
```

---

## API 서버 실행

### 1. 개발 모드로 실행

```bash
python -m src.api.main
```

또는:

```bash
uvicorn src.api.main:app --reload --host 0.0.0.0 --port 8000
```

### 2. 서버 확인

브라우저에서 접속:
- API 문서: http://localhost:8000/docs
- 대체 API 문서: http://localhost:8000/redoc
- 루트 엔드포인트: http://localhost:8000/

---

## API 엔드포인트 테스트

### 1. 루트 엔드포인트 테스트

```bash
curl http://localhost:8000/
```

**예상 응답:**
```json
{
  "service": "Vector DB 통합 시스템",
  "version": "1.0.0",
  "endpoints": {
    "용어집": "/api/terms/*",
    "관련자료": "/api/documents/*"
  }
}
```

### 2. 용어 검색 테스트

#### 키워드 검색
```bash
curl -X POST http://localhost:8000/api/terms/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "API",
    "search_type": "keyword",
    "top_k": 5,
    "confidence_threshold": 0.7
  }'
```

#### 벡터 검색
```bash
curl -X POST http://localhost:8000/api/terms/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "회의 일정 관리",
    "search_type": "vector",
    "top_k": 3,
    "confidence_threshold": 0.6
  }'
```

#### 하이브리드 검색
```bash
curl -X POST http://localhost:8000/api/terms/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "마이크로서비스",
    "search_type": "hybrid",
    "top_k": 5,
    "confidence_threshold": 0.5
  }'
```

### 3. 용어 상세 조회

먼저 검색으로 용어 ID를 찾은 후:

```bash
curl http://localhost:8000/api/terms/{term_id}
```

### 4. 용어 설명 생성 (Claude AI)

```bash
curl -X POST http://localhost:8000/api/terms/{term_id}/explain \
  -H "Content-Type: application/json" \
  -d '{
    "meeting_context": "백엔드 개발 회의에서 REST API 설계 논의"
  }'
```

### 5. 용어 통계 조회

```bash
curl http://localhost:8000/api/terms/stats
```

### 6. 관련 문서 검색

```bash
curl -X POST http://localhost:8000/api/documents/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "프로젝트 계획",
    "top_k": 3,
    "relevance_threshold": 0.3,
    "semantic_ranking": true
  }'
```

#### 필터링된 검색
```bash
curl -X POST http://localhost:8000/api/documents/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "회의록",
    "top_k": 5,
    "relevance_threshold": 0.3,
    "document_type": "회의록",
    "folder": "프로젝트A",
    "semantic_ranking": true
  }'
```

### 7. 문서 통계 조회

```bash
curl http://localhost:8000/api/documents/stats
```

---

## 자동화 테스트

### 1. pytest 설치 확인

pytest가 requirements.txt에 포함되어 있어야 합니다.

### 2. API 테스트 실행

서버가 실행 중인 상태에서:

```bash
pytest tests/test_api.py -v
```

**예상 출력:**
```
tests/test_api.py::test_root PASSED
tests/test_api.py::test_search_terms_keyword PASSED
tests/test_api.py::test_search_terms_vector PASSED
tests/test_api.py::test_search_terms_hybrid PASSED
tests/test_api.py::test_get_term_stats PASSED
tests/test_api.py::test_search_documents PASSED
tests/test_api.py::test_search_documents_with_filters PASSED
tests/test_api.py::test_get_document_stats PASSED
tests/test_api.py::test_get_nonexistent_term PASSED
tests/test_api.py::test_explain_term PASSED
```

### 3. 개별 테스트 실행

```bash
# 특정 테스트만 실행
pytest tests/test_api.py::test_search_terms_keyword -v

# 테스트 상세 출력
pytest tests/test_api.py -v -s
```

---

## 문제 해결

### 1. PostgreSQL 연결 실패

**증상:**
```
psycopg2.OperationalError: could not connect to server
```

**해결:**
- PostgreSQL이 실행 중인지 확인
- .env 파일의 데이터베이스 접속 정보 확인
- 방화벽 설정 확인

### 2. pgvector 확장 오류

**증상:**
```
psycopg2.errors.UndefinedObject: type "vector" does not exist
```

**해결:**
```sql
CREATE EXTENSION IF NOT EXISTS vector;
```

### 3. Azure OpenAI API 오류

**증상:**
```
openai.error.AuthenticationError: Incorrect API key provided
```

**해결:**
- .env 파일의 AZURE_OPENAI_API_KEY 확인
- Azure Portal에서 API 키 재확인
- API 엔드포인트 URL 확인

### 4. Azure AI Search 인덱스 생성 실패

**증상:**
```
azure.core.exceptions.HttpResponseError: (Unauthorized) Access denied
```

**해결:**
- .env 파일의 AZURE_SEARCH_API_KEY 확인
- Azure Portal에서 API 키 및 권한 확인
- 인덱스 이름 중복 여부 확인

### 5. 임베딩 생성 실패

**증상:**
```
RateLimitError: Rate limit exceeded
```

**해결:**
- Azure OpenAI의 Rate Limit 확인
- 배치 크기를 줄여서 재시도
- 재시도 로직이 자동으로 작동하므로 대기

### 6. Claude API 오류

**증상:**
```
anthropic.APIError: Invalid API Key
```

**해결:**
- .env 파일의 CLAUDE_API_KEY 확인
- API 키 유효성 확인
- 호출 빈도 제한 확인

---

## 성능 테스트

### 1. 검색 응답 시간 측정

```bash
time curl -X POST http://localhost:8000/api/terms/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "API",
    "search_type": "hybrid",
    "top_k": 10
  }'
```

### 2. 동시 요청 테스트

Apache Bench를 사용한 부하 테스트:

```bash
ab -n 100 -c 10 http://localhost:8000/
```

---

## 다음 단계

1. **프로덕션 배포 준비**
   - 환경별 설정 분리 (dev/staging/prod)
   - 로깅 및 모니터링 설정
   - 보안 강화 (API 키 관리, HTTPS)

2. **성능 최적화**
   - Redis 캐싱 활성화
   - 인덱스 튜닝
   - 쿼리 최적화

3. **기능 확장**
   - 사용자 인증/인가
   - 용어 버전 관리
   - 문서 업데이트 자동화

4. **통합 테스트**
   - E2E 테스트 작성
   - CI/CD 파이프라인 구축
   - 자동화된 성능 테스트
