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:

  • Basis Data Buku: Kumpulan data publik BigQuery yang luas dari buku-buku arsip internet akan berfungsi sebagai katalog buku yang komprehensif.
  • 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 adalah 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 untuk Google Cloud dan API yang diperlukan

Mengaktifkan Gemini

  1. Buka Gemini untuk Google Cloud di Marketplace guna 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 di codelab ini untuk memulai Gemini dan mengaktifkan Gemini di IDE Cloud Shell.

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 dari respons 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 kode 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 membuat 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, saya 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 bangun implementasi Gemini Pro API di Cloud Function ini menggunakan Java SDK.

Sekarang, mari kita buat fungsi untuk kasus penggunaan kita, yang 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 melakukan campuran keduanya.

6. Tambahkan Dependensi

Di konsol chat Gemini (yang ada di Cloud Code Editor pada 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 dapat hasil ini:

62c4295b9b4654e9.png

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

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

Bagian dependensi akan terlihat seperti ini:

1800f10af9331210.png

Pastikan Anda memperbarui nomor versi, jika diperlukan, agar sesuai dengan yang tercantum di atas. Jika Anda melihat, 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 ke cloudcode.bookshelf.Bookshelf.
  3. Sekarang, buka file class Java "HelloWorld.java". Ubah nama paket menjadi paket cloudcode.bookshelf; Pada kesalahan yang muncul, klik bohlam kuning dan klik opsi yang mengatakan "Move HelloWorld.java" untuk memaketkan cloudcode.bookshelf;.

38d721978bddc8a8.pngS

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

8. Buat metode yang memanggil Gemini Pro

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

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

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

Tindakan ini akan menampilkan respons seperti di bawah ini:

(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 minta Gemini cara men-deploy-nya. Buka chat Gemini di editor Cloud Code dan masukkan kode 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 melanjutkan dan meminta Gemini untuk memberi saya perintah deploy fungsi gcloud yang lengkap. Responsnya adalah seperti yang ditunjukkan di bawah ini:

b77701c00dc3eaf1.png

Sekarang saya tidak dapat mengatakan apakah Anda akan menerima respons yang sama, tetapi saya merasa cukup menarik untuk melihat bahwa respons tersebut dilengkapi dengan beberapa detail lainnya 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 kepada kita. 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 menggunakan perintah di bawah:

cd duetai-gemini-calling

Diikuti oleh perintah di bawah ini:

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]?" Ucapkan "y" dan tekan enter. Setelah itu, ajukan beberapa pertanyaan jika ada dan Cloud Function serverless Anda akan di-deploy dengan URL yang di-deploy: https://us-central1-*******.cloudfunctions.net/bookshelf.

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

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

10. Memanggil 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 melihat respons yang sama persis atau tidak, jangan ragu untuk mencoba perintah dan melihat perbedaan respons).

1d2242715571fe6f.pngS

Selidiki chat dengan pertanyaan spesifik seputar cara alternatif untuk memanggil Fungsi yang di-deploy, melakukan panggilan menggunakan perintah gcloud, dll. Saya mengirimkan perintah di bawah ini:

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 tweak agar berfungsi untuk skenario kita (Atau, coba teruskan parameter di perintah itu sendiri dan lihat apakah Anda dapat 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 adalah hasilnya:

6f396d915251db78.pngS

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 menggunakan perintah input yang terkait dengan Rekomendasi buku dengan ringkasan dan tema buku.