Analytics למדף הספרים: שימוש ב-Gemini כדי לפתח אפליקציית Java Cloud Run שמעבירה נתונים מ-BigQuery לאינטרנט

1. מבוא

אתם אוהבים לקרוא על ספרים, אבל נופלים בקלות כמות גדולה של אפשרויות? נסו לדמיין אפליקציה מבוססת-AI שממליצה לא רק על הקריאה המושלמת, אלא גם מציעה סיכום תמציתי על סמך הז'אנר שבחרתם, כדי לתת לכם הצצה לעצמת הספר. בשיעור ה-Codelab הזה אסביר לך איך לפתח אפליקציה כזו בעזרת BigQuery, Vertex AI ו-Cloud Run, בעזרת Gemini.

סקירה כללית של הפרויקט

התרחיש לדוגמה שלנו מתמקד ב-4 הרכיבים העיקריים הבאים:

  • מסד נתונים של ספרים: מערך הנתונים הציבורי העצום של BigQuery של ספרים בארכיון האינטרנט ישמש כקטלוג המקיף של הספרים שלנו.
  • AI Summarization Engine:Google Cloud Functions, שמשולב עם מודל השפה Gemini-Pro, ייצור סיכומים מועילים שמותאמים לבקשות משתמשים.
  • שילוב עם BigQuery: פונקציה מרוחקת בתוך BigQuery שמפעילה את הפונקציה של Cloud Functions כדי לספק סיכומים ונושאים של ספרים על פי דרישה.
  • ממשק משתמש: אפליקציית אינטרנט שמתארחת ב-Cloud Run ותציע למשתמשים אפליקציית אינטרנט כדי להציג את התוצאות.

חילקנו את כל תהליך ההטמעה של הפרויקט ל-3 Codelabs, והקודלאב הזה מכסה את Codelab 3 ברשימה הבאה:

Codelab 1: שימוש ב-Gemini כדי ליצור Cloud Function ב-Java לאפליקציית Gemini.

Codelab 2: שימוש ב-Gemini ליצירת אפליקציות AI גנרטיביות מבוססות-SQL בלבד באמצעות BigQuery.

Codelab 3: שימוש ב-Gemini כדי ליצור אפליקציית אינטרנט של Java Spring Boot שמקיימת אינטראקציה עם BigQuery.

2. שימוש ב-Gemini כדי לפתח אפליקציית אינטרנט ל-Springboot באמצעות BigQuery

מה תפַתחו

  • יוצרים את מערך הנתונים והטבלה הנדרשים ב-BigQuery.
  • אפליקציית האינטרנט Java Spring אתחול יוצרת אינטראקציה עם BigQuery כדי לאחזר נתונים ותצוגות של ספרים באינטרנט.
  • האפליקציה הזו פרוסה ב-Cloud Run.
  • את השלבים האלה תבצעו בעזרת Gemini.

3. דרישות

יצירת הפרויקט

אם כבר הפעלתם חשבון לחיוב ויצרתם פרויקט באמצעות הקישור שצוין בשלב המותנה שלמעלה, אתם יכולים לדלג על השלבים הבאים.

  1. בדף לבחירת הפרויקט במסוף Google Cloud, בוחרים או יוצרים פרויקט ב-Google Cloud.
  2. הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט

הפעלת Cloud Shell

  1. נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud ומגיעה עם bq טעון מראש:

במסוף Cloud, לוחצים על Activate Cloud Shell (הפעלת 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 וממשקי ה-API הנדרשים

הפעלת Gemini

  1. עוברים אל Gemini Marketplace כדי להפעיל את ה-API. אפשר גם להשתמש בפקודה הבאה:

gcloud services enable cloudaicompanion.googleapis.com --project PROJECT_ID

  1. נכנסים לדף של Gemini ולוחצים על 'התחלת צ'אט'.

הפעלת ממשקי API נחוצים אחרים

איך עושים את זה? בואו נשאל את Gemini, נכון? אבל לפני כן, חשוב לזכור:

הערה: LLM הם לא גורמים חד-משמעיים. לכן, כשמנסים את ההנחיות האלה, התשובה שתקבלו עשויה להיראות שונה מהתשובות שמוצגות בצילום המסך שלי.

כדי לעבור למסוף הצ'אט של Gemini, לוחצים על הסמל 'פתיחת Gemini' בפינה השמאלית העליונה של מסוף Google Cloud, ליד סרגל החיפוש.

26e1491322855614.png

מקלידים את השאלה הבאה בקטע 'הזנת הנחיה כאן':

How do I enable the BigQuery and Cloud Run apis using gcloud command?

התגובה תהיה כמו בתמונה הבאה:

b97a8a9fa9143b3f.png

מעתיקים את הקוד (אפשר להשתמש בסמל ההעתקה שמופיע בחלק העליון של קטע הקוד של הפקודה) ומריצים אותו ב-Cloud Shell Terminal כדי להפעיל את השירותים המתאימים:

  • bigquery.googleapis.com
  • run.googleapis.com

5. סקירה של מערך הנתונים הציבורי ב-BigQuery עם נתוני ספרים

כדי להתחיל, כדאי להכיר את מערך הנתונים הציבורי של BigQuery שמכיל מידע על ספרים רבים בארכיון האינטרנט. אם לא ניתן להגיע למערך הנתונים internetarchivebooks מהקישור הזה, אפשר לפעול לפי השלבים הבאים כדי לעיין במערך הנתונים, או לפעול לפי המסמכים הבאים:

אפשר למצוא את מערך הנתונים הציבורי הזה בחלונית הניווט של BigQuery. הוא מופיע בצד שמאל כשמגיעים למסוף BigQuery.

39e2ac03cc99cbac.png

מקלידים 'gdelt-bq' או 'internetarchivebooks' בסרגל החיפוש ולוחצים על 'חיפוש בכל הפרויקטים'. הרחב את התוצאה וסמן בכוכב ספרים בארכיון האינטרנט, כפי שמוצג בתמונה למטה:

68dba68a79cddfc9.png.

מרחיבים את מערך הנתונים, לוחצים על gdelt-bq.internetarchivebooks ומציגים תצוגה מקדימה של הנתונים בטבלה 1920. הטבלה הזו כוללת ספרים משנת 1920 שהועברו לארכיון.

כדי להציג את הסכימה שבה נשתמש בקטעים הבאים, מריצים את השאילתה הבאה:

select * from  `gdelt-bq.internetarchivebooks.1920` limit 5;

נשתמש בשלושת השדות הבאים ב-Codelab שלנו:

  • BookMeta_Title (שם)
  • עיצובים (העיצובים מופרדים באמצעות ';')
  • BookMeta_FullText (הטקסט המלא של הספר)

6. יצירת תבנית בסיסית של Java Cloud Run באמצעות Gemini

פותחים את Cloud Shell Editor בלחיצה על סמל ה-Open Editor בפינה השמאלית העליונה של Cloud Shell Terminal (בדרך כלל אני מעדיף לפתוח את הטרמינל והעורך בכרטיסיות נפרדות במקביל, כדי שנוכל לכתוב קוד באחד ולבנות באחר).

edd258384bc74f1f.png

אחרי שפותחים את העורך, מוודאים שלוגו Gemini בפינה השמאלית התחתונה של מסוף העורך פעיל (ולא מבוטל). כמו כן, צריך לוודא שהפרויקט ב-Google Cloud, שמופיע בפינה הימנית התחתונה, מפנה לפרויקט הפעיל הנוכחי שאיתו אתם רוצים לעבוד. אם הם לא פעילים, לוחצים עליהם, נותנים הרשאה, בוחרים את פרויקט Google Cloud שאליו רוצים שהם יצביעו ומפעילים אותם.

אחרי שהשניים פעילים, לוחצים על שם הפרויקט בפינה הימנית התחתונה. ברשימה הקופצת שנפתחת, Cloud Code, גוללים למטה אל New Application (אפליקציה חדשה).

db998cc557e83f40.png

ברשימה הזו, בוחרים את האפליקציה Cloud Run. ברשימה הקופצת, בוחרים באפשרות Java:

c7748de85120507b.png

ברשימה שמופיעה, מקלידים את שם הפרויקט bookshelf-web במקום helloworld ולוחצים על 'אישור'.

7c58c764277c571f.png

מעולה! השתמשתם ב-Gemini כדי להפעיל את אפליקציית Java Cloud Run הפשוטה שלכם, ולא עשיתם הרבה מלבד הפעלת הגדרות והפעלתן, נכון?

זהו מבנה הפרויקט שאמור להופיע:

e6be37bbee730bd1.png

עכשיו אפשר לפרוס את האפליקציה. אבל זה לא הסיבה לכך שהתחלנו בפרויקט הזה. עדיין צריך לכלול את הפונקציונליות העיקרית של אפליקציית האינטרנט, שהיא אחזור נתוני הניתוח ממסד הנתונים של BigQuery והצגתם באינטרנט.

כדי לעשות את זה, אתם יכולים להוסיף עוד הנחיות ולפתח את הקוד בהדרגה בעזרת Gemini או לכתוב את הלוגיקה בעצמכם. אני אשתמש בשילוב של שניהם.

7. הוספת יחסי תלות לשימוש ב-BigQuery באפליקציית האינטרנט

עכשיו, לאחר אתחול האפליקציה, אנחנו מוכנים לבצע שינויים במקור ובמאפיינים של האפליקציה. קודם נוסיף יחסי תלות. נבקש מ-Gemini להמליץ עליו.

ב-Cloud Code Editor, מוודאים שבשורת הסטטוס מופיע Gemini פעיל בפינה הימנית התחתונה, ושהפרויקט הפעיל ב-Google Cloud נבחר בפינה הימנית התחתונה.

ב-Cloud Code Editor, עוברים לקובץ pom.xml, ממש מעל התג </dependencies>, מקלידים את ההנחיה הבאה :

171d1c40ff8124e8.png

<!-- What maven dependency should I include to access BigQuery in the app-->

התקבלה התוצאה הזו, כפי שמוצג בתמונה למטה:

2df51efd655a3557.png

הנה הדבקה של התלות לצורך נוחות. אם במקרה שלכם ההצעה מופיעה עם תג גרסה, אפשר להתעלם ממנו.

<dependency>
 <groupId>com.google.cloud</groupId>
 <artifactId>google-cloud-bigquery</artifactId>
</dependency>

8. עדכון המקור כדי לקבל את נתוני מדף הספרים לאינטרנט

מחליפים את הקוד HelloWorldController.Java בקוד הבא:

package cloudcode.helloworld.web;
import java.util.UUID;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.JobId;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.cloud.bigquery.FieldValueList;


@RestController
public final class HelloWorldController {


  /**
   * Create an endpoint for the landing page
   * @return the BigQuery analytics results string to the web
   */


  @GetMapping("/")
  public String helloWorld() throws Exception {
    /* Connect to bigquery and write a select SQL to fetch Title, Theme and Summary fields from the table `bookshelf.bookshelf_theme` if you have executed the codelab 1 of this series, if not just directly use records from gdelt-bq.internetarchivebooks.1920 table */

 
String query = "SELECT  BookMeta_Title || ' (' || Themes || ') ' as summary  from gdelt-bq.internetarchivebooks.1920 limit 10 ";


    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    QueryJobConfiguration queryConfig =
        QueryJobConfiguration.newBuilder(query)
            .setUseLegacySql(false)
            .build();
    // Create a job ID so that we can safely retry.
    JobId jobId = JobId.of(UUID.randomUUID().toString());
    Job queryJob = bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());
    // Wait for the query to complete.
    queryJob = queryJob.waitFor();
    // Check for errors
    if (queryJob == null) {
      throw new RuntimeException("Job no longer exists");
    } else if (queryJob.getStatus().getError() != null) {
      throw new RuntimeException(queryJob.getStatus().getError().toString());
    }
    // Get the results.
    TableResult result = queryJob.getQueryResults();
    String responseString = "";
    // Print all pages of the results.
    for (FieldValueList row : result.iterateAll()) {
      responseString += row.get("summary").getStringValue() + ".         \n";
      System.out.printf("%s\n", row.get("summary").getStringValue());
    }
    return responseString;
  }
}

