Codelab – tworzenie chatbota do rekomendacji filmów za pomocą Neo4j i Vertex AI

1. Omówienie

W tym ćwiczeniu w Codelabs utworzysz inteligentnego chatbota do rekomendowania filmów, łącząc możliwości Neo4j, Google Vertex AI i Gemini. Sercem tego systemu jest graf wiedzy Neo4j, który modeluje filmy, aktorów, reżyserów, gatunki itp. za pomocą bogatej sieci połączonych ze sobą węzłów i relacji.

Aby zwiększyć wygodę użytkowników dzięki zrozumieniu semantycznemu, wygenerujesz wektory zanurzeniowe z omówienia fabuły filmu za pomocą modelu text-embedding-004 (lub nowszego) w Vertex AI. Te elementy są indeksowane w Neo4j na potrzeby szybkiego wyszukiwania na podstawie podobieństwa.

Na koniec zintegrujesz Gemini, aby umożliwić korzystanie z interfejsu konwersacyjnego, w którym użytkownicy mogą zadawać pytania w języku naturalnym, np. „Co powinienem obejrzeć, jeśli podobał mi się film Interstellar?”, i otrzymywać spersonalizowane propozycje filmów na podstawie podobieństwa semantycznego i kontekstu graficznego.

W ramach tego ćwiczenia będziesz wykonywać czynności krok po kroku:

  1. Tworzenie grafu Neo4j Knowledge Graph z elementami i relacji powiązanymi z filmami
  2. Generowanie i wczytywanie wektorów dystrybucyjnych tekstu dla opisów filmów za pomocą Vertex AI
  3. Wdrożyć interfejs chatbota Gradio oparty na Gemini, który łączy wyszukiwanie wektorowe z wykonywaniem poleceń Cypher na podstawie grafu
  4. (Opcjonalnie) Wdróż aplikację w Cloud Run jako samodzielną aplikację internetową

Czego się nauczysz

  • Jak utworzyć i wypełnić graf wiedzy o filmach za pomocą Cypher i Neo4j
  • Jak używać Vertex AI do generowania wektorów dystrybucyjnych tekstu semantycznego i pracy z nimi
  • Jak łączyć modele LLM i grafy wiedzy w ramach inteligentnego wyszukiwania za pomocą GraphRAG
  • Jak za pomocą Gradio utworzyć przyjazny dla użytkownika interfejs czatu
  • Opcjonalne wdrażanie w Google Cloud Run

Czego potrzebujesz

  • przeglądarka Chrome,
  • konto Gmail,
  • projekt Google Cloud z włączonymi płatnościami;
  • bezpłatne konto Neo4j Aura DB,
  • podstawowa znajomość poleceń terminala i Pythona (przydatna, ale nie wymagana);

Ten warsztat programistyczny przeznaczony dla deweloperów na wszystkich poziomach (w tym początkujących) wykorzystuje w swojej przykładowej aplikacji język Python i Neo4j. Podstawowa znajomość języka Python i baz danych z wykresami może być przydatna, ale do zrozumienia tych zagadnień i prześledowania kursu nie jest wymagane żadne wcześniejsze doświadczenie.

a194b635f913211b.png

2. Konfiguracja Neo4j AuraDB

Neo4j to najpopularniejsza natywna baza danych typu graf, która przechowuje dane w postaci sieci węzłów (obiektów) i relacji (połączeń między obiektami). Dzięki temu jest idealna do zastosowań, w których kluczowe znaczenie ma zrozumienie połączeń, np. w przypadku rekomendacji, wykrywania oszustw czy grafów wiedzy. W przeciwieństwie do relacyjnych lub dokumentowych baz danych, które opierają się na sztywnych tabelach lub hierarchicznych strukturach, elastyczny model grafu Neo4j umożliwia intuicyjne i wydajne przedstawianie złożonych, powiązanych ze sobą danych.

