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 5 15, 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ẽ xây dựng một chatbot đề xuất phim thông minh bằng cách kết hợp sức mạnh của Neo4j, Google Vertex AI và Gemini. Trung tâm của hệ thống này là một Sơ đồ tri thức Neo4j mô hình hoá các bộ phim, diễn viên, đạo diễn, thể loại và nhiều nội dung khác thông qua một mạng lưới phong phú gồm các nút và mối quan hệ liên kết với nhau.

Để nâng cao trải nghiệm người dùng bằng khả năng hiểu ngữ nghĩa, bạn sẽ tạo các vectơ nhúng từ thông tin tổng quan về cốt truyện của phim bằng mô hình text-embedding-004 của Vertex AI (hoặc mới hơn). Các nội dung nhúng này được lập chỉ mục trong Neo4j để truy xuất nhanh, dựa trên mức độ tương đồng.

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 các thực thể và mối quan hệ liên quan đến phim
  2. Tạo/Tải văn bản nhúng cho thông tin tổng quan về phim bằng Vertex AI
  3. Triển khai giao diện chatbot Gradio do Gemini cung cấp, kết hợp tìm kiếm vectơ với việc thực thi Cypher dựa trên biểu đồ
  4. (Không bắt buộc) Triển khai ứng dụng lên Cloud Run dưới dạng ứng dụng web độc lập

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

  • Cách tạo và điền thông tin vào biểu đồ tri thức về phim bằng Cypher và Neo4j
  • Cách sử dụng Vertex AI để tạo và xử lý các văn bản nhúng ngữ nghĩa
  • Cách kết hợp LLM và Sơ đồ tri thức để truy xuất thông minh bằng GraphRAG
  • Cách tạo giao diện trò chuyện thân thiện với người dùng bằng Gradio
  • Cách triển khai tuỳ chọn trên Google Cloud Run

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í
  • Có kiến thức cơ bản về các lệnh dòng lệnh và Python (rất hữu ích nhưng không bắt buộc)

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 làm quen với Python và cơ sở dữ liệu đồ thị ở mức cơ bản 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.

