Trình tạo giá sách: Sử dụng Gemini để tạo Hàm Java Cloud cho ứng dụng Gemini

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 và Cloud Functions dựa trên 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 sẽ cung cấp một ứng dụng web để người dùng xem kết quả.

Chúng ta sẽ chia quá trình triển khai thành 3 lớp học lập trình:

Lớp học lập trình 1: Sử dụng Gemini để tạo một Hàm trên đám mây 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. Sử dụng Gemini để tạo một ứng dụng AI tạo sinh mà không cần máy chủ trên Java Cloud Function

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

Bạn sẽ tạo một

  • Ứng dụng Java Cloud Functions triển khai Gemini 1.0 Pro để lấy một câu lệnh cụ thể làm đầu vào dưới dạng Mảng JSON và trả về một phản hồi (giá trị Json được gắn nhãn "replies").
  • Bạn sẽ thực hiện các bước tạo và triển khai 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

Sau đây là các điều kiện tiên quyết:

Tạo dự á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 biểu tượng 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 cho Google Cloud và các API cần thiết

Bật Gemini

  1. Chuyển đến Gemini cho Google Cloud trong 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".

Quan trọng: Hãy làm theo bước 1 và 2 trong lớp học lập trình này để bắt đầu sử dụng Gemini và bật Gemini trong Cloud Shell IDE.

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ớ:

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 cloud functions api using a gcloud command? 

Bạn sẽ nhận được phản hồi tương tự như sau:

gcloud services enable cloudfunctions.googleapis.com

Sao chép lệnh đó (bạn có thể sử dụng biểu tượng sao chép ở đầu đoạn lệnh) và kích hoạt lệnh đó trong Cloud Shell Terminal để bật Cloud Functions. Làm tương tự cho Cloud Run vì chúng ta cần cả hai để tạo và triển khai Cloud Functions:

gcloud services enable \
  cloudfunctions.googleapis.com \
  aiplatform.googleapis.com \
  run.googleapis.com \
  cloudbuild.googleapis.com

5. Chuẩn bị mẫu Cloud Functions bằng Gemini

Tại thời điểm này, tôi giả định rằng bạn đã bật Gemini trong Cloud Shell IDE.

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

ca08602b576ebd57.png

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

ac2b44245949da68.png

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

bf9cfe86e35cdced.png

Thật tuyệt! Bạn đã khởi động ứng dụng Java Cloud Functions đơn giản bằng Gemini và bạn 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:

d56e410fb76f183f.png

Bây giờ, bạn có thể triển khai hàm. Nhưng đó không phải là lý do chúng tôi bắt đầu việc này. Hãy tiếp tục và tạo quá trình triển khai Gemini Pro API trong Cloud Functions này bằng Java SDK.

Bây giờ, hãy tạo chức năng cho trường hợp sử dụng của chúng ta, đó là gọi mô hình Gemini Pro trong Cloud Functions này. Để 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.

6. Thêm phần phụ thuộc

Trong bảng điều khiển cuộc trò chuyện với Gemini (bảng điều khiển trong Trình chỉnh sửa Cloud Code ở ngăn bên trái), hãy nhập câu lệnh sau:

what is the maven dependency for com.google.cloud.vertexai library

Lý do tôi yêu cầu cụ thể gói com.google.cloud.vertexai là vì đó là gói tôi đang sử dụng trong mã nguồn của mình, nơi tôi triển khai mã gọi Gemini.

Tôi nhận được kết quả sau:

62c4295b9b4654e9.png

 <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vertexai</artifactId>
      <version>0.1.0</version>
    </dependency>

Sao chép và dán đoạn mã này vào tệp pom.xml, ngay trước thẻ </dependencies>. Thay thế phiên bản bằng 0.1.0 (Bạn có thể xoá thẻ <version> nếu đang dùng BOM Spring Cloud GCP để quản lý số phiên bản spring-cloud-gcp cho bạn).

Phần phụ thuộc sẽ có dạng như sau:

1800f10af9331210.png

Đảm bảo bạn cập nhật số phiên bản (nếu cần) cho phù hợp với thông tin ở trên. Nếu bạn nhận thấy, tôi cũng đã thêm một phần phụ thuộc khác cùng với phần phụ thuộc này:

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.10</version>
    </dependency>

