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 thích nghiên cứu và tìm tòi sách nhưng bị choáng ngợp trước quá nhiều lựa chọn? Hãy tưởng tượng bạn có một ứng dụng sử dụng 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 bản chất 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 xây dựng một ứng dụng như vậy bằng BigQuery và Cloud Functions do Gemini cung cấp.

Tổng quan về dự án

Trường hợp sử dụng của chúng tôi tập trung vào 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 các bản tóm tắt chi tiết, 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 Hàm trên đám mây của chúng tôi để phân phối các chủ đề và bản tóm tắt 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 và sẽ cung cấp một ứng dụng web để người dùng xem kết quả.

Chúng tôi sẽ chia cách 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 để xây dựng ứng dụng AI tạo sinh chỉ dành cho 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 để xây dựng ứng dụng AI tạo sinh 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 dữ liệu đầu vào ở dạng Mảng JSON và trả về một phản hồi (giá trị JSON có nhãn "trả lời").
  • Bạn sẽ thực hiện các bước tạo bản dựng 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 Google Cloud đã bật tính năng thanh toán

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

Tạo 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.

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, được tải sẵn bq:

Trong Bảng điều khiển Cloud, hãy nhấp vào 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 mình đã được xác thực và dự án đã được đặt thành mã dự á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 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 dự án:
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 này. Bạn cũng có thể sử 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 các 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 IDE Cloud Shell.

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

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

LLM không xác định trước. Vì vậy, trong 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.

Chuyển đến bảng điều khiển trò chuyện của 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 Google Cloud.

26e1491322855614.pngs

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

gcloud services enable cloudfunctions.googleapis.com

Sao chép mã đó (bạn có thể sử dụng biểu tượng sao chép ở đầu đoạn mã lệnh) rồi chạy mã đó trong Cloud Shell Terminal (Màn hình điều khiển Cloud Shell) để 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. Đang chuẩn bị Mẫu Cloud Functions cho Gemini

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

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 (thường thì tôi thích mở trình chỉnh sửa và 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 một thẻ khác).

edd258384bc74f1f.png

Sau khi mở trình chỉnh sửa, hãy đảm bảo biểu trưng Gemini ở góc dưới 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 Google Cloud ở góc dưới 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 dự án này không hoạt động, hãy nhấp vào các dự án đó, uỷ quyền, chọn Dự án Google Cloud mà bạn muốn các dự án này trỏ đến rồi kích hoạt các dự án đó.

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

ca08602b576ebd57.png

Trong danh sách đó, 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 đã tự 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, phải không?

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

d56e410fb76f183f.png

Hiện tại, bạn có thể triển khai hàm này. Nhưng đó không phải lý do chúng tôi bắt đầu làm việc này. Hãy tiếp tục xây dựng cách triển khai API Gemini Pro trong Hàm trên đám mây này bằng SDK Java.

Bây giờ, hãy xây dựng chức năng cho trường hợp sử dụng của chúng ta, tức là gọi mô hình Gemini Pro trong Hàm đám mây này. Để làm việc này, bạn có thể thêm câu lệnh khác và phát triển dần mã bằng Gemini 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 trò chuyện Gemini (bảng điều khiển trong Trình soạn thảo mã đám mây ở 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ể về gói com.google.cloud.vertexai là vì đó là gói tôi đang sử dụng trong mã nguồn để triển khai mã gọi Gemini.

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

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 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 sử dụng BOM Spring Cloud GCP để quản lý số phiên bản spring-cloud-gcp cho bạn).

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

1800f10af9331210.png

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

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

7. Sửa đổi điểm truy cậ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ị inputPoint 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 gói Cloudcode.bookshelf (giá vé đám mây). Trong cửa sổ lỗi bật lên, hãy nhấp vào bóng đèn màu vàng rồi nhấp vào tuỳ chọn có nội dung "Move HelloWorld.java" để đóng gói Cloudcode.bookshelf;.

38d721978bddc8a8.png.

  1. Cập nhật tên lớp thành Bookshelf và trong lỗi bật lê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 ứng dụng đó.

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 dự kiến dữ liệu đầu vào sẽ có cấu trúc JSON như sau:

{ &quot;calls&quot;: [[&quot;YOUR_PROMPT_HERE&quot;]] }

Thao tác này sẽ trả về phản hồi như sau:

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

Hãy dùng thử tuỳ chọn trò chuyện của Gemini trong Cloud Shell Editor ở ngăn bên trái để giải thích mã. Ngoài ra, bạn có thể chọn tất cả mã rồi nhấp vào bóng đèn màu vàng ở góc trên cùng bên trái của phần đã chọn rồi chọn "Explain this" (Giải thích điều này).

66fb67507793e368.png

9. Triển khai chức năng đám mây

Giờ thì hàm trên đám mây đã sẵn sàng, hãy hỏi Gemini cách triển khai hàm đó. Chuyển đến cuộc trò chuyện trên Gemini trong Trình chỉnh sửa mã đám mây rồi nhập thông tin sau:

   How to deploy this Cloud Function with a gcloud command?

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

9f9db98933841864.pngS

Nay tôi muốn tìm hiểu thêm. Vì vậy, tôi đã tiếp tục yêu cầu Gemini cung cấp cho tôi toàn bộ lệnh triển khai chức năng gcloud. Câu trả lời như sau:

b77701c00dc3eaf1.png

Bây giờ, tôi không biết liệu bạn có nhận được phản hồi tương tự hay không, nhưng tôi thấy khá thú vị khi nội dung bên trên chứa thêm một vài chi tiết khiến tôi ngạc nhiên, như trong hình dưới đây:

Đị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ếp tục và triển khai hàm này 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 cho 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 Kích hoạt Cloud Shell ở góc trên cùng 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 dùng lệnh bên dưới:

cd duetai-gemini-calling

Tiếp theo là lệnh sau:

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

Bạn sẽ thấy thông báo "Allow unauthenticated invocations of new function [bookshelf]?" (Cho phép các lệnh gọi chưa xác thực của hàm mới [bookshelf]?). Nói "y" rồi nhấn Enter. Sau đó, hãy trả lời một vài câu hỏi (nếu có) và triển khai Chức năng đám mây không máy chủ của bạn bằng URL được triển khai: https://us-central1-*******.cloudfunctions.net/bookshelf.

Bây giờ, hãy gọi các Hàm trên đám mây đã triển khai và kiểm thử!

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

10. Gọi Hàm trên đám mây đã triển khai

Hãy hỏi Gemini nhé! Tôi đã nhập câu lệnh

How to call the deployed cloud function?

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

1d2242715571fe6f.png

Hãy thăm dò cuộc trò chuyện bằng các câu hỏi cụ thể về các cách thay thế để gọi Hàm đã triển khai, gọi bằng lệnh gcloud, v.v. Tôi đã gửi câu lệnh dưới đây:

how to call the deployed cloud function using gcloud

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

Bạn có thể sử dụng phản hồi này ("lệnh gcloud functions call") từ dòng lệnh bằng các biện pháp điều chỉnh để phản hồi phù hợp với 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 liệu bạn có thể nhận được lệnh gọi hàm gcloud chi tiết hay không):

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

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

6f396d915251db78.png

11. Dọn dẹp

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

12. Xin chúc mừng

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