1. 개요
이 Codelab에서는 Neo4j, Google Vertex AI, Gemini의 강력한 기능을 결합하여 지능형 영화 추천 챗봇을 빌드합니다. 이 시스템의 핵심은 상호 연결된 노드와 관계의 풍부한 네트워크를 통해 영화, 배우, 감독, 장르 등을 모델링하는 Neo4j 지식 그래프입니다.
시맨틱 이해를 통해 사용자 환경을 개선하기 위해 Vertex AI의 text-embedding-004 모델 (또는 최신 모델)을 사용하여 영화 줄거리 개요에서 벡터 임베딩을 생성합니다. 이러한 임베딩은 유사성 기반의 빠른 검색을 위해 Neo4j에서 색인이 생성됩니다.
마지막으로 Gemini를 통합하여 사용자가 '인터스텔라를 재미있게 봤는데 뭘 보면 좋을까?'와 같은 자연어 질문을 하고 의미 유사성 및 그래프 기반 컨텍스트에 따라 맞춤 영화 추천을 받을 수 있는 대화형 인터페이스를 구현합니다.
Codelab을 통해 다음과 같이 단계별 접근 방식을 사용합니다.
- 영화 관련 항목 및 관계로 Neo4j 지식 그래프 빌드
- Vertex AI를 사용하여 영화 개요의 텍스트 임베딩 생성/로드
- 벡터 검색과 그래프 기반 사이퍼 실행을 결합하는 Gemini 기반 Gradio 챗봇 인터페이스 구현
- (선택사항) 앱을 Cloud Run에 독립형 웹 애플리케이션으로 배포
학습할 내용
- Cypher 및 Neo4j를 사용하여 영화 지식 그래프를 만들고 채우는 방법
- Vertex AI를 사용하여 시맨틱 텍스트 임베딩을 생성하고 사용하는 방법
- GraphRAG를 사용하여 지능형 검색을 위해 LLM과 지식 그래프를 결합하는 방법
- Gradio를 사용하여 사용자 친화적인 채팅 인터페이스를 빌드하는 방법
- 선택적으로 Google Cloud Run에 배포하는 방법
필요한 항목
- Chrome 웹브라우저
- Gmail 계정
- 결제가 사용 설정된 Google Cloud 프로젝트
- 무료 Neo4j Aura DB 계정
- 터미널 명령어 및 Python에 대한 기본적인 지식 (있으면 좋지만 필수는 아님)
이 Codelab은 초보자를 포함한 모든 수준의 개발자를 대상으로 하며 샘플 애플리케이션에서 Python과 Neo4j를 사용합니다. Python 및 그래프 데이터베이스에 대한 기본적인 지식이 있으면 도움이 되지만 개념을 이해하거나 따라가는 데 사전 경험은 필요하지 않습니다.

2. Neo4j AuraDB 설정
Neo4j는 데이터를 노드 (엔티티)와 관계 (엔티티 간 연결)의 네트워크로 저장하는 선도적인 기본 그래프 데이터베이스로, 추천, 사기 감지, 지식 그래프 등 연결을 이해하는 것이 중요한 사용 사례에 적합합니다. 엄격한 테이블이나 계층 구조에 의존하는 관계형 또는 문서 기반 데이터베이스와 달리 Neo4j의 유연한 그래프 모델을 사용하면 복잡하게 상호 연결된 데이터를 직관적이고 효율적으로 표현할 수 있습니다.
Neo4j는 관계형 데이터베이스처럼 행과 테이블로 데이터를 구성하는 대신 정보가 노드 (항목)와 관계 (항목 간 연결)로 표현되는 그래프 모델을 사용합니다. 이 모델은 사람, 장소, 제품 또는 Google의 경우 영화, 배우, 장르와 같이 본질적으로 연결된 데이터를 사용하는 데 매우 직관적입니다.
예를 들어 영화 데이터 세트에서
- 노드는
Movie,Actor또는Director를 나타낼 수 있습니다. - 관계는
ACTED_IN또는DIRECTED일 수 있습니다.

