Bookshelf builder: Menggunakan Gemini untuk membangun Java Cloud Function untuk aplikasi Gemini

1. Pengantar

Apakah Anda suka membaca buku tetapi kewalahan dengan banyaknya pilihan? Bayangkan Anda memiliki aplikasi berteknologi AI yang tidak hanya merekomendasikan bacaan terbaik, tetapi juga menawarkan ringkasan singkat berdasarkan genre pilihan Anda, sehingga Anda dapat melihat sekilas esensi buku tersebut. Dalam codelab ini, saya akan memandu Anda membangun aplikasi semacam itu dengan BigQuery dan Cloud Functions yang didukung oleh Gemini.

Ringkasan Project

Kasus penggunaan kami berpusat pada 4 komponen utama berikut:

  • Database Buku: Set data publik BigQuery yang luas untuk buku arsip internet akan berfungsi sebagai katalog buku komprehensif kami.
  • Mesin Peringkasan AI: Google Cloud Functions, yang dilengkapi dengan model bahasa Gemini Pro, akan menghasilkan ringkasan bermanfaat yang disesuaikan dengan permintaan pengguna.
  • Integrasi BigQuery: Fungsi jarak jauh dalam BigQuery yang memanggil Cloud Function kami untuk memberikan tema dan ringkasan buku on-demand.
  • Antarmuka Pengguna: Aplikasi web yang dihosting di Cloud Run dan akan menawarkan aplikasi web agar pengguna dapat melihat hasilnya.

Kita akan membagi implementasi menjadi 3 codelab:

Codelab 1: Menggunakan Gemini untuk membangun Java Cloud Function untuk aplikasi Gemini.

Codelab 2: Menggunakan Gemini untuk membangun aplikasi AI Generatif khusus SQL dengan BigQuery.

Codelab 3: Menggunakan Gemini untuk membuat aplikasi web Java Spring Boot yang berinteraksi dengan BigQuery.

2. Menggunakan Gemini untuk membangun aplikasi AI Generatif tanpa server di Java Cloud Function

Yang akan Anda build

Anda akan membuat

  • Aplikasi Java Cloud Functions yang menerapkan Gemini 1.0 Pro untuk mengambil perintah tertentu sebagai input dalam bentuk Array JSON dan menampilkan respons (nilai Json berlabel "replies").
  • Anda akan melakukan langkah-langkah build dan deployment dengan bantuan Gemini

3. Persyaratan

  • Browser, seperti Chrome atau Firefox
  • Project Google Cloud yang mengaktifkan penagihan

Berikut prasyaratnya:

Buat project Anda

  1. Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
  2. Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.

Aktifkan Cloud Shell

  1. Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Google Cloud yang telah dilengkapi dengan bq:

Dari Cloud Console, klik Activate Cloud Shell di pojok kanan atas: 6757b2fb50ddcc2d.png

  1. Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda
gcloud config list project
  1. Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>

Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.

4. Mengaktifkan Gemini for Google Cloud dan API yang diperlukan

Mengaktifkan Gemini

  1. Buka Gemini for Google Cloud di Marketplace untuk mengaktifkan API. Anda juga dapat menggunakan perintah berikut:
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. Buka halaman Gemini, lalu klik "Start chatting".

Penting: Ikuti langkah 1 dan 2 dalam codelab ini untuk mulai menggunakan Gemini dan mengaktifkan Gemini di Cloud Shell IDE.

Aktifkan API lain yang diperlukan

Bagaimana cara melakukannya? Mari kita tanyakan pada Gemini. Tetapi sebelum itu, ingatlah:

LLM bersifat non-deterministik. Jadi, saat Anda mencoba perintah ini, respons yang Anda terima mungkin terlihat berbeda dengan yang ada di screenshot saya.

Buka konsol percakapan Gemini dengan mengklik ikon "Open Gemini" di sudut kanan atas di samping kotak penelusuran di konsol Google Cloud.

26e1491322855614.png

Ketik pertanyaan ini di bagian "Enter a prompt here":

How do I enable the cloud functions api using a gcloud command? 

Anda akan mendapatkan respons yang mirip dengan:

gcloud services enable cloudfunctions.googleapis.com

Salin perintah tersebut (Anda dapat menggunakan ikon salin di bagian atas cuplikan perintah) dan jalankan di Terminal Cloud Shell untuk mengaktifkan Cloud Functions. Lakukan hal yang sama untuk Cloud Run karena kita memerlukan keduanya untuk membangun dan men-deploy Cloud Functions:

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

