עדכון ובנייה מחדש של אינדקס פעיל

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

החלפת אינדקס שלם

כדי להחליף את התוכן של חבילת עדכונים או סטרימינג קיימת Index, משתמשים בשיטה IndexService.UpdateIndex.

  • מגדירים את Index.metadata.contentsDeltaUri ל-URI של Cloud Storage שכולל את הווקטורים שרוצים לעדכן.
  • מגדירים את Index.metadata.isCompleteOverwrite לערך true. אם הערך הוא true, כל האינדקס מוחלף לחלוטין בקובץ המטא-נתונים החדש שסיפקתם.

gcloud

  1. מעדכנים את קובץ המטא-נתונים של האינדקס כדי להגדיר את הערכים contentsDeltaUri ו-isCompleteOverwrite=true.
  2. משתמשים בפקודה gcloud ai indexes update.

לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:

  • ‫LOCAL_PATH_TO_METADATA_FILE: הנתיב המקומי לקובץ המטא-נתונים.
  • ‫INDEX_ID: מזהה האינדקס.
  • ‫LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud ai indexes update INDEX_ID \
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE \
    --region=LOCATION \
    --project=PROJECT_ID

‏Windows (PowerShell)

gcloud ai indexes update INDEX_ID `
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE `
    --region=LOCATION `
    --project=PROJECT_ID

Windows‏ (cmd.exe)

gcloud ai indexes update INDEX_ID ^
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫INPUT_DIR: נתיב הספרייה ב-Cloud Storage של תוכן האינדקס.
  • ‫INDEX_ID: מזהה האינדקס.
  • ‫LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .
  • ‫PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.

ה-method של ה-HTTP וכתובת ה-URL:

PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID

תוכן בקשת JSON:

{
 "metadata": {
   "contentsDeltaUri": "INPUT_DIR",
   "isCompleteOverwrite": true
 }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
 "metadata": {
   "@type": "type.googleapis.com/google.cloud.aiplatform.v1.UpdateIndexOperationMetadata",
   "genericMetadata": {
     "createTime": "2022-01-12T23:56:14.480948Z",
     "updateTime": "2022-01-12T23:56:14.480948Z"
   }
 }
}

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

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

def vector_search_update_index_embeddings(
    project: str,
    location: str,
    index_name: str,
    gcs_uri: str,
    is_complete_overwrite: Optional[bool] = None,
) -> None:
    """Update a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_name (str): Required. The index to update. A fully-qualified index
          resource name or a index ID.  Example:
          "projects/123/locations/us-central1/indexes/my_index_id" or
          "my_index_id".
        gcs_uri (str): Required. The Google Cloud Storage uri for index content
        is_complete_overwrite (bool): Optional. If true, the index content will
          be overwritten wth the contents at gcs_uri.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index
    index = aiplatform.MatchingEngineIndex(index_name=index_name)

    index.update_embeddings(
        contents_delta_uri=gcs_uri, is_complete_overwrite=is_complete_overwrite
    )

המסוף

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

  1. בקטע Agent Platform במסוף Cloud de Confiance , עוברים לקטע Deploy and Use. בוחרים באפשרות חיפוש וקטורי.

    כניסה אל חיפוש וקטורי

  2. בוחרים את האינדקס שרוצים לעדכן. ייפתח הדף פרטי האינדקס.
  3. לוחצים על עריכת האינדקס. תיפתח חלונית לעריכת האינדקס.
  4. בשדה Cloud Storage, מחפשים את תיקיית Cloud Storage שבה מאוחסנים נתוני הווקטור ובוחרים אותה.
  5. מסמנים את התיבה 'החלפת כל הנתונים' כדי להחליף את כל הנתונים הקיימים.
  6. לוחצים על עדכון.
  7. לוחצים על סיום כדי לסגור את החלונית.

עדכון חלקי של אינדקס של חבילת בקשות

כדי לעדכן את ההטמעות של קבוצת נתונים קיימת Index, משתמשים בשיטה IndexService.UpdateIndex.

  • מגדירים את Index.metadata.contentsDeltaUri ל-URI של Cloud Storage שכולל את הווקטורים שרוצים לעדכן.
  • מגדירים את Index.metadata.isCompleteOverwrite לערך false.

רק הווקטורים שצוינו ב-Index.metadata.contentsDeltaUri מתעדכנים, מתווספים או נמחקים. ההטמעות הקיימות האחרות באינדקס יישארו.

gcloud

  1. מעדכנים את קובץ המטא-נתונים של האינדקס כדי להגדיר את contentsDeltaUri.
  2. משתמשים בפקודה gcloud ai indexes update.

לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:

  • ‫LOCAL_PATH_TO_METADATA_FILE: הנתיב המקומי לקובץ המטא-נתונים.
  • ‫INDEX_ID: מזהה האינדקס.
  • ‫LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud ai indexes update INDEX_ID \
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE \
    --region=LOCATION \
    --project=PROJECT_ID

‏Windows (PowerShell)

gcloud ai indexes update INDEX_ID `
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE `
    --region=LOCATION `
    --project=PROJECT_ID

