เครื่องมือสร้างชั้นวางหนังสือ: ใช้ Gemini เพื่อสร้าง Java Cloud Function สำหรับแอปพลิเคชัน Gemini

1. บทนำ

คุณชอบอ่านหนังสือ แต่มีตัวเลือกมากมายจนเลือกไม่ถูกใช่ไหม ลองจินตนาการว่าคุณมีแอปที่ทำงานด้วยระบบ AI ซึ่งไม่เพียงแนะนำหนังสือที่เหมาะกับคุณที่สุด แต่ยังให้สรุปที่กระชับตามประเภทหนังสือที่คุณเลือก ซึ่งจะช่วยให้คุณเห็นภาพรวมของเนื้อหาหนังสือ ใน Codelab นี้ เราจะแนะนำวิธีการสร้างแอปเช่นนี้ด้วย BigQuery และ Cloud Functions ที่ขับเคลื่อนโดย Gemini

ภาพรวมของโปรเจ็กต์

กรณีการใช้งานของเรามุ่งเน้นที่องค์ประกอบหลัก 4 ประการต่อไปนี้

  • ฐานข้อมูลหนังสือ: ชุดข้อมูลสาธารณะขนาดใหญ่ของ BigQuery สำหรับหนังสือที่เก็บถาวรบนอินเทอร์เน็ตจะทำหน้าที่เป็นแคตตาล็อกหนังสือที่ครอบคลุมของเรา
  • เครื่องมือสรุปข้อมูลด้วย AI: Google Cloud Functions ที่มาพร้อมกับโมเดลภาษา Gemini-Pro จะสร้างข้อมูลสรุปที่มีประโยชน์ซึ่งปรับให้เหมาะกับคำขอของผู้ใช้
  • การผสานรวม BigQuery: ฟังก์ชันระยะไกลภายใน BigQuery ที่เรียกใช้ Cloud Function เพื่อแสดงสรุปและธีมเกี่ยวกับหนังสือแบบออนดีมานด์
  • อินเทอร์เฟซผู้ใช้: เว็บแอปที่โฮสต์บน Cloud Run ซึ่งจะนำเสนอเว็บแอปพลิเคชันแก่ผู้ใช้เพื่อดูผลลัพธ์

เราจะแบ่งการติดตั้งใช้งานออกเป็น 3 โค้ดแล็บ ดังนี้

Codelab 1: ใช้ Gemini เพื่อสร้าง Java Cloud Function สำหรับแอปพลิเคชัน Gemini

Codelab 2: ใช้ Gemini เพื่อสร้างแอปพลิเคชัน Generative AI ที่ใช้เฉพาะ SQL กับ BigQuery

Codelab 3: ใช้ Gemini เพื่อสร้างเว็บแอปพลิเคชัน Java Spring Boot ที่โต้ตอบกับ BigQuery

2. ใช้ Gemini เพื่อสร้างแอป Generative AI แบบเซิร์ฟเวอร์บน Java Cloud Function

สิ่งที่คุณจะสร้าง

คุณจะต้องสร้าง

  • แอปพลิเคชัน Java Cloud Functions ที่ใช้ Gemini 1.0 Pro เพื่อรับพรอมต์ที่เฉพาะเจาะจงเป็นอินพุตในรูปแบบ JSON Array และแสดงผลลัพธ์ (ค่า JSON ที่มีป้ายกำกับ "replies")
  • คุณจะทำขั้นตอนการสร้างและทำให้ใช้งานได้ด้วยความช่วยเหลือของ Gemini

3. ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน

สิ่งที่ต้องทำก่อนมีดังนี้

สร้างโปรเจ็กต์

  1. ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
  2. ตรวจสอบว่าเปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าเปิดใช้การเรียกเก็บเงินในโปรเจ็กต์หรือไม่

เปิดใช้งาน Cloud Shell

  1. คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานใน Google Cloud และโหลด bq ไว้ล่วงหน้า

จากคอนโซลระบบคลาวด์ ให้คลิกเปิดใช้งาน Cloud Shell ที่มุมขวาบน 6757b2fb50ddcc2d.png

  1. เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรจะเห็นการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์ของคุณแล้ว เรียกใช้คําสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์
gcloud auth list
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
  1. หากยังไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>

โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ

4. การเปิดใช้ Gemini สำหรับ Google Cloud และ API ที่จำเป็น

เปิดใช้ Gemini

  1. ไปที่ Gemini สำหรับ Google Cloud ใน Marketplace เพื่อเปิดใช้ API คุณใช้คําสั่งต่อไปนี้ได้ด้วย
gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID
  1. ไปที่หน้า Gemini แล้วคลิก "เริ่มแชท"

