LangGraph를 기반으로 한 카카오톡 대화내역 분석을 통한 개인 맞춤형 선물 추천 시스템입니다.
- 대화내역 분석: 카카오톡 대화를 LLM으로 분석하여 선물 선호도 파악
- 계층적 카테고리 분류: 상위/하위 카테고리별 점수 계산 및 결합
- 맞춤형 추천: 상대방 프로필과 예산을 고려한 최적 상품 선택
- LangGraph 파이프라인: 확장 가능하고 유지보수가 용이한 워크플로우
app/
├── core/ # 핵심 비즈니스 로직
│ ├── config.py # 환경변수, 하이퍼파라미터
│ ├── state.py # 파이프라인 상태 관리
│ ├── pipeline.py # 메인 파이프라인 실행
│ └── nodes/ # LangGraph 노드들
│ ├── init_node.py # 초기화 (카테고리 레이블)
│ ├── parent_score_node.py # 상위 카테고리 LLM 점수
│ ├── child_score_node.py # 하위 카테고리 LLM 점수
│ ├── combine_node.py # 계층 결합
│ ├── db_filter_node.py # DB 상품 필터링
│ └── product_node.py # 최종 상품 선택
├── services/ # 외부 서비스 연동
│ ├── llm/ # LLM 관련 서비스
│ │ ├── client.py # Upstage API 클라이언트
│ │ ├── prompts.py # 프롬프트 템플릿
│ │ └── scorer.py # LLM 점수 계산
│ └── repo/ # 데이터 저장소
│ └── product_repo.py # 상품 데이터 접근
├── utils/ # 유틸리티 함수들
│ ├── softmax.py # Softmax + 자동 온도 튜닝
│ └── text.py # 텍스트 정규화
└── main.py # 메인 실행 파일
pip install -r requirements.txtcp env.example .env
# .env 파일을 편집하여 실제 값 입력필수 환경 변수:
UPSTAGE_API_KEY: Upstage API 키UPSTAGE_BASE_URL: Upstage API 기본 URLUPSTAGE_MODEL: 사용할 모델명 (기본값: solar-pro-2)
- 대화내역 CSV:
chatt-1.csv형식 (text 컬럼 포함) - 상품 데이터:
kakao_gifts.normalized.csv형식
python app/main.py \
--chat_csv chatt-1.csv \
--age 25 \
--gender 여성 \
--relation 친구 \
--budget_min 10000 \
--budget_max 50000 \
--products_csv_path kakao_gifts.normalized.csv--chat_csv: 전처리된 대화 CSV 파일 경로--age: 선물 받는 상대방의 나이 (1-120)--gender: 성별 (남성/여성/기타)--relation: 관계 (친구/연인/가족/동료 등)--budget_min: 최소 예산 (원)--budget_max: 최대 예산 (원)--products_csv_path: 상품 데이터베이스 CSV 파일 경로
- 초기화: 카테고리 분류 체계 구축
- 상위 카테고리 점수: LLM을 사용한 상위 카테고리별 점수 계산
- 하위 카테고리 점수: LLM을 사용한 하위 카테고리별 점수 계산
- 계층 결합: 상위/하위 카테고리 점수 결합 및 Top-3 선정
- 상품 필터링: 예산 범위 내 후보 상품 조회
- 최종 선택: LLM을 사용한 최종 상품 5개 선택
- 교환권, 상품권, 뷰티, 패션, 식품, 와인/양주/전통주
- 리빙/도서, 레저/스포츠, 골프선물, 아티스트/캐릭터
- 유아동/반려, 디지털/가전, 카카오프렌즈
각 상위 카테고리별로 세분화된 하위 카테고리 제공
BETA_CHILD: 하위 카테고리 점수 가중치 (기본값: 0.6)GAMMA_PARENT: 상위 카테고리 점수 가중치 (기본값: 0.4)SINGLE_CHILD_PENALTY_LAMBDA: 단일 자식 패널티 (기본값: 0.1)
SOFTMAX_TEMPERATURE: 온도 파라미터 (기본값: 0.9)SCORE_CLAMP_MIN/MAX: 점수 범위 제한
- API 키 보안:
.env파일을.gitignore에 추가하여 API 키 노출 방지 - 데이터 형식: CSV 파일의 컬럼명이 예상 형식과 일치해야 함
- 메모리 사용량: 대용량 데이터 처리 시 메모리 사용량 모니터링 필요
- API 제한: Upstage API 사용량 및 속도 제한 확인
- API 키 오류:
UPSTAGE_API_KEY환경 변수 확인 - 파일 없음: CSV 파일 경로 및 존재 여부 확인3. 메모리 부족: 대용량 데이터 처리 시 배치 크기 조정
# 로그 레벨을 DEBUG로 설정하여 상세 정보 확인
export PYTHONPATH=.
python -c "import logging; logging.basicConfig(level=logging.DEBUG)"