Windows‏ (cmd.exe)

gcloud ai indexes update INDEX_ID ^
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫INPUT_DIR: נתיב הספרייה ב-Cloud Storage של תוכן האינדקס.
  • ‫INDEX_ID: מזהה האינדקס.
  • ‫LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .
  • ‫PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.

ה-method של ה-HTTP וכתובת ה-URL:

PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID

תוכן בקשת JSON:

{
 "metadata": {
   "contentsDeltaUri": "INPUT_DIR",
   "isCompleteOverwrite": false
 }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
 "metadata": {
   "@type": "type.googleapis.com/google.cloud.aiplatform.v1.UpdateIndexOperationMetadata",
   "genericMetadata": {
     "createTime": "2022-01-12T23:56:14.480948Z",
     "updateTime": "2022-01-12T23:56:14.480948Z"
   }
 }
}

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

כשמפעילים את השיטה שבהמשך, מגדירים את הערך is_complete_overwrite=False.

def vector_search_update_index_embeddings(
    project: str,
    location: str,
    index_name: str,
    gcs_uri: str,
    is_complete_overwrite: Optional[bool] = None,
) -> None:
    """Update a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_name (str): Required. The index to update. A fully-qualified index
          resource name or a index ID.  Example:
          "projects/123/locations/us-central1/indexes/my_index_id" or
          "my_index_id".
        gcs_uri (str): Required. The Google Cloud Storage uri for index content
        is_complete_overwrite (bool): Optional. If true, the index content will
          be overwritten wth the contents at gcs_uri.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index
    index = aiplatform.MatchingEngineIndex(index_name=index_name)

    index.update_embeddings(
        contents_delta_uri=gcs_uri, is_complete_overwrite=is_complete_overwrite
    )

המסוף

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

  1. בקטע Agent Platform במסוף Cloud de Confiance , עוברים לקטע Deploy and Use. בוחרים באפשרות חיפוש וקטורי.

    כניסה אל חיפוש וקטורי

  2. בוחרים את האינדקס שרוצים לעדכן. ייפתח הדף פרטי האינדקס.
  3. לוחצים על עריכת האינדקס. תיפתח חלונית לעריכת האינדקס.
  4. בשדה Cloud Storage, מחפשים את תיקיית Cloud Storage שבה מאוחסנים נתוני הווקטור ובוחרים אותה.
  5. מוודאים שהתיבה 'החלפה מלאה' לא מסומנת.
  6. לוחצים על עדכון.
  7. לוחצים על סיום כדי לסגור את החלונית.

אם ל-Index יש פריסות משויכות (ראו את השדה Index.deployed_indexes), אז כשמבצעים שינויים מסוימים ב-Index המקורי, ה-DeployedIndex מתעדכן באופן אוטומטי ברקע באופן אסינכרוני כדי לשקף את השינויים האלה.

כדי לבדוק אם השינוי הועבר, משווים בין זמן הסיום של פעולת עדכון האינדקס לבין DeployedIndex.index_sync_time.

עדכון חלקי של אינדקס סטרימינג

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

החיוב הוא 0.45 $לכל GB שמשמש לעדכונים בסטרימינג. מידע נוסף על התמחור זמין בדף התמחור של Agent Platform. העדכונים של הסטרימינג מוחלים ישירות על האינדקסים שנפרסו בזיכרון, ואז משתקפים בתוצאות השאילתות אחרי השהיה קצרה.

הוספה או עדכון של נקודות נתונים

בדוגמאות האלה אפשר לראות איך לבצע פעולת upsert של נקודת נתונים. חשוב לזכור ש-upsert-datapoints מקבל רק JSON בפורמט מערך.

Python

Python

def vector_search_upsert_datapoints(
    project: str,
    location: str,
    index_name: str,
    datapoints: Sequence[aiplatform.compat.types.index_v1beta1.IndexDatapoint],
) -> None:
    """Upsert datapoints to the index.

    Args:
      project (str): Required. The Project ID
      location (str): Required. The region name, e.g. "us-central1"
      index_name (str): Required. The index to update. A fully-qualified index
        resource name or a index ID.  Example:
        "projects/123/locations/us-central1/indexes/my_index_id" or
        "my_index_id".
      datapoints: Sequence[IndexDatapoint]: Required. The datapoints to be
        updated. For example:
        [IndexDatapoint(datapoint_id="1", feature_vector=[1.0, 2.0, 3.0]),
        IndexDatapoint(datapoint_id="2", feature_vector=[4.0, 5.0, 6.0])]
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index with stream_update
    # enabled
    my_index = aiplatform.MatchingEngineIndex(index_name=index_name)

    # Upsert the datapoints to the index
    my_index.upsert_datapoints(datapoints=datapoints)