a194b635f913211b.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 thao tác một cách trực quan với dữ liệu vốn có liên kết, 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ột 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 hợp tá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 thông báo: "Operation .... finished successfully" (Thao tác .... đã hoàn tất thành công).

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ấu trúc tương tự như 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 và 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 phiên bản 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 luận 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 cấu trúc 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 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 chúng ta 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_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");

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ẽ tải tuần tự 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 ra mức độ 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ả.

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 một 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 (dành 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"

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à vectơ nhúng, đã đến lúc kết hợp mọi thứ vào một giao diện trò chuyện có đầy đủ chức năng — Trình tự động gợi ý phim bằng công nghệ GenAI.

Chatbot này được triển khai trong Python bằng Gradio, một khung web nhẹ để tạo giao diện người dùng trực quan. Logic cốt lõi nằm trong app.py, kết nối với thực thể Neo4j AuraDB và sử dụng Google Vertex AIGemini để xử lý và trả lời các truy vấn bằng ngôn ngữ tự nhiên.

Cách tính năng hoạt động

  1. Người dùng nhập một truy vấn bằng ngôn ngữ tự nhiênví dụ: "Đề xuất cho tôi những phim khoa học viễn tưởng ly kỳ như Interstellar"
  2. Tạo một vectơ nhúng cho truy vấn bằng cách sử dụng mô hình text-embedding-004 của Vertex AI
  3. Tìm kiếm vectơ trong Neo4j để truy xuất những bộ phim có ngữ nghĩa tương tự
  4. Sử dụng Gemini để:
  • Diễn giải truy vấn theo ngữ cảnh
  • Tạo cụm từ tìm kiếm Cypher tuỳ chỉnh dựa trên kết quả tìm kiếm vectơ và giản đồ Neo4j
  • Thực thi truy vấn để trích xuất dữ liệu biểu đồ có liên quan (ví dụ: diễn viên, đạo diễn, thể loại)
  • Tóm tắt kết quả theo cách trò chuyện cho người dùng

c628f853e86ff61b.png

Phương pháp kết hợp này, được gọi là GraphRAG (Tạo nội dung tăng cường bằng tính năng truy xuất biểu đồ), kết hợp tính năng truy xuất ngữ nghĩa và suy luận có cấu trúc để tạo ra các đề xuất chính xác hơn, phù hợp với ngữ cảnh và dễ giải thích hơn.

Chạy Chatbot trên máy

Kích hoạt môi trường ảo (nếu chưa kích hoạt), sau đó chạy chatbot bằng:

python app.py

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

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

💡 Để chia sẻ chatbot với bên ngoài, hãy đặt share=True trong hàm launch() trong app.py.

Tương tác với Chatbot

Mở URL cục bộ hiển thị trong thiết bị đầu cuối (thường là 👉 http://0.0.0.0:8080) để truy cập vào giao diện chatbot.

Hãy thử đặt những câu hỏi như:

  • "Tôi nên xem phim gì nếu thích Interstellar?"
  • "Đề xuất một bộ phim lãng mạn do Nora Ephron làm đạo diễn"
  • "Tôi muốn xem phim gia đình có Tom Hanks"
  • "Tìm phim giật gân có liên quan đến trí tuệ nhân tạo"

a194b635f913211b.png

Chatbot sẽ:

✅ Tìm hiểu truy vấn

✅ Tìm những cốt truyện phim tương tự về mặt ngữ nghĩa bằng cách sử dụng các giá trị nhúng

✅ Tạo và chạy truy vấn Cypher để tìm nạp ngữ cảnh biểu đồ liên quan

✅ Trả về đề xuất thân thiện, phù hợp với từng người dùng — tất cả chỉ trong vài giây

Những gì bạn hiện có

Bạn vừa tạo một chatbot về phim chạy bằng GraphRAG kết hợp:

  • Tìm kiếm vectơ để tìm mức độ liên quan về ngữ nghĩa
  • Tư duy bằng sơ đồ tri thức với Neo4j
  • Các tính năng LLM thông qua Gemini
  • Giao diện trò chuyện mượt mà với Gradio

Cấu trúc này tạo thành nền tảng mà bạn có thể mở rộng sang các hệ thống tìm kiếm, đề xuất hoặc suy luận nâng cao hơn do GenAI cung cấp.

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

a194b635f913211b.png

Nếu muốn công khai Chatbot đề xuất phim, bạn có thể triển khai chatbot đó trên Google Cloud Run — một nền tảng không máy chủ, được quản lý toàn diện, tự động mở rộng quy mô ứng dụng và loại bỏ mọi vấn đề về cơ sở hạ tầng.

Phương thức triển khai này sử dụng:

  • requirements.txt – để xác định các phần phụ thuộc Python (Neo4j, Vertex AI, Gradio, v.v.)
  • Dockerfile – để đóng gói ứng dụng
  • .env.yaml – để truyền biến môi trường một cách an toàn trong thời gian chạy

Bước 1: Chuẩn bị .env.yaml

Tạo một tệp có tên .env.yaml trong thư mục gốc với nội dung như sau:

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

💡 Bạn nên sử dụng định dạng này thay vì --set-env-vars vì định dạng này có thể mở rộng quy mô, kiểm soát phiên bản và dễ đọc hơn.

Bước 2: 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

Bây giờ, hãy triển khai ứng dụng bằng tệp .env.yaml cho cấu hình thời gian chạy:

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

Truy cập vào Chatbot

Sau khi triển khai, Cloud Run sẽ cung cấp một URL công khai như:

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

Mở URL này trong trình duyệt để truy cập vào giao diện chatbot Gradio đã triển khai — sẵn sàng xử lý các đề xuất về phim bằng GraphRAG, Gemini và Neo4j!

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à CSDL 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ởi GraphRAG 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 các khả năng lập mô hình gốc dạng đồ thị của Neo4j với tính năng tìm kiếm ngữ nghĩa thông qua Vertex AI và khả năng suy luận ngôn ngữ tự nhiên thông qua Gemini, bạn đã tạo ra một hệ thống thông minh không chỉ dừng lại ở tính năng tìm kiếm cơ bản — hệ thống này hiểu được ý định của người dùng, lập luận dựa trên dữ liệu được kết nốitrả lời theo kiểu trò chuyện.

Trong lớp học lập trình này, bạn đã hoàn thành những việc sau:

Tạo Sơ đồ tri thức về phim trong thế giới thực trong Neo4j để lập mô hình phim, diễn viên, thể loại và mối quan hệ

Tạo vectơ nhúng cho bản tóm tắt cốt truyện phim bằng cách sử dụng các mô hình nhúng văn bản của Vertex AI

Triển khai GraphRAG, kết hợp tìm kiếm vectơ và truy vấn Cypher do LLM tạo để suy luận sâu hơn, nhiều bước

Tích hợp Gemini để diễn giải câu hỏi của người dùng, tạo truy vấn Cypher và tóm tắt kết quả biểu đồ bằng ngôn ngữ tự nhiên

Tạo giao diện trò chuyện trực quan bằng Gradio

Có thể triển khai chatbot lên Google Cloud Run để lưu trữ không máy chủ và có thể mở rộng

Vậy bước tiếp theo là gì?

Cấu trúc này không chỉ giới hạn ở các đề xuất phim mà còn có thể mở rộng sang:

  • Nền tảng khám phá sách và nhạc
  • Trợ lý nghiên cứu học thuật
  • Công cụ đề xuất sản phẩm
  • Trợ lý kiến thức về y tế, tài chính và pháp lý

Bất cứ nơi nào bạn có các mối quan hệ phức tạp + dữ liệu văn bản đa dạng thức, sự kết hợp này giữa Biểu đồ tri thức + LLM + nội dung nhúng ngữ nghĩa có thể hỗ trợ các ứng dụng thông minh thế hệ mới.

Khi các mô hình GenAI đa phương thức như Gemini phát triển, bạn sẽ có thể kết hợp ngữ cảnh, hình ảnh, lời nói và tính năng cá nhân hoá phong phú hơn nữa để xây dựng các hệ thống thực sự tập trung vào con người.

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! Khám phá thêm các hướng dẫn thực hành về sơ đồ tri thức tại Neo4j GraphAcademy.

Tài liệu tham khảo