Lớp học lập trình – Xây dựng chatbot đề xuất phim bằng Neo4j và Vertex AI

Lớp học lập trình – Xây dựng chatbot đề xuất phim bằng Neo4j và Vertex AI

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 4 4, 2025
account_circleTác giả: Romin Irani and Siddhant Agarwal(GDE)

1. Tổng quan

Trong lớp học lập trình này, bạn sẽ tạo một chatbot đề xuất phim thông minh bằng cách kết hợp Neo4j, Vertex AI và Gemini. Chatbot sử dụng Biểu đồ tri thức Neo4j làm nền tảng để thể hiện phim, diễn viên, đạo diễn, nhà sản xuất, thể loại, v.v. Để nâng cao trải nghiệm tìm kiếm, bạn sẽ tạo các vectơ nhúng từ thông tin tổng quan về cốt truyện phim bằng mô hình text-embedding-004 của Vertex AI.

Cuối cùng, bạn sẽ tích hợp Gemini để hỗ trợ giao diện trò chuyện, nơi người dùng có thể đặt câu hỏi bằng ngôn ngữ tự nhiên như "Tôi nên xem phim gì nếu thích Interstellar?" và nhận được đề xuất phim được cá nhân hoá dựa trên mức độ tương đồng ngữ nghĩa và ngữ cảnh dựa trên biểu đồ.

Trong lớp học lập trình này, bạn sẽ áp dụng phương pháp từng bước như sau:

  1. Tạo Sơ đồ tri thức Neo4j bằng dữ liệu liên quan đến phim
  2. Làm phong phú dữ liệu phim bằng cách tạo văn bản nhúng trên thông tin tổng quan/nội dung của phim bằng văn bản nhúng của Vertex AI.
  3. Tạo giao diện chatbot Gradio do Gemini cung cấp để tìm kiếm và truy xuất ngữ nghĩa từ Neo4j, giúp kết hợp mọi thứ với nhau.
  4. Bạn có thể triển khai ứng dụng này trên Google Cloud Run dưới dạng một ứng dụng web độc lập như minh hoạ dưới đây:

Kiến thức bạn sẽ học được

  • Cách tạo biểu đồ tri thức về phim bằng Cypher và Neo4j.
  • Cách sử dụng Vertex AI để tạo các phần nhúng ngữ nghĩa cho văn bản.
  • Cách tích hợp Neo4j và Gemini để truy xuất dựa trên vectơ thông minh.
  • Cách tạo và chạy giao diện người dùng của chatbot đàm thoại bằng Gradio.

Bạn cần có

  • Trình duyệt web Chrome
  • Tài khoản Gmail
  • Một dự án trên Google Cloud đã bật tính năng thanh toán
  • Tài khoản Neo4j Aura DB miễn phí
  • Hiểu biết cơ bản về các lệnh dòng lệnh và Python

Lớp học lập trình này được thiết kế cho các nhà phát triển ở mọi cấp độ (bao gồm cả người mới bắt đầu), sử dụng Python và Neo4j trong ứng dụng mẫu. Mặc dù việc nắm được kiến thức cơ bản về Python và cơ sở dữ liệu đồ thị có thể hữu ích, nhưng bạn không cần có kinh nghiệm trước đó để hiểu các khái niệm hoặc làm theo. 121747afa89e0e6.png

2. Thiết lập Neo4j AuraDB

Neo4j là một cơ sở dữ liệu đồ thị gốc hàng đầu, lưu trữ dữ liệu dưới dạng một mạng lưới các nút (thực thể) và mối quan hệ (kết nối giữa các thực thể). Nhờ đó, Neo4j rất phù hợp với các trường hợp sử dụng mà việc hiểu rõ các mối kết nối là yếu tố then chốt, chẳng hạn như đề xuất, phát hiện gian lận, sơ đồ tri thức, v.v. Không giống như các cơ sở dữ liệu quan hệ hoặc dựa trên tài liệu dựa vào các bảng cứng nhắc hoặc cấu trúc phân cấp, mô hình đồ thị linh hoạt của Neo4j cho phép trình bày trực quan và hiệu quả dữ liệu phức tạp, liên kết với nhau.