이 구조를 사용하면 다음과 같은 질문을 쉽게 할 수 있습니다.
- 이 배우가 출연한 영화는 뭐야?
- 크리스토퍼 놀런과 함께 작업한 사람은 누구인가요?
- 공유된 배우나 장르를 기반으로 한 유사한 영화는 무엇인가요?
Neo4j에는 그래프 쿼리를 위해 특별히 설계된 강력한 쿼리 언어인 Cypher가 함께 제공됩니다. Cypher를 사용하면 복잡한 패턴과 연결을 간결하고 읽기 쉬운 방식으로 표현할 수 있습니다. 예를 들어 이 Cypher 쿼리는 MERGE를 사용하여 배우, 영화, 역할 세부정보와의 관계가 중복되지 않도록 고유하게 생성되도록 합니다.
MERGE (a:Actor {name: "Tom Hanks"})
MERGE (m:Movie {title: "Toy Story", released: 1995})
MERGE (a)-[:ACTED_IN {roles: ["Woody"]}]->(m);
Neo4j는 요구사항에 따라 다양한 배포 옵션을 제공합니다.
- 자체 관리: Neo4j Desktop을 사용하거나 Docker 이미지 (온프레미스 또는 자체 클라우드)로 자체 인프라에서 Neo4j를 실행합니다.
- 클라우드 관리형: 마켓 제품을 사용하여 인기 있는 클라우드 제공업체에 Neo4j를 배포합니다.
- 완전 관리형: 프로비저닝, 확장, 백업, 보안을 처리하는 Neo4j의 완전 관리형 클라우드 서비스로서의 데이터베이스인 Neo4j AuraDB를 사용합니다.
이 Codelab에서는 AuraDB의 무료 등급인 Neo4j AuraDB Free를 사용합니다. 프로토타입 제작, 학습, 소규모 애플리케이션 빌드에 충분한 스토리지와 기능을 갖춘 완전 관리형 그래프 데이터베이스 인스턴스를 제공하므로 생성형 AI 기반 영화 추천 챗봇을 빌드한다는 목표에 적합합니다.
이 실습에서는 무료 AuraDB 인스턴스를 만들고, 연결 사용자 인증 정보를 사용하여 애플리케이션에 연결하고, 이를 사용하여 영화 지식 그래프를 저장하고 쿼리합니다.
그래프를 사용해야 하는 이유
기존 관계형 데이터베이스에서는 '공유된 출연진이나 장르를 기준으로 인셉션과 유사한 영화는 무엇인가요?'와 같은 질문에 답변하려면 여러 테이블에 걸쳐 복잡한 JOIN 작업이 필요합니다. 관계의 깊이가 깊어질수록 성능과 가독성이 저하됩니다.
하지만 Neo4j와 같은 그래프 데이터베이스는 관계를 효율적으로 탐색하도록 설계되어 추천 시스템, 시맨틱 검색, 지능형 어시스턴트에 적합합니다. 이러한 모델은 기존 데이터 모델을 사용하여 표현하기 어려운 협업 네트워크, 스토리라인, 시청자 선호도와 같은 실제 상황을 포착하는 데 도움이 됩니다.
이 연결된 데이터를 Gemini와 같은 LLM 및 Vertex AI의 벡터 임베딩과 결합하면 챗봇 환경을 강화하여 더 맞춤설정되고 관련성 높은 방식으로 추론, 검색, 응답할 수 있습니다.
Neo4j AuraDB 무료 생성
- https://console.neo4j.io를 방문합니다.
- Google 계정 또는 이메일로 로그인합니다.
- '무료 인스턴스 만들기'를 클릭합니다.
- 인스턴스가 프로비저닝되는 동안 데이터베이스의 연결 사용자 인증 정보를 보여주는 팝업 창이 표시됩니다.
팝업에서 다음 세부정보를 다운로드하여 안전하게 저장해야 합니다. 애플리케이션을 Neo4j에 연결하는 데 필요합니다.
NEO4J_URI=neo4j+s://<your-instance-id>.databases.neo4j.io
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=<your-generated-password>
AURA_INSTANCEID=<your-instance-id>
AURA_INSTANCENAME=<your-instance-name>
이 값은 다음 단계에서 Neo4j로 인증하기 위해 프로젝트의 .env 파일을 구성하는 데 사용됩니다.

Neo4j AuraDB Free는 개발, 실험, 이 Codelab과 같은 소규모 애플리케이션에 적합합니다. 최대 200,000개의 노드와 400,000개의 관계를 지원하는 넉넉한 사용량 한도를 제공합니다. 지식 그래프를 빌드하고 쿼리하는 데 필요한 모든 필수 기능을 제공하지만 맞춤 플러그인이나 스토리지 증가와 같은 고급 구성은 지원하지 않습니다. 프로덕션 워크로드 또는 대규모 데이터 세트의 경우 더 큰 용량, 성능, 엔터프라이즈급 기능을 제공하는 상위 등급 AuraDB 요금제로 업그레이드할 수 있습니다.
이로써 Neo4j AuraDB 백엔드 설정 섹션이 완료됩니다. 다음 단계에서는 코드랩을 시작하기 전에 개발 환경을 준비하기 위해 Google Cloud 프로젝트를 만들고, 저장소를 클론하고, 필요한 환경 변수를 구성합니다.
3. 시작하기 전에
프로젝트 만들기
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요 .
- bq가 미리 로드되어 제공되는 Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다. Google Cloud 콘솔 상단에서 Cloud Shell 활성화를 클릭합니다.