ข้อสำคัญ: ทำตามขั้นตอนที่ 1 และ 2 ใน Codelab นี้เพื่อเริ่มต้นใช้งาน Gemini และเปิดใช้ Gemini ใน Cloud Shell IDE ตามลำดับ

เปิดใช้ API อื่นๆ ที่จำเป็น

เราจะดำเนินการอย่างไร ลองถาม Gemini ว่า แต่อย่าลืมว่า

LLM เป็นแบบกำหนดไม่ได้ ดังนั้นขณะที่คุณลองใช้พรอมต์เหล่านี้ คำตอบที่คุณได้รับอาจแตกต่างจากในภาพหน้าจอ

ไปที่คอนโซลแชทของ Gemini โดยคลิกไอคอน "เปิด Gemini" ที่มุมขวาบนที่อยู่ติดกับแถบค้นหาในคอนโซล Google Cloud

26e1491322855614.png

พิมพ์คำถามนี้ในส่วน "ป้อนพรอมต์ที่นี่"

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

คุณควรได้รับการตอบกลับที่คล้ายกับคำถามต่อไปนี้

gcloud services enable cloudfunctions.googleapis.com

คัดลอก (คุณสามารถใช้ไอคอนคัดลอกที่ด้านบนของข้อมูลโค้ดคำสั่ง) แล้วเรียกใช้ในเทอร์มินัล Cloud Shell เพื่อเปิดใช้ Cloud Functions ให้ทำเช่นเดียวกันสำหรับ Cloud Run เนื่องจากเราต้องใช้ทั้ง 2 อย่างเพื่อสร้างและทำให้ใช้งานได้ Cloud Functions

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

5. การเตรียมเทมเพลต Cloud Functions ด้วย Gemini

ตอนนี้เราคิดว่าคุณเปิดใช้ Gemini ใน Cloud Shell IDE แล้ว

เปิด Cloud Shell Editor โดยคลิกไอคอน "เปิดเครื่องมือแก้ไข" ที่มุมขวาบนของเทอร์มินัล Cloud Shell (โดยปกติฉันชอบเปิดเทอร์มินัลและตัวแก้ไขในแท็บแยกคู่ขนานกัน เพื่อให้เราเขียนโค้ดในแต่ละแท็บและสร้างในอีกแท็บหนึ่งได้)

edd258384bc74f1f.png

เมื่อเปิดเครื่องมือแก้ไขแล้ว ให้ตรวจสอบว่าโลโก้ Gemini ที่มุมล่างขวาของคอนโซลเครื่องมือแก้ไขทำงานอยู่ (และไม่ได้ถูกยกเลิก) นอกจากนี้ โปรดตรวจสอบว่าโปรเจ็กต์ Google Cloud ที่มุมล่างซ้ายชี้ไปยังโปรเจ็กต์ที่ใช้งานอยู่ในปัจจุบันซึ่งคุณต้องการทำงานด้วย หากไม่ทำงาน ให้คลิก Authorize เลือกโปรเจ็กต์ Google Cloud ที่ต้องการให้ชี้ไปที่โปรเจ็กต์ดังกล่าว แล้วเปิดใช้งาน

เมื่อทั้ง 2 อย่างทำงานแล้ว ให้คลิกชื่อโปรเจ็กต์ที่มุมซ้ายล่างและในรายการป๊อปอัปที่ปรากฏขึ้นที่ชื่อว่า "Cloud Code" ให้เลื่อนลงไปที่ "New Application"

ca08602b576ebd57.png

ในรายการดังกล่าว ให้เลือกแอปพลิเคชัน Cloud Functions เลือก Java จากรายการที่ปรากฏขึ้น

ac2b44245949da68.png

ในรายการที่ปรากฏขึ้น ให้พิมพ์ชื่อโปรเจ็กต์ "duetai-gemini-calling" แทน helloworld แล้วคลิก "ตกลง"

bf9cfe86e35cdced.png

ไชโย คุณได้เริ่มต้นใช้งานแอปพลิเคชัน Java Cloud Functions แบบง่ายด้วย Gemini และคุณไม่ได้ดำเนินการอะไรมากนักนอกเหนือจากการเปิดใช้และการกําหนดค่าการเปิดใช้งาน ถูกต้องไหม

โครงสร้างโปรเจ็กต์ที่คุณควรเห็นมีดังนี้

d56e410fb76f183f.png

ขณะนี้คุณพร้อมทำให้ฟังก์ชันใช้งานได้แล้ว แต่นั่นไม่ใช่เหตุผลที่เราเริ่มทำแบบนี้ มาเริ่มสร้างการใช้งาน Gemini Pro API ใน Cloud Function นี้โดยใช้ Java SDK กัน