Zamiast porządkowania danych w wierszach i tablicach, jak w przypadku relacyjnych baz danych, Neo4j używa modelu grafu, w którym informacje są reprezentowane jako węzły (elementy) i relacje (połączenia między tymi elementami). Ten model umożliwia wyjątkowo intuicyjną pracę z danymi, które są ze sobą powiązane, np. z ludźmi, miejscami, produktami lub, jak w naszym przypadku, z filmami, aktorami i gatunkami.

Na przykład w zbiorze danych o filmach:

  • Węzeł może reprezentować element Movie, Actor lub Director
  • Relacja może być typu ACTED_IN lub DIRECTED

Dzięki tej strukturze możesz łatwo zadawać pytania w rodzaju:

  • W jakich filmach zagrał ten aktor?
  • Kto pracował z Christopherem Nolanem?
  • Jakie filmy są podobne na podstawie wspólnych aktorów lub gatunków?

Neo4j zawiera potężny język zapytań o nazwie Cypher, który został opracowany specjalnie do wykonywania zapytań do grafów. Cypher umożliwia wyrażanie złożonych wzorców i połączeń w sposób zwięzły i czytelny.

Neo4j oferuje wiele opcji wdrażania w zależności od potrzeb:

  • Samodzielne zarządzanie: uruchom Neo4j w ramach własnej infrastruktury za pomocą Neo4j Desktop lub obrazu Dockera (lokalnie lub w własnej chmurze). 397a3c535b52d3f6.png
  • Zarządzanie w chmurze: wdróż Neo4j u popularnych dostawców usług w chmurze, korzystając z ofert w Marketplace.
  • W pełni zarządzana: użyj usługi Neo4j AuraDB, czyli w pełni zarządzanej bazy danych w chmurze jako usługi od firmy Neo4j, która obsługuje inicjowanie, skalowanie, tworzenie kopii zapasowych i zabezpieczenia.

W tym ćwiczeniu użyjemy Neo4j AuraDB Free, bezpłatnej wersji AuraDB. Udostępnia ona w pełni zarządzaną instancję bazy danych typu graf z wystarczającą ilością miejsca na dane i funkcjami do tworzenia prototypów, uczenia się i małych aplikacji. Jest to idealne rozwiązanie do tworzenia chatbota do rekomendowania filmów na podstawie generatywnej AI.

W ramach tego ćwiczenia utworzysz bezpłatną instancję AuraDB, połączysz ją z aplikacją za pomocą danych logowania i użyjesz jej do przechowywania grafu wiedzy o filmach oraz wykonywania na nim zapytań.

Dlaczego wykresy?

W tradycyjnych relacyjnych bazach danych udzielenie odpowiedzi na pytania w rodzaju „Które filmy są podobne do Inception ze względu na obsadę lub gatunek?” wymagałoby wykonania skomplikowanych operacji JOIN na wielu tabelach. Wraz ze wzrostem głębokości relacji spada wydajność i czytelność.

Bazy danych typu Neo4j są jednak skonstruowane tak, aby skutecznie przeszukiwać relacje, dzięki czemu są idealne do systemów rekomendacji, wyszukiwania semantycznego i inteligentnych asystentów. Pomagają one uchwycić kontekst rzeczywisty, np. sieci współpracy, wątki fabularne czy preferencje widzów, które trudno jest przedstawić za pomocą tradycyjnych modeli danych.

Łącząc te połączone dane z modelami LLM, takimi jak Gemini, oraz wektorowymi reprezentacjami z Vertex AI, możemy znacznie ulepszyć działanie chatbota, umożliwiając mu wnioskowanie, wyszukiwanie i odpowiadanie w bardziej spersonalizowany i trafny sposób.

Tworzenie bezpłatnej bazy danych Neo4j AuraDB

  1. Wejdź na https://console.neo4j.io.
  2. Zaloguj się na konto Google lub za pomocą adresu e-mail.
  3. Kliknij „Utwórz bezpłatną instancję”.
  4. Podczas przygotowywania instancji pojawi się wyskakujące okienko z danymi logowania do bazy danych.

Pobierz i bezpiecznie zapisz te informacje z wyskakującego okienka, ponieważ są one niezbędne do połączenia aplikacji z 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>