- Cloud Shell에 연결되면 다음 명령어를 사용하여 이미 인증되었는지, 프로젝트가 프로젝트 ID로 설정되었는지 확인합니다.
gcloud auth list
- Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project
- 프로젝트가 설정되지 않은 경우 다음 명령어를 사용하여 설정합니다.
gcloud config set project <YOUR_PROJECT_ID>
- 아래에 표시된 명령어를 통해 필수 API를 사용 설정합니다. 몇 분 정도 소요될 수 있으니 잠시 기다려 주세요.
gcloud services enable cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
명령어가 성공적으로 실행되면 Operation .... finished successfully라는 메시지가 표시됩니다.
gcloud 명령의 대안은 콘솔을 통해 각 제품을 검색하거나 이 링크를 사용하는 것입니다.
API가 누락된 경우 구현 과정에서 언제든지 사용 설정할 수 있습니다.
gcloud 명령어 및 사용법은 문서를 참조하세요.
저장소 클론 및 환경 설정
다음 단계는 Codelab의 나머지 부분에서 참조할 샘플 저장소를 클론하는 것입니다. Cloud Shell에 있다고 가정하고 홈 디렉터리에서 다음 명령어를 실행합니다.
git clone https://github.com/sidagarwal04/neo4j-vertexai-codelab.git
편집기를 실행하려면 Cloud Shell 창의 툴바에서 편집기 열기를 클릭합니다. 왼쪽 상단의 메뉴 바를 클릭하고 아래와 같이 파일 → 폴더 열기를 선택합니다.

neo4j-vertexai-codelab 폴더를 선택하면 아래와 비슷한 구조로 폴더가 열립니다.

다음으로 Codelab 전체에서 사용할 환경 변수를 설정해야 합니다. example.env 파일을 클릭하면 아래와 같이 콘텐츠가 표시됩니다.
NEO4J_URI=
NEO4J_USER=
NEO4J_PASSWORD=
NEO4J_DATABASE=
PROJECT_ID=
LOCATION=
이제 example.env 파일과 동일한 폴더에 .env이라는 새 파일을 만들고 기존 example.env 파일의 콘텐츠를 복사합니다. 이제 다음 변수를 업데이트합니다.
NEO4J_URI,NEO4J_USER,NEO4J_PASSWORD,NEO4J_DATABASE:- 이전 단계에서 Neo4j AuraDB Free 인스턴스를 만드는 동안 제공된 사용자 인증 정보를 사용하여 이러한 값을 입력합니다.
NEO4J_DATABASE은 일반적으로 AuraDB Free의 경우 neo4j로 설정됩니다.PROJECT_ID및LOCATION:- Google Cloud Shell에서 Codelab을 실행하는 경우 활성 프로젝트 구성에서 자동으로 추론되므로 이러한 필드를 비워 둘 수 있습니다.
- 로컬에서 실행하거나 Cloud Shell 외부에서 실행하는 경우
PROJECT_ID를 이전에 만든 Google Cloud 프로젝트의 ID로 업데이트하고LOCATION을 해당 프로젝트에 선택한 리전 (예: us-central1)으로 설정합니다.
이 값을 입력한 후 .env 파일을 저장합니다. 이 구성을 사용하면 애플리케이션이 Neo4j 및 Vertex AI 서비스에 모두 연결할 수 있습니다.
개발 환경 설정의 마지막 단계는 Python 가상 환경을 만들고 requirements.txt 파일에 나열된 모든 필수 종속 항목을 설치하는 것입니다. 이러한 종속 항목에는 Neo4j, Vertex AI, Gradio 등과 함께 작동하는 데 필요한 라이브러리가 포함됩니다.
먼저 다음 명령어를 실행하여 .venv라는 가상 환경을 만듭니다.
python -m venv .venv
환경이 생성되면 다음 명령어를 사용하여 생성된 환경을 활성화해야 합니다.
source .venv/bin/activate
이제 터미널 프롬프트의 시작 부분에 (.venv)가 표시되어 환경이 활성 상태임을 나타냅니다. 예: (.venv) yourusername@cloudshell:
이제 다음을 실행하여 필수 종속 항목을 설치합니다.
pip install -r requirements.txt
다음은 파일에 나열된 주요 종속 항목의 스냅샷입니다.
gradio>=4.0.0
neo4j>=5.0.0
numpy>=1.20.0
python-dotenv>=1.0.0
google-cloud-aiplatform>=1.30.0
vertexai>=0.0.1
모든 종속 항목이 성공적으로 설치되면 이 Codelab에서 스크립트와 챗봇을 실행할 수 있도록 로컬 Python 환경이 완전히 구성됩니다.
좋습니다. 이제 다음 단계로 넘어갈 준비가 되었습니다. 데이터 세트를 이해하고 그래프 생성 및 시맨틱 보강을 위해 데이터 세트를 준비합니다.
4. Movies 데이터 세트 준비
첫 번째 작업은 지식 그래프를 빌드하고 추천 챗봇을 지원하는 데 사용할 영화 데이터 세트를 준비하는 것입니다. 처음부터 시작하는 대신 기존 공개 데이터 세트를 사용하여 이를 기반으로 빌드합니다.
여기서는 Kaggle에서 제공되는 유명한 공개 데이터 세트인 Rounak Banik의 영화 데이터 세트를 사용합니다. 여기에는 출연진, 제작진, 키워드, 평점 등 TMDB의 45,000개가 넘는 영화의 메타데이터가 포함됩니다.