ตอนนี้มาสร้างฟังก์ชันการทำงานสำหรับ Use Case ของเรากัน ซึ่งก็คือการเรียกใช้โมเดล Gemini Pro ใน Cloud Function นี้ โดยคุณสามารถเพิ่มพรอมต์และทำให้โค้ดพัฒนาขึ้นเรื่อยๆ ด้วย Gemini หรือจะเขียนตรรกะด้วยตนเองก็ได้ ผมจะใช้ทั้ง 2 อย่างร่วมกัน

6. เพิ่มการอ้างอิง

ในคอนโซลแชทของ Gemini (ที่อยู่ภายในเครื่องมือแก้ไข Cloud Code ที่แผงด้านซ้าย) ให้พิมพ์พรอมต์ต่อไปนี้

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

สาเหตุที่เราขอแพ็กเกจ com.google.cloud.vertexai โดยเฉพาะคือเราใช้แพ็กเกจนี้ในซอร์สโค้ดที่ติดตั้งใช้งานโค้ดเรียกใช้ Gemini

ฉันได้รับผลลัพธ์นี้

62c4295b9b4654e9.png

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

คัดลอกข้อมูลนี้และวางลงในไฟล์ pom.xml ก่อนแท็ก </dependencies> แทนที่เวอร์ชันด้วย 0.1.0 (คุณนำแท็ก <version> ออกได้หากกำลังใช้ BOM ของ GCP สำหรับระบบคลาวด์ Spring เพื่อจัดการหมายเลขเวอร์ชัน spring-cloud-gcp ให้คุณ)

ส่วน Dependency ควรมีลักษณะดังนี้

1800f10af9331210.png

โปรดอัปเดตหมายเลขเวอร์ชันให้ตรงกับด้านบน หากจำเป็น โปรดสังเกตว่าเราได้รวมข้อกําหนดอื่นไว้ด้วย

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

7. แก้ไขจุดแรกเข้าของฟังก์ชันและชื่อคลาส

  1. ไปที่ไฟล์ "launch.json" ในโฟลเดอร์ ".vscode" แก้ไขชื่อฟังก์ชันจาก "function-hello-world" เป็น "function-gemini-calling"
  2. อัปเดตค่า entryPoint จาก "cloudcode.helloworld.HelloWorld" เป็น "cloudcode.bookshelf.Bookshelf"
  3. จากนั้นไปที่ไฟล์คลาส Java "HelloWorld.java" เปลี่ยนชื่อแพ็กเกจเป็น package cloudcode.bookshelf; ในข้อผิดพลาดที่ปรากฏขึ้น ให้คลิกหลอดไฟสีเหลือง แล้วคลิกตัวเลือกที่ระบุว่า "ย้าย HelloWorld.java" ไปยัง package cloudcode.bookshelf;

38d721978bddc8a8.png

  1. อัปเดตชื่อคลาสเป็น Bookshelf และคลิกหลอดไฟสีเหลืองเล็กๆ ในข้อผิดพลาดที่ปรากฏขึ้น แล้วเลือก "เปลี่ยนชื่อไฟล์เป็น Bookshelf.java" เลือกอันนั้น

8. สร้างเมธอดที่เรียกใช้ Gemini Pro

เรามาลองใช้ฟังก์ชันนี้ในคลาส Booksชั้น.java กัน แทนที่ Booksfloor.java ด้วยโค้ดด้านล่าง

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

คลาสนี้คาดหวังอินพุตในโครงสร้าง JSON ดังต่อไปนี้

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

ซึ่งจะแสดงผลลัพธ์ดังต่อไปนี้

(Json) Map<สตริง รายการ<สตริง>> {"replies": ["response"]}

ลองใช้ตัวเลือก Gemini Chat จากเครื่องมือแก้ไข Cloud Shell ในแผงด้านซ้ายเพื่ออธิบายโค้ด หรือจะเลือกโค้ดทั้งหมดแล้วคลิกหลอดไฟสีเหลืองที่มุมซ้ายบนของส่วนที่เลือก แล้วเลือกตัวเลือก "อธิบาย" ก็ได้

66fb67507793e368.png

9. ทำให้ Cloud Function ใช้งานได้

ตอนนี้ Cloud Function พร้อมแล้ว เรามาถาม Gemini เกี่ยวกับวิธีทำให้ฟังก์ชันใช้งานได้กัน ไปที่แชทของ Gemini ในเครื่องมือแก้ไข Cloud Code แล้วป้อนดังนี้

   How to deploy this Cloud Function with a gcloud command?

ฉันได้รับคำตอบด้านล่างนี้

9f9db98933841864.png

ตอนนี้เราต้องการตรวจสอบเรื่องนี้เพิ่มเติม เราจึงขอให้ Gemini ส่งคำสั่ง gcloud functions deploy แบบเต็มมาให้ การตอบกลับจะแสดงดังด้านล่าง

b77701c00dc3eaf1.png