Tych wartości użyjesz w następnym kroku do skonfigurowania pliku .env w projekcie, aby uwierzytelniać się w Neo4j.

a1e29e56e6c412fc.png

Neo4j AuraDB Free nadaje się do tworzenia aplikacji, eksperymentowania i stosowania na małą skalę, np. w tym Codelab. Oferuje ona duże limity wykorzystania, obsługując do 200 000 węzłów400 000 związków. Chociaż zawiera wszystkie niezbędne funkcje potrzebne do tworzenia i wyszukiwania grafu wiedzy, nie obsługuje zaawansowanych konfiguracji, takich jak niestandardowe wtyczki czy zwiększona ilość miejsca na dane. W przypadku zadań produkcyjnych lub większych zbiorów danych możesz przejść na wyższy abonament AuraDB, który oferuje większą pojemność, wydajność i funkcje klasy korporacyjnej.

To koniec sekcji poświęconej konfigurowaniu backendu Neo4j AuraDB. W następnym kroku utworzymy projekt Google Cloud, sklonujemy repozytorium i skonfigurujemy niezbędne zmienne środowiskowe, aby przygotować środowisko programistyczne przed rozpoczęciem pracy z Codelab.

3. Zanim zaczniesz

Utwórz projekt

  1. W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud.
  2. Sprawdź, czy w projekcie Cloud włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności .
  3. Użyjesz Cloud Shell, czyli środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane w bq. Kliknij Aktywuj Cloud Shell u góry konsoli Google Cloud.

Obraz przycisku aktywowania Cloud Shell

  1. Po połączeniu z Cloud Shell sprawdź, czy jesteś już uwierzytelniony i czy projekt jest ustawiony na identyfikator Twojego projektu, używając tego polecenia:
gcloud auth list
  1. Aby sprawdzić, czy polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project
  1. Jeśli projekt nie jest ustawiony, użyj tego polecenia:
gcloud config set project <YOUR_PROJECT_ID>
  1. Włącz wymagane interfejsy API za pomocą polecenia pokazanego poniżej. Może to potrwać kilka minut, więc zachowaj cierpliwość.
gcloud services enable cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com 

Po pomyślnym wykonaniu polecenia powinien wyświetlić się komunikat: Operation .... finished successfully (Operacja .... została zakończona pomyślnie).

Alternatywą dla polecenia gcloud jest konsola, w której możesz wyszukać poszczególne usługi lub skorzystać z tego linku.

Jeśli pominiesz któryś interfejs API, zawsze możesz go włączyć w trakcie implementacji.

Informacje o poleceniach i użytkowaniu gcloud znajdziesz w dokumentacji.

Klonowanie repozytorium i konfigurowanie ustawień środowiska

Następnym krokiem jest sklonowanie przykładowego repozytorium, do którego będziemy się odwoływać w dalszej części tego samouczka. Zakładając, że jesteś w Cloud Shell, uruchom to polecenie w katalogu domowym:

git clone https://github.com/sidagarwal04/neo4j-vertexai-codelab.git

Aby uruchomić edytor, na pasku narzędzi w oknie Cloud Shell kliknij Otwórz edytor. W lewym górnym rogu kliknij pasek menu i wybierz Plik → Otwórz folder, jak pokazano na ilustracji:

66221fd0d0e5202f.png

Wybierz folder neo4j-vertexai-codelab. Powinien się on otworzyć z podobną strukturą jak ta poniżej:

e49542efd70de22e.png

Następnie musimy skonfigurować zmienne środowiskowe, których będziemy używać w trakcie ćwiczeń. Kliknij plik example.env. Powinieneś zobaczyć zawartość pokazaną poniżej:

NEO4J_URI=
NEO4J_USER=
NEO4J_PASSWORD=
NEO4J_DATABASE=
PROJECT_ID=
LOCATION=