신뢰할 수 있고 효과적인 영화 추천 챗봇을 빌드하려면 깨끗하고 일관되며 구조화된 데이터로 시작하는 것이 중요합니다. Kaggle의 영화 데이터 세트는 45,000개가 넘는 영화 기록과 장르, 출연진, 제작진 등을 비롯한 자세한 메타데이터가 포함된 풍부한 리소스이지만, 그래프 모델링이나 시맨틱 임베딩에 적합하지 않은 노이즈, 불일치, 중첩된 데이터 구조도 포함되어 있습니다.
이 문제를 해결하기 위해 Neo4j 지식 그래프를 빌드하고 고품질 삽입을 생성하는 데 적합하도록 데이터 세트를 사전 처리하고 정규화했습니다. 이 프로세스에는 다음이 포함되었습니다.
- 중복 및 불완전한 레코드 삭제
- 주요 필드 표준화 (예: 장르 이름, 사람 이름)
- 복잡한 중첩 구조 (예: 출연진 및 제작진)를 구조화된 CSV로 평면화
- Neo4j AuraDB Free 한도 내에 있도록 대표적인 영화 약 12,000편 선택
고품질의 정규화된 데이터는 다음을 보장하는 데 도움이 됩니다.
- 데이터 품질: 오류와 불일치를 최소화하여 더 정확한 추천 제공
- 쿼리 성능: 간소화된 구조로 검색 속도가 향상되고 중복이 감소합니다.
- 임베딩 정확도: 깨끗한 입력은 더 의미 있고 맥락에 맞는 벡터 임베딩을 생성합니다.
이 GitHub 저장소의 normalized_data/ 폴더에서 정리되고 정규화된 데이터 세트에 액세스할 수 있습니다. 이 데이터 세트는 향후 Python 스크립트에서 쉽게 액세스할 수 있도록 Google Cloud Storage 버킷에도 미러링됩니다.
데이터가 정리되고 준비되었으므로 이제 Neo4j에 데이터를 로드하고 영화 지식 그래프를 구성할 수 있습니다.
5. 영화 지식 그래프 빌드
AI 기반 영화 추천 챗봇을 지원하려면 영화, 배우, 감독, 장르, 기타 메타데이터 간의 풍부한 연결 네트워크를 포착하는 방식으로 영화 데이터 세트를 구조화해야 합니다. 이 섹션에서는 이전에 준비한 정리되고 정규화된 데이터 세트를 사용하여 Neo4j에서 영화 지식 그래프를 빌드합니다.
Neo4j의 LOAD CSV 기능을 사용하여 공개 Google Cloud Storage (GCS) 버킷에 호스팅된 CSV 파일을 수집합니다. 이러한 파일은 영화, 장르, 출연진, 제작진, 제작사, 사용자 평점과 같은 영화 데이터 세트의 다양한 구성요소를 나타냅니다.
1단계: 제약 조건 및 색인 만들기
데이터를 가져오기 전에 데이터 무결성을 적용하고 쿼리 성능을 최적화하기 위해 제약 조건 및 색인을 만드는 것이 좋습니다.
CREATE CONSTRAINT unique_tmdb_id IF NOT EXISTS FOR (m:Movie) REQUIRE m.tmdbId IS UNIQUE;
CREATE CONSTRAINT unique_movie_id IF NOT EXISTS FOR (m:Movie) REQUIRE m.movieId IS UNIQUE;
CREATE CONSTRAINT unique_prod_id IF NOT EXISTS FOR (p:ProductionCompany) REQUIRE p.company_id IS UNIQUE;
CREATE CONSTRAINT unique_genre_id IF NOT EXISTS FOR (g:Genre) REQUIRE g.genre_id IS UNIQUE;
CREATE CONSTRAINT unique_lang_id IF NOT EXISTS FOR (l:SpokenLanguage) REQUIRE l.language_code IS UNIQUE;
CREATE CONSTRAINT unique_country_id IF NOT EXISTS FOR (c:Country) REQUIRE c.country_code IS UNIQUE;
CREATE INDEX actor_id IF NOT EXISTS FOR (p:Person) ON (p.actor_id);
CREATE INDEX crew_id IF NOT EXISTS FOR (p:Person) ON (p.crew_id);
CREATE INDEX movieId IF NOT EXISTS FOR (m:Movie) ON (m.movieId);
CREATE INDEX user_id IF NOT EXISTS FOR (p:Person) ON (p.user_id);
2단계: 영화 메타데이터 및 관계 가져오기
LOAD CSV 명령어를 사용하여 영화 메타데이터를 가져오는 방법을 살펴보겠습니다. 이 예에서는 제목, 개요, 언어, 러닝타임과 같은 주요 속성이 있는 Movie 노드를 만듭니다.
LOAD CSV WITH HEADERS FROM "https://storage.googleapis.com/neo4j-vertexai-codelab/normalized_data/normalized_movies.csv" AS row
WITH row, toInteger(row.tmdbId) AS tmdbId
WHERE tmdbId IS NOT NULL
WITH row, tmdbId
LIMIT 12000
MERGE (m:Movie {tmdbId: tmdbId})
ON CREATE SET m.title = coalesce(row.title, "None"),
m.original_title = coalesce(row.original_title, "None"),
m.adult = CASE
WHEN toInteger(row.adult) = 1 THEN 'Yes'
ELSE 'No'
END,
m.budget = toInteger(coalesce(row.budget, 0)),
m.original_language = coalesce(row.original_language, "None"),
m.revenue = toInteger(coalesce(row.revenue, 0)),
m.tagline = coalesce(row.tagline, "None"),
m.overview = coalesce(row.overview, "None"),
m.release_date = coalesce(row.release_date, "None"),
m.runtime = toFloat(coalesce(row.runtime, 0)),
m.belongs_to_collection = coalesce(row.belongs_to_collection, "None");
마찬가지로 각 CSV와 Cypher 쿼리를 사용하여 장르, 제작사, 사용 언어, 국가, 출연진, 제작진, 사용자 평점과 같은 다른 항목을 가져오고 연결할 수 있습니다.
Python을 통해 전체 그래프 로드
여러 Cypher 쿼리를 수동으로 실행하는 대신 이 Codelab에 제공된 자동화된 Python 스크립트를 사용하는 것이 좋습니다.
graph_build.py 스크립트는 .env 파일의 사용자 인증 정보를 사용하여 GCS에서 전체 데이터 세트를 Neo4j AuraDB 인스턴스로 로드합니다.
python graph_build.py
스크립트는 필요한 모든 CSV를 순차적으로 로드하고, 노드와 관계를 만들고, 전체 영화 지식 그래프를 구조화합니다.
|
|
그래프 검증
로드한 후 다음 스크립트를 실행하여 그래프를 검증할 수 있습니다.
python validate_graph.py
이렇게 하면 그래프에 포함된 항목(영화, 배우, 장르, 관계(ACTED_IN, DIRECTED 등))의 개수가 표시되어 가져오기가 성공적으로 완료되었는지 확인할 수 있습니다.
📦 Node Counts:
Movie: 11997 nodes
ProductionCompany: 7961 nodes
Genre: 20 nodes
SpokenLanguage: 100 nodes
Country: 113 nodes
Person: 92663 nodes
Actor: 81165 nodes
Director: 4846 nodes
Producer: 5981 nodes
User: 671 nodes
🔗 Relationship Counts:
HAS_GENRE: 28479 relationships
PRODUCED_BY: 22758 relationships
PRODUCED_IN: 14702 relationships
HAS_LANGUAGE: 16184 relationships
ACTED_IN: 191307 relationships
DIRECTED: 5047 relationships
PRODUCED: 6939 relationships
RATED: 90344 relationships
이제 그래프에 영화, 인물, 장르 등이 채워져 있으며 다음 단계에서 시맨틱하게 보강할 준비가 되었습니다.
6. 임베딩을 생성하고 로드하여 벡터 유사성 검색 실행
챗봇에서 시맨틱 검색을 사용 설정하려면 영화 개요에 대한 벡터 임베딩을 생성해야 합니다. 이러한 임베딩은 텍스트 데이터를 유사성을 비교할 수 있는 숫자 벡터로 변환하므로 쿼리가 제목이나 설명과 정확히 일치하지 않더라도 챗봇이 관련 영화를 검색할 수 있습니다.

