뷰티 관련 텍스트 데이터를 수집하고, AI를 활용해 RAG용 구조화 JSON으로 변환하는 데이터 파이프라인입니다.
현재 지원 소스: 네이버 블로그, 유튜브 자막
크롤러 실행 → crawled_data/ (txt 파일)
↓
hair_factory 실행 → cleaned_data/ (JSON 파일)
- Python 3.12 이상
- uv (패키지 관리)
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | shgit clone https://github.com/Zyooon/chunk_factory.git
cd chunk_factory
uv venv
uv sync프로젝트 루트에 .env 파일을 생성하고 아래 키를 입력합니다.
GEMINI_API_KEY=your_gemini_api_key_here
YOUTUBE_API_KEY=your_youtube_api_key_here
- Google AI Studio 접속
- 로그인 후
Get API key클릭 - 발급된 키를
.env의GEMINI_API_KEY에 입력
- Google Cloud Console 접속
- 새 프로젝트 생성 또는 기존 프로젝트 선택
API 및 서비스→라이브러리에서YouTube Data API v3검색 후 활성화사용자 인증 정보→API 키 만들기- 발급된 키를
.env의YOUTUBE_API_KEY에 입력
유튜브 자막 수집만 사용하는 경우
YOUTUBE_API_KEY는 필수입니다.
네이버 블로그만 수집하는 경우GEMINI_API_KEY만 있어도 됩니다.
apps/crawler/config.py에서 수집할 키워드와 수량을 설정합니다.
# 네이버 블로그 검색 키워드
NAVER_BLOG_SEARCH_KEYWORDS = [
"얼굴형 헤어스타일",
"봄웜톤 메이크업",
]
# 키워드당 최대 수집 수
NAVER_BLOG_MAX_ARTICLES_PER_KEYWORD = 3
# 유튜브 검색 키워드
YOUTUBE_SEARCH_KEYWORDS = [
"얼굴형 헤어스타일",
]
# 키워드당 최대 수집 수
YOUTUBE_SEARCH_MAX_RESULTS_PER_KEYWORD = 3uv run main.py수집된 txt 파일은 아래 경로에 저장됩니다.
crawled_data/
├── naver_blog/
│ └── 20260528_제목.txt
└── youtube/
└── 20260528_영상제목.txt
수집 이력은 프로젝트 루트의 crawl_log.json에 기록됩니다. 같은 URL은 재실행해도 중복 수집하지 않습니다.
uv run hair_factory.pycrawled_data/ 폴더의 txt 파일을 읽어 Gemini API로 처리한 뒤, 아래 경로에 저장됩니다.
cleaned_data/
└── cleaned_rag_data_20260528_143000.json
처리 이력은 processed_log.json에 기록됩니다. 이미 처리된 파일은 재실행해도 건너뜁니다.
[
{
"category": "hair",
"gender": "여성",
"conditions": {
"face_shape": "둥근형",
"face_proportion": "균형"
},
"recommended_styles": ["시스루 뱅 굵은 히피펌", "사이드 뱅 젤리펌"],
"worst_styles": ["5:5 가르마 긴 생머리"],
"expert_reasoning_positive": "추천 이유 설명",
"expert_reasoning_negative": "워스트 이유 설명"
}
]face_shape 허용값: 계란형 둥근형 각진형 장방형 역삼각형
face_proportion 허용값: 균형 상안부_긴형 중안부_긴형 하안부_긴형
| 파일 | 위치 | 설명 |
|---|---|---|
crawl_log.json |
프로젝트 루트 | 크롤링 완료 URL 이력 |
processed_log.json |
프로젝트 루트 | AI 처리 완료 파일 이력 |
crawled_data/ |
프로젝트 루트 | 크롤링 원본 txt |
cleaned_data/ |
프로젝트 루트 | 정제된 RAG용 JSON |
위 파일과 폴더는 모두 .gitignore에 포함되어 있습니다.
.env파일은 절대 커밋하지 마세요.- 네이버 블로그 크롤링은 요청 간 2~3초 딜레이가 적용됩니다. 과도한 수집은 자제해 주세요.
- YouTube Data API는 일일 무료 할당량(10,000 units)이 있습니다. 키워드당 수집 수를 적게 유지하는 것을 권장합니다.
- Gemini API Free Tier 사용 시 분당 요청 수 제한이 있습니다.
SLEEP_BETWEEN_REQUESTS값을 올려서 조절할 수 있습니다.
cleaned_data/의 정제 JSON을 ChromaDB에 임베딩하고, CLI에서 헤어스타일을 질문할 수 있습니다.
GEMINI_API_KEY=your_key_here
# 아래는 기본값이 있으므로 생략 가능
CHROMA_DIR=./vector_data/chroma
CHROMA_COLLECTION_NAME=beauty_hair_rag
GEMINI_EMBEDDING_MODEL=models/text-embedding-004
GEMINI_CHAT_MODEL=gemini-1.5-flash
# 1. 의존성 설치
uv sync
# 2. 크롤링 및 정제 (이미 완료했다면 건너뜀)
uv run main.py
uv run hair_factory.py
# 3. ChromaDB에 임베딩 적재 (최신 cleaned JSON을 자동으로 읽음)
uv run python -m apps.rag.ingest
# 4. CLI 챗봇 실행
uv run python -m apps.rag.cli_chat성별: 남성
얼굴형: 둥근형
삼정 비율: 균형
질문: 나한테 어울리는 헤어스타일 추천해줘