ตอนนี้เราไม่สามารถบอกได้ว่าคุณจะได้รับการตอบกลับแบบเดียวกันหรือไม่ แต่ฉันเห็นว่าน่าสนใจมากถ้าเราได้แจ้งรายละเอียดเพิ่มเติมนี้ไว้เพื่อสร้างความประหลาดใจของเรา ดังที่เห็นได้จากภาพด้านล่าง:

รูปแบบเนื้อหาของคำขอ:

82bf20304143a374.png

และ

รูปแบบการตอบกลับ:

ade55b3de5d823a6.png

ตอนนี้มาทำให้ฟังก์ชันใช้งานได้กันโดยเรียกใช้คําสั่ง gcloud ที่ Gemini ให้มา เราต้องเปิดเทอร์มินัล Cloud Shell คุณสามารถเปิดในแท็บใหม่สำหรับ https://console.cloud.google.com และตรวจสอบว่าได้เลือกโปรเจ็กต์ที่ถูกต้องแล้ว เปิดเทอร์มินัล Cloud Shell โดยคลิกไอคอนเปิดใช้งาน Cloud Shell ที่มุมขวาบนของคอนโซล และตรวจสอบว่าคุณอยู่ในโฟลเดอร์โปรเจ็กต์ที่ถูกต้องโดยใช้คําสั่งด้านล่าง

cd duetai-gemini-calling

ตามด้วยคําสั่งด้านล่าง

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

ระบบจะถามว่า "อนุญาตการเรียกใช้ฟังก์ชันใหม่ [books] ที่ไม่ผ่านการตรวจสอบสิทธิ์ไหม" พูดว่า "y" แล้วกด Enter หลังจากนั้นให้ถามคำถาม 2-3 ข้อ (หากมี) และจะทำให้ Cloud Function แบบ Serverless ใช้งานได้ด้วย URL ที่ทำให้ใช้งานได้: https://us-central1-*******.cloudfunctions.net/booksชั้น

ต่อไปเราจะเรียกใช้ Cloud Functions ที่ทำให้ใช้งานได้แล้วและทดสอบ

หมายเหตุ: หากคุณข้ามคำถาม "อนุญาตการเรียกใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์" หรือเลือก "N" โดยไม่ได้ตั้งใจ คุณจะเข้าถึงผลลัพธ์ของ Cloud Functions ไม่ได้และจะเห็น "ข้อผิดพลาดเกี่ยวกับสิทธิ์" หากไม่ให้สิทธิ์การตั้งค่า IAM เพิ่มเติม ดังนั้นโปรดคำนึงถึงเรื่องนี้

10. เรียกใช้ Cloud Function ที่ทำให้ใช้งานได้แล้ว

มาถาม Gemini กัน ฉันป้อนข้อความแจ้ง

How to call the deployed cloud function?

เราได้รับผลลัพธ์ด้านล่าง: (คุณอาจเห็นคำตอบเดียวกันหรือไม่ก็ได้ โปรดลองพิจารณาใช้พรอมต์และดูความแตกต่างของคำตอบ)

1d2242715571fe6f.png

ตรวจสอบแชทด้วยคําถามที่เฉพาะเจาะจงเกี่ยวกับวิธีอื่นๆ ในการเรียกใช้ฟังก์ชันที่ติดตั้งใช้งาน เรียกใช้โดยใช้คําสั่ง gcloud ฯลฯ เราได้ส่งพรอมต์ด้านล่างนี้

how to call the deployed cloud function using gcloud

ฉันได้รับคำตอบด้านล่าง e7b29b2cfb57782c.png

คุณสามารถใช้คำตอบนี้ ("คำสั่ง gcloud functions call") จากเทอร์มินัลโดยทำการปรับเปลี่ยนเพื่อให้ทำงานกับสถานการณ์ของเราได้ (หรือลองส่งพารามิเตอร์ในพรอมต์เองและดูว่าคุณได้รับคำตอบแบบละเอียดของ gcloud functions call หรือไม่)

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

ผลที่ได้คือ

6f396d915251db78.png

11. ล้างข้อมูล

คุณลบ Cloud Functions ที่สร้างไว้ก่อนหน้านี้ได้โดยคลิกปุ่ม "ลบ" ในหน้ารายละเอียดของ Cloud Functions

12. ขอแสดงความยินดี

คุณสร้าง ทำให้ใช้งานได้ และทดสอบ Java Cloud Functions ในการเรียกใช้ Gemini 1.0 Pro ด้วย Gemini เสร็จสมบูรณ์แล้ว แอปพลิเคชันนี้รับข้อความแจ้งเกี่ยวกับการป้อนข้อมูลที่เกี่ยวข้องกับการแนะนำหนังสือ พร้อมด้วยสรุปและธีมของหนังสือ