Utwórz teraz nowy plik o nazwie .env w tym samym folderze, w którym znajduje się plik example.env, i skopiuj zawartość dotychczasowego pliku example.env. Zaktualizuj te zmienne:

  • NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD i NEO4J_DATABASE:
  • Podaj te wartości, używając danych logowania podanych podczas tworzenia instancji Neo4j AuraDB Free w poprzednim kroku.
  • W przypadku AuraDB Free wartość parametru NEO4J_DATABASE to zwykle neo4j.
  • PROJECT_IDLOCATION:
  • Jeśli uruchamiasz ćwiczenie w Google Cloud Shell, możesz pozostawić te pola puste, ponieważ zostaną one automatycznie wywnioskowane z aktywnej konfiguracji projektu.
  • Jeśli uruchamiasz go lokalnie lub poza Cloud Shell, zaktualizuj parametr PROJECT_ID, podając identyfikator utworzonego wcześniej projektu Google Cloud, a następnie ustaw parametr LOCATION na region wybrany dla tego projektu (np. us-central1).

Gdy wypełnisz te wartości, zapisz plik .env. Ta konfiguracja pozwoli Twojej aplikacji na połączenie z usługami Neo4j i Vertex AI.

Ostatnim krokiem w konfigurowaniu środowiska programistycznego jest utworzenie środowiska wirtualnego Pythona i zainstalowanie wszystkich wymaganych zależności wymienionych w pliku requirements.txt. Te zależności obejmują biblioteki potrzebne do pracy z Neo4j, Vertex AI, Gradio i innymi.

Najpierw utwórz środowisko wirtualne o nazwie .venv, uruchamiając to polecenie:

python -m venv .venv

Po utworzeniu środowiska należy je aktywować za pomocą tego polecenia:

source .venv/bin/activate

Na początku prompta w terminalu powinien pojawić się ciąg znaków (.venv), co oznacza, że środowisko jest aktywne. Na przykład: (.venv) yourusername@cloudshell:

Teraz zainstaluj wymagane zależności, uruchamiając:

pip install -r requirements.txt

Oto podsumowanie najważniejszych zależności wymienionych w pliku:

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

Gdy wszystkie zależności zostaną zainstalowane, Twoje lokalne środowisko Pythona zostanie w pełni skonfigurowane do uruchamiania skryptów i botów na potrzeby tego Codelab.

Świetnie! Możemy przejść do następnego kroku, czyli poznania zbioru danych i przygotowania go do tworzenia grafu oraz wzbogacania semantycznego.

4. Przygotowanie zbioru danych Movies

Naszym pierwszym zadaniem jest przygotowanie zbioru danych Filmy, którego użyjemy do zbudowania grafu wiedzy i zarządzania chatbotem z rekomendacjami. Zamiast zaczynać od zera, użyjemy istniejącego otwartego zbioru danych i na jego podstawie zbudujemy nowy model.

Używamy The Movies Dataset (Zbiór danych Movies) Rounaka Banika, znanego publicznego zbioru danych dostępnego na Kaggle. Zawiera metadane ponad 45 tys. filmów z TMDB, w tym informacje o obsadzie, ekipie filmowej, hasłach, ocenach i inne.

9e3a1dc4c286af1b.png

Aby stworzyć niezawodny i skuteczny chatbot rekomendujący filmy, musisz zacząć od czystych, spójnych i uporządkowanych danych. Zbiór danych The Movies Dataset z Kaggle to bogaty zasób ponad 45 tys. rekordów filmów i szczegółowych metadanych, w tym gatunków, obsady, ekipy filmowej i innych informacji. Zawiera on jednak również szum, niespójności i zagnieżdżone struktury danych, które nie nadają się do modelowania grafów ani osadzania semantycznego.

Aby temu zaradzić, przetworzyliśmy i znormalizowaliśmy zbiór danych, aby był on odpowiedni do tworzenia grafu wiedzy Neo4j i generowania wysokiej jakości wektorów zastępczych. Ten proces obejmował:

  • Usuwanie duplikatów i niekompletnych rekordów
  • ujednolicenie kluczowych pól (np. nazw gatunków, nazw osób);
  • spłaszczania złożonych zagnieżdżonych struktur (np. obsady i ekipy filmowej) w uporządkowane pliki CSV;
  • Wybór reprezentatywnego podzbioru około 12 tys. filmów,aby nie przekroczyć limitów bezpłatnej wersji Neo4j AuraDB