Thay vì sắp xếp dữ liệu theo hàng và bảng như cơ sở dữ liệu quan hệ, Neo4j sử dụng mô hình đồ thị, trong đó thông tin được biểu thị dưới dạng nút (thực thể) và mối quan hệ (kết nối giữa các thực thể đó). Mô hình này giúp bạn dễ dàng xử lý dữ liệu vốn có liên kết với nhau, chẳng hạn như con người, địa điểm, sản phẩm hoặc trong trường hợp của chúng ta là phim, diễn viên và thể loại.

Ví dụ: trong tập dữ liệu về phim:

  • Một nút có thể đại diện cho Movie, Actor hoặc Director
  • Mối quan hệ có thể là ACTED_IN hoặc DIRECTED

Cấu trúc này cho phép bạn dễ dàng đặt các câu hỏi như:

  • Diễn viên này đã xuất hiện trong những bộ phim nào?
  • Những ai đã từng làm việc với Christopher Nolan?
  • Những bộ phim tương tự dựa trên diễn viên hoặc thể loại chung là gì?

Neo4j đi kèm với một ngôn ngữ truy vấn mạnh mẽ có tên là Cypher, được thiết kế riêng để truy vấn biểu đồ. Cypher cho phép bạn thể hiện các mẫu và kết nối phức tạp theo cách ngắn gọn và dễ đọc.

Neo4j cung cấp nhiều lựa chọn triển khai tuỳ theo nhu cầu của bạn:

  • Tự quản lý: Chạy Neo4j trên cơ sở hạ tầng của riêng bạn bằng Neo4j Desktop hoặc dưới dạng hình ảnh Docker (tại chỗ hoặc trong đám mây của riêng bạn). 397a3c535b52d3f6.png
  • Được quản lý trên đám mây: Triển khai Neo4j trên các nhà cung cấp dịch vụ đám mây phổ biến bằng các sản phẩm trên trang web thương mại.
  • Được quản lý toàn diện: Sử dụng Neo4j AuraDB, dịch vụ cơ sở dữ liệu trên đám mây được quản lý toàn diện của Neo4j, giúp bạn xử lý việc cấp phép, mở rộng quy mô, sao lưu và bảo mật.

Trong lớp học lập trình này, chúng ta sẽ sử dụng Neo4j AuraDB Free, cấp độ không tốn phí của AuraDB. Công cụ này cung cấp một thực thể cơ sở dữ liệu đồ thị được quản lý đầy đủ với đủ bộ nhớ và tính năng để tạo bản minh hoạ, học tập và xây dựng các ứng dụng nhỏ — phù hợp với mục tiêu của chúng tôi là xây dựng một chatbot đề xuất phim chạy bằng GenAI.

Bạn sẽ tạo một thực thể AuraDB miễn phí, kết nối thực thể đó với ứng dụng bằng thông tin xác thực kết nối và sử dụng thực thể đó để lưu trữ và truy vấn biểu đồ tri thức về phim trong suốt lớp học này.

Tại sao nên sử dụng Biểu đồ?

Trong cơ sở dữ liệu quan hệ truyền thống, việc trả lời các câu hỏi như "Những bộ phim nào tương tự như Inception dựa trên dàn diễn viên hoặc thể loại chung?" sẽ liên quan đến các thao tác JOIN phức tạp trên nhiều bảng. Khi độ sâu của mối quan hệ tăng lên, hiệu suất và khả năng đọc sẽ giảm.

Tuy nhiên, các cơ sở dữ liệu đồ thị như Neo4j được xây dựng để truyền tải hiệu quả các mối quan hệ, giúp chúng phù hợp với các hệ thống đề xuất, tìm kiếm ngữ nghĩa và trợ lý thông minh. Các mô hình này giúp nắm bắt bối cảnh thực tế (chẳng hạn như mạng lưới cộng tác, cốt truyện hoặc lựa chọn ưu tiên của người xem) mà có thể khó thể hiện bằng các mô hình dữ liệu truyền thống.

Bằng cách kết hợp dữ liệu được kết nối này với các mô hình ngôn ngữ lớn (LLM) như Geminivectơ nhúng từ Vertex AI, chúng tôi có thể tăng cường trải nghiệm chatbot — cho phép chatbot suy luận, truy xuất và phản hồi theo cách phù hợp và cá nhân hoá hơn.