Curl

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

  
  DATAPOINT_ID_1=
  DATAPOINT_ID_2=
  curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
  -d '{datapoints: [{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...]},
  {datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...]}]}'
  
  

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

בדוגמה הזו מתבצע עדכון של הטמעות צפופות והטמעות דלילות.

  
    curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111], "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
  
  

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

    
      curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111]}]}'
    
  

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

    
      curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111",  "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
    
  

המסוף

המסוף

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

  1. במסוף Cloud de Confiance , עוברים לדף חיפוש וקטורי.

    כניסה אל חיפוש וקטורי

  2. בוחרים את האינדקס שרוצים לעדכן. ייפתח הדף פרטי האינדקס.
  3. לוחצים על עריכת האינדקס. תיפתח חלונית לעריכת האינדקס.
  4. בחלונית, בוחרים בכרטיסייה Upsert data point (הוספה או עדכון של נקודה על הגרף) כדי להוסיף תוכן.
  5. מזינים את המזהה של נקודת הנתונים.
  6. מזינים לפחות סוג אחד של הטמעה:
    • הטמעה צפופה: מזינים מערך של ערכים מופרדים בפסיקים של נקודות צפות. מספר הערכים צריך להתאים למימדים של האינדקס.
    • הטמעה דלילה:
      1. מזינים את המימדים של ההטמעה הדלילה כמערך של מספרים שלמים מופרדים בפסיקים. מספר הערכים לא חייב להיות זהה למספר הממדים של האינדקס.
      2. צריך להזין ערכים כמערך של ערכים מסוג נקודה צפה שמופרדים בפסיקים. מספר הערכים צריך להיות זהה למספר המימדים של ההטמעה הדלילה.
  7. אופציונלי: כדי להפעיל סינון לפי הגבלות על טוקנים בנקודה על הגרף הזו, לוחצים על הוספת הגבלת טוקן, ואז מזינים מרחב שמות ומחרוזות מופרדות בפסיקים כטוקנים.
  8. אופציונלי: כדי להפעיל סינון לפי הגבלות מספריות בנקודה על הגרף הזו, לוחצים על הוספת הגבלה מספרית, מזינים מרחב שמות, בוחרים סוג מספר ומזינים ערך.
  9. אופציונלי: כדי למנוע הצגת תוצאות דומות רבות, מזינים מחרוזת תגים של הצטברות.
  10. לוחצים על Upsert (עדכון והוספה).
  11. לוחצים על סיום כדי לסגור את החלונית.

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

עדכון המטא-נתונים של ההטמעה

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

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

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

בדוגמה הבאה אפשר לראות איך מוסיפים הגבלות לשתי נקודות נתונים קיימות.

DATAPOINT_ID_1=
DATAPOINT_ID_2=

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
-d '{datapoints:
[{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...],  restricts:[{namespace: "color", allow_list: ["red"]}]},
{datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...],  restricts:[{namespace: "color", allow_list: ["red"]}]}
], update_mask: "all_restricts"}'

הסרת נקודות על הגרף

יכול להיות שתצטרכו להסיר נקודות נתונים מהאינדקס של השידור. אפשר לעשות את זה באמצעות curl או ממסוף Cloud de Confiance .

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

Curl


curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/indexes/{INDEX_ID}:removeDatapoints -d '{datapoint_ids: ["'{DATAPOINT_ID_1}'", "'{DATAPOINT_ID_2}'"]}'

המסוף

המסוף

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

  1. בקטע Agent Platform במסוף Cloud de Confiance , עוברים לקטע Deploy and Use. בוחרים באפשרות חיפוש וקטורי.

    כניסה אל חיפוש וקטורי

  2. בוחרים את אינדקס הסטרימינג שרוצים לעדכן. ייפתח הדף פרטי האינדקס.
  3. לוחצים על עריכת האינדקס. תיפתח חלונית לעריכת האינדקס.
  4. בחלונית, בוחרים בכרטיסייה הסרת נקודות נתונים.
  5. אפשר להוסיף עד 20 נקודות על הגרף על ידי הזנת רשימה של מזהי נקודות על הגרף, מופרדים בפסיקים
  6. לוחצים על הסרה.
  7. לוחצים על סיום כדי לסגור את החלונית.

