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
- User-Based Recommendation: 사용자의 선호도 기반 협업 필터링
- Item-Based Recommendation: 아이템의 속성 유사도 기반 추천
- Intent Detection: 자연어 의도 파악 (영화 추천 vs 일반 대화)
- Similarity Scoring: 가중치 기반 다중 속성 유사도 계산
- 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 DESCIntent Detection Logic
# 영화 추천 관련 질문인지 판별
def intent_detection(query):
prompt = "주어진 쿼리가 영화 추천 요청이면 true, 아니면 false 반환"
return llm(prompt + query)예시:
- “안녕하세요” → False (일반 인사)
- “네가 영화 추천을 잘한다며” → False (실제 추천 요청 아님)
- “타이타닉과 비슷한 영화” → True (명확한 추천 요청)
Gradio Chatbot Architecture
3가지 함수:
intent_detection()- 질문 의도 판별response()- 의도별 처리 (Graph RAG 또는 Default LLM)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 공원나연 채널 | 녹화본 요약 및 개념 추출