Tạo Neo4j AuraDB miễn phí

  1. Truy cập vào https://console.neo4j.io
  2. Đăng nhập bằng Tài khoản Google hoặc email của bạn.
  3. Nhấp vào "Tạo phiên bản miễn phí".
  4. Trong khi thực thể đang được cấp phép, một cửa sổ bật lên sẽ xuất hiện cho thấy thông tin xác thực kết nối cho cơ sở dữ liệu của bạn.

Hãy nhớ tải xuống và lưu an toàn các thông tin sau từ cửa sổ bật lên — đây là những thông tin cần thiết để kết nối ứng dụng của bạn với 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>

Bạn sẽ sử dụng các giá trị này để định cấu hình tệp .env trong dự án của mình nhằm xác thực bằng Neo4j ở bước tiếp theo.

a1e29e56e6c412fc.png

Neo4j AuraDB Free rất phù hợp cho việc phát triển, thử nghiệm và các ứng dụng quy mô nhỏ như lớp học lập trình này. Loại này cung cấp hạn mức sử dụng hào phóng, hỗ trợ tối đa 200.000 nút400.000 mối quan hệ. Mặc dù cung cấp tất cả các tính năng cần thiết để tạo và truy vấn biểu đồ tri thức, nhưng phiên bản này không hỗ trợ các cấu hình nâng cao như trình bổ trợ tuỳ chỉnh hoặc tăng bộ nhớ. Đối với khối lượng công việc sản xuất hoặc tập dữ liệu lớn hơn, bạn có thể nâng cấp lên gói AuraDB cấp cao hơn để có dung lượng, hiệu suất và các tính năng cấp doanh nghiệp lớn hơn.

Như vậy là bạn đã hoàn tất phần thiết lập phần phụ trợ Neo4j AuraDB. Trong bước tiếp theo, chúng ta sẽ tạo một dự án Google Cloud, nhân bản kho lưu trữ và định cấu hình các biến môi trường cần thiết để chuẩn bị môi trường phát triển trước khi bắt đầu lớp học lập trình.

3. Trước khi bắt đầu

Tạo một dự án

  1. Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên dự án hay không .
  3. Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn bq. Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Google Cloud.

Hình ảnh nút Kích hoạt Cloud Shell

  1. Sau khi kết nối với Cloud Shell, hãy kiểm tra để đảm bảo bạn đã được xác thực và dự án được đặt thành mã dự án của bạn bằng lệnh sau:
gcloud auth list
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn.
gcloud config list project
  1. Nếu dự án của bạn chưa được đặt, hãy sử dụng lệnh sau để đặt dự án:
gcloud config set project <YOUR_PROJECT_ID>
  1. Bật các API bắt buộc thông qua lệnh hiển thị bên dưới. Quá trình này có thể mất vài phút. Vui lòng kiên nhẫn chờ đợi.
gcloud services enable cloudresourcemanager.googleapis.com \
                       
servicenetworking.googleapis.com \
                       
run.googleapis.com \
                       
cloudbuild.googleapis.com \
                       
cloudfunctions.googleapis.com \
                       
aiplatform.googleapis.com

Khi thực thi thành công lệnh này, bạn sẽ thấy một thông báo tương tự như thông báo dưới đây:

Operation "operations/..." finished successfully.

Bạn có thể sử dụng bảng điều khiển để tìm kiếm từng sản phẩm hoặc sử dụng đường liên kết này thay cho lệnh gcloud.

Nếu thiếu bất kỳ API nào, bạn luôn có thể bật API đó trong quá trình triển khai.

Tham khảo tài liệu để biết các lệnh và cách sử dụng gcloud.

Sao chép kho lưu trữ và thiết lập chế độ cài đặt môi trường

Bước tiếp theo là sao chép kho lưu trữ mẫu mà chúng ta sẽ tham chiếu trong phần còn lại của lớp học lập trình. Giả sử bạn đang ở Cloud Shell, hãy nhập lệnh sau trong thư mục gốc:

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

Để khởi chạy trình chỉnh sửa, hãy nhấp vào Open Editor (Mở trình chỉnh sửa) trên thanh công cụ của cửa sổ Cloud Shell. Nhấp vào thanh trình đơn ở góc trên cùng bên trái rồi chọn File (Tệp) → Open Folder (Mở thư mục) như minh hoạ bên dưới:

66221fd0d0e5202f.png

Chọn thư mục neo4j-vertexai-codelab và bạn sẽ thấy thư mục mở ra với các tệp sau như minh hoạ bên dưới:

e49542efd70de22e.png

Tiếp theo, chúng ta cần thiết lập các biến môi trường sẽ được sử dụng trong toàn bộ lớp học lập trình này. Nhấp vào tệp example.env, bạn sẽ thấy nội dung như sau:

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

Bây giờ, hãy tạo một tệp mới có tên .env trong cùng thư mục với tệp example.env và sao chép nội dung của tệp example.env hiện có. Bây giờ, hãy cập nhật các biến sau:

  • NEO4J_URI, NEO4J_USER, NEO4J_PASSWORDNEO4J_DATABASE:
  • Điền các giá trị này bằng thông tin xác thực được cung cấp trong quá trình tạo thực thể Neo4j AuraDB Free ở bước trước.
  • NEO4J_DATABASE thường được đặt thành neo4j cho AuraDB Free.
  • PROJECT_IDLOCATION:
  • Nếu đang chạy lớp học lập trình này từ Google Cloud Shell, bạn có thể để trống các trường này vì các trường này sẽ được tự động suy ra từ cấu hình dự án đang hoạt động của bạn.
  • Nếu bạn đang chạy cục bộ hoặc bên ngoài Cloud Shell, hãy cập nhật PROJECT_ID bằng mã nhận dạng của dự án Google Cloud mà bạn đã tạo trước đó và đặt LOCATION thành khu vực mà bạn đã chọn cho dự án đó (ví dụ: us-central1).

Sau khi điền các giá trị này, hãy lưu tệp .env. Cấu hình này sẽ cho phép ứng dụng của bạn kết nối với cả dịch vụ Neo4j và Vertex AI.

Bước cuối cùng trong việc thiết lập môi trường phát triển là tạo một môi trường ảo Python và cài đặt tất cả các phần phụ thuộc bắt buộc được liệt kê trong tệp requirements.txt. Các phần phụ thuộc này bao gồm các thư viện cần thiết để làm việc với Neo4j, Vertex AI, Gradio và nhiều thư viện khác.

Trước tiên, hãy tạo một môi trường ảo có tên .venv bằng cách chạy lệnh sau:

python -m venv .venv

Sau khi tạo môi trường, chúng ta cần kích hoạt môi trường đã tạo bằng lệnh sau

source .venv/bin/activate

Bây giờ, bạn sẽ thấy (.venv) ở đầu lời nhắc của dòng lệnh, cho biết môi trường đang hoạt động. Ví dụ: (.venv) yourusername@cloudshell:

Bây giờ, hãy cài đặt các phần phụ thuộc bắt buộc bằng cách chạy:

pip install -r requirements.txt

Dưới đây là thông tin tổng quan nhanh về các phần phụ thuộc chính được liệt kê trong tệp:

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

Sau khi cài đặt thành công tất cả các phần phụ thuộc, môi trường Python cục bộ của bạn sẽ được định cấu hình đầy đủ để chạy các tập lệnh và chatbot trong lớp học lập trình này.

Tuyệt vời! Bây giờ, chúng ta đã sẵn sàng chuyển sang bước tiếp theo — tìm hiểu tập dữ liệu và chuẩn bị tập dữ liệu đó để tạo biểu đồ và làm phong phú ngữ nghĩa.

4. Chuẩn bị tập dữ liệu Phim

Nhiệm vụ đầu tiên của chúng ta là chuẩn bị tập dữ liệu Phim mà chúng ta sẽ sử dụng để tạo biểu đồ tri thức và hỗ trợ chatbot đề xuất. Thay vì bắt đầu từ đầu, chúng ta sẽ sử dụng một tập dữ liệu mở hiện có và xây dựng dựa trên tập dữ liệu đó.

Chúng ta sẽ sử dụng The Movies Dataset (Dữ liệu về phim) của Rounak Banik, một tập dữ liệu công khai nổi tiếng có trên Kaggle. Tệp này chứa siêu dữ liệu của hơn 45.000 bộ phim trên TMDB, bao gồm dàn diễn viên, đoàn làm phim, từ khoá, điểm xếp hạng và nhiều thông tin khác.

9e3a1dc4c286af1b.png

