#!/bin/bash # run-with-excel.sh # 엑셀 파일로 RAG 시스템 전체 실행 set -e GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' # 사용법 if [ "$#" -lt 1 ]; then echo "사용법: ./run-with-excel.sh <엑셀파일경로> [옵션]" echo "" echo "예제:" echo " ./run-with-excel.sh data/qa_data.xlsx" echo " ./run-with-excel.sh ~/Downloads/customer_qa.xlsx" echo " ./run-with-excel.sh data/qa_data.xlsx --rebuild # 이미지 재빌드" echo "" exit 1 fi EXCEL_FILE=$1 REBUILD=${2:-""} # 파일 존재 확인 if [ ! -f "$EXCEL_FILE" ]; then echo -e "${RED}❌ 엑셀 파일을 찾을 수 없습니다: $EXCEL_FILE${NC}" exit 1 fi echo -e "${GREEN}================================================${NC}" echo -e "${GREEN}RAG 시스템 자동 실행 (엑셀 파일 사용)${NC}" echo -e "${GREEN}================================================${NC}" echo "" # 프로젝트 디렉토리로 이동 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd "$SCRIPT_DIR" # 1. 엑셀 파일 복사 echo -e "${GREEN}[1/6] 엑셀 파일 복사 중...${NC}" EXCEL_BASENAME=$(basename "$EXCEL_FILE") cp "$EXCEL_FILE" "data/$EXCEL_BASENAME" echo " ✅ data/$EXCEL_BASENAME" echo "" # 2. JSONL 변환 echo -e "${GREEN}[2/6] JSONL 변환 중...${NC}" if python scripts/excel_to_jsonl.py "data/$EXCEL_BASENAME"; then echo " ✅ data/qa_raw.jsonl 생성 완료" else echo -e "${RED} ❌ JSONL 변환 실패${NC}" echo "" echo "pandas와 openpyxl이 설치되어 있는지 확인하세요:" echo " pip install pandas openpyxl" exit 1 fi # 변환된 QA 수 확인 QA_COUNT=$(wc -l < data/qa_raw.jsonl | tr -d ' ') echo " 📊 변환된 QA 쌍: ${QA_COUNT}개" echo "" # 3. .env 파일 확인 echo -e "${GREEN}[3/6] 환경 설정 확인 중...${NC}" if [ ! -f ".env" ]; then echo -e "${YELLOW} ⚠️ .env 파일이 없습니다.${NC}" echo " env.template을 복사합니다..." cp env.template .env echo "" echo -e "${RED} ❗ .env 파일을 수정해주세요:${NC}" echo " vi .env" echo "" echo " 필수 설정:" echo " - LLM_HOST=" echo " - TEI_EMBED_HOST=" echo " - TEI_RERANK_HOST=" echo "" read -p "지금 수정하시겠습니까? (y/n) " answer if [ "$answer" = "y" ]; then ${EDITOR:-vi} .env else echo "" echo "환경 설정 후 다시 실행하세요:" echo " vi .env" echo " ./run-with-excel.sh data/$EXCEL_BASENAME" exit 0 fi fi # .env 로드 source .env # API 주소 출력 echo " 📍 LLM API: ${LLM_BASE_URL:-http://host.docker.internal:16000}" echo " 📍 TEI Embed: ${TEI_EMBED_URL:-http://host.docker.internal:16001}" echo " 📍 TEI Rerank: ${TEI_RERANK_URL:-http://host.docker.internal:16002}" echo "" # 4. Docker 이미지 빌드 if [ "$REBUILD" = "--rebuild" ] || ! docker images | grep -q "rag-batch-slim"; then echo -e "${GREEN}[4/6] Docker 이미지 빌드 중...${NC}" docker-compose -f docker-compose-slim.yml build echo " ✅ 이미지 빌드 완료" else echo -e "${GREEN}[4/6] Docker 이미지 확인 완료${NC}" fi echo "" # 5. 기존 서비스 정리 echo -e "${GREEN}[5/6] 기존 서비스 정리 중...${NC}" docker-compose -f docker-compose-slim.yml down 2>/dev/null || true echo " ✅ 정리 완료" echo "" # 6. Docker 실행 echo -e "${GREEN}[6/6] Docker 서비스 실행 중...${NC}" echo "" echo "실행 순서:" echo " 1️⃣ 전처리 (LLM 요약)" echo " 2️⃣ 임베딩 (TEI API)" echo " 3️⃣ 인덱싱 (FAISS)" echo " 4️⃣ API 서비스 시작" echo "" echo -e "${YELLOW}Ctrl+C를 눌러 중단할 수 있습니다${NC}" echo "" sleep 2 # Docker Compose 실행 if docker-compose -f docker-compose-slim.yml up; then echo "" echo -e "${GREEN}================================================${NC}" echo -e "${GREEN}✅ RAG 시스템 실행 완료!${NC}" echo -e "${GREEN}================================================${NC}" echo "" echo "API 주소: http://localhost:28012" echo "API 문서: http://localhost:28012/docs" echo "" echo "테스트:" echo " curl http://localhost:28012/health" echo " curl -X POST http://localhost:28012/ask \\" echo " -H 'Content-Type: application/json' \\" echo " -d '{\"query\":\"테스트 질문\"}'" else echo "" echo -e "${RED}================================================${NC}" echo -e "${RED}❌ Docker 실행 실패${NC}" echo -e "${RED}================================================${NC}" echo "" echo "로그 확인:" echo " docker-compose -f docker-compose-slim.yml logs" echo "" echo "문제 해결:" echo " 1. .env 파일의 API 주소 확인" echo " 2. 외부 API 서버 상태 확인" echo " 3. Docker 디스크 공간 확인" exit 1 fi