Normalizowane dane wysokiej jakości pomagają w tym, aby:

  • Jakość danych: minimalizuje błędy i niespójności, co pozwala na bardziej dokładne rekomendacje.
  • Wydajność zapytań: uproszczona struktura zwiększa szybkość wyszukiwania i zmniejsza nadmiarowość.
  • Dokładność wstawiania: prawidłowe dane wejściowe prowadzą do bardziej znaczących i kontekstualnych wektorów embeddingu

Do oczyszczonego i znormalizowanego zbioru danych możesz uzyskać dostęp w folderze normalized_data/ w tym repozytorium GitHub. Ten zbiór danych jest też powielany w zasośniku Google Cloud Storage, aby można było łatwo uzyskać do niego dostęp w przyszłych skryptach Pythona.

Dane są już oczyszczone i gotowe do załadowania do Neo4j, więc możemy zacząć budować graf wiedzy o filmach.

5. Tworzenie grafu wiedzy Filmy

Aby umożliwić działanie chatbota do rekomendowania filmów z wykorzystaniem technologii generatywnej AI, musimy uporządkować zbiór danych o filmach w sposób, który uwzględnia bogatą sieć połączeń między filmami, aktorami, reżyserami, gatunkami i innymi metadanymi. W tej sekcji utworzymy w Neo4j Graf wiedzy o filmach, korzystając z przygotowanego wcześniej wyczyszczonego i znormalizowanego zbioru danych.

Do przetwarzania plików CSV hostowanych w publicznym zasobniku Google Cloud Storage (GCS) użyjemy funkcji LOAD CSV w Neo4j. Pliki te reprezentują różne komponenty zbioru danych o filmach, takie jak filmy, gatunki, obsada, ekipa, firmy produkcyjne i oceny użytkowników.

Krok 1. Utwórz ograniczenia i indeksy

Przed importowaniem danych warto utworzyć ograniczenia i indeksy, aby zapewnić integralność danych i zoptymalizować wydajność zapytań.

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);

Krok 2. Zaimportuj metadane i relacje filmów

Zobaczmy, jak importujemy metadane filmów za pomocą polecenia LOAD CSV. W tym przykładzie tworzone są węzły Filmu z kluczowymi atrybutami, takimi jak tytuł, opis, język i czas trwania:

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");

Podobnych poleceń Cypher można używać do importowania powiązanych elementów, takich jak gatunki, firmy produkcyjne, języki, kraje, obsada, ekipa i oceny.

Ładowanie pełnego wykresu za pomocą Pythona

Zamiast ręcznego wykonywania wielu zapytań Cypher, zalecamy użycie automatycznego skryptu Pythona udostępnionego w tym laboratorium kodu.

Skrypt graph_build.py wczytuje cały zbiór danych z GCS do instancji Neo4j AuraDB, używając danych logowania z pliku .env.

python graph_build.py

Skrypt kolejno wczyta wszystkie niezbędne pliki CSV, utworzy węzły i relacje oraz uporządkuje pełny wykres wiedzy o filmach.

Weryfikowanie wykresu

Po załadowaniu możesz sprawdzić graf, wykonując proste zapytania Cypher, takie jak:

MATCH (m:Movie) RETURN m LIMIT 5;
MATCH (a:Actor)-[:ACTED_IN]->(m:Movie) RETURN a.name, m.title LIMIT 5;

Twój wykres powinien być teraz wypełniony filmami, osobami, gatunkami itp., aby można było go wzbogacić semantycznie w następnym kroku.

6. Generowanie i wczytywanie wektorów dystrybucyjnych w celu przeprowadzenia wyszukiwania według podobieństwa wektorowego