Để xây dựng một Chatbot Đề xuất phim đáng tin cậy và hiệu quả, điều quan trọng là bạn phải bắt đầu bằng dữ liệu rõ ràng, nhất quán và có cấu trúc. Mặc dù Dữ liệu tập hợp phim của Kaggle là một tài nguyên phong phú với hơn 45.000 bản ghi phim và siêu dữ liệu chi tiết (bao gồm cả thể loại, dàn diễn viên, đoàn làm phim, v.v.), nhưng dữ liệu này cũng chứa tạp âm, sự không nhất quán và các cấu trúc dữ liệu lồng nhau không lý tưởng cho việc lập mô hình biểu đồ hoặc nhúng ngữ nghĩa.

Để giải quyết vấn đề này, chúng tôi đã xử lý trước và chuẩn hoá tập dữ liệu để đảm bảo tập dữ liệu đó phù hợp với việc xây dựng biểu đồ kiến thức Neo4j và tạo các nội dung nhúng chất lượng cao. Quy trình này bao gồm:

  • Xoá bản ghi trùng lặp và không đầy đủ
  • Tiêu chuẩn hoá các trường chính (ví dụ: tên thể loại, tên người)
  • Làm phẳng các cấu trúc lồng nhau phức tạp (ví dụ: diễn viên và đoàn làm phim) thành tệp CSV có cấu trúc
  • Chọn một tập hợp con đại diện gồm khoảng 12.000 bộ phim để nằm trong giới hạn của Neo4j AuraDB Free

Dữ liệu chất lượng cao, được chuẩn hoá giúp đảm bảo:

  • Chất lượng dữ liệu: Giảm thiểu lỗi và sự không nhất quán để đưa ra đề xuất chính xác hơn
  • Hiệu suất truy vấn: Cấu trúc tinh giản giúp cải thiện tốc độ truy xuất và giảm tình trạng dư thừa
  • Mức độ chính xác của tính năng nhúng: Dữ liệu đầu vào sạch sẽ giúp tạo ra các vectơ nhúng theo ngữ cảnh và có ý nghĩa hơn

Bạn có thể truy cập vào tập dữ liệu đã được làm sạch và chuẩn hoá trong thư mục normalized_data/ của kho lưu trữ GitHub này. Tập dữ liệu này cũng được phản ánh trong một bộ chứa Google Cloud Storage để dễ dàng truy cập trong các tập lệnh Python sắp tới.

Sau khi dữ liệu được dọn dẹp và sẵn sàng, chúng ta đã sẵn sàng để tải dữ liệu đó vào Neo4j và bắt đầu xây dựng biểu đồ tri thức về phim.

5. Tạo Sơ đồ tri thức về phim

Để hỗ trợ chatbot đề xuất phim sử dụng công nghệ GenAI, chúng ta cần sắp xếp tập dữ liệu phim theo cách nắm bắt được mạng lưới kết nối phong phú giữa các bộ phim, diễn viên, đạo diễn, thể loại và siêu dữ liệu khác. Trong phần này, chúng ta sẽ xây dựng một Biểu đồ tri thức về phim trong Neo4j bằng cách sử dụng tập dữ liệu đã được làm sạch và chuẩn hoá mà bạn đã chuẩn bị trước đó.

Chúng ta sẽ sử dụng chức năng LOAD CSV của Neo4j để nhập tệp CSV được lưu trữ trong một bộ chứa Google Cloud Storage (GCS) công khai. Các tệp này đại diện cho nhiều thành phần của tập dữ liệu phim, chẳng hạn như phim, thể loại, dàn diễn viên, đoàn làm phim, công ty sản xuất và điểm xếp hạng của người dùng.

Bước 1: Tạo các quy tắc ràng buộc và chỉ mục

Trước khi nhập dữ liệu, bạn nên tạo các quy tắc ràng buộc và chỉ mục để thực thi tính toàn vẹn của dữ liệu và tối ưu hoá hiệu suất truy vấn.

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

Bước 2: Nhập siêu dữ liệu và mối quan hệ của phim

Hãy xem cách nhập siêu dữ liệu phim bằng lệnh LOAD CSV. Ví dụ này tạo các nút Phim có các thuộc tính chính như tiêu đề, thông tin tổng quan, ngôn ngữ và thời lượng:

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

Bạn có thể sử dụng các lệnh Cypher tương tự để nhập các thực thể có liên quan như thể loại, công ty sản xuất, ngôn ngữ, quốc gia, diễn viên, đoàn làm phim và điểm xếp hạng.

