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