---
# System prepended metadata

title: AMCareLand - 카카오 챗봇 서비스

---

# 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. 응답 품질 모니터링
