1. Tổng quan
Trong thế giới ứng dụng chăm sóc sức khoẻ và thể dục, việc mang đến trải nghiệm phong phú và hấp dẫn cho người dùng là yếu tố then chốt. Đối với ứng dụng Yoga, điều này có nghĩa là không chỉ cung cấp nội dung mô tả đơn giản về các tư thế mà còn cung cấp thông tin toàn diện, nội dung đa phương tiện và khả năng tìm kiếm thông minh. Trong blog này, chúng ta sẽ khám phá cách xây dựng một cơ sở dữ liệu tư thế Yoga mạnh mẽ bằng Firestore của Google Cloud, tận dụng Tiện ích tìm kiếm vectơ để so khớp theo ngữ cảnh và tích hợp sức mạnh của Gemini 2.0 Flash (Thử nghiệm) để xử lý nội dung đa phương thức.
Tại sao nên dùng Firestore?
Firestore, cơ sở dữ liệu dạng tài liệu NoSQL không máy chủ của Google Cloud, là một lựa chọn tuyệt vời để xây dựng các ứng dụng linh động và có thể mở rộng. Dưới đây là lý do khiến ứng dụng Yoga của chúng ta phù hợp với công cụ này:
- Khả năng mở rộng và hiệu suất: Firestore tự động mở rộng quy mô để xử lý hàng triệu người dùng và tập dữ liệu khổng lồ, đảm bảo ứng dụng của bạn vẫn phản hồi nhanh ngay cả khi phát triển.
- Cập nhật theo thời gian thực: Tính năng đồng bộ hoá theo thời gian thực tích hợp sẵn giúp dữ liệu nhất quán trên tất cả ứng dụng khách đã kết nối, phù hợp với các tính năng như lớp học trực tiếp hoặc thực hành cộng tác.
- Mô hình dữ liệu linh hoạt: Cấu trúc dựa trên tài liệu của Firestore cho phép bạn lưu trữ nhiều loại dữ liệu, bao gồm cả văn bản, hình ảnh và thậm chí là nội dung nhúng, giúp bạn thể hiện thông tin phức tạp về tư thế Yoga.
- Truy vấn mạnh mẽ: Firestore hỗ trợ các truy vấn phức tạp, bao gồm cả truy vấn bằng, không bằng và giờ đây, với tiện ích mới, tìm kiếm vectơ tương đồng.
- Hỗ trợ ngoại tuyến: Firestore lưu dữ liệu vào bộ nhớ đệm cục bộ, cho phép ứng dụng của bạn hoạt động ngay cả khi người dùng không có mạng.
Cải thiện tính năng Tìm kiếm bằng tiện ích Tìm kiếm vectơ Firestore
Phương pháp tìm kiếm truyền thống dựa trên từ khoá có thể bị hạn chế khi xử lý các khái niệm phức tạp như tư thế Yoga. Người dùng có thể tìm kiếm một tư thế "mở hông" hoặc "cải thiện khả năng cân bằng" mà không biết tên tư thế cụ thể. Đây là lúc bạn cần đến tính năng Tìm kiếm vectơ.
Tính năng Tìm kiếm vectơ bằng Firestore cho phép bạn:
- Tạo nội dung nhúng: Biến đổi nội dung mô tả bằng văn bản, và trong tương lai có thể là hình ảnh và âm thanh, thành nội dung đại diện vectơ số (nội dung nhúng) giúp nắm bắt ý nghĩa ngữ nghĩa của nội dung đó bằng cách sử dụng các mô hình như các mô hình có trong Vertex AI hoặc mô hình tuỳ chỉnh.
- Lưu trữ nội dung nhúng: Lưu trữ trực tiếp các nội dung nhúng này trong tài liệu Firestore.
- Tìm kiếm theo độ tương đồng: Truy vấn cơ sở dữ liệu của bạn để tìm các tài liệu có ngữ nghĩa tương tự với một vectơ truy vấn nhất định, cho phép so khớp theo ngữ cảnh.
Tích hợp Gemini 2.0 Flash (Thử nghiệm)
Gemini 2.0 Flash là mô hình AI đa phương thức tiên tiến của Google. Mặc dù vẫn đang trong giai đoạn thử nghiệm, nhưng công cụ này mang lại nhiều khả năng thú vị để làm phong phú ứng dụng Yoga của chúng tôi:
- Tạo văn bản: Sử dụng tính năng Flash của Gemini 2.0 để tạo nội dung mô tả chi tiết về các tư thế Yoga, bao gồm cả lợi ích, cách sửa đổi và chống chỉ định.
- Tạo hình ảnh (Bắt chước): Mặc dù tính năng tạo hình ảnh trực tiếp bằng Gemini chưa được cung cấp công khai, nhưng tôi đã mô phỏng tính năng này bằng Imagen của Google, tạo ra hình ảnh thể hiện trực quan các tư thế.
- Tạo âm thanh (Bắt chước): Tương tự, chúng ta có thể sử dụng dịch vụ Chuyển văn bản sang lời nói (TTS) để tạo hướng dẫn bằng âm thanh cho từng tư thế, hướng dẫn người dùng thực hành.
Có thể tôi sẽ đề xuất tích hợp để nâng cao ứng dụng nhằm sử dụng các tính năng sau của mô hình:
- Multimodal Live API (API trực tiếp đa phương thức): API mới này giúp bạn tạo các ứng dụng phát trực tuyến hình ảnh và âm thanh theo thời gian thực bằng cách sử dụng công cụ.
- Tốc độ và hiệu suất: Gemini 2.0 Flash cải thiện đáng kể thời gian tạo mã thông báo đầu tiên (TTFT) so với Gemini 1.5 Flash.
- Cải thiện trải nghiệm tác nhân: Gemini 2.0 cải thiện khả năng hiểu nhiều phương thức, lập trình, làm theo hướng dẫn phức tạp và gọi hàm. Những điểm cải tiến này hoạt động cùng nhau để hỗ trợ trải nghiệm đại lý tốt hơn.
Để biết thêm thông tin, hãy tham khảo trang%20trên%20Gemini%201.5%20Flash) của tài liệu này.
Tìm thông tin cơ bản trên Google Tìm kiếm
Để tăng độ tin cậy và cung cấp thêm tài nguyên, chúng ta có thể tích hợp Google Tìm kiếm để làm cơ sở cho thông tin do ứng dụng cung cấp. Điều này có nghĩa là:
- Tìm kiếm theo bối cảnh: Khi người dùng quản trị nhập thông tin chi tiết về một tư thế, chúng ta có thể sử dụng tên tư thế để tìm kiếm trên Google.
- Trích xuất URL: Từ kết quả tìm kiếm, chúng ta có thể trích xuất các URL có liên quan, chẳng hạn như bài viết, video hoặc trang web Yoga uy tín, rồi hiển thị các URL đó trong ứng dụng.
Sản phẩm bạn sẽ tạo ra
Trong lớp học này, bạn sẽ:
- Tạo một bộ sưu tập Firestore và tải tài liệu Yoga
- Tìm hiểu cách tạo ứng dụng CRUD bằng Firestore
- Tạo nội dung mô tả tư thế Yoga bằng Gemini 2.0 Flash
- Bật tính năng Tìm kiếm vectơ Firebase bằng tính năng tích hợp Firestore
- Tạo nội dung nhúng từ nội dung mô tả về Yoga
- Tìm kiếm nội dung tương tự cho văn bản tìm kiếm của người dùng
Yêu cầu
2. Trước khi bắt đầu
Tạo một dự án
- 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.
- Đả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 .
- 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.
- 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
- 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
- Nếu dự án của bạn chưa được thiết lập, hãy sử dụng lệnh sau để thiết lập:
gcloud config set project <YOUR_PROJECT_ID>
- Bật các API bắt buộc.
gcloud services enable firestore.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com \
storage.googleapis.com \
secretmanager.googleapis.com \
texttospeech.googleapis.com
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.
3. Thiết lập cơ sở dữ liệu
Tài liệu này có các bước hoàn chỉnh hơn về cách thiết lập một thực thể Firestore. Nhìn chung, để bắt đầu, tôi sẽ làm theo các bước sau:
1 Chuyển đến Firestore Viewer (Trình xem Firestore) và trên màn hình Select a database service (Chọn dịch vụ cơ sở dữ liệu), hãy chọn Firestore ở chế độ Native (Gốc)
- Chọn vị trí cho Firestore
- Nhấp vào Tạo cơ sở dữ liệu (nếu đây là lần đầu tiên, hãy để cơ sở dữ liệu là "(mặc định)")
Khi bạn tạo một dự án Firestore, dự án đó cũng sẽ bật API trong Trình quản lý API trên đám mây
- LƯU Ý QUAN TRỌNG: Chọn phiên bản KIỂM THỬ (không phải BẢN PHÁT HÀNH) của Quy tắc bảo mật để có thể truy cập vào dữ liệu
- Sau khi thiết lập, bạn sẽ thấy chế độ xem Cơ sở dữ liệu Firestore, Tập hợp và Tài liệu ở chế độ Gốc như trong hình dưới đây:
- Bạn chưa cần thực hiện bước này, nhưng để lưu ý, bạn có thể nhấp vào "Bắt đầu thu thập" để tạo một bộ sưu tập mới. Đặt Mã bộ sưu tập thành "poses" (tư thế). Nhấp vào nút Lưu.
Mẹo chuyên nghiệp để áp dụng cho bản phát hành chính thức:
- Sau khi hoàn tất mô hình dữ liệu và xác định những người có thể truy cập vào các loại tài liệu khác nhau, bạn có thể tạo, chỉnh sửa và theo dõi Quy tắc bảo mật từ giao diện Firebase. Bạn có thể truy cập vào Quy tắc bảo mật thông qua đường liên kết này: https://console.firebase.google.com/u/0/project/<<your_project_id>>/firestore/rules
- Hãy nhớ chỉnh sửa, theo dõi và kiểm thử các quy tắc bảo mật trước khi triển khai / ra mắt dự án từ giai đoạn phát triển vì đây thường là nguyên nhân thầm lặng khiến ứng dụng của bạn hoạt động khác đi :)
Đối với bản minh hoạ này, chúng ta sẽ sử dụng ứng dụng trong chế độ TEST (KIỂM THỬ).
4. API REST của Firestore
- API REST có thể hữu ích cho các trường hợp sử dụng sau:a. Truy cập vào Firestore từ một môi trường bị hạn chế về tài nguyên, nơi không thể chạy một thư viện ứng dụng hoàn chỉnh. Tự động hoá việc quản trị cơ sở dữ liệu hoặc truy xuất siêu dữ liệu cơ sở dữ liệu chi tiết
- Cách dễ nhất để sử dụng Firestore là sử dụng một trong các thư viện ứng dụng gốc. Tuy nhiên, có một số trường hợp bạn nên gọi trực tiếp API REST
- Trong phạm vi của blog này, bạn sẽ thấy cách sử dụng và minh hoạ các API Firestore REST chứ không phải thư viện ứng dụng gốc
- Để xác thực, API Firestore REST chấp nhận mã thông báo Firebase Authentication ID hoặc mã thông báo Google Identity OAuth 2.0. Để biết thêm thông tin về chủ đề Xác thực và Uỷ quyền, hãy tham khảo tài liệu.
- Tất cả các điểm cuối API REST đều nằm trong URL cơ sở https://firestore.googleapis.com/v1/.
Spring Boot và API Firestore
Giải pháp này trong Khung Spring Boot là để minh hoạ một ứng dụng khách sử dụng các API Firestore để thu thập và sửa đổi thông tin chi tiết về tư thế và hơi thở Yoga với trải nghiệm tương tác của người dùng.
Để biết nội dung giải thích chi tiết từng bước về phần giải pháp CRUD Firestore trong ứng dụng tư thế Yoga, bạn có thể xem đường liên kết đến blog.
Để tập trung vào giải pháp hiện tại và tìm hiểu phần CRUD khi đang di chuyển, hãy sao chép toàn bộ giải pháp tập trung vào blog này từ kho lưu trữ bên dưới trong Cloud Shell Terminal và lấy một bản sao của cơ sở mã.
git clone https://github.com/AbiramiSukumaran/firestore-poserecommender
Lưu ý:
- Sau khi sao chép kho lưu trữ này, bạn chỉ cần thực hiện một vài thay đổi về Mã dự án, API, v.v. Bạn không cần thực hiện thay đổi nào khác để khởi động và chạy ứng dụng. Mỗi thành phần của ứng dụng sẽ được giải thích trong các phần tiếp theo. Dưới đây là danh sách các thay đổi:
- Trong tệp
src/main/java/com/example/demo/GenerateImageSample.java
, hãy thay thế "<<YOUR_PROJECT_ID>>" bằng mã dự án của bạn - Trong tệp
src/main/java/com/example/demo/GenerateEmbeddings.java
, hãy thay thế "<<YOUR_PROJECT_ID>>" bằng mã dự án của bạn - Trong
src/main/java/com/example/demo/PoseController.java
, hãy thay thế tất cả các thực thể của "<<YOUR_PROJECT_ID>>"
và tên cơ sở dữ liệu,
trong trường hợp này là"(default)",
bằng các giá trị thích hợp trong cấu hình của bạn: - Trong
src/main/java/com/example/demo/PoseController.java
, hãy thay thế "[YOUR_API_KEY]
" bằng KHÓA API của bạn cho Gemini 2.0 Flash. Bạn có thể lấy thông tin này từ AI Studio. - Nếu bạn muốn kiểm thử cục bộ, hãy chạy các lệnh sau từ thư mục dự án trong Dòng lệnh Cloud Shell:
mvn package
mvn spring-boot:run
Hiện tại, bạn có thể xem ứng dụng đang chạy bằng cách nhấp vào tuỳ chọn "xem trước trên web" trong Cloud Shell Terminal. Chúng ta chưa sẵn sàng để kiểm thử và thử nghiệm ứng dụng.
- Không bắt buộc: Nếu muốn triển khai ứng dụng trong Cloud Run, bạn sẽ phải tạo một ứng dụng Cloud Run Java hoàn toàn mới từ đầu trong Trình chỉnh sửa Cloud Shell và thêm các tệp src và tệp mẫu từ repo vào dự án mới của bạn trong các thư mục tương ứng (vì dự án kho lưu trữ github hiện tại không được thiết lập theo mặc định cho cấu hình triển khai Cloud Run). Trong trường hợp đó, bạn cần làm theo các bước sau (thay vì nhân bản kho lưu trữ hiện có):
- Chuyển đến Cloud Shell Editor (Trình chỉnh sửa Cloud Shell) (Đảm bảo rằng Trình chỉnh sửa đang mở chứ không phải cửa sổ dòng lệnh), nhấp vào biểu tượng tên Dự án trên Google Cloud ở bên trái của thanh trạng thái (phần bị chặn trong ảnh chụp màn hình bên dưới)
- Chọn New application (Ứng dụng mới) -> Cloud Run Application (Ứng dụng Cloud Run) -> Java: Cloud Run (Java: Cloud Run) trong danh sách lựa chọn và đặt tên là "firestore-poserecommender"
- Bây giờ, bạn sẽ thấy một mẫu ngăn xếp đầy đủ cho Ứng dụng Java Cloud Run, được định cấu hình sẵn và sẵn sàng sử dụng
- Xoá lớp Trình điều khiển hiện có và sao chép các tệp sau vào thư mục tương ứng trong cấu trúc dự án:
firestore-poserecommender/src/main/java/com/example/demo/
- FirestoreSampleApplication.java
- GenerateEmbeddings.java
- GenerateImageSample.java
- Pose.java
- PoseController.java
- ServletInitializer.java
firestore-poserecommender/src/main/resources/static/
- Index.html
firestore-poserecommender/src/main/resources/templates/
- contextsearch.html
- createpose.html
- errmessage.html
- pose.html
- ryoq.html
- searchpose.html
- showmessage.html
firestore-poserecommender/
- tệp Docker
- Bạn cần thực hiện các thay đổi trong các tệp tương ứng để thay thế PROJECT ID (MÃ DỰ ÁN) và API KEY (KHOÁ API) bằng các giá trị tương ứng. (các bước 1 a,b, c và d ở trên).
5. Nhập dữ liệu
Dữ liệu cho ứng dụng có trong tệp data.json này: https://github.com/AbiramiSukumaran/firestore-poserecommender/blob/main/data.json
Nếu muốn bắt đầu bằng một số dữ liệu được xác định trước, bạn có thể sao chép tệp json và thay thế tất cả các lần xuất hiện của "<<YOUR_PROJECT_ID>>" bằng giá trị của bạn
- Chuyển đến Firestore Studio
- Đảm bảo bạn đã tạo một bộ sưu tập có tên "poses"
- Thêm từng tài liệu trong tệp kho lưu trữ được đề cập ở trên theo cách thủ công
Ngoài ra, bạn có thể nhập dữ liệu một lần từ tập hợp được xác định trước mà chúng tôi đã tạo cho bạn bằng cách thực hiện các bước sau:
- Chuyển đến Cloud Shell Terminal và đảm bảo bạn đã thiết lập dự án Google Cloud đang hoạt động và bạn có quyền truy cập. Tạo một bộ chứa trong dự án bằng lệnh gsutil dưới đây. Thay thế biến <PROJECT_ID> trong lệnh bên dưới bằng Mã dự án Google Cloud của bạn:
gsutil mb -l us gs://<PROJECT_ID>-yoga-poses-bucket
- Giờ đây, khi đã tạo bộ chứa, chúng ta cần sao chép tệp xuất cơ sở dữ liệu mà chúng ta đã chuẩn bị vào bộ chứa này trước khi có thể nhập tệp đó vào cơ sở dữ liệu Firebase. Sử dụng lệnh dưới đây:
gsutil cp -r gs://demo-bq-gemini-public/yoga_poses gs://<PROJECT_ID>-yoga-poses-bucket
Giờ đây, khi đã có dữ liệu để nhập, chúng ta có thể chuyển sang bước cuối cùng là nhập dữ liệu vào cơ sở dữ liệu Firebase (mặc định) mà chúng ta đã tạo.
- Bây giờ, hãy chuyển đến bảng điều khiển Firestore rồi nhấp vào Import/Export (Nhập/Xuất) trong trình đơn điều hướng ở bên trái.
Chọn Nhập rồi chọn đường dẫn Bộ nhớ trên đám mây mà bạn vừa tạo và di chuyển cho đến khi bạn có thể chọn tệp "yoga_poses.overall_export_metadata":
- Nhấp vào Nhập.
Quá trình nhập sẽ mất vài giây và sau khi hoàn tất, bạn có thể xác thực cơ sở dữ liệu Firestore và tập hợp bằng cách truy cập vào https://console.cloud.google.com/firestore/databases, chọn cơ sở dữ liệu mặc định và tập hợp tư thế như minh hoạ bên dưới:
- Một phương pháp khác là bạn cũng có thể tạo bản ghi theo cách thủ công thông qua ứng dụng sau khi triển khai bằng thao tác "Tạo tư thế mới".
6. Tìm kiếm vectơ
Bật tiện ích Tìm kiếm vectơ Firestore
Hãy sử dụng tiện ích này để tự động nhúng và truy vấn tài liệu Firestore bằng tính năng tìm kiếm vectơ mới! Thao tác này sẽ đưa bạn đến Trung tâm tiện ích Firebase.
Khi cài đặt tiện ích Tìm kiếm vectơ, bạn sẽ chỉ định một bộ sưu tập và tên trường tài liệu. Việc thêm hoặc cập nhật tài liệu có trường này sẽ kích hoạt tiện ích này để tính toán một vectơ nhúng cho tài liệu. Vecteur nhúng này được ghi lại vào cùng một tài liệu và tài liệu được lập chỉ mục trong kho vectơ, sẵn sàng để truy vấn.
Hãy cùng xem các bước:
Cài đặt tiện ích:
Cài đặt tiện ích "Tìm kiếm vectơ bằng Firestore" từ Chợ tiện ích Firebase bằng cách nhấp vào "Cài đặt trong Bảng điều khiển Firebase".
LƯU Ý QUAN TRỌNG:
Khi lần đầu chuyển đến trang tiện ích này, bạn cần chọn chính dự án mà bạn đang làm việc trong bảng điều khiển Google Cloud có trong bảng điều khiển Firebase.
Nếu dự án của bạn không có trong danh sách, hãy tiếp tục thêm dự án đó trong Firebase (chọn dự án Google Cloud hiện có trong danh sách).
Định cấu hình tiện ích:
Chỉ định tập hợp ("poses"), trường chứa văn bản cần nhúng ("posture") và các tham số khác như kích thước nhúng.
Nếu có API cần bật được liệt kê trong bước này, trang cấu hình sẽ cho phép bạn thực hiện việc này, hãy làm theo các bước tương ứng.
Nếu trang không phản hồi sau khi bật API trong một thời gian, bạn chỉ cần làm mới trang là có thể thấy các API đã được bật.
Trong một trong các bước sau, bạn có thể sử dụng LLM mà mình chọn để tạo các mục nhúng. Chọn "Vertex AI".
Một số chế độ cài đặt tiếp theo liên quan đến tập hợp và trường mà bạn muốn nhúng:
LLM: Vertex AI
Đường dẫn bộ sưu tập: tư thế
Giới hạn truy vấn mặc định: 3
Đo khoảng cách: Cosin
Tên trường nhập: tư thế
Tên trường đầu ra: nhúng
Tên trường trạng thái: status
Nhúng tài liệu hiện có: Có
Cập nhật nội dung nhúng hiện có: Có
Vị trí của Cloud Functions: us-central1
Enable Events (Bật sự kiện): Không đánh dấu chọn
Sau khi thiết lập xong, hãy nhấp vào nút Cài đặt tiện ích. Quá trình này sẽ mất từ 3 đến 5 phút.
Tạo nội dung nhúng:
Khi bạn thêm hoặc cập nhật tài liệu trong tập hợp "poses" (tư thế), tiện ích này sẽ tự động tạo các mục nhúng bằng cách sử dụng mô hình được huấn luyện trước hoặc mô hình mà bạn chọn thông qua điểm cuối API. Trong trường hợp này, chúng ta đã chọn Vertex AI trong cấu hình tiện ích.
Tạo chỉ mục
Phương thức này sẽ yêu cầu tạo Chỉ mục trên trường nhúng tại thời điểm sử dụng tính năng nhúng trong ứng dụng.
Firestore tự động tạo chỉ mục cho các truy vấn cơ bản; tuy nhiên, bạn có thể cho phép Firestore tạo cú pháp chỉ mục bằng cách chạy các truy vấn không có chỉ mục. Firestore sẽ cung cấp cho bạn đường liên kết đến chỉ mục đã tạo trong thông báo lỗi ở phía ứng dụng. Dưới đây là danh sách các bước để tạo chỉ mục vectơ:
- Chuyển đến Cửa sổ dòng lệnh Cloud Shell
- Chạy lệnh sau:
gcloud firestore indexes composite create --collection-group="poses" --query-scope=COLLECTION --database="(default)" --field-config vector-config='{"dimension":"768", "flat": "{}"}',field-path="embedding"
Hãy đọc thêm về vấn đề này tại đây.
Sau khi tạo chỉ mục vectơ, bạn có thể thực hiện tìm kiếm bằng thuật toán kề gần nhất bằng các vectơ nhúng.
Lưu ý quan trọng:
Từ thời điểm này trở đi, bạn không cần phải thực hiện bất kỳ thay đổi nào đối với nguồn. Bạn chỉ cần làm theo để hiểu ứng dụng đang làm gì.
Tìm kiếm vectơ
Hãy xem cách ứng dụng mới tạo của bạn tiếp cận tính năng Tìm kiếm vectơ. Sau khi lưu trữ các nội dung nhúng, bạn có thể sử dụng lớp VectorQuery của SDK Firestore Java để thực hiện Tìm kiếm vectơ và nhận kết quả về vectơ kề gần nhất:
CollectionReference coll = firestore.collection("poses");
VectorQuery vectorQuery = coll.findNearest(
"embedding",
userSearchTextEmbedding,
/* limit */ 3,
VectorQuery.DistanceMeasure.EUCLIDEAN,
VectorQueryOptions.newBuilder().setDistanceResultField("vector_distance")
.setDistanceThreshold(2.0)
.build());
ApiFuture<VectorQuerySnapshot> future = vectorQuery.get();
VectorQuerySnapshot vectorQuerySnapshot = future.get();
List<Pose> posesList = new ArrayList<Pose>();
// Get the ID of the closest document (assuming results are sorted by distance)
String closestDocumentId = vectorQuerySnapshot.getDocuments().get(0).getId();
Đoạn mã này so sánh nội dung nhúng của văn bản tìm kiếm của người dùng với nội dung nhúng của các tài liệu trong Firestore và trích xuất nội dung gần nhất theo ngữ cảnh.
7. Gemini 2.0 Flash
Tích hợp Gemini 2.0 Flash (để tạo nội dung mô tả)
Hãy xem cách ứng dụng mới tạo của bạn xử lý việc tích hợp Gemini 2.0 Flash để tạo nội dung mô tả.
Giả sử một người dùng quản trị / huấn luyện viên Yoga muốn nhập thông tin chi tiết về các tư thế nhờ sự trợ giúp của Gemini 2.0 Flash, sau đó thực hiện tìm kiếm để xem các kết quả phù hợp nhất. Điều này dẫn đến việc trích xuất thông tin chi tiết về các tư thế phù hợp cùng với các đối tượng đa phương thức hỗ trợ kết quả.
String apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent?key=[YOUR_API_KEY]";
Map<String, Object> requestBody = new HashMap<>();
List<Map<String, Object>> contents = new ArrayList<>();
List<Map<String, Object>> tools = new ArrayList<>();
Map<String, Object> content = new HashMap<>();
List<Map<String, Object>> parts = new ArrayList<>();
Map<String, Object> part = new HashMap<>();
part.put("text", prompt);
parts.add(part);
content.put("parts", parts);
contents.add(content);
requestBody.put("contents", contents);
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
ResponseEntity<String> response = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
System.out.println("Generated response: " + response);
String responseBody = response.getBody();
JSONObject jsonObject = new JSONObject(responseBody);
JSONArray candidates = jsonObject.getJSONArray("candidates");
JSONObject candidate = candidates.getJSONObject(0);
JSONObject contentResponse = candidate.getJSONObject("content");
JSONArray partsResponse = contentResponse.getJSONArray("parts");
JSONObject partResponse = partsResponse.getJSONObject(0);
String generatedText = partResponse.getString("text");
System.out.println("Generated Text: " + generatedText);
a. Bắt chước hoạt động tạo hình ảnh và âm thanh
Gemini 2.0 Flash Experimental có thể tạo ra kết quả đa phương thức, tuy nhiên tôi chưa đăng ký sử dụng sớm nên đã mô phỏng đầu ra hình ảnh và âm thanh tương ứng bằng API Imagen và TTS. Hãy tưởng tượng bạn sẽ cảm thấy tuyệt vời như thế nào khi tạo được tất cả những nội dung này chỉ bằng một lệnh gọi API đến Gemini 2.0 Flash!!
try (PredictionServiceClient predictionServiceClient =
PredictionServiceClient.create(predictionServiceSettings)) {
final EndpointName endpointName =
EndpointName.ofProjectLocationPublisherModelName(
projectId, location, "google", "imagen-3.0-generate-001");
Map<String, Object> instancesMap = new HashMap<>();
instancesMap.put("prompt", prompt);
Value instances = mapToValue(instancesMap);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("sampleCount", 1);
paramsMap.put("aspectRatio", "1:1");
paramsMap.put("safetyFilterLevel", "block_few");
paramsMap.put("personGeneration", "allow_adult");
Value parameters = mapToValue(paramsMap);
PredictResponse predictResponse =
predictionServiceClient.predict(
endpointName, Collections.singletonList(instances), parameters);
for (Value prediction : predictResponse.getPredictionsList()) {
Map<String, Value> fieldsMap = prediction.getStructValue().getFieldsMap();
if (fieldsMap.containsKey("bytesBase64Encoded")) {
bytesBase64Encoded = fieldsMap.get("bytesBase64Encoded").getStringValue();
}
}
return bytesBase64Encoded;
}
try {
// Create a Text-to-Speech client
try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
// Set the text input to be synthesized
SynthesisInput input = SynthesisInput.newBuilder().setText(postureString).build();
// Build the voice request, select the language code ("en-US") and the ssml
// voice gender
// ("neutral")
VoiceSelectionParams voice =
VoiceSelectionParams.newBuilder()
.setLanguageCode("en-US")
.setSsmlGender(SsmlVoiceGender.NEUTRAL)
.build();
// Select the type of audio file you want returned
AudioConfig audioConfig =
AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();
// Perform the text-to-speech request on the text input with the selected voice
// parameters and audio file type
SynthesizeSpeechResponse response =
textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);
// Get the audio contents from the response
ByteString audioContents = response.getAudioContent();
// Convert to Base64 string
String base64Audio = Base64.getEncoder().encodeToString(audioContents.toByteArray());
// Add the Base64 encoded audio to the Pose object
return base64Audio;
}
} catch (Exception e) {
e.printStackTrace(); // Handle exceptions appropriately. For a real app, log and provide user feedback.
return "Error in Audio Generation";
}
}
b. Tìm thông tin cơ bản bằng Google Tìm kiếm:
Nếu kiểm tra mã gọi Gemini ở bước 6, bạn sẽ thấy đoạn mã sau đây để bật tính năng liên kết với Google Tìm kiếm cho phản hồi LLM:
/**Setting up Grounding*/
Map<String, Object> googleSearchTool = new HashMap<>();
googleSearchTool.put("googleSearch", new HashMap<>());
tools.add(googleSearchTool);
requestBody.put("tools", tools);
Việc này nhằm đảm bảo chúng tôi:
- Dựa trên mô hình của chúng tôi vào kết quả tìm kiếm thực tế
- Trích xuất các URL có liên quan được tham chiếu trong nội dung tìm kiếm
8. Chạy ứng dụng
Hãy xem tất cả chức năng của ứng dụng Spring Boot Java mới tạo bằng giao diện web Thymeleaf đơn giản:
- Thao tác CRUD trên Firestore (Tạo, Đọc, Cập nhật, Xoá)
- Tìm kiếm bằng từ khoá
- Tạo ngữ cảnh dựa trên AI tạo sinh
- Tìm kiếm theo ngữ cảnh (Tìm kiếm vectơ)
- Đầu ra đa phương thức liên quan đến nội dung tìm kiếm
- Chạy truy vấn của riêng bạn (Truy vấn ở định dạng structuredQuery)
Ví dụ: {"structuredQuery":{"select":{"fields":[{"fieldPath":"name"}]},"from":[{"collectionId":"fitness_poses"}]}}
Tất cả các tính năng đã thảo luận cho đến nay đều là một phần của ứng dụng mà bạn vừa tạo từ kho lưu trữ: https://github.com/AbiramiSukumaran/firestore-poserecommender
Để tạo, chạy và triển khai ứng dụng, hãy chạy các lệnh sau từ Dòng lệnh Cloud Shell:
mvn package
mvn spring-boot:run
Bạn sẽ thấy kết quả và có thể thử nghiệm các tính năng của ứng dụng. Hãy xem video dưới đây để xem minh hoạ kết quả:
Trình đề xuất tư thế bằng Firestore, Tìm kiếm vectơ và Gemini 2.0 Flash
Bước không bắt buộc:
Để triển khai ứng dụng này trên Cloud Run (giả sử bạn đã tự khởi động một ứng dụng hoàn toàn mới bằng Dockerfile và sao chép các tệp nếu cần), hãy chạy lệnh sau từ Cloud Shell Terminal trong thư mục dự án:
gcloud run deploy --source .
Cung cấp tên ứng dụng, mã khu vực (chọn mã cho us-central1) và chọn lệnh gọi chưa xác thực "Y" khi được nhắc. Bạn sẽ nhận được điểm cuối của ứng dụng trong thiết bị đầu cuối sau khi triển khai thành công.
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:
- Trong Google Cloud Console, 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, sau đó nhấp vào Shut down (Tắt) để xoá dự án.
10. Xin chúc mừng
Xin chúc mừng! Bạn đã sử dụng thành công Firestore để tạo một ứng dụng quản lý tư thế Yoga mạnh mẽ và thông minh. Bằng cách kết hợp sức mạnh của Firestore, Tiện ích tìm kiếm vectơ và các tính năng của Gemini 2.0 Flash (với tính năng tạo hình ảnh và âm thanh mô phỏng), chúng tôi đã tạo ra một ứng dụng Yoga thực sự hấp dẫn và đầy thông tin để triển khai các thao tác CRUD, thực hiện tìm kiếm dựa trên từ khoá, tìm kiếm vectơ theo ngữ cảnh và tạo nội dung đa phương tiện.
Phương pháp này không chỉ áp dụng cho ứng dụng Yoga. Khi các mô hình AI như Gemini tiếp tục phát triển, khả năng tạo ra trải nghiệm người dùng sống động và được cá nhân hoá hơn nữa sẽ ngày càng tăng. Hãy nhớ cập nhật thông tin về các bản phát triển và tài liệu mới nhất của Google Cloud và Firebase để khai thác tối đa tiềm năng của các công nghệ này.
Nếu muốn mở rộng ứng dụng này, tôi sẽ cố gắng làm hai việc với Gemini 2.0 Flash:
- Sử dụng API Multimodal Live (Trực tiếp đa phương thức) bằng cách tạo luồng âm thanh và hình ảnh theo thời gian thực cho trường hợp sử dụng.
- Sử dụng Chế độ suy nghĩ để tạo ra những suy nghĩ đằng sau câu trả lời cho hoạt động tương tác với dữ liệu theo thời gian thực, giúp trải nghiệm trở nên chân thực hơn.
Bạn có thể thử và gửi yêu cầu kéo :>D!!!