5. Menyiapkan Template Cloud Functions dengan Gemini

Pada tahap ini, kami mengasumsikan bahwa Anda telah mengaktifkan Gemini di IDE Cloud Shell.

Buka Cloud Shell Editor dengan mengklik ikon Open Editor di sudut kanan atas Terminal Cloud Shell (biasanya saya lebih suka membuka terminal dan editor di tab terpisah secara paralel sehingga kita bisa menulis kode di satu tab dan membangun kode di tab lainnya).

edd258384bc74f1f.png

Setelah editor terbuka, pastikan logo Gemini di pojok kanan bawah konsol editor aktif (dan tidak dibatalkan). Pastikan juga bahwa Project Google Cloud Anda di pojok kiri bawah mengarah ke project aktif saat ini yang akan Anda kerjakan. Jika project tidak aktif, klik project, beri otorisasi, lalu pilih Project Google Cloud target dan aktifkan project tersebut.

Setelah keduanya aktif, klik nama project di pojok kiri bawah dan di daftar pop-up yang terbuka berjudul "Cloud Code", scroll ke "New Application" di bawah.

ca08602b576ebd57.png

Dalam daftar tersebut, pilih aplikasi Cloud Functions. Dari daftar yang muncul, pilih Java:

ac2b44245949da68.png

Dalam daftar yang muncul, ketik nama project "duetai-gemini-calling", bukan helloworld, lalu klik OK.

bf9cfe86e35cdced.png

Hore! Anda telah melakukan bootstrap pada aplikasi Java Cloud Functions sederhana dengan Gemini dan tidak banyak hal yang Anda lakukan selain pengaktifan dan konfigurasi aktivasi, bukan begitu?

Berikut struktur project yang akan Anda lihat:

d56e410fb76f183f.png

Sekarang Anda siap men-deploy fungsi. Namun, bukan itu alasan kami memulai codelab ini. Mari kita lanjutkan dan buat implementasi Gemini Pro API di Cloud Function ini menggunakan Java SDK.

Sekarang mari kita buat fungsionalitas untuk kasus penggunaan kita, yaitu memanggil model Gemini Pro di Cloud Function ini. Untuk melakukannya, Anda dapat menambahkan lebih banyak perintah dan mengembangkan kode secara bertahap dengan Gemini atau menulis logika sendiri. Saya akan menggabungkan kedua metode tersebut.

6. Tambahkan Dependensi

Di konsol chat Gemini (yang ada di dalam Cloud Code Editor di panel kiri), ketik perintah berikut:

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

Alasan saya meminta paket com.google.cloud.vertexai secara khusus adalah karena itulah yang saya gunakan dalam kode sumber tempat saya menerapkan kode pemanggilan Gemini.

Saya mendapatkan hasil ini:

62c4295b9b4654e9.png

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

Salin kode ini dan tempel di file pom.xml, tepat sebelum tag </dependencies>. Ganti versi dengan 0.1.0 (Anda dapat menghapus tag <version> jika menggunakan Spring Cloud GCP BOM untuk mengelola nomor versi spring-cloud-gcp).

Bagian dependensi akan terlihat seperti ini:

1800f10af9331210.png

Pastikan Anda memperbarui nomor versi, jika diperlukan, agar sesuai dengan di atas. Jika Anda perhatikan, saya juga menyertakan dependensi lain bersama dengan dependensi tersebut:

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

7. Mengubah titik entri fungsi dan nama class

  1. Buka file "launch.json" di folder ".vscode". Edit nama fungsi dari "function-hello-world" menjadi "function-gemini-calling".
  2. Perbarui nilai entryPoint dari "cloudcode.helloworld.HelloWorld menjadi cloudcode.bookshelf.Bookshelf.
  3. Sekarang buka file class Java "HelloWorld.java". Ubah nama paket menjadi package cloudcode.bookshelf; Pada error yang muncul, klik bohlam kuning, lalu klik opsi yang bertuliskan "Move HelloWorld.java" ke package cloudcode.bookshelf;.

38d721978bddc8a8.png

  1. Perbarui nama class menjadi Bookshelf, lalu di error yang muncul, klik bohlam kuning kecil dan pilih "Rename file to Bookshelf.java". Pilih opsi tersebut.

8. Buat metode yang memanggil Gemini Pro

Mari kita terapkan fungsi ini di class Bookshelf.java. Ganti Bookshelf.java Anda dengan kode di bawah:

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;
    }
}