ביצענו את השינויים הבאים בקובצי המקור:

  1. ב-HelloWorldController.java, עדכנו את ה-@Controller ל-@RestController.
  2. החלפתם את התוכן של השיטה helloWorld()‎ כך שיכלול את הקריאה ל-BigQuery, את ההפעלה של השאילתה שמאחזרת את הנתונים כדי לרשום את השם והנושאים של הספר.
  3. במקום להחזיר את התבנית של תצוגת האינדקס בזמן הטעינה, היא מתעדכנת כדי להחזיר את התגובה כמחרוזת לאינטרנט.

הערה חשובה: חשוב לזכור לעדכן את הפרטים הבאים

  1. מעדכנים את הקובץ HelloWorldControllerTests.Java ומסירים את ההערה מהקריאה הנוכחית של mvc.perform(...).

Gemini להסבר על הקוד

סיפקנו לך את הקוד ותיארנו את השינויים שביצענו בקובצי המקור. אפשר גם להשתמש ב-Gemini כדי לקבל הסברים על קוד או תגובות לקוד לפי הצורך. כמה דברים שאפשר לנסות:

  1. כשהקובץ HelloWorldController.java פתוח בסביבת הפיתוח, עוברים לחלונית הצ'אט בסביבת הפיתוח ומזינים את ההנחיה הבאה: Explain this. כדאי לעיין בהסבר המפורט של Gemini. אפשר להשתמש בתכונה הזו בכל שלב כדי לקבל הסבר על הקוד.
  2. אפשר להדגיש קטע קוד או שורה ספציפיים בקוד (למשל @GetMapping("/")) ואז להשתמש בהנחיה הבאה: Explain this. כך תקבלו הסבר מפורט רק על שורת הקוד או על קטע הקוד שבחרתם.
  3. אפשר גם לנסות כמה שאילתות שמחפשות את הקוד בדרך אחרת. לדוגמה, אפשר לבחור את שורת הקוד הבאה

BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

ומפעילים את השאילתה הבאה: "What will happen if the bigquery variable is null?" 4. אתם יכולים גם לבקש שיפורים בקוד או עיצוב מחדש של קוד בעזרת Gemini. לדוגמה, אתם יכולים לבחור את כל הקוד של השיטה helloWorld() ולתת את ההנחיה הבאה: "How do Iimprove or refactor this code?". בודקים את ההצעות ש-Gemini מציע.

9. פיתוח ופריסה

נכנסים לTerminal של Cloud Shell. מוודאים שהוא מפנה למזהה הפרויקט בטרמינל.

4b3392dd050340a3.png

עוברים לספריית הפרויקט באמצעות הפקודה cd:

cd bookshelf-web

מריצים את הפקודות הבאות אחת אחרי השנייה כדי לוודא שהאפליקציה פועלת באופן מקומי.

mvn package

mvn spring-boot:run

עכשיו לוחצים על הלחצן 'תצוגה מקדימה באינטרנט' ואז על האפשרות 'תצוגה מקדימה ביציאה 8080', כפי שמוצג בהמשך:

ea9464498b6bd9df.png

מוודאים שאפשר לראות את האפליקציה פועלת באופן מקומי במכונה של Cloud Shell.

עכשיו נשאל את Gemini איך לפרוס את אפליקציית האינטרנט הזו ב-Cloud Run. כדי לעבור אל Gemini Chat, לוחצים על הלחצן 'פתיחת Gemini' במסוף Google Cloud.

זו ההנחיה שלי:

What is the gcloud command to deploy my app to cloud run without having to containerize, only by giving the source file?

התשובה היא:

6f21c2d59b6dc416.png

מחליפים את שם השירות ואת התוויות של האזורים בפקודה gcloud, כפי שמתואר בקטע הקוד הבא:

gcloud run deploy bookshelf-web --source . --allow-unauthenticated --region $REGION

מריצים את הפקודה הבאה מהטרמינל של Cloud Shell. אמורות להופיע כמה שאלות נוספות. בוחרים את התשובות המתאימות, ואמור להיות אפשר לראות את הפריסה מתבצעת:

66f5d6e00c16a4db.png

התהליך הזה אורך כמה דקות, והאפליקציה נפרסת ב-Google Cloud ללא שרת. לוחצים על האפליקציה שפרסמתם ב-Cloud Run ומציגים את התוצאה באינטרנט:

fd342d8f16e664ab.png

10. מזל טוב

מעולה! פיתחנו, פרסנו ובדקנו אפליקציית אינטרנט ב-Java Cloud Run כדי לבצע ניתוח נתונים של מדף הספרים באמצעות Gemini. כמשימה המשך, שואלים את Gemini איך למחוק את שירות Cloud Run שנפרס ממסוף Google Cloud, ופועלים לפי השלבים שמופיעים בתשובה כדי לנקות את המשאב.