Python

Python

def vector_search_remove_datapoints(
    project: str,
    location: str,
    index_name: str,
    datapoint_ids: Sequence[str],
) -> None:
    """Remove datapoints from a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_name (str): Required. The index to update. A fully-qualified index
          resource name or a index ID.  Example:
          "projects/123/locations/us-central1/indexes/my_index_id" or
          "my_index_id".
        datapoint_ids (Sequence[str]): Required. The datapoint IDs to remove.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index
    index = aiplatform.MatchingEngineIndex(index_name=index_name)

    index.remove_datapoints(datapoint_ids=datapoint_ids)

עדכון המטא-נתונים של האינדקס

אפשר להשתמש ב-IndexService.UpdateIndex גם כדי לעדכן את שדות המטא-נתונים display_name, description ו-labels לאינדקסים של עיבוד באצווה ושל סטרימינג. הערה: קריאה אחת ל-UpdateIndex יכולה לעדכן את ההטמעות של האינדקס או את שדות המטא-נתונים האלה, אבל לא את שניהם בו-זמנית.

gcloud

  1. מעדכנים את קובץ המטא-נתונים של האינדקס.
  2. משתמשים בפקודה gcloud ai indexes update.

לפני השימוש בנתוני הפקודה הבאים, צריך להחליף את הנתונים הבאים:

  • ‫LOCAL_PATH_TO_METADATA_FILE: הנתיב המקומי לקובץ המטא-נתונים.
  • ‫INDEX_ID: מזהה האינדקס.
  • ‫LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud ai indexes update INDEX_ID \
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE \
    --region=LOCATION \
    --project=PROJECT_ID

‏Windows (PowerShell)

gcloud ai indexes update INDEX_ID `
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE `
    --region=LOCATION `
    --project=PROJECT_ID

Windows‏ (cmd.exe)

gcloud ai indexes update INDEX_ID ^
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • ‫INPUT_DIR: נתיב הספרייה ב-Cloud Storage של תוכן האינדקס.
  • ‫INDEX_ID: מזהה האינדקס.
  • ‫LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Cloud de Confiance by S3NS .
  • ‫PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.

ה-method של ה-HTTP וכתובת ה-URL:

PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID

תוכן בקשת JSON:

{
 "metadata": {
   "description": "Updated description",
   "display_name": "Updated display name"
 }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
 "metadata": {
   "@type": "type.googleapis.com/google.cloud.aiplatform.v1.UpdateIndexOperationMetadata",
   "genericMetadata": {
     "createTime": "2022-01-12T23:56:14.480948Z",
     "updateTime": "2022-01-12T23:56:14.480948Z"
   }
 }
}

Python

def vector_search_update_index_metadata(
    project: str,
    location: str,
    index_name: str,
    display_name: Optional[str] = None,
    description: Optional[str] = None,
    labels: Optional[Dict[str, str]] = None,
) -> None:
    """Update a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        index_name (str): Required. The index to update. A fully-qualified index
          resource name or a index ID.  Example:
          "projects/123/locations/us-central1/indexes/my_index_id" or
          "my_index_id".
        display_name (str): Optional. The display name of the Index. The name
          can be up to 128 characters long and can be consist of any UTF-8
          characters.
        description (str): Optional. The description of the Index.
        labels (Dict[str, str]): Optional. The labels with user-defined
          metadata to organize your Indexs. Label keys and values can be no
          longer than 64 characters (Unicode codepoints), can only contain
          lowercase letters, numeric characters, underscores and dashes.
          International characters are allowed. See https://goo.gl/xmQnxf for
          more information on and examples of labels. No more than 64 user
          labels can be associated with one Index (System labels are excluded).
          System reserved label keys are prefixed with
          "aiplatform.googleapis.com/" and are immutable.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index
    index = aiplatform.MatchingEngineIndex(index_name=index_name)

    index.update_metadata(
        display_name=display_name,
        description=description,
        labels=labels,
    )

המסוף

אפשר להשתמש בהוראות האלה כדי לעדכן את המטא-נתונים של האינדקס (המסוף מוגבל לעדכון של display_name ושל description).

  1. בקטע Agent Platform במסוף Cloud de Confiance , עוברים לקטע Deploy and Use. בוחרים באפשרות חיפוש וקטורי.

    כניסה אל חיפוש וקטורי

  2. בוחרים את האינדקס שרוצים לעדכן. ייפתח הדף פרטי האינדקס.
  3. לוחצים על עריכת האינדקס. תיפתח חלונית לעריכת האינדקס.
  4. מעדכנים את שדות המטא-נתונים הרצויים.
  5. לוחצים על עדכון.
  6. לוחצים על סיום כדי לסגור את החלונית.

