1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ tạo một trình tạo tư thế dựa trên AI bằng cách sử dụng Java, Spring Boot, cơ sở dữ liệu Cloud Spanner và Vertex AI Imagen API. Người dùng sẽ nhập một câu lệnh và ứng dụng sẽ tạo ra một tư thế dựa trên câu lệnh đó. Chúng tôi cũng sẽ sử dụng dữ liệu từ cơ sở dữ liệu Spanner dưới dạng một API REST. Đây là một cách thú vị và mang tính giáo dục để minh hoạ các khả năng của AI tạo sinh bằng Spring Boot trên Google Cloud.
Danh sách các dịch vụ đã sử dụng là:
- Cloud Spanner
- Vertex AI Imagen API
- Cloud Run
Sơ đồ luồng cấp cao

Sản phẩm bạn sẽ tạo ra
Bạn sẽ tạo
- Một ứng dụng Java Spring Boot cho API dữ liệu dưới dạng dịch vụ của Spanner
- Một ứng dụng Java Spring Boot cho trường hợp sử dụng tạo hình ảnh bằng Imagen
- Giao diện người dùng tương tác cho dữ liệu đầu vào và phản hồi của câu lệnh
2. Yêu cầu
- Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
- Một dự án trên Google Cloud đã bật tính năng thanh toán
Trước khi bắt đầu
- Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud
- Đảm bảo rằng 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 một dự án hay không
- Đảm bảo rằng tất cả các API cần thiết (Cloud Spanner API, Vertex AI API, Cloud Run API, Cloud Functions API) đều được bật
- 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. Tham khảo tài liệu về các lệnh và cách sử dụng gcloud
Trong Cloud Console, hãy nhấp vào Activate Cloud Shell (Kích hoạt Cloud Shell) ở góc trên cùng bên phải:

Nếu bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project <YOUR_PROJECT_ID>
- Chuyển đến trang Cloud Spanner bằng dự án Google Cloud đang hoạt động để bắt đầu
3. Chuẩn bị dữ liệu bằng Spanner
Trước khi tạo ứng dụng, hãy hoàn tất quá trình thiết lập cơ sở dữ liệu bằng cách tạo một phiên bản, cơ sở dữ liệu và bảng Cloud Spanner. Bạn có thể tham khảo blog này để đọc thêm thông tin chi tiết về các tính năng, DDL, DML và nhiều nội dung khác của Cloud Spanner. Bạn có thể làm theo các bước dưới đây để tạo các đối tượng cơ sở dữ liệu cần thiết cho dự án này:
- Tạo một phiên bản bằng cách nhấp vào CREATE INSTANCE (TẠO PHIÊN BẢN) trên trang phiên bản.
- Nhập thông tin chi tiết như trong hình ảnh sau rồi nhấp vào TẠO:

- Sau khi tạo, trên trang tổng quan về phiên bản, hãy nhấp vào TẠO CƠ SỞ DỮ LIỆU
- Cung cấp tên của cơ sở dữ liệu là "first-spanner-db" rồi nhập DDL sau đây trong phần DDL TEMPLATES (MẪU DDL) và nhấp vào SUBMIT (GỬI):
CREATE TABLE Yoga_Poses(
Pose_Id INT64 NOT NULL,
Name STRING(1024),
Breath STRING(1024),
Description STRING(1024)
) PRIMARY KEY(Pose_Id);
Cơ sở dữ liệu và bảng sẽ được tạo do kết quả của bước cuối cùng. Bây giờ, hãy chèn một vài hàng vào bảng Yoga_Poses để chúng ta có thể bắt đầu tạo ứng dụng Spring Boot.
- Nhấp vào Spanner Studio trên ngăn Database (Cơ sở dữ liệu) ở bên trái rồi mở một thẻ trình chỉnh sửa truy vấn mới như trong hình bên dưới:

- Chạy các truy vấn INSERT sau:
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(1, 'STAND', 'INHALE AND EXHALE',
'STAND WITH YOUR FEET HIP WIDTH APART AND ARMS RESTING BY THE SIDES');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(2, 'PLANK', 'INHALE OR EXHALE',
'PLANT YOUR TOES AND PALMS ON THE MAT WITH BODY PARALLEL TO THE GROUND');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(3, 'SIT', 'INHALE AND EXHALE',
'SIT ON THE FLOOR LEGS CROSSED');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(4, 'BEND', 'EXHALE',
'FOLD FORWARD AS YOU STAND, HANDS REACHING TO THE FLOOR');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(5, 'PUSH UP', 'EXHALE',
'PLANK WITH ELBOWS ON MAT');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(6, 'SEATED FORWARD BEND', 'EXHALE',
'FOLD FORWARD AS YOU SIT, HANDS TRYING TO REACH THE FEET');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(7, 'LUNGE', 'EXHALE',
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK LEG STRAIGHT');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(8, 'COURTESY LUNGE', 'INHALE',
'ONE LEG TO THE FRONT 90 DEGREES TO THE FLOOR AND THE BACK KNEE TOUCHING THE FLOOR');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(9, 'BANK BEND', 'INHALE',
'STAND WITH ARMS UP AND BODY BENT BACKWARDS, ARCHING YOUR SPINE, LOOKING AT THE SKY');
INSERT INTO Yoga_Poses(Pose_Id, Name, Breath, Description)
VALUES(10, 'BICEP ACTION', 'INHALE AND EXHALE',
'CURL, PRESS AND WORK YOUR BICEPS');
Giờ đây, chúng ta đã tạo xong phiên bản, cơ sở dữ liệu, bảng và dữ liệu Spanner và sẵn sàng cho ứng dụng.
4. Tạo một API REST bằng Spring Boot và Spanner cho dữ liệu tư thế
Để làm quen với Spring Boot và bảng điều khiển Cloud của Google, hãy xem blog này.
- Khởi động ứng dụng Spring Boot Để khởi động ứng dụng này từ đầu, hãy làm theo blog này. Để sao chép từ kho lưu trữ và bắt đầu hành động, bạn chỉ cần chạy lệnh bên dưới trong thiết bị đầu cuối Cloud Shell:
git clone https://github.com/AbiramiSukumaran/spanner-springb
Thao tác này sẽ tạo dự án spanner-springb trong máy cloud shell của bạn. Để tìm hiểu các thành phần của ứng dụng, hãy xem blog.
- Hãy tạo và chạy ứng dụng. Để làm việc này, hãy chạy các lệnh sau từ thiết bị đầu cuối Cloud Shell:
cd spanner-springb
./mvnw package
./mvnw spring-boot:run
- Triển khai ứng dụng trong Cloud Run để ứng dụng này có sẵn cho ứng dụng tạo tư thế. Để làm việc này, hãy chạy lệnh sau từ thiết bị đầu cuối Cloud Shell:
gcloud run deploy –source .
Truyền các thông số bắt buộc và đảm bảo ứng dụng của bạn được triển khai. URL dịch vụ được tạo phải có khả năng liệt kê dữ liệu được tạo trong Spanner.
5. Khởi động một ứng dụng tạo tư thế bằng Spring Boot, Spanner và Imagen
Đến đây, chúng ta đã hoàn tất phần trên cùng của sơ đồ quy trình, tức là cung cấp dữ liệu Spanner dưới dạng một dịch vụ (API REST). Bây giờ, hãy tạo một ứng dụng khách gọi dữ liệu của Spanner, gọi API Imagen bằng một câu lệnh và trả về chuỗi được mã hoá Base64 dưới dạng hình ảnh cho giao diện người dùng.
- Đến đây, bạn đã quen thuộc với cấu trúc dự án Spring Boot và ý nghĩa của cấu trúc này. Vì vậy, bạn sẽ nhanh chóng chuyển thẳng đến bước sao chép repo vào máy cloud shell bằng cách chạy lệnh bên dưới trong thiết bị đầu cuối cloud shell:
git clone https://github.com/AbiramiSukumaran/genai-posegen
Thao tác này sẽ tạo dự án genai-posegen trong máy cloud shell của bạn. Cấu trúc dự án được sao chép sẽ xuất hiện như sau trong trình chỉnh sửa Cloud Shell:

Lớp Java PromptController có lệnh gọi dịch vụ cơ sở dữ liệu, việc triển khai logic nghiệp vụ và lệnh gọi API AI tạo sinh của Imagen. Lớp này tương tác với các mẫu Thymeleaf để xử lý việc tích hợp dữ liệu vào giao diện người dùng. Có 3 phương thức dịch vụ trong lớp này: 1) để nhận dữ liệu đầu vào của câu lệnh, 2) để xử lý yêu cầu và gọi API Imagen, 3) để xử lý phản hồi của Imagen.
Prompt và Yoga là các lớp POJO chứa các trường, phương thức getter và setter để tương tác với Imagen API và Spanner Data Server API tương ứng.
Các tệp html Index và getImage trong thư mục mẫu chứa các mẫu cho giao diện người dùng và có các phần phụ thuộc của tập lệnh JS và CSS trong các thư mục tương ứng.
Tích hợp Vertex AI Imagen API Đối với trường hợp sử dụng tạo hình ảnh, chúng tôi đang sử dụng Vertex AI Imagen API theo định dạng sau:
https://<<region>>- aiplatform.googleapis.com/v1/projects/<<your-project-id>>/locations/<<region>>/publishers/google/models/imagegeneration:predict
Bạn có thể đọc thêm về các chức năng của Imagen tại đây. API này trả về phản hồi ở định dạng chuỗi được mã hoá Base64. Để chuyển đổi thành hình ảnh, chúng ta đã sử dụng phương thức setattribute javascript (trong tệp getImage.js) trên đối tượng hình ảnh như sau trong tệp getImage.HTML:
poseImage.setAttribute('src', "data:image/jpg;base64," + baseStr64);
Uỷ quyền Imagen API yêu cầu bạn phải bật xác thực mã thông báo của người mang để truy cập vào API này. Trong trường hợp này, tôi đã sử dụng phương pháp JSON Thông tin xác thực mặc định của ứng dụng. Bạn có thể triển khai bằng cách chạy lệnh bên dưới từ cửa sổ dòng lệnh của Cloud Shell và làm theo hướng dẫn trong cửa sổ dòng lệnh:
gcloud auth application-default login
Nhập "Y" để xác thực bằng tài khoản của bạn. Cho phép truy cập và sao chép mã uỷ quyền xuất hiện trong cửa sổ bật lên. Ngay khi thực hiện việc đó, bạn sẽ nhận được thông tin đăng nhập mặc định của ứng dụng trong tệp JSON được lưu vào một vị trí tương tự như sau: /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json.
Tải tệp xuống hoặc sao chép nội dung của tệp JSON bằng cách chạy lệnh cat (cat /tmp/tmp.Fh0Gf4yF0V/application_default_credentials.json) rồi sử dụng tệp đó trong ứng dụng ở phương thức callImagen() của lớp PromptController.java. Bạn có thể đọc thêm về quy trình xác thực tại đây.
Giao diện người dùng Chúng tôi đã sử dụng Thymeleaf làm công cụ mẫu để phân tích cú pháp và hiển thị dữ liệu cho các tệp mẫu giao diện người dùng cũng như thêm thiết kế trang nhã vào giao diện người dùng. Nó tương tự như HTML nhưng hỗ trợ nhiều thuộc tính hơn để xử lý dữ liệu được hiển thị. index.html chứa các thành phần thiết kế trang đích và cho phép người dùng chọn chủ đề cũng như thêm một câu lệnh ghi đè để tạo hình ảnh mong muốn.
6. Xây dựng và triển khai
Giờ đây, bạn đã sao chép mã, thay thế các giá trị cho phần giữ chỗ (nếu có) cho dự án, vùng và thông tin xác thực của mình. Hãy chuyển sang bước tạo và triển khai ứng dụng. Chuyển đến thư mục dự án trong thiết bị đầu cuối Cloud Shell bằng lệnh, sau đó tạo và triển khai để kiểm thử cục bộ trong máy Cloud Shell bằng 3 lệnh sau đây lần lượt:
cd genai-posegen
./mvnw package
./mvnw spring-boot:run
Triển khai ứng dụng trong Cloud Run để ứng dụng có thể truy cập trên đám mây. Để thực hiện việc này, hãy chạy lệnh sau từ dòng lệnh của Cloud Shell trong thư mục dự án:
gcloud run deploy –source .
Truyền các thông số bắt buộc và đảm bảo ứng dụng của bạn được triển khai.
7. Bản minh hoạ
Sau khi triển khai ứng dụng, bạn sẽ thấy URL dịch vụ trong thiết bị đầu cuối. Nhấp vào đường liên kết và xem ứng dụng tạo hình ảnh tư thế của bạn chạy trên Google Cloud mà không cần máy chủ!

8. Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong bài đăng này, hãy làm theo các bước sau:
- Trong bảng điều khiển Cloud, hãy chuyển đến trang Quản lý tài nguyên
- 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á
- Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án
- Nếu bạn không muốn xoá dự án, hãy xoá thực thể Spanner bằng cách chuyển đến thực thể mà bạn vừa tạo cho dự án này rồi nhấp vào nút XOÁ THỰC THỂ ở góc trên cùng bên phải của trang tổng quan về thực thể
- Bạn cũng có thể chuyển đến trang dịch vụ Cloud Run, chọn các dịch vụ được tạo trong dự án này rồi nhấp vào nút xoá để xoá các dịch vụ.
9. Xin chúc mừng
Trong blog này, chúng tôi đã có thể mang ứng dụng Spring Boot đầy đủ lưu trữ và xử lý dữ liệu trong Cloud Spanner, để tạo tư thế bằng cách sử dụng Imagen API của Vertex AI trên Google Cloud trong một ứng dụng khách tương tác được triển khai trong Cloud Run. Trong phần sơ đồ cấu trúc của blog này, bạn có thấy thành phần Cloud Functions (Java) mà chúng ta chưa bao giờ thực hiện không? Bạn có thể tham gia nếu muốn đóng góp. Bạn có thể triển khai 2 Java Cloud Functions để thực hiện 2 phương thức có trong tệp getimage.html: lưu tư thế vào cơ sở dữ liệu và tải phương thức hình ảnh lên. Hãy xem tài liệu về Imagen trên Vertex AI để tìm hiểu thêm về mô hình này.