Tải Biểu đồ đầy đủ thông qua Python

Thay vì chạy nhiều truy vấn Cypher theo cách thủ công, bạn nên sử dụng tập lệnh Python tự động được cung cấp trong lớp học lập trình này.

Tập lệnh graph_build.py tải toàn bộ tập dữ liệu từ GCS vào thực thể Neo4j AuraDB bằng thông tin xác thực trong tệp .env.

python graph_build.py

Tập lệnh sẽ lần lượt tải tất cả tệp CSV cần thiết, tạo các nút và mối quan hệ, đồng thời định cấu trúc biểu đồ tri thức đầy đủ về phim.

Xác thực biểu đồ

Sau khi tải, bạn có thể xác thực biểu đồ bằng cách chạy các truy vấn Cypher đơn giản như:

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

Bây giờ, bạn sẽ thấy biểu đồ của mình được điền sẵn các bộ phim, người, thể loại và nhiều thông tin khác — sẵn sàng để được làm phong phú về ngữ nghĩa ở bước tiếp theo!

6. Tạo và tải các phần nhúng để thực hiện Tìm kiếm theo độ tương đồng vectơ

Để bật tính năng tìm kiếm ngữ nghĩa trong chatbot, chúng ta cần tạo các vectơ nhúng cho thông tin tổng quan về phim. Các nội dung nhúng này biến dữ liệu văn bản thành vectơ số có thể so sánh để tìm sự tương đồng. Nhờ đó, chatbot có thể truy xuất các bộ phim có liên quan ngay cả khi cụm từ tìm kiếm không khớp chính xác với tiêu đề hoặc nội dung mô tả.

⚠️ Lưu ý về hiệu suất

Việc tạo nội dung nhúng cho hàng nghìn nội dung mô tả phim theo thời gian thực vừa tốn thời gian vừa tốn tài nguyên. Để lớp học lập trình này hiệu quả và dễ tiếp cận, chúng tôi đã tính toán trước các nội dung nhúng cho tất cả ~12.000 bản tóm tắt phim bằng cách sử dụng

text-embedding-004

và lưu trữ chúng trong một tệp CSV có thể truy cập công khai.

bcca07eaee60787b.png

Cách 1: Tải các phần nhúng được tính toán trước thông qua Cypher

Để nhanh chóng đính kèm các phần nhúng vào các nút Movie tương ứng trong Neo4j, hãy chạy lệnh Cypher sau trong Trình duyệt Neo4j:

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)

Lệnh này đọc các vectơ nhúng từ tệp CSV và đính kèm các vectơ đó dưới dạng thuộc tính (m.embedding) trên mỗi nút Movie.

Cách 2: Tải nội dung nhúng bằng Python

Bạn cũng có thể tải các phần nhúng theo phương thức lập trình bằng tập lệnh Python được cung cấp. Phương pháp này hữu ích nếu bạn đang làm việc trong môi trường của riêng mình hoặc muốn tự động hoá quy trình:

python load_embeddings.py

Tập lệnh này đọc cùng một tệp CSV từ GCS và ghi các mục nhúng vào Neo4j bằng trình điều khiển Neo4j Python.

[Không bắt buộc] Tự tạo nội dung nhúng (cho dữ liệu khám phá)

Nếu muốn tìm hiểu cách tạo nội dung nhúng, bạn có thể khám phá logic trong tập lệnh generate_embeddings.py. Ứng dụng này sử dụng Vertex AI để nhúng từng văn bản tóm tắt về phim bằng mô hình text-embedding-004.

Để tự thử, hãy mở và chạy phần tạo mã nhúng. Nếu đang chạy trong Cloud Shell, bạn có thể chú thích dòng sau vì Cloud Shell đã được xác thực thông qua tài khoản đang hoạt động của bạn:

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

⚠️ Việc chạy toàn bộ quy trình tạo tính năng nhúng sẽ tiêu tốn hạn mức Vertex AI và có thể mất nhiều thời gian, đặc biệt là khi có hàng nghìn bản ghi.

Sau khi các nội dung nhúng được tải vào Neo4j, sơ đồ tri thức về phim sẽ trở thành nhận biết ngữ nghĩa — sẵn sàng hỗ trợ tính năng tìm kiếm bằng ngôn ngữ tự nhiên mạnh mẽ bằng cách sử dụng độ tương đồng vectơ!