דחיסה

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

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

  • חבילת עדכונים: מתרחש כשגודל קבוצת הנתונים המצטברת גדול מ-20% מגודל קבוצת הנתונים הבסיסית.

בנייה מחדש של האינדקס והפעלת שאילתה

אפשר לשלוח בקשות התאמה או בקשות התאמה מקובצות כרגיל באמצעות grpc cli, ספריית הלקוח או Agent Platform SDK ל-Python. אחרי שבונה מחדש את השאילתה, העדכונים אמורים להופיע תוך כמה שניות. מידע נוסף על שאילתות באינדקס זמין במאמר שאילתות באינדקס כדי לקבל את השכנים הקרובים ביותר.

שדות אופציונליים

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

פעולת Upsert עם הגבלות

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

בנוסף להגבלות על טוקנים, בדוגמה נעשה שימוש בהגבלות מספריות. במקרה הזה, נקודת הנתונים משויכת למחיר של 20, לאורך של 0.3 ולרוחב של 0.5. בזמן השאילתה, אפשר להשתמש בהגבלות המספריות האלה כדי לסנן את התוצאות ולהגביל את תוצאות השאילתה לפי ערכי המחיר, האורך והרוחב. לדוגמה, נקודת הנתונים הזו תופיע בשאילתה שמסננת לפי מחיר > 25, אורך < 1 ורוחב < 1.

מידע נוסף על סינון זמין במאמר חיפוש וקטורי להוספה לאינדקס.

Python

# Upsert datapoints
_TEST_DATAPOINT_1 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="3",
    feature_vector=[0.00526886899, -0.0198396724],
    restricts=[
        aiplatform_v1.types.index.IndexDatapoint.Restriction(namespace="Color", allow_list=["red"])
    ],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_int=1,
        )
    ],
)
_TEST_DATAPOINT_2 =  aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="4",
    feature_vector=[0.00526886899, -0.0198396724],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_double=0.1,
        )
    ],
    crowding_tag=aiplatform_v1.types.index.IndexDatapoint.CrowdingTag(crowding_attribute="crowding"),
)
_TEST_DATAPOINT_3 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="5",
    feature_vector=[0.00526886899, -0.0198396724],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_float=1.1,
        )
    ],
)

_TEST_DATAPOINTS = [_TEST_DATAPOINT_1, _TEST_DATAPOINT_2, _TEST_DATAPOINT_3]

my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=_TEST_DATAPOINTS)

# Dynamic metadata update
_TEST_DATAPOINT_4 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="-2",
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_float=1.1,
        )
    ],
)
my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=[_TEST_DATAPOINT4], update_mask=["all_restricts"])

curl

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
  {
    datapoint_id: "'${DATAPOINT_ID_1}'",
    feature_vector: [...],
    restricts: { namespace: "color", allow_list: ["red"], deny_list: ["blue"]},
    numeric_restricts: [{namespace: "price", value_int: 20}, {namespace: "length", value_float: 0.3}, {namespace: "width", value_double: 0.5}]
  }
]}'

עדכון או הוספה של נתונים עם הצטברות

תג הצפיפות מגביל תוצאות דומות על ידי שיפור המגוון של התוצאות. הצפיפות היא מגבלה על רשימת שכנים שנוצרת על ידי חיפוש השכן הקרוב ביותר, שדורשת שלא יותר מערך מסוים של קבוצת תוצאות יחזיר את אותו ערך של crowding_attribute. לדוגמה, נניח שחזרתם לקניות אונליין של נעליים. אתם רוצים לראות מגוון רחב של צבעים בתוצאות, אבל אולי אתם רוצים שהם יהיו בסגנון אחד, כמו נעלי כדורגל. אפשר לבקש שלא יוחזרו יותר מ-3 זוגות נעליים באותו צבע על ידי הגדרת per_crowding_attribute_num_neighbors = 3 בשאילתה, בהנחה שהגדרתם את מאפיין הצפיפות (crowding_attribute) לצבע הנעליים כשמכניסים את נקודה על הגרף.

השדה הזה מייצג את המספר המקסימלי המותר של התאמות עם אותו תג ריווח.

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
  {
    datapoint_id: "'${DATAPOINT_ID_1}'",
    feature_vector: [...],
    restricts: { namespace: "type", allow_list: ["cleats"]}
    crowding_tag: { crowding_attribute: "red-shoe"},
  }
]}'

המאמרים הבאים