Summary

Neo4j의 Vector Retriever를 활용하여 영화 줄거리 데이터로 의미론적 검색 엔진 구축. OpenAI Embedding과 Graph RAG를 결합하여 전통 벡터 검색의 한계를 극복하는 실전 예제. Neo4j 샌드박스 환경에서 쉽게 구현 가능한 3단계 파이프라인 제시.

Key Claims

  • Graph DB + Vector Search의 결합 — 벡터 유사도만으로는 부족한 관계 정보를 그래프로 보강
  • Neo4j Vector Retriever — 임베딩 벡터를 그래프에 저장하고 검색
  • Embedding 모델 — OpenAI API를 활용한 의미론적 표현
  • 실시간 추천 — 영화 줄거리의 의미 유사도 기반 추천
  • LangChain 통합 — Python 기반 쉬운 구현

Key Concepts Introduced

  1. Neo4j Graph Database

    • 노드(영화, 배우, 감독, 장르)와 관계(출연, 감독, 분류) 모델링
    • Cypher 쿼리로 관계 검색
  2. Vector Retriever

    • 텍스트 → 임베딩 벡터 변환
    • 코사인 유사도로 의미 유사 영화 검색
  3. OpenAI Embedding

    • text-embedding-ada-002 모델
    • 각 영화 줄거리를 고차원 벡터로 표현
  4. LangChain

    • Neo4jVector 통합
    • 간단한 API로 그래프 + 벡터 검색 구현
  5. 영화 추천 데이터셋 (MovieLens)

    • 영화, 장르, 평점, 태그 포함
    • 실제 사용자 평가 데이터

3-Step Implementation Pipeline

Step 1: 데이터 준비 & 그래프 구축

CREATE (m:Movie {title: "...", plotSummary: "..."})
CREATE (g:Genre {name: "..."})
CREATE (m)-[:BELONGS_TO]->(g)

Step 2: 임베딩 벡터 저장

from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vectors = embeddings.embed_documents([movie_plots])
# Neo4j에 벡터 저장
 
> [!caution] 검토 필요
> 
> 원본 자료 재방문 권장 (최초 수집: 2024-08-30)

Step 3: Vector + Graph 검색

from langchain.vectorstores.neo4j_vector import Neo4jVector
 
vector_store = Neo4jVector.from_existing_index(
    embedding=embeddings,
    index_name="moviePlots"
)
 
results = vector_store.similarity_search("슈퍼히어로 액션 영화")

Vector RAG vs Graph RAG 비교

측면Vector RAGVector + Graph RAG
검색 원리임베딩 유사도만벡터 + 관계 결합
관계 정보손실됨보존됨
정확도중상높음
추천 다양성낮음 (유사도 중심)높음 (관계 기반)
실시간성빠름약간 느림

예시:

  • Vector RAG: “SF 영화와 유사한 영화” → 유사도 Top-5
  • Graph + Vector RAG: “SF 영화 + 같은 감독/배우 영화 + 같은 장르” → 다각도 추천

실무 응용

1. 영화 추천 시스템

  • 사용자 선호도 기반 개인화 추천
  • 콘텐츠 유사도와 협업 필터링 결합

2. 콘텐츠 검색

  • “이런 느낌의 영화 추천해줘” → 의미 검색
  • 장르·배우·감독 필터링과 결합

3. 시각화

  • 임베딩 공간에서 영화 간 거리 시각화
  • 그래프 네트워크로 배우-감독-영화 관계 표시

관련 개념


관련 소스: what-is-graph-database (기초), rdf-lpg (표현 방식), why-use-graphrag (GraphRAG 개념)

인정: YouTube 공원나연 채널 (2024-08-30)