Phân tích giá sách: Sử dụng Gemini để tạo ứng dụng Java Cloud Run giúp đưa dữ liệu BigQuery lên web

1. Giới thiệu

Bạn có thích đọc sách nhưng cảm thấy choáng ngợp trước vô vàn lựa chọn? Hãy tưởng tượng bạn có một ứng dụng dựa trên AI, không chỉ đề xuất cuốn sách phù hợp mà còn cung cấp bản tóm tắt ngắn gọn dựa trên thể loại bạn chọn, giúp bạn nắm bắt được nội dung cốt lõi của cuốn sách. Trong lớp học lập trình này, tôi sẽ hướng dẫn bạn cách tạo một ứng dụng như vậy bằng BigQuery, Vertex AI và Cloud Run với sự trợ giúp của Gemini.

Tổng quan về dự án

Trường hợp sử dụng của chúng tôi xoay quanh 4 thành phần chính sau:

  • Cơ sở dữ liệu sách: Tập dữ liệu công khai khổng lồ của BigQuery về sách lưu trữ trên Internet sẽ đóng vai trò là danh mục sách toàn diện của chúng tôi.
  • Công cụ tóm tắt bằng AI: Google Cloud Functions, được trang bị mô hình ngôn ngữ Gemini Pro, sẽ tạo ra những bản tóm tắt sâu sắc phù hợp với yêu cầu của người dùng.
  • Tích hợp BigQuery: Một hàm từ xa trong BigQuery gọi Cloud Functions của chúng tôi để cung cấp bản tóm tắt và chủ đề của sách theo yêu cầu.
  • Giao diện người dùng: Một ứng dụng web được lưu trữ trên Cloud Run, cung cấp một ứng dụng web để người dùng xem kết quả.

Chúng tôi đã chia toàn bộ quá trình triển khai dự án thành 3 lớp học lập trình và lớp học lập trình này bao gồm Lớp học lập trình 3 trong danh sách dưới đây:

Lớp học lập trình 1: Sử dụng Gemini để tạo một Cloud Function bằng Java cho ứng dụng Gemini.

Lớp học lập trình 2: Sử dụng Gemini để tạo các ứng dụng AI tạo sinh chỉ dùng SQL bằng BigQuery.

Lớp học lập trình 3: Sử dụng Gemini để tạo một ứng dụng web Java Spring Boot tương tác với BigQuery.

2. Dùng Gemini để tạo một ứng dụng web Spring Boot bằng BigQuery

Sản phẩm bạn sẽ tạo ra

  • Tạo tập dữ liệu và bảng BigQuery cần thiết.
  • Ứng dụng web Java Spring Boot tương tác với BigQuery để tìm nạp dữ liệu về sách và hiển thị trên web.
  • Ứng dụng này được triển khai trên Cloud Run.
  • Bạn sẽ triển khai các bước này với sự trợ giúp của Gemini.

3. 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
  • Bạn nên triển khai Cloud Function trong phần 1 của lớp học lập trình Sử dụng Gemini để tạo Cloud Function bằng Java cho một ứng dụng AI tạo sinh.
  • Có điều kiện: Nếu tại thời điểm này, bạn có quyền truy cập vào đường liên kết đến khoản tín dụng Google Cloud miễn phí (do người tổ chức hội thảo cung cấp cho bạn), hãy làm theo hướng dẫn trong trang bên dưới để hoàn tất các bước KÍCH HOẠT TÍN DỤNG và TẠO DỰ ÁN trước. Nếu bạn không có đường liên kết này, hãy tiếp tục thực hiện các bước tiên quyết về dự án và việc thanh toán bên dưới:

Tạo dự án

Bạn có thể bỏ qua các bước bên dưới nếu đã kích hoạt một tài khoản thanh toán và tạo một dự án bằng đường liên kết được đề cập trong bước có điều kiện ở trên.

  1. 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.
  2. Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên đám mây của bạn. 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.

Kích hoạt Cloud Shell

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

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:

6757b2fb50ddcc2d.png

  1. Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
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 bạn chưa đặt dự án, hãy dùng lệnh sau để đặt:
gcloud config set project <YOUR_PROJECT_ID>

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

4. Bật Gemini và các API cần thiết

Bật Gemini

  1. Chuyển đến Gemini Marketplace để bật API. Bạn cũng có thể dùng lệnh sau:

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. Truy cập vào trang Gemini rồi nhấp vào "Bắt đầu trò chuyện".

Bật các API cần thiết khác

