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

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

Informacje o tym ćwiczeniu (w Codelabs)

subjectOstatnia aktualizacja: kwi 4, 2025
account_circleAutorzy: Romin Irani and Siddhant Agarwal(GDE)

1. Omówienie

W tym ćwiczeniu w Codelab utworzysz inteligentnego chatbota do rekomendowania filmów, korzystając z Neo4j, Vertex AI i Gemini. Chatbot korzysta z grafu wiedzy Neo4j jako podstawy do reprezentowania filmów, aktorów, reżyserów, producentów, gatunków itp. Aby ulepszyć wyszukiwanie, wygenerujesz wektory dystrybucyjne z omówienia fabuły filmu za pomocą modelu text-embedding-004 Vertex AI.

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 sugestie filmów na podstawie podobieństwa semantycznego i kontekstu graficznego.

W ramach tego ćwiczenia będziesz wykonywać czynności w kolejności:

  1. Tworzenie grafu wiedzy Neo4j z danymi dotyczącymi filmów
  2. wzbogacanie danych o filmach przez generowanie wektorów dystrybucyjnych tekstu na podstawie opisów filmów lub ich fabuł za pomocą wektorów dystrybucyjnych tekstu z Vertex AI;
  3. Utwórz interfejs chatbota Gradio, który wykorzystuje Gemini do wyszukiwania semantycznego i pobierania danych z Neo4j.
  4. Opcjonalnie możesz wdrożyć ją w Google Cloud Run jako samodzielną aplikację internetową, jak pokazano poniżej:

Czego się nauczysz

  • Jak utworzyć graf wiedzy o filmach za pomocą Cypher i Neo4j.
  • Jak używać Vertex AI do generowania wektorów dystrybucyjnych semantycznych tekstu.
  • Jak zintegrować Neo4j i Gemini w celu inteligentnego wyszukiwania wektorowego.
  • Jak utworzyć i uruchomić interfejs użytkownika konwersacyjnego chatbota za pomocą Gradio.

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;

Ten warsztat programistyczny przeznaczony dla deweloperów na wszystkich poziomach (w tym początkujących) wykorzystuje w przykładowej aplikacji język Python i Neo4j. Podstawowa znajomość języka Python i baz danych z grafami może być przydatna, ale do zrozumienia tych pojęć i prześledowania kursu nie jest wymagane żadne wcześniejsze doświadczenie. 121747afa89e0e6.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). Dzięki temu modelowi można wyjątkowo intuicyjnie pracować z danymi, które są ze sobą powiązane, np. z informacjami o osobach, miejscach, produktach lub, jak w naszym przypadku, o filmach, aktorach i gatunkach.

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 w popularnych usługach chmurowych za pomocą 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 zajmuje się tworzeniem, skalowaniem, tworzeniem kopii zapasowych i zabezpieczeniami.

W tym ćwiczeniu będziemy używać 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 bazach danych relacyjnych udzielenie odpowiedzi na pytania w rodzaju "Które filmy są podobne do Inception na podstawie wspólnej obsady lub gatunku?" wymagałoby wykonania złożonych 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 użycia, obsługując do 200 000 węzłów400 000 związków. Chociaż zawiera wszystkie niezbędne funkcje potrzebne do tworzenia i wyszukiwania danych w grafie 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 zapewnia 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, używając 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 podobny do tego:

Operation "operations/..." finished successfully.

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, możesz go włączyć w trakcie implementacji.

Więcej informacji 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ę otworzyć folder z tymi plikami:

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_PASSWORDNEO4J_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).