7. Chatbot đề xuất phim

Khi đã có sơ đồ tri thức và các phần nhúng, đã đến lúc kết hợp mọi thứ vào một giao diện trò chuyện — Trình trò chuyện đề xuất phim.

Chatbot được triển khai bằng PythonGradio, một khung nhẹ để xây dựng giao diện người dùng dựa trên web. Logic chính nằm trong tập lệnh chatbot.py. Tập lệnh này kết nối với thực thể Neo4j AuraDB và thực hiện tìm kiếm vectơ tương đồng trên các nội dung nhúng phim dựa trên câu lệnh bằng ngôn ngữ tự nhiên.

Chatbot sử dụng Gemini để nâng cao trải nghiệm người dùng bằng cách tinh chỉnh truy vấn và định dạng câu trả lời. Kết quả tìm kiếm được trả về từ Neo4j bằng cách kết hợp ngữ cảnh biểu đồ và mức độ tương đồng của vectơ.

Chạy Chatbot trên máy

Để chạy chatbot, hãy kích hoạt môi trường ảo (nếu chưa kích hoạt) rồi chạy:

python chatbot.py

Bạn sẽ thấy kết quả tương tự như sau:

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

💡 Nếu thấy cảnh báo về việc ngừng sử dụng liên quan đến allow_flagging, bạn có thể bỏ qua các cảnh báo đó vì ứng dụng vẫn sẽ chạy.

Tương tác với Chatbot

Sau khi chạy, hãy mở URL hiển thị trong thiết bị đầu cuối, thường là: 👉 http://127.0.0.1:7860

Bạn sẽ thấy một giao diện trò chuyện đơn giản, nơi bạn có thể nhập các truy vấn bằng ngôn ngữ tự nhiên như:

  • "Đề xuất cho tôi những phim kinh dị khoa học viễn tưởng như Inception"
  • "Đề xuất một bộ phim lãng mạn có Tom Hanks"
  • "Tôi muốn xem một bộ phim truyền hình gia đình vui vẻ"

c76b6c6e2bcb25d9.png

Chatbot xử lý truy vấn, thực hiện tìm kiếm vectơ ngữ nghĩa trên thông tin tổng quan về phim và hiển thị danh sách các phim phù hợp nhất, bao gồm cả tiêu đề, thông tin tổng quan và năm phát hành.

Mỗi đề xuất được hiển thị theo bố cục kiểu thẻ với kết quả được định dạng gọn gàng.

Khi chatbot chạy cục bộ, bạn sẽ có một hệ thống đề xuất phim hoạt động đầy đủ dựa trên GenAI, kết hợp những tính năng tốt nhất của biểu đồ tri thức, LLM (Gemini)tìm kiếm ngữ nghĩa bằng cách sử dụng tệp nhúng Vertex AI.

8. (Không bắt buộc) Triển khai lên Google Cloud Run

Nếu muốn cung cấp công cụ Chatbot đề xuất phim cho công chúng trên web, bạn có thể triển khai công cụ này trên Google Cloud Run — một nền tảng không có máy chủ, được quản lý toàn diện và tự động mở rộng quy mô ứng dụng của bạn. 121747afa89e0e6.png

Trước khi triển khai, hãy đảm bảo các tệp sau đây có trong dự án của bạn (các tệp này đã có trong kho lưu trữ này):

  • requirements.txt – liệt kê tất cả các phần phụ thuộc Python cần thiết để chạy ứng dụng, bao gồm cả Neo4j và Vertex AI.
  • Dockerfile – xác định môi trường vùng chứa, bao gồm hình ảnh cơ sở, quá trình cài đặt phần phụ thuộc và cách chạy ứng dụng.

Bước 1: Thiết lập biến môi trường

Trong thiết bị đầu cuối, hãy đặt các biến môi trường sau (thay thế giá trị phần giữ chỗ bằng chế độ cài đặt dự án thực tế của bạn):

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

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

Bước 2: Tạo Cấu phần phần mềm đăng ký và tạo vùng chứa

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

Lệnh này đóng gói ứng dụng của bạn bằng Dockerfile và tải hình ảnh vùng chứa lên Google Cloud Artifact Registry.

Bước 3: Triển khai lên Cloud Run