Aby umożliwić wyszukiwanie semantyczne w naszym czacie, musimy wygenerować wektory zastępcze dla opisów filmów. Te elementy zamieniają dane tekstowe w wektory liczbowe, które można porównywać pod kątem podobieństwa. Dzięki temu chatbot może wyszukiwać odpowiednie filmy, nawet jeśli zapytanie nie pasuje dokładnie do tytułu lub opisu.

bcca07eaee60787b.png

Opcja 1. Załaduj wcześniej obliczone embeddingi za pomocą Cypher

Aby szybko dołączyć elementy do odpowiednich węzłów Movie w Neo4j, uruchom w przeglądarce Neo4j to polecenie 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)

To polecenie odczytuje wektory osadzania z pliku CSV i dołączy je jako właściwości (m.embedding) do każdego węzła Movie.

Opcja 2. Załaduj wbudowane modele za pomocą Pythona

Możesz też wczytać uczenia maszynowego za pomocą skryptu Pythona. To podejście jest przydatne, jeśli pracujesz w własnym środowisku lub chcesz zautomatyzować proces:

python load_embeddings.py

Ten skrypt odczytuje ten sam plik CSV z GCS i zapisze wbudowane dane w Neo4j przy użyciu sterownika Neo4j w Pythonie.

[Opcjonalnie] Generowanie elementów do umieszczania samodzielnie (w przypadku eksploracji)

Jeśli chcesz się dowiedzieć, jak generowane są wektory, możesz zapoznać się z logiką w samym skrypcie generate_embeddings.py. Używa ona Vertex AI do umieszczania tekstu z opisem filmu za pomocą modelu text-embedding-004.

Aby wypróbować to samodzielnie, otwórz i uruchom sekcję kodu służącą do generowania treści do osadzenia. Jeśli używasz Cloud Shell, możesz skomentować ten wiersz, ponieważ Cloud Shell jest już uwierzytelnione za pomocą Twojego aktywnego konta:

# os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "./service-account.json"

Gdy reprezentacje zostaną załadowane do Neo4j, twój graf wiedzy o filmach stanie się świadomy semantycznie – będzie gotowy do obsługi zaawansowanego wyszukiwania z użyciem języka naturalnego na podstawie podobieństwa wektorowego.

7. Czatbot do rekomendacji filmów

Gdy masz już gotowy graf wiedzy i wektory zanurzone, możesz połączyć wszystko w pełnowartościowym interfejsie konwersacyjnym – czatbot do rekomendowania filmów oparty na generatywnej AI.

Ten chatbot jest napisany w Pythonie z użyciem Gradio, lekkiej platformy internetowej do tworzenia intuicyjnych interfejsów użytkownika. Główna logika znajduje się w app.py, który łączy się z Twoim wystąpieniem Neo4j AuraDB i korzysta z Google Vertex AI oraz Gemini do przetwarzania zapytań w języku naturalnym i wydawania na nie odpowiedzi.

Jak to działa

  1. Użytkownik wpisze zapytanie w języku naturalnym, np. „Poleć mi thrillery science fiction, takie jak Interstellar”
  2. Wygeneruj wektor dystrybucyjny dla zapytania przy użyciu modelu text-embedding-004 w Vertex AI.
  3. Wykonaj wyszukiwanie wektorowe w Neo4j, aby pobrać filmy podobne semantycznie.
  4. Używaj Gemini do:
  • Interpretowanie zapytania w kontekście
  • Wygeneruj niestandardowe zapytanie Cypher na podstawie wyników wyszukiwania wektorów i schematu Neo4j.
  • Wykonaj zapytanie, aby wyodrębnić powiązane dane z wykresu (np.aktorów, reżyserów, gatunki).
  • Podsumowanie wyników w formie rozmowy z użytkownikiem

c628f853e86ff61b.png

To hybrydowe podejście, znane jako GraphRAG (Graph Retrieval-Augmented Generation), łączy wyszukiwanie semantyczne i strukturyzowane rozumowanie, aby generować bardziej dokładne, kontekstowe i wyjaśnialne rekomendacje.

