1. סקירה כללית
ב-codelab הזה תלמדו איך להוסיף לאפליקציה תכונות חיפוש מתקדמות באמצעות חיפוש דמיון וקטורי ב-Firestore. תטמיעו תכונה של חיפוש סמנטי באפליקציה לסיכום פגישות שנכתבה ב-Swift וב-SwiftUI.
מה תלמדו
- איך להתקין את התוסף Vector Search with Firestore כדי לחשב הטמעות וקטוריות.
- איך קוראים ל-Firebase Cloud Functions מאפליקציית Swift.
- איך מסננים מראש נתונים על סמך המשתמש שמחובר לחשבון.
מה צריך
- Xcode 15.3
- קוד לדוגמה של ה-codelab. תורידו אותו בשלב מאוחר יותר של ה-codelab.
2. יצירה והגדרה של פרויקט Firebase
כדי להשתמש בתוסף Firebase Vector Search, צריך פרויקט Firebase. בחלק הזה של ה-codelab, תיצרו פרויקט חדש ב-Firebase ותפעילו את השירותים הנדרשים, כמו Cloud Firestore ו-Firebase Authentication.
יצירת פרויקט Firebase
- נכנסים למסוף Firebase באמצעות חשבון Google.
- לוחצים על הלחצן כדי ליצור פרויקט חדש, ואז מזינים שם לפרויקט (לדוגמה,
Firestore Vector Search Codelab
).
- לוחצים על המשך.
- אם מוצגת בקשה לעשות זאת, קוראים ומאשרים את התנאים של Firebase, ואז לוחצים על המשך.
- (אופציונלי) מפעילים את העזרה מבוססת-AI במסוף Firebase (שנקראת Gemini ב-Firebase).
- ב-codelab הזה לא צריך להשתמש ב-Google Analytics, ולכן משביתים את האפשרות Google Analytics.
- לוחצים על יצירת פרויקט, מחכים שהפרויקט יוקצה ולוחצים על המשך.
מידע נוסף על פרויקטים ב-Firebase זמין במאמר הסבר על פרויקטים ב-Firebase.
שדרוג תוכנית התמחור של Firebase
כדי להשתמש בתוספים של Firebase ובשירותי הענן הבסיסיים שלהם, הפרויקט שלכם ב-Firebase צריך להיות בתוכנית התמחור 'תשלום לפי שימוש' (Blaze), כלומר הוא צריך להיות מקושר לחשבון לחיוב ב-Cloud.
- בחשבון לחיוב ב-Cloud צריך להגדיר אמצעי תשלום, כמו כרטיס אשראי.
- אם אתם חדשים ב-Firebase וב-Google Cloud, כדאי לבדוק אם אתם עומדים בדרישות לקבלת קרדיט בסך 300$וחשבון לחיוב ב-Cloud עם תקופת ניסיון בחינם.
- אם אתם משתתפים בסדנת קוד כחלק מאירוע, כדאי לשאול את מארגן האירוע אם יש קרדיטים ל-Cloud.
כדי לשדרג את הפרויקט לתוכנית Blaze, פועלים לפי השלבים הבאים:
- במסוף Firebase, בוחרים באפשרות שדרוג התוכנית.
- בוחרים בתוכנית Blaze. פועלים לפי ההוראות במסך כדי לקשר חשבון לחיוב ב-Cloud לפרויקט.
אם הייתם צריכים ליצור חשבון לחיוב ב-Cloud כחלק מהשדרוג, יכול להיות שתצטרכו לחזור לתהליך השדרוג במסוף Firebase כדי להשלים את השדרוג.
הפעלה והגדרה של מוצרי Firebase במסוף
האפליקציה שאתם מפתחים משתמשת בכמה מוצרים של Firebase שזמינים לאפליקציות של אפל:
- אימות ב-Firebase כדי לאפשר למשתמשים להיכנס לאפליקציה בקלות.
- Cloud Firestore כדי לשמור נתונים מובנים בענן ולקבל הודעה מיידית כשמתבצעים שינויים בנתונים.
- כללי אבטחה של Firebase כדי לאבטח את מסד הנתונים.
כדי להשתמש בחלק מהמוצרים האלה, צריך לבצע הגדרה מיוחדת או להפעיל אותם באמצעות מסוף Firebase.
הפעלת אימות אנונימי ב-Firebase Authentication
האפליקציה הזו משתמשת באימות אנונימי כדי לאפשר למשתמשים להתחיל להשתמש באפליקציה בלי ליצור חשבון קודם. כך תהליך ההצטרפות יהיה פשוט ומהיר. מידע נוסף על אימות אנונימי (ועל שדרוג לחשבון עם שם) זמין במאמר שיטות מומלצות לאימות אנונימי.
- בחלונית הימנית במסוף Firebase, לוחצים על Build > Authentication (פיתוח > אימות). אחר כך לוחצים על שנתחיל?.
- עכשיו אתם במרכז הבקרה של האימות, שבו תוכלו לראות את המשתמשים שנרשמו, להגדיר ספקי כניסה ולנהל את ההגדרות.
- בוחרים בכרטיסייה שיטת הכניסה (או לוחצים כאן כדי לעבור ישירות לכרטיסייה).
- לוחצים על אנונימי באפשרויות הספק, מעבירים את המתג למצב הפעלה ואז לוחצים על שמירה.
הגדרת Cloud Firestore
אפליקציית Swift הזו משתמשת ב-Cloud Firestore כדי לשמור הערות.
כך מגדירים את Cloud Firestore בפרויקט Firebase:
- בחלונית הימנית במסוף Firebase, מרחיבים את Build ובוחרים באפשרות Firestore database.
- לוחצים על יצירת מסד נתונים.
- משאירים את הערך
(default)
בשדה מזהה מסד הנתונים. - בוחרים מיקום למסד הנתונים ולוחצים על הבא.
באפליקציה אמיתית, כדאי לבחור מיקום שקרוב למשתמשים. - לוחצים על התחלה במצב בדיקה. קוראים את כתב הוויתור בנוגע לכללי האבטחה.
בהמשך ה-codelab הזה, תוסיפו כללי אבטחה כדי לאבטח את הנתונים. אל תפיצו או תחשפו אפליקציה באופן ציבורי בלי להוסיף כללי אבטחה למסד הנתונים. - לוחצים על יצירה.
הגדרה של Cloud Storage for Firebase
אפליקציית האינטרנט משתמשת ב-Cloud Storage for Firebase כדי לאחסן, להעלות ולשתף תמונות.
כך מגדירים את Cloud Storage for Firebase בפרויקט Firebase:
- בחלונית הימנית במסוף Firebase, מרחיבים את Build (פיתוח) ובוחרים באפשרות Storage (אחסון).
- לוחצים על תחילת העבודה.
- בוחרים מיקום לקטגוריית האחסון שמוגדרת כברירת מחדל.
קטגוריות ב-US-WEST1
, ב-US-CENTRAL1
וב-US-EAST1
יכולות ליהנות מהמסלול תמיד בחינם של Google Cloud Storage. התמחור והשימוש בקטגוריות בכל המיקומים האחרים מפורטים בתמחור ובשימוש ב-Google Cloud Storage. - לוחצים על התחלה במצב בדיקה. קוראים את כתב הוויתור בנוגע לכללי האבטחה.
בהמשך ה-codelab, תוסיפו כללי אבטחה כדי לאבטח את הנתונים. אל תפיצו או תחשפו אפליקציה לציבור בלי להוסיף כללי אבטחה לדלי שלכם ב-Storage. - לוחצים על יצירה.
3. חיבור האפליקציה לנייד
בקטע הזה של ה-codelab, תורידו את קוד המקור של אפליקציה פשוטה לרישום הערות, ותקשרו אותה לפרויקט Firebase שיצרתם.
הורדת האפליקציה לדוגמה
- עוברים אל https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios ומשכפלים את המאגר למחשב המקומי
- פותחים את הפרויקט Notes.xcodeproj ב-Xcode.
קישור האפליקציה לפרויקט Firebase
כדי שהאפליקציה תוכל לגשת לשירותי Firebase, צריך להגדיר את האפליקציה במסוף Firebase. אפשר לקשר כמה אפליקציות לקוח לאותו פרויקט Firebase. לדוגמה, אם יוצרים אפליקציית Android או אפליקציית אינטרנט, כדאי לקשר אותן לאותו פרויקט Firebase.
מידע נוסף על פרויקטים ב-Firebase זמין במאמר הסבר על פרויקטים ב-Firebase.
- במסוף Firebase, עוברים לדף הסקירה הכללית של פרויקט Firebase.
- לוחצים על סמל ה-iOS+ כדי להוסיף את אפליקציית ה-iOS.
- במסך Add Firebase to your Apple app (הוספת Firebase לאפליקציית Apple), מזינים את מזהה החבילה מפרויקט Xcode (com.google.firebase.codelab.Notes).
- אם רוצים, אפשר להזין כינוי לאפליקציה (הערות ל-iOS).
- לוחצים על Register app (רישום אפליקציה) כדי לעבור לשלב הבא.
- מורידים את הקובץ GoogleServices-Info.plist.
- גוררים את GoogleServices-Info.plist לתיקייה Notes של פרויקט Xcode. דרך טובה לעשות את זה היא להעביר את הקובץ מתחת לקובץ Assets.xcassets.
- בוחרים באפשרות העתקת פריטים אם צריך, מוודאים שיעד הערות נבחר באפשרות הוספה ליעדים ולוחצים על סיום.
- במסוף Firebase, אפשר עכשיו ללחוץ על שאר השלבים בתהליך ההגדרה: בדוגמה שהורדתם בתחילת הקטע הזה כבר מותקן Firebase Apple SDK, וההגדרה של האתחול כבר בוצעה. כדי לסיים את התהליך, לוחצים על המשך אל מסוף.
הפעלת האפליקציה
הגיע הזמן לנסות את האפליקציה!
- חוזרים ל-Xcode ומריצים את האפליקציה ב-iOS Simulator. בתפריט הנפתח Run Destinations (יעדי הרצה), בוחרים קודם באחד מהסימולטורים של iOS.
- לאחר מכן, לוחצים על הלחצן Run או מקישים על ⌘ + R.
- אחרי שהאפליקציה מופעלת בהצלחה בסימולטור, מוסיפים כמה הערות.
- במסוף Firebase, עוברים לדפדפן הנתונים של Firestore כדי לראות מסמכים חדשים שנוצרים כשמוסיפים הערות חדשות באפליקציה.
4. התקנה של התוסף Vector Search with Firestore
בחלק הזה של ה-codelab, תתקינו את התוסף Vector Search with Firestore ותגדירו אותו בהתאם לדרישות של אפליקציית סיכום הפגישות שאתם עובדים עליה.
התחלת ההתקנה של התוסף
- עדיין בקטע Firestore, לוחצים על הכרטיסייה תוספים.
- לוחצים על סקירת מרכז התוספים.
- מקלידים 'וקטור'.
- לוחצים על Vector Search with Firestore extension (חיפוש וקטורי עם תוסף Firestore).
תועברו לדף הפרטים של התוסף, שבו תוכלו לקרוא מידע נוסף על התוסף, על אופן הפעולה שלו, על שירותי Firebase שהוא דורש ועל אופן ההגדרה שלו.
- לוחצים על Install in Firebase console (התקנה במסוף Firebase).
- תוצג רשימה של כל הפרויקטים שלכם.
- בוחרים את הפרויקט שיצרתם בשלב הראשון של ה-codelab הזה.
הגדרת התוסף
- בודקים את ממשקי ה-API שהופעלו ואת המשאבים שנוצרו.
- מפעילים את השירותים הנדרשים.
- אחרי שמפעילים את כל השירותים, לוחצים על הבא.
- בודקים את הגישה שניתנה לתוסף הזה.
- מגדירים את התוסף:
- בוחרים באפשרות Vertex AI בתור מודל שפה גדול (LLM)
- נתיב האוסף: notes
- מגבלת ברירת המחדל של שאילתות: 3
- שם השדה להזנת קלט: text
- שם שדה הפלט: embedding
- שם שדה הסטטוס:* *status*
- הטמעת מסמכים קיימים: כן
- עדכון מסמכים קיימים: כן
- המיקום של Cloud Function: us-central1
- לוחצים על התקנת התוסף כדי לסיים את ההתקנה.
יכול להיות שהתהליך יימשך כמה דקות. בזמן שמחכים לסיום ההתקנה, אפשר לעבור לסעיף הבא במדריך ולקרוא מידע רקע על הטמעות וקטוריות.
5. רקע
בזמן שמחכים לסיום ההתקנה, כדאי לקרוא את המידע הבא על אופן הפעולה של התוסף Vector Search with Firestore.
מהם וקטורים, הטמעות ומסדי נתונים וקטוריים?
- וקטורים הם אובייקטים מתמטיים שמייצגים את הגודל והכיוון של כמות מסוימת. אפשר להשתמש בהם כדי להציג נתונים בצורה שמאפשרת להשוות ולחפש אותם בקלות.
- הטמעות הן וקטורים שמייצגים את המשמעות של מילה או ביטוי. הם נוצרים על ידי אימון רשת נוירונים על קורפוס גדול של טקסט, ולמידת הקשרים בין המילים.
- מסדי נתונים וקטוריים הם מסדי נתונים שעברו אופטימיזציה לאחסון ולחיפוש של נתונים וקטוריים. הם מאפשרים חיפוש יעיל של השכן הקרוב ביותר, שהוא תהליך של מציאת הווקטורים הכי דומים לווקטור שאילתה נתון.
איך פועל חיפוש וקטורי?
חיפוש וקטורי פועל על ידי השוואת וקטור השאילתה לכל הווקטורים במסד הנתונים. הווקטורים הכי דומים לווקטור השאילתה מוחזרים כתוצאות החיפוש.
אפשר למדוד את הדמיון בין שני וקטורים באמצעות מגוון מדדי מרחק. מדד המרחק הנפוץ ביותר הוא דמיון קוסינוס, שמודד את הזווית בין שני וקטורים.
6. כדאי לנסות את התוסף Vector Search with Firestore
לפני שמשתמשים בתוסף Vector Search with Firestore באפליקציית iOS שהורדתם קודם ב-codelab הזה, אפשר לנסות את התוסף במסוף Firebase.
קריאת התיעוד
תוספי Firebase כוללים תיעוד שמסביר איך הם פועלים.
- בסיום ההתקנה של התוסף, לוחצים על הלחצן תחילת העבודה.
- בכרטיסייה 'איך התוסף הזה פועל' מוסבר:
- איך מחשבים הטמעות של מסמכים על ידי הוספה שלהם לאוסף
notes
, - איך לשלוח שאילתה לאינדקס באמצעות קריאה לפונקציה
ext-firestore-vector-search-queryCallable
callable, - או איך לשלוח שאילתה לאינדקס על ידי הוספת מסמך שאילתה לאוסף
_firestore-vector-search/index/queries
. - בנוסף, מוסבר איך להגדיר פונקציית הטמעה מותאמת אישית – זה שימושי אם אף אחד מה-LLM שנתמכים על ידי התוסף לא עונה על הדרישות שלכם, ואתם רוצים להשתמש ב-LLM אחר כדי לחשב הטמעות.
- איך מחשבים הטמעות של מסמכים על ידי הוספה שלהם לאוסף
- לוחצים על הקישור Cloud Firestore dashboard כדי לעבור למופע של Firestore.
- עוברים למסמך
_firestore-vector-search/index
. אמור להופיע שהתוסף סיים לחשב את ההטמעות של כל מסמכי הסיכומים שיצרתם בשלב מוקדם יותר ב-codelab הזה. - כדי לוודא זאת, פותחים אחד ממסמכי ההערות וצריך לראות שדה נוסף בשם
embedding
מסוגvector<768>
, וגם שדהstatus
.
יצירת מסמך לדוגמה
כדי לראות את התוסף בפעולה, אפשר ליצור מסמך חדש במסוף Firebase.
- עדיין בדפדפן הנתונים של Firestore, עוברים לאוסף
notes
ולוחצים על + הוספת מסמך בעמודה האמצעית. - לוחצים על Auto-ID (מזהה אוטומטי) כדי ליצור מזהה מסמך ייחודי חדש.
- מוסיפים שדה בשם
text
מסוג מחרוזת, ומדביקים טקסט בשדה value. חשוב שהטקסט לא יהיה lorem ipsum או טקסט אקראי אחר. לדוגמה, בוחרים כתבה חדשותית. - לוחצים על שמירה.
- שימו לב איך התוסף מוסיף שדה סטטוס שמציין שהוא מעבד נתונים.
- אחרי רגע קצר, אמור להופיע שדה חדש
embedding
עם הערךvector<768>
.
ביצוע שאילתה
ל-Vector Search עם תוסף Firestore יש תכונה קטנה ושימושית שמאפשרת לשלוח שאילתות לאינדקס המסמכים בלי לחבר אפליקציה.
- בקטע Firestore במסוף Firebase, עוברים למסמך
_firestore-vector-search/index
- לוחצים על + יצירת אוסף
- יצירת אוסף משנה חדש בשם
queries
- יוצרים מסמך חדש ומגדירים את השדה
query
לטקסט שמופיע באחד המסמכים. התכונה הזו פועלת בצורה הכי טובה עם שאילתות סמנטיות, כמו "איך ממפים מסמכי Firestore באמצעות Swift" (בתנאי שלפחות אחת מההערות שהוספתם מכילה טקסט שמתייחס לנושא הזה). - יכול להיות שתראו שגיאה בסטטוס
- הסיבה לכך היא שחסר אינדקס. כדי להגדיר את תצורת האינדקס החסרה, עוברים אל מסוף Google Cloud של הפרויקט באמצעות הקישור הזה, ואז בוחרים את הפרויקט מהרשימה
- ב-Cloud Log Explorer, אמורה להופיע הודעת שגיאה שאומרת "FAILED_PRECONDITION: Missing vector index configuration. צריך ליצור את האינדקס הנדרש באמצעות פקודת gcloud הבאה: ..."
- הודעת השגיאה מכילה גם פקודה
gcloud
שצריך להריץ כדי להגדיר את האינדקס החסר. - מריצים את הפקודה הבאה משורת הפקודה. אם ה-CLI של
gcloud
לא מותקן במחשב, אפשר לפעול לפי ההוראות האלה כדי להתקין אותו. יצירת האינדקס נמשכת כמה דקות. אפשר לבדוק את ההתקדמות בכרטיסייה Indexes (אינדקסים) בקטע Firestore במסוף Firebase.gcloud alpha firestore indexes composite create --project=INSERT-YOUR=PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
- אחרי שמגדירים את האינדקס, אפשר ליצור מסמך שאילתה חדש.
- עכשיו אמורה להופיע רשימה של מזהי מסמכים תואמים בשדה התוצאות
- מעתיקים אחד מהמזהים האלה וחוזרים לאוסף
notes
. - משתמשים בצירוף המקשים ⌘+F כדי לחפש את מזהה המסמך שהעתקתם – זה המסמך שהכי מתאים לשאילתה שלכם.
7. הטמעה של חיפוש סמנטי
הגיע הזמן לקשר את האפליקציה לנייד לתוסף Vector Search with Firestore ולהטמיע תכונת חיפוש סמנטי שתאפשר למשתמשים לחפש את ההערות שלהם באמצעות שאילתות בשפה טבעית.
קישור הפונקציה שאפשר להפעיל כדי לבצע שאילתות
התוסף Vector Search with Firestore כולל Cloud Function שאפשר להפעיל מאפליקציית המובייל כדי לשלוח שאילתה לאינדקס שיצרתם קודם ב-codelab הזה. בשלב הזה, יוצרים חיבור בין האפליקציה לנייד לבין הפונקציה הזו שאפשר להפעיל. Firebase Swift SDK כולל ממשקי API שמאפשרים לקרוא לפונקציות מרחוק בצורה חלקה.
- חוזרים ל-Xcode ומוודאים שאתם בפרויקט ששיבטתם בשלב הקודם ב-codelab הזה.
- פותחים את הקובץ
NotesRepository.swift
. - מחפשים את השורה שמכילה את
private lazy var vectorSearchQueryCallable: Callable
= functions.httpsCallable("")
כדי להפעיל פונקציה שאפשר לקרוא לה ב-Cloud Functions, צריך לציין את שם הפונקציה שרוצים להפעיל.
- נכנסים למסוף Firebase של הפרויקט ופותחים את הפריט Functions בתפריט בקטע Build.
- תוצג רשימה של פונקציות שהותקנו על ידי התוסף.
- מחפשים את הקובץ שנקרא
ext-firestore-vector-search-queryCallable
ומעתיקים את השם שלו. - מדביקים את השם בקוד. הטקסט צריך להיות
private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
הפעלת פונקציית השאילתה
- מאתרים את השיטה
performQuery
- קוראים לפונקציה שאפשר לקרוא לה על ידי הפעלה
let result = try await vectorSearchQueryCallable(searchTerm)
יכול להיות שהשיחה תכשל כי היא מתבצעת מרחוק.
- מוסיפים טיפול בסיסי בשגיאות כדי לזהות שגיאות ולתעד אותן במסוף של Xcode.
private func performQuery(searchTerm: String) async -> [String] { do { let result = try await vectorSearchQueryCallable(searchTerm) return [result] } catch { print(error.localizedDescription) return [] } }
חיבור ממשק המשתמש
כדי לאפשר למשתמשים לחפש את ההערות שלהם, צריך להטמיע סרגל חיפוש במסך רשימת ההערות. כשהמשתמש מקליד מונח חיפוש, צריך להפעיל את השיטה performQuery
שהטמעתם בשלב הקודם. הודות לשינויים בתצוגה searchable
ו-task
ש-SwiftUI מספקת, נדרשות רק כמה שורות קוד.
- קודם, פותחים את
NotesListScreen.swift
- כדי להוסיף תיבת חיפוש לתצוגת הרשימה, מוסיפים את משנה התצוגה
.searchable(text: $searchTerm, prompt: "Search")
ממש מעל השורה.navigationTitle("Notes")
- לאחר מכן, מפעילים את פונקציית החיפוש על ידי הוספת הקוד הבא ממש מתחת:
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
קטע הקוד הזה קורא לשיטת semanticSearch
באופן אסינכרוני. הגדרתם פסק זמן של 800 אלפיות השנייה, ולכן שיניתם את ההתנהגות של הפונקציה לשינוי המשימה כך שהיא תמתין 0.8 שניות לפני שהיא תבצע את הפעולה. כלומר, הפונקציה semanticSearch
תופעל רק אחרי שהמשתמש יפסיק להקליד למשך יותר מ-0.8 שניות.
הקוד אמור להיראות כך:
...
List(repository.notes) { note in
NavigationLink(value: note) {
NoteRowView(note: note)
}
.swipeActions {
Button(role: .destructive, action: { deleteNote(note: note) }) {
Label("Delete", systemImage: "trash")
}
}
}
.searchable(text: $searchTerm, prompt: "Search")
.task(id: searchTerm, debounce: .milliseconds(800)) {
await notesRepository.semanticSearch(searchTerm: searchTerm)
}
.navigationTitle("Notes")
...
הפעלת האפליקציה
- מקישים על ⌘ + R (או לוחצים על הלחצן Run) כדי להפעיל את האפליקציה ב-iOS Simulator.
- אתם אמורים לראות את אותן הערות שהוספתם באפליקציה בשלב מוקדם יותר ב-codelab הזה, וגם את כל ההערות שהוספתם דרך מסוף Firebase.
- שדה החיפוש יופיע בראש רשימת ההערות.
- מקלידים מונח שמופיע באחד המסמכים שהוספתם. השיטה הזו מתאימה במיוחד לשאילתות סמנטיות, כמו "איך אפשר להתקשר לממשקי API אסינכרוניים של Firebase מ-Swift" (בתנאי שלפחות אחת מההערות שהוספתם מכילה טקסט שמתייחס לנושא הזה).
- סביר להניח שציפיתם לראות את תוצאת החיפוש, אבל במקום זאת, תצוגת הרשימה ריקה, ובמסוף של Xcode מוצגת הודעת שגיאה: 'הפונקציה הופעלה עם ארגומנט לא תקין'
המשמעות היא ששלחתם את הנתונים בפורמט שגוי.
ניתוח הודעת השגיאה
- כדי לגלות מה הבעיה, עוברים אל מסוף Firebase
- עוברים לקטע פונקציות.
- מאתרים את הפונקציה
ext-firestore-vector-search-queryCallable
, פותחים את תפריט האפשרויות הנוספות בלחיצה על שלוש הנקודות האנכיות. - בוחרים באפשרות הצגת יומנים כדי לעבור אל Logs Explorer.
- אמורה להופיע שגיאה
Unhandled error ZodError: [
{
"code": "invalid_type",
"expected": "object",
"received": "string",
"path": [],
"message": "Expected object, received string"
}
]
המשמעות היא ששלחתם את הנתונים בפורמט שגוי.
שימוש בסוגי הנתונים הנכונים
כדי לגלות באיזה פורמט התוסף מצפה שהפרמטרים יהיו, כדאי לעיין במסמכי התיעוד של התוסף.
- עוברים לקטע תוספים במסוף Firebase.
- לוחצים על ניהול ->
- בקטע How this extension works (איך התוסף הזה פועל) מפורטים פרמטרים של קלט ופלט.
- חוזרים אל Xcode ועוברים אל
NotesRepository.swift
- מוסיפים את הקוד הבא בתחילת הקובץ:
private struct QueryRequest: Codable { var query: String var limit: Int? var prefilters: [QueryFilter]? } private struct QueryFilter: Codable { var field: String var `operator`: String var value: String } private struct QueryResponse: Codable { var ids: [String] }
QueryRequest
תואם למבנה של פרמטר הקלט שהתוסף מצפה לו, בהתאם לתיעוד של התוסף. הוא מכיל גם מאפייןprefilter
מקונן שתצטרכו בהמשך.QueryResponse
תואם למבנה של התגובה של התוסף. - מציאת המפרט של הפונקציה שאפשר להפעיל ועדכון של סוגי הקלט והפלט
private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
- עדכון הקריאה לפונקציה שאפשר להפעיל ב-
performQuery
private func performQuery(searchTerm: String) async -> [String] { do { let queryRequest = QueryRequest(query: searchTerm, limit: 2) let result = try await vectorSearchQueryCallable(queryRequest) print(result.ids) return result.ids } catch { print(error.localizedDescription) return [] } }
הפעלת האפליקציה שוב
- הפעלת האפליקציה שוב
- מקלידים שאילתת חיפוש שמכילה מונחים שנכללים באחת מההערות
- עכשיו אמורה להופיע רשימת הערות מסוננת
סינון מוקדם של נתוני משתמשים
לפני שתצאו במחולות משמחה – יש בעיה בגרסה הנוכחית של האפליקציה: קבוצת התוצאות מכילה נתונים של כל המשתמשים.
כדי לוודא זאת, אפשר להריץ את האפליקציה בסימולטור אחר ולהוסיף עוד מסמכים. המסמכים החדשים יופיעו רק בסימולטור הזה. אם תפעילו את האפליקציה שוב בסימולטור השני, יופיעו רק המסמכים שיצרתם בפעם הראשונה.
אם מבצעים חיפוש, אפשר לראות שהקריאה אל vectorSearchQueryCallable
מחזירה מזהי מסמכים שעשויים להיות שייכים למשתמש השני. כדי למנוע את זה, צריך להשתמש במסנן מקדים.
ב-performQuery
, מעדכנים את הקוד באופן הבא:
let prefilters: [QueryFilter] = if let uid = user?.uid {
[QueryFilter(field: "userId", operator: "==", value: uid)]
}
else {
[]
}
let queryRequest = QueryRequest(query: searchTerm,
limit: 2,
prefilters: prefilters)
הפעולה הזו תסנן מראש את הנתונים על סמך המזהה של המשתמש שמחובר לחשבון. כפי שאפשר לצפות, צריך לעדכן את האינדקס של Firestore.
מריצים את הפקודה הבאה משורת הפקודה כדי להגדיר אינדקס חדש של Firestore שכולל גם את userId
וגם את הטמעות הווקטור בשדה embedding
.
gcloud alpha firestore indexes composite create --project=INSERT-YOUR-PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=order=ASCENDING,field-path=userId --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
אחרי שהאינדקס מוכן, מריצים שוב את האפליקציה כדי לוודא שהיא פועלת כמו שצריך.
8. מזל טוב
כל הכבוד, סיימתם את ה-Codelab!
ב-Codelab הזה למדתם איך:
- מגדירים מסד נתונים של Cloud Firestore עם חיפוש סמנטי מופעל.
- יוצרים אפליקציית SwiftUI פשוטה כדי ליצור אינטראקציה עם מסד הנתונים.
- מטמיעים סרגל חיפוש באמצעות modifier של תצוגה שניתן לחיפוש ב-SwiftUI ואת ה-modifier של המשימה.
- קוראים לפונקציית Cloud כדי לבצע חיפוש סמנטי במסד הנתונים, באמצעות הממשק Callable של Firestore SDK.
בעזרת הידע שרכשתם ב-codelab הזה, אתם יכולים עכשיו ליצור אפליקציות עוצמתיות שמנצלות את יכולות החיפוש הסמנטי של Cloud Firestore כדי לספק למשתמשים חוויית חיפוש אינטואיטיבית ויעילה יותר.
מידע נוסף על שדה הווקטור החדש של Firestore ועל חישוב הטמעות וקטוריות זמין במאמרי העזרה.