Trước khi triển khai, hãy đảm bảo tất cả các biến môi trường bắt buộc (ví dụ: Thông tin xác thực Neo4j, chế độ cài đặt dự án) được liệt kê trong tệp .env.

Sử dụng đoạn mã sau để chuyển đổi linh động tệp .env thành định dạng tương thích với cờ --set-env-vars:

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

Bây giờ, hãy triển khai ứng dụng:

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"

Truy cập vào Chatbot

Sau khi triển khai, Cloud Run sẽ trả về một URL dịch vụ công khai ở định dạng:

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

Mở URL trong trình duyệt để truy cập vào chatbot. Bạn sẽ thấy giao diện người dùng Gradio tương tự chạy trên đám mây, có thể nhận truy vấn và phản hồi bằng các đề xuất phim.

Ghi chú và mẹo

  • Đảm bảo Dockerfile chạy pip install -r requirements.txt trong quá trình tạo bản dựng.
  • Nếu không sử dụng Cloud Shell, bạn cần xác thực môi trường bằng Tài khoản dịch vụ có quyền truy cập vào Vertex AI và Cấu phần phần mềm.
  • Bạn có thể theo dõi nhật ký và chỉ số triển khai trong phần Google Cloud Console > Cloud Run.

Bạn cũng có thể truy cập vào Cloud Run từ Google Cloud Console và sẽ thấy danh sách các dịch vụ trong Cloud Run. Dịch vụ movies-chatbot phải là một trong các dịch vụ (nếu không phải là dịch vụ duy nhất) được liệt kê ở đó.

bccf390b7099e73b.png

Bạn có thể xem thông tin chi tiết về dịch vụ như URL, cấu hình, nhật ký và nhiều thông tin khác bằng cách nhấp vào tên dịch vụ cụ thể (movies-chatbot trong trường hợp này).

3709b596167cdaa0.png

Nhờ đó, Chatbot đề xuất phim của bạn hiện đã được triển khai, có thể mở rộng quy mô và chia sẻ. 🎉

9. Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử dụng trong bài đăng này, hãy làm theo các bước sau:

  1. Trong Google Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, rồi nhấp vào Xoá.
  3. Trong hộp thoại, hãy nhập mã dự án, sau đó nhấp vào Shut down (Tắt) để xoá dự án.

10. Xin chúc mừng

Bạn đã xây dựng và triển khai thành công một chatbot đề xuất phim được hỗ trợ bằng đồ thị và tăng cường bằng GenAI bằng cách sử dụng Neo4j, Vertex AIGemini. Bằng cách kết hợp khả năng lập mô hình biểu đạt của Neo4j với sức mạnh ngữ nghĩa của các phần nhúng Vertex AI và trí tuệ trò chuyện của Gemini, bạn đã tạo ra một hệ thống trực quan và thông minh, hiểu được các truy vấn bằng ngôn ngữ tự nhiên và trả về các đề xuất phim phù hợp theo ngữ cảnh.

Trong suốt lớp học lập trình này, bạn đã:

  • Tạo một sơ đồ tri thức phong phú, liên kết với nhau từ một tập dữ liệu phim trong thế giới thực
  • Tạo và tích hợp vectơ nhúng để cho phép tìm kiếm tương đồng ngữ nghĩa
  • Tận dụng Gemini để hỗ trợ tương tác bằng ngôn ngữ tự nhiên
  • Tạo một giao diện chatbot đơn giản nhưng mạnh mẽ bằng Gradio
  • Tuỳ ý triển khai ứng dụng bằng Google Cloud Run để mở rộng quy mô và truy cập

Phương pháp này không chỉ giới hạn ở phim mà bạn có thể mở rộng cùng một cấu trúc cho sách, nhạc, sản phẩm, bài báo học thuật hoặc bất kỳ miền nào mà mối quan hệ và ngữ nghĩa đều quan trọng. Khi các mô hình GenAI đa phương thức như Gemini tiếp tục phát triển, bạn có thể làm phong phú ứng dụng của mình bằng cách hiểu rõ hơn, tương tác được cá nhân hoá và đầu ra đa định dạng.

Hãy tiếp tục khám phá, tiếp tục xây dựng và đừng quên cập nhật thông tin mới nhất từ Neo4j, Vertex AIGoogle Cloud để đưa các ứng dụng thông minh của bạn lên một tầm cao mới!

Tài liệu tham khảo