Uruchamianie czatbota lokalnie

Aktywuj środowisko wirtualne (jeśli jeszcze nie jest aktywne), a potem uruchom chatbota:

python app.py

Powinny się wyświetlić dane wyjściowe podobne do tych:

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()`.

💡 Aby udostępnić chatbota na zewnątrz, ustaw wartość share=True w funkcji launch() w app.py.

Interakcja z czatbotem

Aby uzyskać dostęp do interfejsu chatbota, otwórz lokalny adres URL wyświetlany w terminalu (zwykle jest to 👉 http://0.0.0.0:8080).

Możesz zadać takie pytania:

  • „Co obejrzeć, jeśli podobał mi się film Interstellar?”
  • „Zaproponuj film romantyczny wyreżyserowany przez Norę Ephron”
  • „Chcę obejrzeć film familijny z Tomem Hanksem”
  • „Znajdź thrillery z tematem sztucznej inteligencji”

a194b635f913211b.png

Członek zespołu pomocy:

✅ Zrozumienie zapytania

✅ Znajdowanie sekwencji filmowych o podobnym znaczeniu za pomocą wektorów dystrybucyjnych

✅ Wygeneruj i uruchom zapytanie Cypher, aby pobrać powiązany kontekst grafu.

✅ W kilka sekund wyświetla przyjazną, spersonalizowaną rekomendację

Co masz teraz

Właśnie udało Ci się utworzyć chatbota do zamawiania biletów na filmy na podstawie GraphRAG, który łączy:

  • Wyszukiwanie wektorowe dopasowuje treści na podstawie semantyki.
  • Rozumowanie w grafie wiedzy za pomocą Neo4j
  • Funkcje LLM w Gemini
  • Płynny interfejs czatu w Gradio

Ta architektura stanowi podstawę, którą możesz rozszerzyć o bardziej zaawansowane systemy wyszukiwania, rekomendacji lub rozumowania oparte na sztucznej inteligencji ogólnej.

8. (Opcjonalnie) Wdrażanie w Google Cloud Run

a194b635f913211b.png

Jeśli chcesz udostępnić swojego chatbota z rekomendacjami filmowymi publicznie, możesz go wdrożyć w Google Cloud Run – w pełni zarządzanej, bezserwerowej platformie, która automatycznie skaluje Twoją aplikację i zapewnia obsługę całej infrastruktury.

To wdrożenie korzysta z:

  • requirements.txt – do definiowania zależności Pythona (Neo4j, Vertex AI, Gradio itp.);
  • Dockerfile – spakowanie aplikacji.
  • .env.yaml – do bezpiecznego przekazywania zmiennych środowiskowych w czasie wykonywania

Krok 1. Przygotuj .env.yaml

W katalogu głównym utwórz plik o nazwie .env.yaml z taką zawartością:

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

💡 Ten format jest preferowany w odróżnieniu od --set-env-vars, ponieważ jest bardziej skalowalny, umożliwia kontrolę wersji i jest czytelny.

Krok 2. Skonfiguruj zmienne środowiskowe

W terminalu ustaw te zmienne środowiskowe (zastąp wartości zastępcze rzeczywistymi ustawieniami projektu):

# Set your Google Cloud project ID
export GCP_PROJECT='your-project-id'  # Change this

# Set your preferred deployment region
export GCP_REGION='us-central1'

Krok 2. Utwórz rejestr z elementami i utwórz kontener

# 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"

To polecenie tworzy pakiet aplikacji za pomocą Dockerfile i przesyła obraz kontenera do Google Cloud Artifact Registry.

Krok 3. Wdróż w Cloud Run

Teraz wdróż aplikację, używając pliku .env.yaml do konfiguracji w czasie wykonywania:

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

Otwieranie czatu

Po wdrożeniu Cloud Run udostępni publiczny adres URL, np.:

https://movies-reco-[UNIQUE_ID].${GCP_REGION}.run.app

Otwórz ten adres URL w przeglądarce, aby uzyskać dostęp do wdrożonego interfejsu chatbota Gradio, który obsługuje rekomendacje filmów za pomocą GraphRAG, Gemini i Neo4j.

Uwagi i wskazówki

  • Upewnij się, że podczas kompilacji Dockerfile działa pip install -r requirements.txt.
  • Jeśli nie używasz Cloud Shell, musisz uwierzytelnić swoje środowisko za pomocą konta usługi z uprawnieniami Vertex AI i Artifact Registry.
  • Logi i dane dotyczące wdrożenia możesz monitorować w sekcji Konsola Google Cloud > Cloud Run.

W konsoli Google Cloud możesz też otworzyć Cloud Run, aby wyświetlić listę usług w Cloud Run. Usługa movies-chatbot powinna być jedną z wymienionych usług (jeśli nie jedyną).

bccf390b7099e73b.png

Aby wyświetlić szczegóły usługi, takie jak adres URL, konfiguracje, dzienniki i inne, kliknij nazwę konkretnej usługi (w naszym przypadku movies-chatbot).

3709b596167cdaa0.png

Twój chatbot z rekomendacjami filmów jest teraz wdrożony, skalowalny i udostępniony do użytku innym osobom. 🎉

9. Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby wykorzystane w tym poście, wykonaj te czynności:

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
  2. Na liście projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

10. Gratulacje

Udało Ci się utworzyć i wdrażać chatbota do rekomendowania filmów korzystającego z technologii GraphRAG i generatywnej AI za pomocą Neo4j, Vertex AIGemini. Połączenie możliwości modelowania w formie grafu w Neo4j z wyszukiwaniem semantycznym w Vertex AI i rozpoznawaniem języka naturalnego w Gemini pozwala tworzyć inteligentne systemy, które wykraczają poza podstawową wyszukiwarkę – rozumieją zamiary użytkownika, wyciągają wnioski na podstawie połączonych danychodpowiadają w formie konwersacyjnej.

W tym ćwiczeniu udało Ci się:

Utworzyłeś w Neo4j Graf wiedzy o filmach, aby modelować filmy, aktorów, gatunki i relacje między nimi.

Wygenerowane wektory dystrybucyjne dla podsumowań fabuły filmu za pomocą modeli wektorów dystrybucyjnych tekstu w Vertex AI

Wdrożony GraphRAG, który łączy wyszukiwanie wektorowe z zapytaniami Cypher generowanymi przez LLM w celu uzyskania głębszego wnioskowania wieloetapowego

Zintegrowany Gemini do interpretowania pytań użytkowników, generowania zapytań Cypher i podsumowywania wyników grafu w języku naturalnym

Utworzył(a) intuicyjny interfejs czatu za pomocą Gradio

Opcjonalnie wdróż chatbota w Google Cloud Run, aby uzyskać skalowalny hosting bezserwerowy.

Co dalej?

Ta architektura nie jest ograniczona do rekomendacji filmów – można ją rozszerzyć o:

  • Platformy do odkrywania książek i muzyki
  • Asystenci naukowi
  • Systemy rekomendacji produktów
  • Asystenci wiedzy z zakresu opieki zdrowotnej, finansów i prawa

Wszędzie tam, gdzie występują złożone relacje i bogate dane tekstowe, ta kombinacja grafów wiedzy, modeli LLM i umieszczeń semantycznych może napędzać inteligentne aplikacje nowej generacji.

Wraz z rozwojem multimodalnych modeli generatywnej AI, takich jak Gemini, będziesz mieć możliwość korzystania z jeszcze bogatszego kontekstu, obrazów, mowy i personalizacji, aby tworzyć systemy naprawdę skoncentrowane na człowieku.

Kontynuuj eksplorowanie i tworzenie aplikacji, a także bądź na bieżąco z najnowszymi informacjami z Neo4j, Vertex AIGoogle Cloud, aby przenieść swoje inteligentne aplikacje na wyższy poziom. Więcej praktycznych samouczków dotyczących Grafu wiedzy znajdziesz w Neo4j GraphAcademy.

Dokumenty referencyjne