Class ini mengharapkan input dalam struktur JSON seperti di bawah:

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

Respons yang ditampilkan adalah sebagai berikut:

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

Coba opsi chat Gemini dari Cloud Shell Editor di panel kiri untuk menjelaskan kode. Atau, Anda dapat memilih semua kode dan mengklik bohlam kuning di sudut kiri atas pilihan, lalu memilih opsi "Jelaskan ini".

66fb67507793e368.png

9. Men-deploy Cloud Function

Setelah Cloud Function siap, mari kita tanya Gemini cara men-deploy-nya. Buka percakapan Gemini di editor Cloud Code dan masukkan perintah berikut:

   How to deploy this Cloud Function with a gcloud command?

Saya mendapatkan respons di bawah ini:

9f9db98933841864.png

Sekarang saya ingin menyelidikinya lebih lanjut. Jadi, saya langsung meminta Gemini untuk memberikan perintah gcloud functions deploy lengkap. Responsnya seperti yang ditunjukkan di bawah ini:

b77701c00dc3eaf1.png

Saya tidak dapat memastikan apakah Anda akan menerima respons yang sama, tetapi saya merasa cukup menarik melihat bahwa respons tersebut menambahkan beberapa detail lagi yang mengejutkan saya, seperti yang terlihat pada gambar di bawah:

Format isi permintaan:

82bf20304143a374.png

dan

Format respons:

ade55b3de5d823a6.png

Sekarang, mari kita deploy fungsi dengan menjalankan perintah gcloud yang diberikan Gemini. Untuk melakukannya, kita perlu membuka Terminal Cloud Shell. Anda dapat membukanya di tab baru untuk https://console.cloud.google.com dan memastikan project yang tepat dipilih. Buka Terminal Cloud Shell dengan mengklik ikon Aktifkan Cloud Shell di pojok kanan atas konsol dan pastikan Anda berada di folder project yang tepat dengan menggunakan perintah di bawah:

cd duetai-gemini-calling

Diikuti dengan perintah di bawah:

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

Anda akan ditanya "Allow unauthenticated invocations of new function [bookshelf]?" (Izinkan pemanggilan yang tidak diautentikasi dari fungsi baru [bookshelf]?) Ucapkan "y" dan tekan enter. Setelah itu, beberapa pertanyaan jika berlaku dan akan men-deploy Cloud Function tanpa server Anda dengan URL yang di-deploy: https://us-central1-*******.cloudfunctions.net/bookshelf.

Sekarang, mari kita panggil Cloud Functions yang di-deploy dan mengujinya.

Catatan: Jika Anda secara tidak sengaja melewati pertanyaan "Izinkan pemanggilan yang tidak diautentikasi" atau memilih "T", Anda tidak akan dapat mengakses hasil Cloud Functions dan akan melihat "error izin" tanpa memberikan setelan IAM tambahan. Jadi, perhatikan hal itu.

10. Panggil Cloud Function yang di-deploy

Mari kita tanyakan pada Gemini. Saya memasukkan perintah

How to call the deployed cloud function?

Saya mendapatkan hasil di bawah ini: (Anda mungkin atau mungkin tidak melihat respons yang sama persis, silakan bereksperimen dengan perintah dan lihat perbedaan responsnya).

1d2242715571fe6f.png

Uji percakapan dengan pertanyaan spesifik seputar cara alternatif untuk memanggil Fungsi yang di-deploy, panggil menggunakan perintah gcloud, dll. Saya mengirimkan perintah di bawah:

how to call the deployed cloud function using gcloud

Saya mendapatkan respons di bawah ini: e7b29b2cfb57782c.png

Anda dapat menggunakan respons ini (perintah "gcloud functions call") dari terminal dengan penyesuaian agar berfungsi untuk skenario kita (Atau, coba teruskan parameter dalam perintah itu sendiri dan lihat apakah Anda bisa mendapatkan panggilan fungsi gcloud yang mendetail sebagai respons):

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

Berikut hasil saya:

6f396d915251db78.png

11. Pembersihan

Anda dapat menghapus Cloud Functions yang dibuat sebelumnya dengan mengklik tombol HAPUS di halaman detail Cloud Functions.

12. Selamat

Anda telah berhasil membangun, men-deploy, dan menguji Java Cloud Functions untuk memanggil Gemini 1.0 Pro menggunakan Gemini. Aplikasi ini menerima perintah input terkait rekomendasi Buku dengan ringkasan dan tema buku.