7. Sửa đổi điểm nhập hàm và tên lớp

  1. Chuyển đến tệp "launch.json" trong thư mục ".vscode". Chỉnh sửa tên hàm từ "function-hello-world" thành "function-gemini-calling".
  2. Cập nhật giá trị entryPoint từ "cloudcode.helloworld.HelloWorld thành cloudcode.bookshelf.Bookshelf.
  3. Bây giờ, hãy chuyển đến tệp lớp Java "HelloWorld.java". Thay đổi tên gói thành package cloudcode.bookshelf; Trong lỗi xuất hiện, hãy nhấp vào biểu tượng bóng đèn màu vàng rồi nhấp vào lựa chọn "Move HelloWorld.java" (Di chuyển HelloWorld.java) sang package cloudcode.bookshelf;.

38d721978bddc8a8.png

  1. Cập nhật tên lớp thành Bookshelf (Giá sách) và trong lỗi xuất hiện, hãy nhấp vào bóng đèn màu vàng nhỏ rồi chọn "Rename file to Bookshelf.java" (Đổi tên tệp thành Bookshelf.java). Chọn mục đó.

8. Tạo phương thức gọi Gemini Pro

Hãy triển khai chức năng này trong lớp Bookshelf.java. Thay thế Bookshelf.java bằng mã dưới đây:

package cloudcode.bookshelf;
import java.io.BufferedWriter;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.GenerationConfig;
import com.google.cloud.vertexai.generativeai.preview.GenerativeModel;
import com.google.cloud.vertexai.generativeai.preview.ResponseHandler;
import java.io.IOException;
import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.LinkedHashMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;

public class Bookshelf implements HttpFunction {
  private static final Gson gson = new Gson();

 @Override
  public void service(HttpRequest request, HttpResponse response) throws Exception {
    BufferedWriter writer = response.getWriter();

 // Get the request body as a JSON object.
 JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
 JsonArray calls_array = requestJson.getAsJsonArray("calls");
 JsonArray calls = (JsonArray) calls_array.get(0);
 String context = calls.get(0).toString().replace("\"", "");

 //Invoke Gemini model
  String raw_result = callGemini(context);
  raw_result = raw_result.replace("\n","");
  String trimmed = raw_result.trim();
  List<String> result_list = Arrays.asList(trimmed);
  Map<String, List<String>> stringMap = new LinkedHashMap<>();
  stringMap.put("replies", result_list);
 
  // Serialization
  String return_value = gson.toJson(stringMap);
  writer.write(return_value);
    }
  public String callGemini(String context) throws IOException{
      String res = "";
        try (VertexAI vertexAi = new VertexAI("REPLACE_WITH_YOUR_PROJECT_ID", "us-central1"); ) {
          GenerationConfig generationConfig =
              GenerationConfig.newBuilder()
                  .setMaxOutputTokens(2048)
                  .setTemperature(0.4F)
                  .setTopK(32)
                  .setTopP(1)
                  .build();  
        GenerativeModel model = new GenerativeModel("gemini-pro", generationConfig, vertexAi);
        GenerateContentResponse response = model.generateContent(context);
        res = ResponseHandler.getText(response);
      }catch(Exception e){
        System.out.println(e);
        }
        return res;
    }
}

Lớp này yêu cầu dữ liệu đầu vào ở cấu trúc JSON như bên dưới:

{ "calls": [["YOUR_PROMPT_HERE"]] }

Hàm này trả về một phản hồi như dưới đây:

(Json) Map<String, List<String>> {"replies": ["response"]}

Hãy dùng thử lựa chọn cuộc trò chuyện với Gemini trong Cloud Shell Editor ở ngăn bên trái để giải thích đoạn mã. Ngoài ra, bạn có thể chọn tất cả mã rồi nhấp vào biểu tượng bóng đèn màu vàng ở góc trên cùng bên trái của vùng chọn và chọn mục "Giải thích điều này".

66fb67507793e368.png

9. Triển khai Cloud Function

Bây giờ, khi Cloud Functions đã sẵn sàng, hãy hỏi Gemini cách triển khai Cloud Functions. Chuyển đến cuộc trò chuyện với Gemini trong trình soạn thảo mã Cloud Code rồi nhập nội dung sau:

   How to deploy this Cloud Function with a gcloud command?

Tôi nhận được phản hồi như sau:

9f9db98933841864.png

