הפיכת נתונים לא מאורגנים לנתונים מובנים

1. סקירה כללית

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

לא יותר.

בשיעור Lab הזה נסביר איך להמיר 400 קובצי PDF לא מובְנים – שכוללים טקסט, טבלאות ותמונות – לטבלאות מובְנות ב-BigQuery עם קשרים שמוסקים אוטומטית ביניהן. אנחנו נעשה את זה תוך דקות באמצעות BigQuery Knowledge Catalog ו-Dataplex.

מה תפַתחו

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

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

הנה תרחיש סיוט: לקוח שואל, "אני מאוד מתעניין ביוגורט הקפוא שלך בטעם Midnight Swirl. יש בזה אלרגנים?"

כדי לענות על השאלה הזו, המערכת בדרך כלל צריכה:

  1. מחפשים את קובץ ה-PDF של המתכון 'Midnight Swirl'.
  2. קוראים את רשימת הרכיבים (למשל, "אבקת קקאו", "בסיס חלב", "מתחלב X").
  3. לחפש בעשרות קובצי PDF של ספקים כדי למצוא את גיליונות המפרט של הרכיבים הספציפיים האלה.
  4. צריך לבדוק בגיליונות של הספק אם יש אלרגנים מוסתרים שקשורים לרכיבים האלה.

ניסיון ליצור סוכן AI שעושה את זה תוך כדי תנועה על ידי קריאת 400 קובצי PDF גולמיים בזמן ריצה הוא איטי, יקר ונוטה להזיות. במקום זאת, אנחנו נשתמש בהסקת מסקנות סמנטית כדי לחלץ את כל הנתונים האלה למסד נתונים רלציוני, וכך סוכן ה-AI העתידי שלנו יהיה מהיר מאוד ויסתמך באופן מלא על נתוני SQL עובדתיים.

בואו נתחיל לבנות!

2381f1453211387d.png

מה תלמדו

  • איך מגדירים קטגוריה של Cloud Storage לקובצי המקור (קובצי PDF)
  • איך מגדירים ומריצים משימת סריקת נתונים והסקת מסקנות סמנטיות ב-Knowledge Catalog כדי לחלץ נתונים מקובצי PDF של מקורות, להסיק באופן סמנטי את הקשרים וההקשר ולאחסן אותם ב-BigQuery
  • איך משתמשים בסוכני BigQuery כדי לשוחח עם מערך הנתונים החדש שנוצר

דרישות

  • דפדפן, כמו Chrome או Firefox.
  • פרויקט ב-Google Cloud שהחיוב בו מופעל.
  • היכרות בסיסית עם SQL ו-Java.

‫2. לפני שמתחילים

יצירת פרויקט

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

תמונה של לחצן ההפעלה של Cloud Shell

  1. אחרי שמתחברים ל-Cloud Shell, בודקים שכבר בוצע אימות ושהפרויקט מוגדר למזהה הפרויקט באמצעות הפקודה הבאה:
gcloud auth list
  1. מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שפקודת gcloud מכירה את הפרויקט.
gcloud config list project
  1. אם רוצים לבצע אימות
gcloud auth login
  1. אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project <YOUR_PROJECT_ID>
  1. מפעילים את ממשקי ה-API הנדרשים: מריצים את הפקודה הבאה כדי להפעיל את כל ממשקי ה-API הנדרשים:
gcloud services enable \
    dataplex.googleapis.com \
    datacatalog.googleapis.com \
    discoveryengine.googleapis.com \
    bigqueryconnection.googleapis.com \
    bigquery.googleapis.com \
    aiplatform.googleapis.com \
    cloudresourcemanager.googleapis.com \
    serviceusage.googleapis.com \
    storage.googleapis.com

נקודות חשובות ופתרון בעיות

תסמונת 'פרויקט הרפאים'

הפעלת את הפקודה gcloud config set project, אבל בפועל את מסתכלת על פרויקט אחר בממשק המשתמש של המסוף. צריך לבדוק את מזהה הפרויקט בתפריט הנפתח שבפינה הימנית העליונה.

מחסום בחיוב

הפעלתם את הפרויקט, אבל שכחתם להוסיף חשבון לחיוב. ‫AlloyDB הוא מנוע עם ביצועים גבוהים, והוא לא יופעל אם 'מיכל הדלק' (החיוב) ריק.

השהיה בהפצת API

לחצתם על 'הפעלת ממשקי API', אבל בשורת הפקודה עדיין מופיעה ההודעה Service Not Enabled. מחכים 60 שניות. ייקח כמה רגעים עד שהנוירונים בענן יתעוררו.

מכסה Quags

אם אתם משתמשים בחשבון חדש לתקופת ניסיון, יכול להיות שתגיעו למכסה אזורית של מופעי AlloyDB. אם הפעולה us-central1 נכשלת, מנסים את הפעולה us-east1.