옵션 1: Cypher를 통해 사전 계산된 삽입 로드
Neo4j의 해당 Movie 노드에 삽입을 빠르게 연결하려면 Neo4j 브라우저에서 다음 Cypher 명령어를 실행하세요.
LOAD CSV WITH HEADERS FROM 'https://storage.googleapis.com/neo4j-vertexai-codelab/movie_embeddings.csv' AS row
WITH row
MATCH (m:Movie {tmdbId: toInteger(row.tmdbId)})
SET m.embedding = apoc.convert.fromJsonList(row.embedding)
이 명령어는 CSV에서 삽입 벡터를 읽고 각 Movie 노드에 속성 (m.embedding)으로 연결합니다.
옵션 2: Python을 사용하여 삽입 로드
제공된 Python 스크립트를 사용하여 프로그래매틱 방식으로 임베딩을 로드할 수도 있습니다. 이 방법은 자체 환경에서 작업하거나 프로세스를 자동화하려는 경우에 유용합니다.
python load_embeddings.py
이 스크립트는 GCS에서 동일한 CSV를 읽고 Python Neo4j 드라이버를 사용하여 Neo4j에 삽입을 씁니다.
[선택사항] 직접 임베딩 생성 (탐색용)
임베딩이 생성되는 방식을 이해하고 싶다면 generate_embeddings.py 스크립트 자체의 로직을 살펴보세요. Vertex AI를 사용하여 text-embedding-004 모델을 사용해 각 영화 개요 텍스트를 삽입합니다.
직접 사용해 보려면 코드의 임베딩 생성 섹션을 열고 실행하세요. Cloud Shell에서 실행하는 경우 활성 계정을 통해 Cloud Shell이 이미 인증되었으므로 다음 줄을 주석 처리할 수 있습니다.
# os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "./service-account.json"
임베딩이 Neo4j에 로드되면 영화 지식 그래프가 의미 인식이 되어 벡터 유사성을 사용하는 강력한 자연어 검색을 지원할 수 있습니다.
7. 영화 추천 챗봇
지식 그래프와 벡터 삽입이 준비되었으므로 이제 모든 것을 통합하여 완전한 기능을 갖춘 대화형 인터페이스인 생성형 AI 기반 영화 추천 챗봇을 만들 차례입니다.
이 챗봇은 직관적인 사용자 인터페이스를 빌드하기 위한 경량 웹 프레임워크인 Gradio를 사용하여 Python으로 구현됩니다. 핵심 로직은 app.py에 있으며, 이 로직은 Neo4j AuraDB 인스턴스에 연결되고 Google Vertex AI 및 Gemini를 사용하여 자연어 쿼리를 처리하고 응답합니다.
작동 방식
- 사용자가 자연어 질문을 입력합니다예: "Recommend me sci-fi thrillers like Interstellar(인터스텔라 같은 SF 스릴러 추천해 줘)"
- Vertex AI의
text-embedding-004모델을 사용하여 질문에 대한 벡터 임베딩 생성 - Neo4j에서 벡터 검색을 실행하여 의미상 유사한 영화를 가져옵니다.
- Gemini를 사용하여 다음 작업을 할 수 있습니다.
- 컨텍스트에 따라 질문 해석
- 벡터 검색 결과 및 Neo4j 스키마를 기반으로 맞춤 Cypher 쿼리 생성
- 쿼리를 실행하여 관련 그래프 데이터 (예: 배우, 감독, 장르) 추출
- 사용자를 위해 결과를 대화 형식으로 요약해 줘.