Giờ đây, tôi muốn tìm hiểu thêm về vấn đề này. Vì vậy, tôi đã yêu cầu Gemini cung cấp cho tôi toàn bộ lệnh triển khai hàm gcloud. Phản hồi có dạng như sau:

b77701c00dc3eaf1.png

Tôi không thể nói chắc chắn rằng bạn sẽ nhận được câu trả lời tương tự, nhưng tôi thấy khá thú vị khi thấy câu trả lời này bổ sung thêm một vài chi tiết khiến tôi ngạc nhiên, như trong hình bên dưới:

Định dạng nội dung yêu cầu:

82bf20304143a374.png

Định dạng phản hồi:

ade55b3de5d823a6.png

Bây giờ, hãy tiến hành triển khai hàm bằng cách chạy lệnh gcloud mà Gemini đã cung cấp cho chúng ta. Để làm việc này, chúng ta cần mở Cloud Shell Terminal. Bạn có thể mở trang này trong một thẻ mới tại https://console.cloud.google.com và đảm bảo bạn đã chọn đúng dự án. Mở Cloud Shell Terminal bằng cách nhấp vào biểu tượng Activate Cloud Shell (Kích hoạt Cloud Shell) ở góc trên bên phải của bảng điều khiển và đảm bảo bạn đang ở đúng thư mục dự án bằng cách sử dụng lệnh bên dưới:

cd duetai-gemini-calling

Tiếp theo là lệnh bên dưới:

gcloud functions deploy bookshelf --runtime java17 --trigger-http --entry-point cloudcode.bookshelf.Bookshelf --allow-unauthenticated

Hệ thống sẽ hỏi bạn "Cho phép các lệnh gọi chưa được xác thực của hàm mới [bookshelf]?" Nói "y" rồi nhấn phím Enter. Sau đó, nếu có, bạn sẽ trả lời một vài câu hỏi và Cloud Functions không máy chủ sẽ triển khai với URL đã triển khai: https://us-central1-*******.cloudfunctions.net/bookshelf.

Bây giờ, hãy gọi Cloud Functions đã triển khai và kiểm thử!

Lưu ý: Nếu vô tình bỏ qua câu hỏi "Cho phép lệnh gọi chưa được xác thực" hoặc chọn "N", thì bạn sẽ không thể truy cập vào kết quả của Cloud Functions và sẽ thấy "lỗi về quyền" mà không cần cấp thêm chế độ cài đặt IAM. Vì vậy, hãy chú ý đến điều đó.

10. Gọi Cloud Function đã triển khai

Hãy hỏi Gemini xem sao? Tôi đã nhập câu lệnh

How to call the deployed cloud function?

Tôi nhận được kết quả như bên dưới: (Bạn có thể thấy hoặc không thấy câu trả lời chính xác tương tự. Hãy thoải mái thử nghiệm với câu lệnh và xem sự khác biệt trong các câu trả lời).

1d2242715571fe6f.png

Khám phá cuộc trò chuyện bằng các câu hỏi cụ thể về những cách khác để gọi Hàm đã triển khai, gọi bằng lệnh gcloud, v.v. Tôi đã gửi lời nhắc sau:

how to call the deployed cloud function using gcloud

Tôi nhận được câu trả lời như bên dưới: e7b29b2cfb57782c.png

Bạn có thể sử dụng phản hồi này (lệnh "gcloud functions call") từ thiết bị đầu cuối với các điều chỉnh để làm cho phản hồi hoạt động trong trường hợp của chúng ta (Ngoài ra, hãy thử truyền các tham số trong chính lời nhắc và xem bạn có thể nhận được lệnh gọi hàm gcloud chi tiết trong phản hồi hay không):

gcloud functions call bookshelf --region=us-central1 --gen2 --data '{"calls":[["Hello! This is my test prompt."]]}'

Sau đây là kết quả của tôi:

6f396d915251db78.png

11. Dọn dẹp

Bạn có thể xoá Cloud Functions mà mình đã tạo trước đó bằng cách nhấp vào nút XOÁ trong trang chi tiết của Cloud Functions.

12. Xin chúc mừng

Bạn đã tạo, triển khai và kiểm thử thành công một Java Cloud Functions để gọi Gemini 1.0 Pro bằng Gemini! Ứng dụng này lấy câu lệnh đầu vào liên quan đến Đề xuất sách kèm theo nội dung tóm tắt và chủ đề của sách.