סוכן שירות 'מוסתר'

לפעמים סוכן השירות של AlloyDB לא מקבל אוטומטית את התפקיד aiplatform.user. אם שאילתות ה-SQL לא יכולות לתקשר עם Gemini בהמשך, בדרך כלל זו הסיבה.

3. הגדרה של קטגוריה של Cloud Storage ב-Google Cloud

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

לפני שמתחילים:

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

ב-Cloud Shell, מריצים את הפקודה הבאה:

git clone --depth 1 --filter=blob:none --sparse https://github.com/GoogleCloudPlatform/next-26-keynotes.git

עוברים לתיקייה החדשה שנוצרה:

cd next-26-keynotes

משיכת התיקייה data-cloud-demo

git sparse-checkout set genkey/data-cloud-demo

אחרי שהתשלום יסתיים, עוברים לתיקייה data-cloud-demo ומחלצים את קובצי ה-ZIP כדי לגשת לנכסי ה-codelab.

יצירת קטגוריה והעלאה של קובצי ה-PDF של Froyo (מתכונים וספקים)

  1. במסוף Google Cloud, נכנסים לדף Cloud Storage Buckets.
  2. לוחצים על 'יצירה'.
  3. בדף Create a bucket מזינים את פרטי הקטגוריה. אחרי כל אחד מהשלבים הבאים, לוחצים על 'המשך' כדי לעבור לשלב הבא:
  4. בקטע Get started, מזינים את שם הקטגוריה. לדוגמה: froyo_data
  5. בקטע Choose where to store your data, בוחרים באפשרות Region (אזור) ומזינים את האזור הרצוי. us-central1
  6. בקטע Choose how to control access to objects, מבטלים את הסימון בתיבה Enforce public access prevention on this bucket.
  7. לוחצים על 'יצירה'.
  8. ברשימת הקטגוריות, לוחצים על הקטגוריה שיצרתם.
  9. בכרטיסייה Objects של הקטגוריה, לוחצים על Upload ואז על Upload folders.
  10. בוחרים את התיקייה recipes שחולצה בקטע 'לפני שמתחילים' של ה-codelab הזה.
  11. לחץ על 'העלה'.
  12. חוזרים על תהליך ההעלאה עבור התיקייה suppliers.

אחרי ההעלאה, מבנה הקטגוריה אמור להיראות כך (שם הקטגוריה):

596b8acb481016b7.png

4. הגדרת חיבור ל-BigQuery

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

  • נכנסים לדף BigQuery.
  • בחלונית הימנית, לוחצים על סמל הכלי 'ניתוח'. אם לא רואים את החלונית הימנית, לוחצים על 'הרחבת החלונית הימנית' כדי לפתוח אותה.
  • בחלונית Explorer, מרחיבים את שם הפרויקט ואז לוחצים על Connections (חיבורים).
  • בדף Connections (חיבורים), לוחצים על Create connection (יצירת חיבור).
  • בקטע Connection type (סוג החיבור), בוחרים באפשרות Vertex AI remote models, remote functions, BigLake and Spanner (Cloud Resource) (מודלים מרוחקים, פונקציות מרוחקות, BigLake ו-Spanner של Vertex AI (משאב בענן)).
  • בשדה Connection ID (מזהה החיבור), מזינים את שם מזהה החיבור:
  • bq-connection. חשוב לרשום את המזהה הזה, כי תצטרכו אותו בהמשך כשמגדירים את סריקת הנתונים ב-codelab הזה.
  • מגדירים את סוג המיקום כ'אזור' ואז בוחרים אזור. לדוגמה, us-central1. החיבור צריך להיות באותו אזור שבו נמצאים משאבים אחרים, כמו מערכי נתונים.
  • לוחצים על 'יצירת קישור'.
  • לוחצים על 'מעבר לחיבור'.
  • בחלונית Connection info (פרטי התחברות), מעתיקים את מזהה חשבון השירות לשימוש בשלב מאוחר יותר. חשבון השירות נראה בערך כך: bqcx-**********-qn3a@gcp-sa-bigquery-condel.iam.gserviceaccount.com.

5. הגדרת הרשאות

  1. הענקת ההרשאות הנדרשות לחיבור BigQuery כדי לגשת לאובייקטים ב-Cloud Storage ול-Knowledge Catalog

