-
카카오클라우드 - 클라우드 개발자 교육 16주차 후기카테고리 없음 2026. 3. 11. 16:04
실제 프로젝트등에 사용하기 위해 개발을 진행중입니다.
프로젝트 요구사항 중 채팅창에서 실제 영화 데이터를 기반으로 추천해주는 시스템이 있기에 이번주 학습하고 있는 자연어 기반 챗봇이 중요합니다.
"SF 느낌의 인셉션 같은 영화 추천해줘"
이 한 문장에는 시맨틱 의미(인셉션과 유사한 세계관), 키워드 정보(SF, 인셉션), 관계 정보(SF 장르 + 몰입감 무드)가 모두 담겨 있습니다. 단일 검색 엔진으로는 이 모든 정보를 활용할 수 없습니다.
몽글픽은 영화 추천 AI 챗봇으로, 15만 7천 건의 영화 데이터를 대상으로 자연어 대화를 통해 영화를 추천합니다.몽글픽의 핵심인 하이브리드 RAG를 구현한 코드입니다.


1단계: Qdrant 벡터 검색 — "느낌이 비슷한 영화"
Qdrant는 Upstage Solar 임베딩(4096차원)으로 인코딩된 영화 문서를 코사인 유사도로 검색합니다.
동작 원리:
- 사용자 질의를 embedding-query 모델로 벡터화
- 15만 7천 건의 영화 벡터와 코사인 유사도 비교
- 장르, 무드, OTT 플랫폼, 평점, 연도 등 페이로드 필터 적용"인셉션 같은 느낌"처럼 명확한 키워드가 아닌 분위기·세계관 기반 검색에서 가장 적합한 검색 결과를 뱉습니다.


2단계: Elasticsearch BM25 — "정확한 키워드 매칭"
Elasticsearch는 Nori 한국어 형태소 분석기를 사용해 한국어 영화 데이터를 정확히 검색합니다.필드별 가중치:
- 제목 ×3.0 > 감독 ×2.5 > 출연진 ×2.0 > 키워드 ×1.5 > 줄거리 ×1.0
"봉준호 감독 영화"라고 물으면 감독 필드에서 정확히 매칭되어 높은 점수를 받습니다. 추가로 인기도 부스트(log1p 기반)를 적용해, 동일 점수일 때 많이 알려진 영화가 상위에 오도록 합니다.




3단계: Neo4j 그래프 검색 — "관계 기반 탐색"
Neo4j는 영화-장르-무드-감독-배우 간의 관계를 활용합니다3가지 검색 전략:
전략 1: 무드 + 장르 조합
"긴장감 넘치는 SF"처럼 감성 + 장르를 조합해 검색합니다.
전략 2: 유사 영화 탐색
사전 계산된 유사도 관계를 따라가 연관 영화를 찾습니다.
전략 3: 감독 필모그래피

RRF (Reciprocal Rank Fusion)
세 엔진의 결과를 어떻게 합칠까요? 점수 스케일이 전혀 다릅니다(코사인: 0~1, BM25: 0~∞, 그래프: 순위 기반). RRF는 이 문제를 우아하게 해결합니다.
RRF_score(d) = Σ 1 / (k + rank_i(d))
- k = 60 (하이퍼파라미터)
- rank_i(d) = i번째 엔진에서 문서 d의 순위 (1부터 시작)
하나만으로는 부족합니다. 세 엔진을 병렬 실행하고 결과를 RRF로 합산하면, 각 엔진의 강점을 모두 활용할 수 있습니다.




전체 데이터 흐름
사용자: "인셉션 같은 긴장감 넘치는 SF 영화 추천해줘"
↓
[의도 분류] → 추천 의도
↓
[선호 추출] → genre: SF, mood: 긴장감, reference: 인셉션
↓
[쿼리 빌딩] → semantic: "인셉션 같은 SF 긴장감"
filters: {genres: ["SF"]}
boost: ["긴장감", "인셉션"]
↓
[하이브리드 검색] → Qdrant(30) + ES(20) + Neo4j(15) → RRF → 15건
↓
[품질 검증] → PASS (top_score=0.032, avg=0.018, count=15)
↓
[추천 엔진] → CF+CBF+MMR → 최종 5건
↓
[설명 생성] → LLM이 추천 이유를 자연어로 생성
↓
"인셉션의 다층 구조 세계관을 좋아하셨다면,
테넷은 시간 역행이라는 새로운 개념으로..."이렇게 현재 RAG의 하이브리드 서치를 구현했습니다.


——————————————————————————
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 3기(B-log) 리뷰로 작성 되었습니다.