Chúng ta sẽ làm điều đó như thế nào? Hãy hỏi Gemini xem sao nhé? Nhưng trước đó, hãy nhớ:

Lưu ý: LLM không xác định. Vì vậy, khi bạn thử các câu lệnh này, câu trả lời mà bạn nhận được có thể khác với câu trả lời trong ảnh chụp màn hình của tôi.

Truy cập vào cuộc trò chuyện với Gemini bằng cách nhấp vào biểu tượng "Mở Gemini" ở góc trên cùng bên phải, bên cạnh thanh tìm kiếm trong bảng điều khiển Cloud.

26e1491322855614.png

Nhập câu hỏi này vào phần "Nhập câu lệnh tại đây":

How do I enable the BigQuery and Cloud Run apis using gcloud command?

Bạn sẽ nhận được phản hồi như trong hình ảnh sau:

b97a8a9fa9143b3f.png

Sao chép lệnh đó (bạn có thể dùng biểu tượng sao chép ở đầu đoạn lệnh) rồi chạy lệnh trong Cloud Shell Terminal để bật các dịch vụ tương ứng:

  • bigquery.googleapis.com
  • run.googleapis.com

5. Khám phá tập dữ liệu công khai của BigQuery cho dữ liệu về sách

Bắt đầu bằng cách tìm hiểu về tập dữ liệu công khai của BigQuery chứa thông tin về nhiều sách lưu trữ trên Internet. Nếu không truy cập được tập dữ liệu internetarchivebooks qua đường liên kết này, bạn có thể làm theo các bước bên dưới để khám phá tập dữ liệu hoặc tham khảo tài liệu này:

Bạn có thể tìm thấy tập dữ liệu công khai này trong ngăn trình khám phá BigQuery. Bạn có thể tìm thấy mục này ở bên trái khi truy cập vào bảng điều khiển BigQuery.

39e2ac03cc99cbac.png

Nhập "gdelt-bq" hoặc "internetarchivebooks" vào thanh tìm kiếm rồi nhấp vào TÌM KIẾM TẤT CẢ DỰ ÁN. Mở rộng kết quả và đánh dấu sao cho sách trong kho lưu trữ Internet như minh hoạ trong hình dưới đây:

68dba68a79cddfc9.png.

Mở rộng tập dữ liệu, nhấp vào gdelt-bq.internetarchivebooks, rồi xem trước dữ liệu trong bảng 1920. Bảng này bao gồm những cuốn sách được lưu trữ từ năm 1920.

Để xem giản đồ mà chúng ta sẽ sử dụng trong các phần tiếp theo, hãy chạy truy vấn sau:

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