עוברים לדף IAM & Admin (ניהול זהויות והרשאות גישה) ובקטע View by Principals (תצוגה לפי ישויות מורשות), לוחצים על הלחצן Grant access (הענקת גישה), מוסיפים ישות מורשית על ידי הדבקת חשבון השירות שהעתקתם בשלב הקודם. בקטע התפקידים, מוסיפים את השמות של התפקידים הבאים אחד אחרי השני ושומרים:

  • roles/storage.objectUser
  • roles/storage.objectViewer
  • roles/bigquery.user
  • roles/bigquery.dataEditor
  • roles/aiplatform.viewer
  • roles/agentplatform.user
  • roles/storage.admin
  • roles/dataproc.serviceAgent
  • roles/dataplex.discoveryPublishingServiceAgent
  • roles/dataplex.serviceAgent
  • roles/dataplex.securityAdmin
  1. מתן הרשאות לחשבון השירות של Dataplex לגשת לקטגוריית Cloud Storage

עוברים לדף IAM & Admin (ניהול הרשאות וחשבונות אדמין) ובקטע View by Principals (תצוגה לפי ישויות מורשות), לוחצים על הלחצן Grant access (הענקת גישה) ומוסיפים ישות מורשית על ידי הקלדת Dataplex בסרגל הטקסט New principal (ישות מורשית חדשה). מהרשימה שמושלמת אוטומטית, בוחרים את חשבון השירות של Dataplex שנראה בערך כך:

service-*********@ gcp-sa-dataplex.iam.gserviceaccount.com

מקצים לחשבון השירות הזה את התפקידים הבאים:

  • roles/storage.objectUser
  • roles/storage.objectViewer
  • roles/storage.viewer
  • roles/dataplex.discoveryBigLakePublishingServiceAgentroles/storage.objectUser
  • roles/storage.objectViewer
  • roles/storage.viewer
  • roles/dataplex.discoveryBigLakePublishingServiceAgentroles/storage.objectUser
  • roles/storage.objectViewer
  • roles/storage.viewer
  • roles/dataplex.discoveryBigLakePublishingServiceAgent

6. הגדרה של Knowledge Catalog

ליצור Knowledge Catalog כדי לאחד את הנתונים הלא מובְנים ולאתר באופן אוטומטי קבצים לא מובְנים (כמו מתכונים ב-PDF וספקים ב-PDF).

  1. יצירת סריקת נתונים באמצעות curl

אפשר ליצור את העבודה הזו גם דרך המסוף, אבל בקטע הזה ניצור סריקות עבור קטגוריה של Cloud Storage על ידי הוספת datascan_ID והפנייתו למערכי הנתונים של BigQuery. לאחר מכן, ב-Knowledge Catalog ייווצרו באופן אוטומטי רשומות עבור קובצי ה-PDF שלכם ב-BigQuery.

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

# 1. Set your variables
PROJECT_ID="<PROJECT_ID>"
REGION="<REGION>"
ENV_SUFFIX="stg1"
DATASCAN_ID="froyo-data-${ENV_SUFFIX}"
BUCKET_NAME="<BUCKET_NAME>"

# 2. Set this to the Name of the connection you created in Step 7
CONNECTION_ID="<CONNECTION_ID_NAME>"

# 3. Define the API Endpoint
DATAPLEX_API="dataplex.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}"

# 4. Create the DataScan via CURL
echo "Creating Dataplex DataScan: ${DATASCAN_ID}..."

curl -X POST "https://$DATAPLEX_API/dataScans?dataScanId=${DATASCAN_ID}" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"data": {
   "resource": "//storage.googleapis.com/projects/'"${PROJECT_ID}"'/buckets/'"${BUCKET_NAME}"'"
   },
"executionSpec": {
   "trigger": {
      "on_demand": {}
   }
},
"dataDiscoverySpec": {
   "bigqueryPublishingConfig": {
      "tableType": "BIGLAKE",
      "connection": "projects/'"${PROJECT_ID}"'/locations/'"${REGION}"'/connections/'"${CONNECTION_ID}"'"
   },
   "storageConfig": {
      "unstructuredDataOptions": {
      "entity_inference_enabled": true
      }
   }
   }
}'

כדי שהפקודה תפעל בהצלחה, צריך להחליף את הערכים של משתני ה-placeholder שלמעלה. חשוב לזכור שהפעולה הזו רק יוצרת את העבודה, ולא מריצה אותה.

  1. אחרי דקה או שתיים, במסוף Google Cloud, עוברים לדף Metadata curation.
  2. בכרטיסייה 'גילוי Cloud Storage', לוחצים על השם של פריט סריקת הגילוי (חשוב לא ללחוץ על קישור המקור, כי הוא יפתח את האחסון).

31afb1dc3caba5f6.png

  1. שלב קריטי:

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

c021927bf80fe204.png

אחרי שמסיימים, אפשר להריץ את הפקודה הבאה מ-Cloud Shell Terminal או ללחוץ על הלחצן Run now (הפעלה עכשיו) בדף Cloud Storage Discovery (גילוי של Cloud Storage):

