Summary

Graph RAG와 Text2Cypher를 활용한 실제 추천시스템 챗봇 구현 튜토리얼. 사용자 기반/아이템 기반 추천을 Cypher 쿼리로 자동 생성하고, 의도 파악(Intent Detection)을 통해 영화 추천 질문과 일반 대화를 구분하며, Gradio를 통해 웹 UI 챗봇으로 배포하는 완전한 엔드-투-엔드 파이프라인.

Key Claims

  • 추천시스템 2가지: 사용자 기반(협업 필터링 개념) vs 아이템 기반(콘텐츠 기반)
  • 다중 속성 유사도: 장르 × 5 + 배우 × 3 + 감독 × 4 가중치로 정확한 점수 계산
  • 의도 파악의 중요성: “안녕하세요” vs “비슷한 영화” 구분 → Graph RAG 불필요한 호출 절감
  • LLM 예시 학습: Few-shot 예시 제공으로 Text2Cypher 정확도 대폭 향상
  • 시각적 챗봇: Gradio를 통해 쿼리, 결과, 대화를 동시에 표시하는 투명성 있는 UI

Key Concepts Introduced

  1. User-Based Recommendation: 사용자의 선호도 기반 협업 필터링
  2. Item-Based Recommendation: 아이템의 속성 유사도 기반 추천
  3. Intent Detection: 자연어 의도 파악 (영화 추천 vs 일반 대화)
  4. Similarity Scoring: 가중치 기반 다중 속성 유사도 계산
  5. Gradio UI: 머신러닝 모델을 웹 인터페이스로 빠르게 배포

Recommendation Algorithms in Cypher

사용자 기반 추천 (User-Based)

MATCH (m1:Movie)-[r1:RATED]-(u:User)-[r2:RATED]-(m2:Movie)
WHERE m1.title = "TARGET_MOVIE" AND r1.rating >= 4 AND r2.rating >= 4
RETURN m2.title, avg(r2.rating), count(u) AS popularity
ORDER BY popularity DESC, avg_rating DESC LIMIT 10

아이템 기반 추천 (Item-Based) - 장르 중심

MATCH (m1:Movie)-[:BELONGS_TO]->(g:Genre),
      (m2:Movie)-[:BELONGS_TO]->(g)
WHERE m1.title = "TARGET_MOVIE"
RETURN m2.title, size(collect(DISTINCT g)) AS genre_match
ORDER BY genre_match DESC LIMIT 10

아이템 기반 추천 (Item-Based) - 다중 속성

# 장르(5) + 배우(3) + 감독(4) 가중치 합산
 
> [!caution] 검토 필요
> 
> 원본 자료 재방문 권장 (최초 수집: 2024-10-02)
RETURN m2.title,
  size(collect(DISTINCT genre)) * 5 +
  size(collect(DISTINCT actor)) * 3 +
  (CASE WHEN same_director THEN 4 ELSE 0 END) AS similarity_score
ORDER BY similarity_score DESC

Intent Detection Logic

# 영화 추천 관련 질문인지 판별
def intent_detection(query):
    prompt = "주어진 쿼리가 영화 추천 요청이면 true, 아니면 false 반환"
    return llm(prompt + query)

예시:

  • “안녕하세요” → False (일반 인사)
  • “네가 영화 추천을 잘한다며” → False (실제 추천 요청 아님)
  • “타이타닉과 비슷한 영화” → True (명확한 추천 요청)

Gradio Chatbot Architecture

3가지 함수:

  1. intent_detection() - 질문 의도 판별
  2. response() - 의도별 처리 (Graph RAG 또는 Default LLM)
  3. ChatInterface - 웹 UI 생성

좌측 패널: Cypher 쿼리 + 조회 결과
우측 패널: 대화 히스토리
제출 방식: 텍스트 입력 + Enter/Submit

Real-World Examples

예제 1: 사용자 기반 추천

  • 입력: “포레스트 검프를 좋아하는 사람은 또 어떤 영화를 봤나?”
  • 자동 Cypher: User-based 추천 쿼리
  • 출력: 추천 횟수와 평점으로 정렬된 영화 목록

예제 2: 아이템 기반 (다중 속성)

  • 입력: “비슷한 영화” (장르, 배우, 감독 모두 고려)
  • 자동 Cypher: 가중치 합산 쿼리
  • 출력: 유사도 점수와 함께 포스터 이미지

예제 3: Intent Detection 성공

  • 입력: “인셉션 감독의 다른 영화는?”
  • 의도: 감독 기반 아이템 추천 (예시에 없던 새로운 패턴)
  • 자동 Cypher: LLM이 창의적으로 감독-영화 관계 쿼리 생성

Graph RAG + Intent 파이프라인

사용자 입력
  ↓
Intent Detection (영화 추천?)
  ├─ Yes → Graph RAG 실행
  │  ├─ Text2Cypher → 쿼리 자동 생성
  │  ├─ Neo4j 실행 → 결과 조회
  │  └─ LLM → 답변 생성
  │
  └─ No → Default LLM
     └─ 일반 대화로 응답
  ↓
Gradio UI 표시
(쿼리 + 결과 + 대화 히스토리)

온톨로지 설계 적용점

온톨로지 → 지식그래프 → 추천시스템 완성:

  • Movie, Actor, Genre, User, Person(Director) 클래스
  • BELONGS_TO, ACTED_IN, DIRECTED_BY, RATED 관계
  • 의도 기반 동적 쿼리 생성 = 자연어 인터페이스
  • Gradio = 사용자 친화적 온톨로지 조회 시스템

인정: YouTube 공원나연 채널 | 녹화본 요약 및 개념 추출

관련