Po wypełnieniu tych wartości zapisz plik .env. Ta konfiguracja umożliwi Twojej aplikacji 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 (.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, kluczowych słowach, ocenach i wiele innych.

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 to osiągnąć, 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 nadmiar
  • Dokładność wektorów: czyste dane wejściowe prowadzą do bardziej znaczących i kontekstualnych wektorów

Oczyszczony i znormalizowany zbiór danych znajdziesz w folderze normalized_data/ w 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 na podstawie sztucznej inteligencji ogólnej, musimy uporządkować zbiór danych o filmach w sposób, który odzwierciedla bogatą sieć powiązań 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 zaimportować metadane filmu 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_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 graf wiedzy o filmach.

Sprawdzanie poprawności 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.

⚠️ Uwaga dotycząca skuteczności

Generowanie wektorów w przypadku tysięcy opisów filmów w czasie rzeczywistym jest czasochłonne i wymagające dużych zasobów. Aby to ćwiczenie było efektywne i dostępne, z wykorzystaniem usługi Vertex AI z uprzednio obliczonego embeddingu

text-embedding-004

model i zapisać je w dostępnym publicznie pliku CSV.

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 za pomocą 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 on 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 kodu embed. 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"

⚠️ Przeprowadzenie pełnego procesu generowania wbudowanych obiektów spowoduje wykorzystanie limitu Vertex AI i może zająć dużo czasu, zwłaszcza w przypadku tysięcy rekordów.

Gdy w Neo4j zostaną załadowane wektory, 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 z rekomendacjami filmowymi

Gdy masz już gotowy graf wiedzy i wektory, możesz połączyć je w jednym interfejsie konwersacyjnym – czacie z rekomendacjami filmów.

Chatbot został zaimplementowany przy użyciu Pythona i Gradio, lekkiej platformy do tworzenia interfejsów internetowych. Główna logika znajduje się w skrypcie chatbot.py, który łączy się z Twoim wystąpieniem Neo4j AuraDB i wykonuje wyszukiwanie podobieństwa wektorów na podstawie wektorów filmów na podstawie promptów w języku naturalnym.

Chatbot korzysta z Gemini, aby zwiększać wygodę użytkowników przez dopracowywanie zapytań i formatowanie odpowiedzi. Wyniki wyszukiwania są zwracane przez Neo4j przy użyciu kombinacji kontekstu grafu i podobieństwa wektorowego.

Uruchamianie czatbota lokalnie

Aby uruchomić chatbota, aktywuj środowisko wirtualne (jeśli nie zostało to jeszcze zrobione) i uruchom:

python chatbot.py

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

Old index dropped
Creating new vector index
Vector index created successfully
* Running on local URL:  http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.

💡 Jeśli widzisz ostrzeżenia dotyczące zastąpienia funkcji związanych z allow_flagging, możesz je na razie zignorować – aplikacja będzie działać.

Interakcja z czatbotem

Po uruchomieniu otwórz adres URL wyświetlany w terminalu. Zazwyczaj jest to: 👉 http://127.0.0.1:7860

Pojawi się prosty interfejs czatu, w którym możesz wpisywać zapytania w języku naturalnym, takie jak:

  • „Poleć mi thrillery science fiction, takie jak Incepcja”
  • „Zaproponuj romantyczny film z Tomem Hanksem”
  • „Chcę obejrzeć optymistyczny dramat rodzinny”

c76b6c6e2bcb25d9.png

Czatbot przetwarza zapytanie, wykonuje wyszukiwanie wektorowe na podstawie opisów filmów i wyświetla listę najbardziej odpowiednich filmów, w tym ich tytuły, opisy i lata wydania.

Każda rekomendacja jest wyświetlana na karcie z ładnie sformatowanymi wynikami.

Twój czatbot działa teraz lokalnie, więc masz w pełni funkcjonalny system rekomendacji filmów oparty na generatywnej AI, który łączy to, co najlepsze z grafów wiedzy, modeli LLM (Gemini)wyszukiwania semantycznego, korzystając z wektorów Vertex AI.

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

Jeśli chcesz, aby Twój chatbot do rekomendacji filmów był publicznie dostępny w internecie, możesz go wdrożyć w Google Cloud Run – w ramach tej w pełni zarządzanej platformy bezserwerowej automatycznie skalujesz swoją aplikację. 121747afa89e0e6.png

Przed wdrożeniem sprawdź, czy w projekcie znajdują się te pliki (są one już dostępne w tym repozytorium):

  • requirements.txt – zawiera listę wszystkich zależności Pythona wymaganych do uruchomienia aplikacji, w tym Neo4j i Vertex AI.
  • Dockerfile – definiuje środowisko kontenera, w tym obraz podstawowy, instalację zależności i sposób uruchamiania aplikacji.

Krok 1. 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

Przed wdrożeniem upewnij się, że wszystkie wymagane zmienne środowiskowe (np. Uprawnienia Neo4j i ustawienia projektu są wymienione w pliku .env.

Aby dynamicznie przekonwertować plik .env do formatu zgodnego z flagą --set-env-vars, użyj tego fragmentu kodu:

ENV_VARS=$(grep -v '^#' .env | sed 's/ *= */=/g' | xargs -I{} echo -n "{},")
ENV_VARS=${ENV_VARS%,}

Teraz wdróż aplikację:

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 \
 
--set-env-vars="GCP_PROJECT=$GCP_PROJECT,GCP_REGION=$GCP_REGION,$ENV_VARS"

Otwieranie czatu

Po wdrożeniu Cloud Run zwróci publiczny adres URL usługi w formacie:

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

Otwórz adres URL w przeglądarce, aby uzyskać dostęp do chatbota. Powinieneś zobaczyć to samo środowisko Gradio działające w chmurze, które może odbierać zapytania i odpowiadać na nie rekomendacjami filmów.

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 zobaczyć 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 wdrożyć chatbota do rekomendowania filmów opartego na grafie i wykorzystującego generatywną AI za pomocą Neo4j, Vertex AI i Gemini. Połączenie możliwości modelowania Neo4j z potęgą semantyki w ramach osadzania Vertex AI i inteligencji konwersacyjnej Gemini pozwoliło Ci stworzyć intuicyjny i inteligentny system, który rozumie zapytania w języku naturalnym i zwraca trafne rekomendacje filmów w kontekście.

W tym ćwiczeniu z programowania:

  • na podstawie rzeczywistego zbioru danych filmów utworzyć bogaty, połączony graf wiedzy;
  • wygenerowane i zintegrowane wektory dystrybucyjne, aby umożliwić wyszukiwanie semantyczne po podobieństwie;
  • Korzystanie z Gemini do obsługi interakcji w języku naturalnym
  • Utworzenie prostego, ale zaawansowanego interfejsu chatbota za pomocą Gradio
  • Opcjonalnie wdrożenie aplikacji za pomocą Google Cloud Run w celu zapewnienia skalowalności i dostępu

To podejście nie jest ograniczone do filmów – tę samą architekturę można zastosować w przypadku książek, muzyki, produktów, prac naukowych lub dowolnej dziedziny, w której relacje i semantyka mają znaczenie. Wraz z rozwojem multimodalnych modeli generatywnej AI, takich jak Gemini, będziesz mieć możliwość wzbogacania swoich aplikacji o głębsze zrozumienie, spersonalizowane interakcje i wyjścia w wielu formatach.

Kontynuuj eksplorowanie i tworzenie, ale pamiętaj też o śledzeniu najnowszych informacji o Neo4j, Vertex AIGoogle Cloud, aby rozwijać swoje inteligentne aplikacje.

Dokumenty referencyjne