gcloud dataplex datascans run $DATASCAN_ID --location=$REGION
  1. השלמת עבודת הסריקה תימשך זמן מה. אחרי שהעבודה מסתיימת, בודקים אם מערך הנתונים שפורסם מופיע. כדי לבדוק את סטטוס העבודה, אפשר לעבור לדף Metadata curation, ובכרטיסייה Cloud Storage discovery ללחוץ על השם של סריקות הגילוי של ההרצה האחרונה. אמור להופיע מאגר הנתונים שפורסם, כמו בדוגמה הבאה:

d0cd6ae1edb81ce9.png

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

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

SELECT count(*) FROM `agent-data-cloud.froyo_data.froyo_data` LIMIT 1000;

התוצאה היא 400 (אם לא, אפשר לחזור ולהריץ שוב את עבודת סריקת הנתונים).

7. חילוץ נתונים סמנטי

נהדר! עכשיו נחלץ את ההסקה עבור האובייקטים הלא מובנים האלה באמצעות Knowledge Catalog.

נשתמש בתכונת התובנות כדי ליצור הצהרות SQL לחילוץ נתונים מובְנים מהטבלה הלא מובְנית

  1. במסוף Google Cloud, עוברים לדף Knowledge Catalog Search.
  2. מחפשים את טבלת מערך הנתונים שרוצים לראות את התובנות לגביה. בסרגל החיפוש, מזינים את שם מערך הנתונים או הטבלה מהשלב הקודם: froyo_data ומקישים על Enter.
  3. ברשימת התוצאות, לוחצים על הערך TABLE (לא על מערך הנתונים).
  4. אמורה להופיע הכרטיסייה תובנות. לוחצים על האפשרות הזו (אם צריך להפעיל API כלשהו, פשוט מפעילים את ממשקי ה-API).

אם הפעלתם ממש עכשיו את ה-API, תצטרכו להריץ שוב את עבודת הסריקה.

  1. בכרטיסייה 'תובנות' יופיע התפריט הנפתח של הלחצן 'חילוץ'. לוחצים על האפשרות הזו ובוחרים באפשרות 'חילוץ באמצעות SQL'.

89809b34c610569d.png

בתיבת הדו-שיח Extract with SQL (חילוץ באמצעות SQL) שמופיעה, מגדירים את מערך הנתונים של היעד כמערך שמופיע בתוצאה של משימת סריקת הנתונים. מתחילים להקליד את השם שלו והוא אמור להופיע בהשלמה האוטומטית. לוחצים על הלחצן חילוץ. אפשר גם ליצור בשלב הזה מערך נתונים חדש ולבצע חילוץ.

עורך השאילתות של BigQuery אמור להיפתח עם כרטיסייה מאוכלסת ב-SQL שחולץ מההסקה של סריקת הנתונים.

8. אימות SQL ויצירת סכימה

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

אחרי שתסיימו, תוכלו לוודא שהסכימה נכונה על ידי הרחבת מערך הנתונים בחלונית הסייר של BigQuery Studio, כמו שמוצג בהמשך:

6e65906240a9a8be.png

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

9. המבחן האולטימטיבי!!!

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

השאלה של המשתמש שלי:

I'm really interested in your Midnight Swirl froyo. Are there any allergens in it?

עכשיו, בחיפוש גנרי או בחיפוש באמצעות LLM, יופיע הכיתוב 'אפס רכיבים'. אבל בנינו הסקה סמנטית מלאה שממירה את כל המדיה הלא מובנית שלנו לנתונים מובנים. אז הנה, עם SQL פשוט שיאחזר את המידע הזה:

SELECT p.product_name, i.ingredient_name, a.allergen_name, category, stability
FROM froyo_data.consistsof c
INNER JOIN froyo_data.product p
  ON c.product_id = p.product_id
INNER JOIN froyo_data.ingredient i
  ON c.ingredient_id = i.ingredient_name
LEFT OUTER JOIN froyo_data.containsallergen a
  ON i.ingredient_id = a.ingredient_id
WHERE
  UPPER(p.product_name) LIKE '%MIDNIGHT%SWIRL%'
  AND allergen_name IS NOT NULL;

יש! בודקים את התוצאה:

f582d55814a23e8.png

10. הסרת המשאבים

בסיום ה-Lab, אל תשכחו למחוק את משימת הסריקה ואת טבלאות BigQuery שהמשימה יצרה.

עוברים לכתובת https://console.cloud.google.com/bigquery/governance/metadata-curation/cloud-storage-discovery. לוחצים על סמל האפשרויות הנוספות (שלוש נקודות אנכיות) לצד המשרה שרוצים למחוק ולוחצים על 'מחיקה'.

9fcbbfa1a9ccba6d.png

הפעולה הזו אמורה לנקות את המשימה.

11. מזל טוב

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