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

1. บทนำ

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

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

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

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

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

Codelab 1: ใช้ Gemini เพื่อสร้างฟังก์ชัน Cloud ของ Java สำหรับแอปพลิเคชัน 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 และแสดงผลการตอบกลับ (ค่า JSON ที่มีป้ายกำกับว่า "replies")
  • คุณจะทำขั้นตอนการสร้างและติดตั้งใช้งานด้วยความช่วยเหลือจาก Gemini

3. ข้อกำหนด

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

ข้อกำหนดเบื้องต้นมีดังนี้

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

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

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

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

จาก Cloud Console ให้คลิกเปิดใช้งาน 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 โดยคลิกไอคอน Open Editor ที่มุมขวาบนของเทอร์มินัล Cloud Shell (โดยปกติแล้วฉันชอบเปิดเทอร์มินัลและเอดิเตอร์ในแท็บแยกกันแบบคู่ขนานเพื่อให้เขียนโค้ดในแท็บหนึ่งและสร้างในอีกแท็บหนึ่งได้)

edd258384bc74f1f.png

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

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

ca08602b576ebd57.png

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

ac2b44245949da68.png

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

bf9cfe86e35cdced.png

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

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

d56e410fb76f183f.png

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

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

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

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

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> ออกได้หากใช้ Spring Cloud GCP BOM เพื่อจัดการหมายเลขเวอร์ชันของ spring-cloud-gcp)

ส่วนการขึ้นต่อกันควรมีลักษณะดังนี้

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

มาใช้ฟังก์ชันนี้ในคลาส Bookshelf.java กัน แทนที่ Bookshelf.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 ดังนี้

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

โดยจะแสดงผลการตอบกลับดังนี้

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

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

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

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

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

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

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

ตอนนี้เรามาเรียกใช้ 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 แบบละเอียดในการตอบกลับหรือไม่)

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

ผลลัพธ์ของฉันมีดังนี้

6f396d915251db78.png

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

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

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

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