Chúng ta sẽ sử dụng 3 trường sau đây cho lớp học lập trình:

  • BookMeta_Title (tiêu đề)
  • Chủ đề (các chủ đề được phân tách bằng ";')
  • BookMeta_FullText (toàn bộ nội dung của cuốn sách)

6. Tạo mẫu Java Cloud Run cơ bản bằng Gemini

Mở Cloud Shell Editor bằng cách nhấp vào biểu tượng Open Editor (Mở trình chỉnh sửa) ở góc trên cùng bên phải của Cloud Shell Terminal (Tôi thường thích mở song song trình chỉnh sửa và cửa sổ dòng lệnh trong các thẻ riêng biệt để có thể viết mã trong một thẻ và tạo trong thẻ còn lại).

edd258384bc74f1f.png

Sau khi mở trình chỉnh sửa, hãy đảm bảo rằng biểu trưng Gemini ở góc dưới cùng bên phải của bảng điều khiển trình chỉnh sửa đang hoạt động (và không bị huỷ). Ngoài ra, hãy đảm bảo rằng Dự án trên Google Cloud ở góc dưới cùng bên trái đang trỏ đến dự án đang hoạt động mà bạn muốn làm việc. Nếu các API này không hoạt động, hãy nhấp vào chúng, uỷ quyền, chọn Dự án trên Google Cloud mà bạn muốn API này trỏ đến và kích hoạt chúng.

Sau khi cả hai đều hoạt động, hãy nhấp vào tên dự án ở góc dưới cùng bên trái và trong danh sách bật lên có tiêu đề "Cloud Code" (Mã đám mây), hãy di chuyển xuống "New Application" (Ứng dụng mới).

db998cc557e83f40.png

Trong danh sách đó, hãy chọn ứng dụng Cloud Run. Trong danh sách bật lên, hãy chọn Java:

c7748de85120507b.png

Trong danh sách kết quả, hãy nhập tên dự án "bookshelf-web" thay vì helloworld rồi nhấp vào OK.

7c58c764277c571f.png

Thật tuyệt! Bạn đã khởi động ứng dụng Java Cloud Run đơn giản bằng Gemini và không làm gì nhiều ngoài việc bật và kích hoạt cấu hình, đúng không?

Đây là cấu trúc dự án mà bạn sẽ thấy:

e6be37bbee730bd1.png

Ngay bây giờ, bạn có thể triển khai ứng dụng. Nhưng đó không phải là lý do chúng tôi bắt đầu việc này. Chúng ta vẫn cần phải đưa chức năng chính của ứng dụng web vào, đó là tìm nạp dữ liệu phân tích từ cơ sở dữ liệu BigQuery và hiển thị dữ liệu đó trên web.

Để làm việc này, bạn có thể thêm nhiều câu lệnh và để Gemini phát triển mã của bạn theo từng bước hoặc tự viết logic. Tôi sẽ kết hợp cả hai.

7. Thêm các phần phụ thuộc để sử dụng BigQuery trong ứng dụng web

Giờ đây, khi ứng dụng đã được khởi động, chúng ta đã sẵn sàng thực hiện các thay đổi đối với nguồn và thuộc tính của ứng dụng. Trước tiên, hãy thêm các phần phụ thuộc. Hãy yêu cầu Gemini đề xuất.

Trong Trình chỉnh sửa Cloud Code, hãy đảm bảo thanh trạng thái cho thấy Gemini đang hoạt động ở góc dưới cùng bên phải và dự án trên đám mây đang hoạt động trên Google Cloud được chọn ở góc dưới cùng bên trái.

Trong Cloud Code Editor, hãy chuyển đến tệp pom.xml, ngay phía trên thẻ </dependencies>, nhập chú thích sau :

171d1c40ff8124e8.png

<!-- What maven dependency should I include to access BigQuery in the app-->

Tôi nhận được kết quả như trong hình bên dưới:

2df51efd655a3557.png

Dán phần phụ thuộc vào đây để thuận tiện. Nếu trong trường hợp của bạn, đề xuất xuất hiện cùng với thẻ phiên bản, bạn có thể bỏ qua thẻ đó.

<dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-bigquery</artifactId>
</dependency>

8. Cập nhật nguồn để lấy dữ liệu giá sách lên web

Thay thế mã HelloWorldController.java bằng mã sau:

package cloudcode.helloworld.web;
import java.util.UUID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.cloud.bigquery.FieldValueList;


@RestController
public final class HelloWorldController {


  /**
   * Create an endpoint for the landing page
   * @return the BigQuery analytics results string to the web
   */


  @GetMapping("/")
  public String helloWorld() throws Exception {
    /* Connect to bigquery and write a select SQL to fetch Title, Theme and Summary fields from the table `bookshelf.bookshelf_theme` if you have executed the codelab 1 of this series, if not just directly use records from gdelt-bq.internetarchivebooks.1920 table */

 
String query = "SELECT  BookMeta_Title || ' (' || Themes || ') ' as summary  from gdelt-bq.internetarchivebooks.1920 limit 10 ";


    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    QueryJobConfiguration queryConfig =
        QueryJobConfiguration.newBuilder(query)
            .setUseLegacySql(false)
            .build();
    // Create a job ID so that we can safely retry.
    JobId jobId = JobId.of(UUID.randomUUID().toString());
    Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
    // Wait for the query to complete.
    queryJob = queryJob.waitFor();
    // Check for errors
    if (queryJob == null) {
      throw new RuntimeException("Job no longer exists");
    } else if (queryJob.getStatus().getError() != null) {
      throw new RuntimeException(queryJob.getStatus().getError().toString());
    }
    // Get the results.
    TableResult result = queryJob.getQueryResults();
    String responseString = "";
    // Print all pages of the results.
    for (FieldValueList row : result.iterateAll()) {
      responseString += row.get("summary").getStringValue() + ".         \n";
      System.out.printf("%s\n", row.get("summary").getStringValue());
    }
    return responseString;
  }
}

Chúng tôi đã thực hiện những thay đổi sau đối với các tệp nguồn:

  1. Trong HelloWorldController.java, hãy cập nhật @Controller thành @RestController.
  2. Thay thế nội dung của phương thức helloWorld() để đưa lệnh gọi đến BigQuery, thực thi truy vấn tìm nạp dữ liệu để liệt kê tiêu đề và chủ đề của sách.
  3. Thay vì trả về mẫu khung hiển thị chỉ mục khi tải, mẫu này sẽ được cập nhật để trả về phản hồi dưới dạng một chuỗi cho web.

Lưu ý quan trọng: Nhớ cập nhật thông tin bên dưới

  1. Cập nhật tệp HelloWorldControllerTests.Java để bình luận về lệnh gọi mvc.perform(...) hiện tại.

Gemini giúp giải thích mã

Chúng tôi đã cung cấp mã cho bạn và mô tả những thay đổi mà chúng tôi đã thực hiện đối với các tệp nguồn. Bạn cũng có thể sử dụng Gemini để nhận được nội dung giải thích mã và/hoặc nhận xét về mã khi cần. Bạn có thể thử một số cách sau:

  1. Khi mở tệp HelloWorldController.java trong IDE, hãy chuyển đến Bảng điều khiển trò chuyện trong IDE và đưa ra lời nhắc sau: Giải thích nội dung này. Xem phần giải thích chi tiết mà Gemini cung cấp. Bạn có thể sử dụng tính năng này bất cứ lúc nào để xem nội dung giải thích về mã.
  2. Bạn có thể làm nổi bật một đoạn mã hoặc dòng mã cụ thể (ví dụ: @GetMapping("/")) rồi sử dụng câu lệnh sau: Giải thích đoạn mã này. Thao tác này sẽ chỉ cung cấp nội dung giải thích chi tiết về dòng mã hoặc đoạn mã mà bạn đã chọn.
  3. Bạn thậm chí có thể thử một số câu hỏi theo cách khác để hỏi về mã. Ví dụ: bạn có thể chọn dòng mã sau

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

và đặt câu hỏi sau "Điều gì sẽ xảy ra nếu biến bigquery là giá trị rỗng?" 4. Bạn cũng có thể yêu cầu Gemini giúp cải thiện hoặc tái cấu trúc mã. Ví dụ: bạn có thể chọn toàn bộ mã cho phương thức helloWorld() và đưa ra lời nhắc sau: "Làm cách nào để cải thiện hoặc tái cấu trúc mã này?". Xem các đề xuất mà Gemini đưa ra.

9. Xây dựng và triển khai

Chuyển đến Thiết bị đầu cuối của Cloud Shell. Đảm bảo rằng mã này trỏ đến mã dự án của bạn trong thiết bị đầu cuối.

4b3392dd050340a3.png

Chuyển đến thư mục dự án bằng lệnh cd:

cd bookshelf-web

Chạy từng lệnh bên dưới để đảm bảo ứng dụng của bạn đang chạy cục bộ.

mvn package

mvn spring-boot:run

Bây giờ, hãy nhấp vào nút "Web Preview" (Xem trước trên web) rồi nhấp vào lựa chọn "Preview on port 8080" (Xem trước trên cổng 8080) như minh hoạ bên dưới:

ea9464498b6bd9df.png

Đảm bảo rằng bạn có thể thấy ứng dụng đang chạy cục bộ trên máy cloud shell.

Bây giờ, hãy hỏi Gemini cách triển khai ứng dụng web này trên Cloud Run. Chuyển đến Gemini Chat bằng cách nhấp vào nút "Mở Gemini" trên Google Cloud Console.

Đây là câu lệnh của tôi:

What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?

Dưới đây là câu trả lời:

6f21c2d59b6dc416.png

Hãy thay thế tên dịch vụ và các phần giữ chỗ khu vực trong lệnh gcloud như minh hoạ trong đoạn mã bên dưới:

gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION

Chạy lệnh này từ Cloud Shell Terminal. Bạn sẽ thấy một vài câu hỏi tiếp theo, hãy chọn câu trả lời phù hợp và bạn sẽ thấy quá trình triển khai đang diễn ra:

66f5d6e00c16a4db.png

Quá trình này mất vài phút và ứng dụng sẽ được triển khai vào Google Cloud mà không cần máy chủ. Nhấp vào ứng dụng được triển khai Cloud Run và xem kết quả trên web:

fd342d8f16e664ab.png

10. Xin chúc mừng

Xin chúc mừng! Chúng tôi đã xây dựng, triển khai và thử nghiệm thành công một ứng dụng web Java Cloud Run để thực hiện phân tích kệ sách bằng Gemini. Là một nhiệm vụ tiếp theo, hãy hỏi Gemini cách xoá Dịch vụ Cloud Run đã triển khai khỏi Google Cloud Console và làm theo các bước mà Gemini trả lời để dọn dẹp tài nguyên.