GraphRAG (Graph Retrieval-Augmented Generation)라고 하는 이 하이브리드 접근 방식은 시맨틱 검색과 구조화된 추론을 결합하여 더 정확하고, 맥락에 맞으며, 설명 가능한 추천을 생성합니다.
로컬에서 챗봇 실행
가상 환경을 활성화하고 (아직 활성화되지 않은 경우) 다음을 사용하여 챗봇을 실행합니다.
python app.py
다음과 비슷한 출력이 표시됩니다.
Vector index 'overview_embeddings' already exists. No need to create a new one.
* Running on local URL: http://0.0.0.0:8080
To create a public link, set `share=True` in `launch()`.
💡 챗봇을 외부에서 공유하려면 app.py의 launch() 함수에서 share=True를 설정하세요.
챗봇과 상호작용
터미널에 표시된 로컬 URL (일반적으로 👉 http://0.0.0.0:8080)을 열어 챗봇 인터페이스에 액세스합니다.
다음과 같은 질문을 해 보세요.
- '인터스텔라를 재미있게 봤는데 뭘 보면 좋을까?'
- "노라 에프런이 감독한 로맨틱 영화 추천해 줘"
- "톰 행크스가 출연하는 가족 영화를 보고 싶어"
- "인공지능이 나오는 스릴러 영화 찾아 줘"

챗봇은 다음을 수행합니다.
✅ 질문 이해하기
✅ 임베딩을 사용하여 의미적으로 유사한 영화 줄거리 찾기
✅ Cypher 쿼리를 생성하고 실행하여 관련 그래프 컨텍스트 가져오기
✅ 친근하고 맞춤화된 추천을 몇 초 만에 반환
현재 사용 가능한 기능
다음과 같은 요소를 결합한 GraphRAG 기반 영화 챗봇을 빌드했습니다.
- 의미론적 관련성을 위한 벡터 검색
- Neo4j를 사용한 지식 그래프 추론
- Gemini를 통한 LLM 기능
- Gradio를 사용한 매끄러운 채팅 인터페이스
이 아키텍처는 생성형 AI로 구동되는 고급 검색, 추천 또는 추론 시스템으로 확장할 수 있는 기반을 형성합니다.
8. (선택사항) Google Cloud Run에 배포

영화 추천 챗봇을 공개적으로 액세스할 수 있도록 하려면 Google Cloud Run에 배포하면 됩니다. Google Cloud Run은 완전 관리형 서버리스 플랫폼으로, 앱을 자동으로 확장하고 모든 인프라 문제를 추상화합니다.
이 배포에서는 다음을 사용합니다.
requirements.txt: Python 종속 항목 (Neo4j, Vertex AI, Gradio 등)을 정의합니다.Dockerfile: 애플리케이션을 패키징합니다..env.yaml- 런타임 시 환경 변수를 안전하게 전달
1단계: .env.yaml 준비
루트 디렉터리에 다음과 같은 내용으로 .env.yaml이라는 파일을 만듭니다.
NEO4J_URI: "neo4j+s://<your-aura-db-uri>"
NEO4J_USER: "neo4j"
NEO4J_PASSWORD: "<your-password>"
PROJECT_ID: "<your-gcp-project-id>"
LOCATION: "<your-gcp-region>" # e.g. us-central1
💡 이 형식은 확장 가능하고 버전 관리 가능하며 읽기 쉬우므로 --set-env-vars보다 선호됩니다.
2단계: 환경 변수 설정
터미널에서 다음 환경 변수를 설정합니다 (자리표시자 값을 실제 프로젝트 설정으로 바꿈).
# Set your Google Cloud project ID
export GCP_PROJECT='your-project-id' # Change this
# Set your preferred deployment region
export GCP_REGION='us-central1'
2단계: Artifact Registry 생성 및 컨테이너 빌드
# Artifact Registry repo and service name
export AR_REPO='your-repo-name' # Change this
export SERVICE_NAME='movies-chatbot' # Or any name you prefer
# Create the Artifact Registry repository
gcloud artifacts repositories create "$AR_REPO" \
--location="$GCP_REGION" \
--repository-format=Docker
# Authenticate Docker with Artifact Registry
gcloud auth configure-docker "$GCP_REGION-docker.pkg.dev"
# Build and submit the container image
gcloud builds submit \
--tag "$GCP_REGION-docker.pkg.dev/$GCP_PROJECT/$AR_REPO/$SERVICE_NAME"
이 명령어는 Dockerfile를 사용하여 앱을 패키징하고 컨테이너 이미지를 Google Cloud Artifact Registry에 업로드합니다.
3단계: Cloud Run에 배포
이제 런타임 구성을 위해 .env.yaml 파일을 사용하여 앱을 배포합니다.
gcloud run deploy "$SERVICE_NAME" \
--port=8080 \
--image="$GCP_REGION-docker.pkg.dev/$GCP_PROJECT/$AR_REPO/$SERVICE_NAME" \
--allow-unauthenticated \
--region=$GCP_REGION \
--platform=managed \
--project=$GCP_PROJECT \
--env-vars-file=.env.yaml
챗봇 액세스
배포되면 Cloud Run에서 다음과 같은 공개 URL을 제공합니다.
https://movies-reco-[UNIQUE_ID].${GCP_REGION}.run.app
브라우저에서 이 URL을 열어 배포된 Gradio 챗봇 인터페이스에 액세스하세요. GraphRAG, Gemini, Neo4j를 사용하여 영화 추천을 처리할 준비가 되었습니다.
참고 및 도움말
- 빌드 중에
Dockerfile가pip install -r requirements.txt를 실행하는지 확인합니다. - Cloud Shell을 사용하지 않는 경우 Vertex AI 및 Artifact Registry 권한이 있는 서비스 계정을 사용하여 환경을 인증해야 합니다.
- Google Cloud 콘솔 > Cloud Run에서 배포 로그와 측정항목을 모니터링할 수 있습니다.
Google Cloud 콘솔에서 Cloud Run을 방문하여 Cloud Run의 서비스 목록을 확인할 수도 있습니다. movies-chatbot 서비스는 여기에 나열된 서비스 중 하나여야 합니다 (유일한 서비스가 아닌 경우).

특정 서비스 이름 (이 경우 movies-chatbot)을 클릭하여 URL, 구성, 로그 등 서비스의 세부정보를 확인할 수 있습니다.

이제 영화 추천 챗봇이 배포되고, 확장 가능하며, 공유 가능해졌습니다. 🎉
9. 삭제
이 게시물에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.
10. 축하합니다
Neo4j, Vertex AI, Gemini를 사용하여 GraphRAG 기반의 생성형 AI 강화 영화 추천 챗봇을 빌드하고 배포했습니다. Neo4j의 그래프 네이티브 모델링 기능과 Vertex AI를 통한 시맨틱 검색, Gemini를 통한 자연어 추론을 결합하여 기본적인 검색을 넘어 사용자 의도를 이해하고, 연결된 데이터를 기반으로 추론하며, 대화형으로 응답하는 지능형 시스템을 만들었습니다.
이 Codelab에서는 다음 작업을 완료했습니다.
✅ Neo4j에서 실제 영화 지식 그래프를 빌드하여 영화, 배우, 장르, 관계를 모델링했습니다.
✅ Vertex AI의 텍스트 임베딩 모델을 사용하여 영화 줄거리 개요에 대한 생성된 벡터 임베딩
✅ GraphRAG 구현: 벡터 검색과 LLM 생성 Cypher 쿼리를 결합하여 심층적인 다중 홉 추론
✅ Gemini 통합을 통해 사용자 질문을 해석하고, 사이퍼 쿼리를 생성하고, 그래프 결과를 자연어로 요약
✅ Gradio를 사용하여 직관적인 채팅 인터페이스를 만들었습니다.
✅ 확장 가능한 서버리스 호스팅을 위해 선택적으로 챗봇을 Google Cloud Run에 배포
다음 단계
이 아키텍처는 영화 추천에만 국한되지 않으며 다음과 같이 확장할 수 있습니다.
- 도서 및 음악 탐색 플랫폼
- 학술 연구 어시스턴트
- 제품 추천 엔진
- 의료, 금융, 법률 지식 어시스턴트
복잡한 관계 + 풍부한 텍스트 데이터가 있는 모든 곳에서 지식 그래프 + LLM + 시맨틱 임베딩의 조합은 차세대 지능형 애플리케이션을 지원할 수 있습니다.
Gemini와 같은 멀티모달 생성형 AI 모델이 발전함에 따라 더욱 풍부한 컨텍스트, 이미지, 음성, 맞춤설정을 통합하여 진정으로 인간 중심적인 시스템을 구축할 수 있습니다.
계속 탐색하고 빌드하세요. Neo4j, Vertex AI, Google Cloud의 최신 소식을 확인하여 지능형 애플리케이션을 한 단계 더 발전시키세요. Neo4j GraphAcademy에서 실습 지식 그래프 튜토리얼을 자세히 살펴보세요.

