# AMCareLand - 카카오 챗봇 서비스
이랜드 ASIAN MISSION의 카카오 챗봇 서비스입니다.
## 주요 기능
### 1. 벡터 임베딩 기반 검색 시스템
- OpenAI의 `text-embedding-3-small` 모델을 사용한 질문 임베딩
- 코사인 유사도 기반 로컬 벡터 검색
- H2 인메모리 데이터베이스 활용
- XML 파일 기반 임베딩 데이터 영속화
### 2. 효율적인 임베딩 관리
- 초기 임베딩 데이터를 XML 파일로 저장하여 재사용
- 서버 재시작 시 XML에서 자동 로드로 토큰 비용 절감
- 필요시에만 새로운 페이지 임베딩 생성
### 3. 사이트맵 자동 수집
- 매일 새벽 3시 자동 크롤링
- 페이지별 제목, 설명, 본문 스니펫 추출
- 추출된 콘텐츠 자동 임베딩 처리
### 4. 간소화된 처리 프로세스
1. 사용자 질문 수신
2. 질문을 임베딩 벡터로 변환
3. 코사인 유사도로 가장 유사한 3개 페이지 검색
4. GPT-4에 관련 페이지 정보와 함께 전달
5. 정확한 답변 생성
## 기술 스택
- **Backend**: Spring Boot 3.5.3
- **Database**: H2 (In-Memory)
- **AI/ML**: OpenAI GPT-4, OpenAI Embeddings
- **ORM**: Spring Data JPA
- **Build**: Maven
- **Java**: 17
## 환경 설정
### 필수 환경 변수
```bash
# OpenAI API 키
export OPENAI_API_KEY=your-openai-api-key
```
### 애플리케이션 실행
```bash
# Maven으로 실행
./mvnw spring-boot:run
# JAR 파일로 실행
java -jar target/amcareland-0.0.1-SNAPSHOT.jar
```
### H2 콘솔 접속
- URL: http://localhost:8080/h2-console
- JDBC URL: jdbc:h2:mem:testdb
- Username: sa
- Password: (비워두기)
## API 엔드포인트
### 1. 카카오 메시지 처리
```
POST /kakao/message
Content-Type: application/json
{
"userRequest": {
"utterance": "건강검진 예약하고 싶어요",
"user": {
"id": "user123"
}
}
}
```
### 2. 관리자 API
#### 사이트맵 업데이트
```
POST /admin/sitemap/update
```
#### 임베딩 데이터 XML 저장
```
POST /admin/sitemap/embeddings/export
```
#### 임베딩 데이터 재로드
```
POST /admin/sitemap/embeddings/reload
```
#### 사이트맵 엔트리 조회
```
GET /admin/sitemap/entries
```
#### 키워드 검색
```
GET /admin/sitemap/search?keyword=검진
```
## 프로세스 플로우
```
1. 초기화
├─ 애플리케이션 시작
├─ XML 파일 확인
└─ 있으면 H2 DB에 로드
2. 사이트맵 업데이트 (일일 배치)
├─ sitemap.xml 파싱
├─ 각 페이지 메타데이터 수집
├─ 새로운 페이지만 임베딩 생성
└─ H2 DB에 저장
3. 질문 처리
├─ 카카오 메시지 수신
├─ 질문 임베딩 생성
├─ 코사인 유사도 계산
├─ 상위 3개 페이지 선택
└─ GPT-4로 답변 생성
4. 데이터 영속화
└─ XML 파일로 임베딩 데이터 저장
```
## 데이터 구조
### PageEmbedding 엔티티
```java
{
"id": 1,
"url": "https://www.amcareland.com/health-checkup",
"title": "건강검진 안내",
"description": "종합 건강검진 프로그램 안내",
"snippet": "본문 내용 500자 요약...",
"embeddingVector": "[0.123, -0.456, ...]",
"vectorDimension": 1536,
"lastModified": "2024-01-15T10:00:00",
"createdAt": "2024-01-15T10:00:00",
"updatedAt": "2024-01-15T10:00:00"
}
```
### XML 데이터 형식
```xml
<embeddings generatedAt="2024-01-15T10:00:00">
<embedding>
<url>https://www.amcareland.com/health-checkup</url>
<title>건강검진 안내</title>
<description>종합 건강검진 프로그램 안내</description>
<snippet>본문 내용...</snippet>
<vector>[0.123, -0.456, ...]</vector>
<dimension>1536</dimension>
<lastModified>2024-01-15T10:00:00</lastModified>
</embedding>
</embeddings>
```
## 비용 최적화
1. **XML 파일 캐싱**: 한 번 생성된 임베딩은 XML 파일로 저장하여 재사용
2. **증분 업데이트**: 새로운 페이지만 임베딩 생성
3. **작은 임베딩 모델**: `text-embedding-3-small` 사용으로 비용 절감
4. **로컬 벡터 검색**: 외부 벡터 DB 없이 로컬에서 처리
## 향후 개선사항
1. 임베딩 업데이트 전략 (수정된 페이지 감지)
2. 벡터 검색 성능 최적화 (인덱싱)
3. 임베딩 압축 기법 적용
4. 다국어 지원
5. 응답 품질 모니터링