ניהול האינדקסים

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

סקירה כללית של האינדקס

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

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

הגדרת פרמטרים של אינדקס

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

לדוגמה, יוצרים קובץ בשם index_metadata.json:

{
  "contentsDeltaUri": "gs://BUCKET_NAME/path",
  "config": {
    "dimensions": 100,
    "approximateNeighborsCount": 150,
    "distanceMeasureType": "DOT_PRODUCT_DISTANCE",
    "shardSize": "SHARD_SIZE_MEDIUM",
    "algorithm_config": {
      "treeAhConfig": {
        "leafNodeEmbeddingCount": 5000,
        "fractionLeafNodesToSearch": 0.03
      }
    }
  }
}

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

יצירת אינדקס

גודל האינדקס

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

  • SHARD_SIZE_SMALL: 2 GiB לכל shard.
  • SHARD_SIZE_MEDIUM: 20GiB לכל שארד.
  • SHARD_SIZE_LARGE: 50‎ GiB לכל שארד.

במקרה של הטמעות דלילות, הגדלים הנתמכים הם 20% מגודל השבר בבייטים.

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

סוג המכונה SHARD_SIZE_SMALL SHARD_SIZE_MEDIUM SHARD_SIZE_LARGE
n1-standard-16
n1-standard-32
e2-standard-2 (ברירת מחדל)
e2-standard-16 (ברירת מחדל)
e2-highmem-16 (ברירת מחדל)
n2d-standard-32

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

יצירת אינדקס לחבילת עדכונים

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

כדי ליצור אינדקס:

gcloud

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

  • LOCAL_PATH_TO_METADATA_FILE: הנתיב המקומי לקובץ המטא-נתונים.
  • INDEX_NAME: השם המוצג של האינדקס.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

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

‫Linux,‏ macOS או Cloud Shell

gcloud ai indexes create \
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE \
    --display-name=INDEX_NAME \
    --region=LOCATION \
    --project=PROJECT_ID

‏Windows (PowerShell)

gcloud ai indexes create `
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE `
    --display-name=INDEX_NAME `
    --region=LOCATION `
    --project=PROJECT_ID

Windows‏ (cmd.exe)

gcloud ai indexes create ^
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^
    --display-name=INDEX_NAME ^
    --region=LOCATION ^
    --project=PROJECT_ID

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

You can poll for the status of the operation for the response
to include "done": true. Use the following example to poll the status.

  $ gcloud ai operations describe 1234567890123456789 --project=my-test-project --region=us-central1

מידע נוסף על הפקודה describe זמין במאמר gcloud ai operations.

REST

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

  • INPUT_DIR: נתיב הספרייה ב-Cloud Storage של תוכן האינדקס.
  • INDEX_NAME: השם המוצג של האינדקס.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.

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

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

תוכן בקשת JSON:

{
  "display_name": "INDEX_NAME",
  "metadata": {
    "contentsDeltaUri": "INPUT_DIR",
    "config": {
      "dimensions": 100,
      "approximateNeighborsCount": 150,
      "distanceMeasureType": "DOT_PRODUCT_DISTANCE",
      "algorithm_config": {
        "treeAhConfig": {
          "leafNodeEmbeddingCount": 500,
          "leafNodesToSearchPercent": 7
        }
      }
    }
  }
}

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateIndexOperationMetadata",
    "genericMetadata": {
      "createTime": "2022-01-08T01:21:10.147035Z",
      "updateTime": "2022-01-08T01:21:10.147035Z"
    }
  }
}

Terraform

בדוגמה הבאה נעשה שימוש במשאב google_vertex_ai_index של Terraform כדי ליצור אינדקס לעדכונים באצווה.

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

# Cloud Storage bucket name must be unique
resource "random_id" "bucket_name_suffix" {
  byte_length = 8
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "bucket" {
  name                        = "vertex-ai-index-bucket-${random_id.bucket_name_suffix.hex}"
  location                    = "us-central1"
  uniform_bucket_level_access = true
}

# Create index content
resource "google_storage_bucket_object" "data" {
  name    = "contents/data.json"
  bucket  = google_storage_bucket.bucket.name
  content = <<EOF
{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class", "allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace": "class", "allow": ["dog", "pet"]},{"namespace": "category", "allow": ["canine"]}]}
EOF
}

resource "google_vertex_ai_index" "default" {
  region       = "us-central1"
  display_name = "sample-index-batch-update"
  description  = "A sample index for batch update"
  labels = {
    foo = "bar"
  }

  metadata {
    contents_delta_uri = "gs://${google_storage_bucket.bucket.name}/contents"
    config {
      dimensions                  = 2
      approximate_neighbors_count = 150
      distance_measure_type       = "DOT_PRODUCT_DISTANCE"
      algorithm_config {
        tree_ah_config {
          leaf_node_embedding_count    = 500
          leaf_nodes_to_search_percent = 7
        }
      }
    }
  }
  index_update_method = "BATCH_UPDATE"

  timeouts {
    create = "2h"
    update = "1h"
  }
}

Python

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

def vector_search_create_index(
    project: str, location: str, display_name: str, gcs_uri: Optional[str] = None
) -> aiplatform.MatchingEngineIndex:
    """Create a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        display_name (str): Required. The index display name
        gcs_uri (str): Optional. The Google Cloud Storage uri for index content

    Returns:
        The created MatchingEngineIndex.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create Index
    index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
        display_name=display_name,
        contents_delta_uri=gcs_uri,
        description="Matching Engine Index",
        dimensions=100,
        approximate_neighbors_count=150,
        leaf_node_embedding_count=500,
        leaf_nodes_to_search_percent=7,
        index_update_method="BATCH_UPDATE",  # Options: STREAM_UPDATE, BATCH_UPDATE
        distance_measure_type=aiplatform.matching_engine.matching_engine_index_config.DistanceMeasureType.DOT_PRODUCT_DISTANCE,
    )

    return index

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.aiplatform.v1.CreateIndexRequest;
import com.google.cloud.aiplatform.v1.Index;
import com.google.cloud.aiplatform.v1.Index.IndexUpdateMethod;
import com.google.cloud.aiplatform.v1.IndexServiceClient;
import com.google.cloud.aiplatform.v1.IndexServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.protobuf.Value;
import com.google.protobuf.util.JsonFormat;
import java.util.concurrent.TimeUnit;

public class CreateIndexSample {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String location = "YOUR_LOCATION";
    String displayName = "YOUR_INDEX_DISPLAY_NAME";
    String contentsDeltaUri = "gs://YOUR_BUCKET/";
    String metadataJson =
        String.format(
            "{\n"
                + "  \"contentsDeltaUri\": \"%s\",\n"
                + "  \"config\": {\n"
                + "    \"dimensions\": 100,\n"
                + "        \"approximateNeighborsCount\": 150,\n"
                + "        \"distanceMeasureType\": \"DOT_PRODUCT_DISTANCE\",\n"
                + "        \"shardSize\": \"SHARD_SIZE_MEDIUM\",\n"
                + "        \"algorithm_config\": {\n"
                + "      \"treeAhConfig\": {\n"
                + "        \"leafNodeEmbeddingCount\": 5000,\n"
                + "            \"fractionLeafNodesToSearch\": 0.03\n"
                + "      }\n"
                + "    }\n"
                + "  }\n"
                + "}",
            contentsDeltaUri);

    createIndexSample(project, location, displayName, metadataJson);
  }

  public static Index createIndexSample(
      String project, String location, String displayName, String metadataJson) throws Exception {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (IndexServiceClient indexServiceClient =
        IndexServiceClient.create(
            IndexServiceSettings.newBuilder()
                .setEndpoint(location + "-aiplatform.googleapis.com:443")
                .build())) {
      Value.Builder metadataBuilder = Value.newBuilder();
      JsonFormat.parser().merge(metadataJson, metadataBuilder);

      CreateIndexRequest request =
          CreateIndexRequest.newBuilder()
              .setParent(LocationName.of(project, location).toString())
              .setIndex(
                  Index.newBuilder()
                      .setDisplayName(displayName)
                      .setMetadata(metadataBuilder)
                      .setIndexUpdateMethod(IndexUpdateMethod.BATCH_UPDATE))
              .build();

      return indexServiceClient.createIndexAsync(request).get(5, TimeUnit.MINUTES);
    }
  }
}

המסוף

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

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

    מעבר אל חיפוש וקטורי

  2. לוחצים על יצירת אינדקס חדש כדי לפתוח את החלונית אינדקס. מופיעה החלונית יצירת אינדקס חדש.
  3. בשדה שם מוצג, מזינים שם ייחודי שישמש לזיהוי האינדקס.
  4. בשדה Description, מציינים תיאור של מטרת האינדקס.
  5. בשדה אזור, בוחרים אזור מהתפריט הנפתח.
  6. בשדה Cloud Storage, מחפשים את תיקיית Cloud Storage שבה מאוחסנים נתוני הווקטור ובוחרים אותה.
  7. בתפריט הנפתח סוג האלגוריתם, בוחרים את סוג האלגוריתם שבו נעשה שימוש בחיפוש וקטורי לחיפוש יעיל. אם בוחרים באלגוריתם treeAh, צריך להזין את מספר השכנים המשוער.
  8. בשדה Dimensions, מזינים את מספר המאפיינים של וקטורי הקלט.
  9. בשדה Update method (שיטת העדכון), בוחרים באפשרות Batch (עדכון קבוצתי).
  10. בשדה גודל השבר, בוחרים בתפריט הנפתח את גודל השבר הרצוי.
  11. לוחצים על יצירה. האינדקס החדש יופיע ברשימת האינדקסים כשהוא יהיה מוכן. הערה: משך זמן של תהליך build יכול להימשך עד שעה.

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

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

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

דוגמה לבקשה ריקה להוספה לאינדקס

{
  "display_name": INDEX_NAME,
  "indexUpdateMethod": "BATCH_UPDATE",
  "metadata": {
    "config": {
      "dimensions": 100,
      "approximateNeighborsCount": 150,
      "distanceMeasureType": "DOT_PRODUCT_DISTANCE",
      "algorithm_config": {
        "treeAhConfig": {
          "leafNodeEmbeddingCount": 500,
          "fractionLeafNodesToSearch": 0.07
        }
      }
    }
  }
}
  

יצירת אינדקס לעדכונים של סטרימינג

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

REST

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

  • INDEX_NAME: השם המוצג של האינדקס.
  • DESCRIPTION: תיאור של האינדקס.
  • INPUT_DIR: נתיב הספרייה ב-Cloud Storage של תוכן האינדקס.
  • DIMENSIONS: מספר הממדים של וקטור ההטמעה.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.

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

POST https://ENDPOINT-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes

תוכן בקשת JSON:

{
  displayName: "INDEX_NAME",
  description: "DESCRIPTION",
  metadata: {
     contentsDeltaUri: "INPUT_DIR",
     config: {
        dimensions: "DIMENSIONS",
        approximateNeighborsCount: 150,
        distanceMeasureType: "DOT_PRODUCT_DISTANCE",
        algorithmConfig: {treeAhConfig: {leafNodeEmbeddingCount: 10000, leafNodesToSearchPercent: 2}}
     },
  },
  indexUpdateMethod: "STREAM_UPDATE"
}

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.ui.CreateIndexOperationMetadata",
    "genericMetadata": {
      "createTime": "2023-12-05T23:17:45.416117Z",
      "updateTime": "2023-12-05T23:17:45.416117Z",
      "state": "RUNNING",
      "worksOn": [
        "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID"
      ]
    }
  }
}

Terraform

בדוגמה הבאה נעשה שימוש במשאב google_vertex_ai_index של Terraform כדי ליצור אינדקס לעדכונים בזמן אמת.

כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.

# Cloud Storage bucket name must be unique
resource "random_id" "default" {
  byte_length = 8
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "bucket" {
  name                        = "vertex-ai-index-bucket-${random_id.default.hex}"
  location                    = "us-central1"
  uniform_bucket_level_access = true
}

# Create index content
resource "google_storage_bucket_object" "data" {
  name    = "contents/data.json"
  bucket  = google_storage_bucket.bucket.name
  content = <<EOF
{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class", "allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace": "class", "allow": ["dog", "pet"]},{"namespace": "category", "allow": ["canine"]}]}
EOF
}

resource "google_vertex_ai_index" "streaming_index" {
  region       = "us-central1"
  display_name = "sample-index-streaming-update"
  description  = "A sample index for streaming update"
  labels = {
    foo = "bar"
  }

  metadata {
    contents_delta_uri = "gs://${google_storage_bucket.bucket.name}/contents"
    config {
      dimensions                  = 2
      approximate_neighbors_count = 150
      distance_measure_type       = "DOT_PRODUCT_DISTANCE"
      algorithm_config {
        tree_ah_config {
          leaf_node_embedding_count    = 500
          leaf_nodes_to_search_percent = 7
        }
      }
    }
  }
  index_update_method = "STREAM_UPDATE"

  timeouts {
    create = "2h"
    update = "1h"
  }
}

Python

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

def vector_search_create_streaming_index(
    project: str, location: str, display_name: str, gcs_uri: Optional[str] = None
) -> aiplatform.MatchingEngineIndex:
    """Create a vector search index.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name
        display_name (str): Required. The index display name
        gcs_uri (str): Optional. The Google Cloud Storage uri for index content

    Returns:
        The created MatchingEngineIndex.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create Index
    index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
        display_name=display_name,
        contents_delta_uri=gcs_uri,
        description="Matching Engine Index",
        dimensions=100,
        approximate_neighbors_count=150,
        leaf_node_embedding_count=500,
        leaf_nodes_to_search_percent=7,
        index_update_method="STREAM_UPDATE",  # Options: STREAM_UPDATE, BATCH_UPDATE
        distance_measure_type=aiplatform.matching_engine.matching_engine_index_config.DistanceMeasureType.DOT_PRODUCT_DISTANCE,
    )

    return index

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.aiplatform.v1.CreateIndexRequest;
import com.google.cloud.aiplatform.v1.Index;
import com.google.cloud.aiplatform.v1.Index.IndexUpdateMethod;
import com.google.cloud.aiplatform.v1.IndexServiceClient;
import com.google.cloud.aiplatform.v1.IndexServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.protobuf.Value;
import com.google.protobuf.util.JsonFormat;
import java.util.concurrent.TimeUnit;

public class CreateStreamingIndexSample {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String location = "YOUR_LOCATION";
    String displayName = "YOUR_INDEX_DISPLAY_NAME";
    String contentsDeltaUri = "gs://YOUR_BUCKET/";
    String metadataJson =
        String.format(
            "{\n"
                + "  \"contentsDeltaUri\": \"%s\",\n"
                + "  \"config\": {\n"
                + "    \"dimensions\": 100,\n"
                + "        \"approximateNeighborsCount\": 150,\n"
                + "        \"distanceMeasureType\": \"DOT_PRODUCT_DISTANCE\",\n"
                + "        \"shardSize\": \"SHARD_SIZE_MEDIUM\",\n"
                + "        \"algorithm_config\": {\n"
                + "      \"treeAhConfig\": {\n"
                + "        \"leafNodeEmbeddingCount\": 5000,\n"
                + "            \"fractionLeafNodesToSearch\": 0.03\n"
                + "      }\n"
                + "    }\n"
                + "  }\n"
                + "}",
            contentsDeltaUri);

    createStreamingIndexSample(project, location, displayName, metadataJson);
  }

  public static Index createStreamingIndexSample(
      String project, String location, String displayName, String metadataJson) throws Exception {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (IndexServiceClient indexServiceClient =
        IndexServiceClient.create(
            IndexServiceSettings.newBuilder()
                .setEndpoint(location + "-aiplatform.googleapis.com:443")
                .build())) {
      Value.Builder metadataBuilder = Value.newBuilder();
      JsonFormat.parser().merge(metadataJson, metadataBuilder);

      CreateIndexRequest request =
          CreateIndexRequest.newBuilder()
              .setParent(LocationName.of(project, location).toString())
              .setIndex(
                  Index.newBuilder()
                      .setDisplayName(displayName)
                      .setMetadata(metadataBuilder)
                      .setIndexUpdateMethod(IndexUpdateMethod.STREAM_UPDATE))
              .build();

      return indexServiceClient.createIndexAsync(request).get(5, TimeUnit.MINUTES);
    }
  }
}

המסוף

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

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

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

    מעבר אל חיפוש וקטורי

  2. לוחצים על יצירת אינדקס חדש כדי לפתוח את החלונית אינדקס. מופיעה החלונית יצירת אינדקס חדש.
  3. בשדה שם מוצג, מזינים שם ייחודי שישמש לזיהוי האינדקס.
  4. בשדה Description (תיאור), מציינים למה נועד האינדקס.
  5. בשדה אזור, בוחרים אזור מהתפריט הנפתח.
  6. בשדה Cloud Storage, מחפשים ובוחרים את תיקיית Cloud Storage שבה מאוחסנים נתוני הווקטור.
  7. בתפריט הנפתח סוג האלגוריתם, בוחרים את סוג האלגוריתם שבו חיפוש וקטורי ישתמש כדי לבצע את החיפוש. אם בוחרים באלגוריתם treeAh, צריך להזין את מספר השכנים המשוער.
  8. בשדה Dimensions, מזינים את מספר המאפיינים של וקטורי הקלט.
  9. בשדה Update method (שיטת העדכון), בוחרים באפשרות Stream (סטרימינג).
  10. בשדה גודל השבר, בוחרים את גודל השבר הרצוי מתוך התפריט הנפתח.
  11. לוחצים על יצירה. אחרי שהאינדקס החדש יהיה מוכן, הוא יופיע ברשימת האינדקסים. הערה: משך זמן של תהליך build יכול להימשך עד שעה.

יצירת אינדקס ריק לעדכונים של סטרימינג

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

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

דוגמה לבקשה ריקה להוספה לאינדקס

{
  "display_name": INDEX_NAME,
  "indexUpdateMethod": "STREAM_UPDATE",
  "metadata": {
    "config": {
      "dimensions": 100,
      "approximateNeighborsCount": 150,
      "distanceMeasureType": "DOT_PRODUCT_DISTANCE",
      "algorithm_config": {
        "treeAhConfig": {
          "leafNodeEmbeddingCount": 500,
          "leafNodesToSearchPercent": 7
        }
      }
    }
  }
}
  

הצגת רשימת האינדקסים

gcloud

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

  • INDEX_NAME: השם המוצג של האינדקס.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

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

‫Linux,‏ macOS או Cloud Shell

gcloud ai indexes list \
    --region=LOCATION \
    --project=PROJECT_ID

‏Windows (PowerShell)

gcloud ai indexes list `
    --region=LOCATION `
    --project=PROJECT_ID

Windows‏ (cmd.exe)

gcloud ai indexes list ^
    --region=LOCATION ^
    --project=PROJECT_ID

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

You can poll for the status of the operation for the response
to include "done": true. Use the following example to poll the status.

  $ gcloud ai operations describe 1234567890123456789 --project=my-test-project --region=us-central1

מידע נוסף על הפקודה describe זמין במאמר gcloud ai operations.

REST

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

  • INDEX_NAME: השם המוצג של האינדקס.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.

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

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

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

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

{
 "indexes": [
   {
     "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID",
     "displayName": "INDEX_NAME",
     "metadataSchemaUri": "gs://google-cloud-aiplatform/schema/matchingengine/metadata/nearest_neighbor_search_1.0.0.yaml",
     "metadata": {
       "config": {
         "dimensions": 100,
         "approximateNeighborsCount": 150,
         "distanceMeasureType": "DOT_PRODUCT_DISTANCE",
         "featureNormType": "NONE",
         "algorithmConfig": {
           "treeAhConfig": {
             "maxLeavesToSearch": 50,
             "leafNodeCount": 10000
           }
         }
       }
     },
     "etag": "AMEw9yNU8YX5IvwuINeBkVv3yNa7VGKk11GBQ8GkfRoVvO7LgRUeOo0qobYWuU9DiEc=",
     "createTime": "2020-11-08T21:56:30.558449Z",
     "updateTime": "2020-11-08T22:39:25.048623Z"
   }
 ]
}

Python

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

def vector_search_list_index(
    project: str, location: str
) -> List[aiplatform.MatchingEngineIndex]:
    """List vector search indexes.

    Args:
        project (str): Required. Project ID
        location (str): Required. The region name

    Returns:
        List of aiplatform.MatchingEngineIndex
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # List Indexes
    return aiplatform.MatchingEngineIndex.list()

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.aiplatform.v1.Index;
import com.google.cloud.aiplatform.v1.IndexServiceClient;
import com.google.cloud.aiplatform.v1.IndexServiceClient.ListIndexesPagedResponse;
import com.google.cloud.aiplatform.v1.IndexServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;

public class ListIndexesSample {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String location = "YOUR_LOCATION";

    for (Index index : listIndexesSample(project, location).iterateAll()) {
      System.out.println(index.getName());
    }
  }

  public static ListIndexesPagedResponse listIndexesSample(String project, String location)
      throws Exception {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (IndexServiceClient indexServiceClient =
        IndexServiceClient.create(
            IndexServiceSettings.newBuilder()
                .setEndpoint(location + "-aiplatform.googleapis.com:443")
                .build())) {
      String parent = LocationName.of(project, location).toString();
      return indexServiceClient.listIndexes(parent);
    }
  }
}

המסוף

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

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

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

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

שיפור האינדקס

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

פרמטרים של הגדרות שמשפיעים על הביצועים

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

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

פרמטר מידע כללי השפעה על הביצועים
shardSize

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

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

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

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

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

  • Recall: Decreased
  • זמן האחזור: מופחת, פחות שונות
  • זמינות: הפסקות בשארדים משפיעות על אחוז גדול יותר של נתונים
  • עלות: יכולה לרדת אם משתמשים באותו סוג מכונה עם פחות רסיסים
distanceMeasureType

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

ההגדרות הבאות של distanceMeasureType יכולות לעזור להפחית את זמן האחזור של השאילתות:

  • האפשרות DOT_PRODUCT_DISTANCE היא האופטימלית ביותר לצמצום זמן האחזור
  • מומלץ להשתמש ב-DOT_PRODUCT_DISTANCE בשילוב עם ההגדרה FeatureNormType ל-UNIT_L2_NORM כדי לחשב את הדמיון הקוסינוסי
leafNodeEmbeddingCount

מספר ההטמעות לכל צומת עלה. כברירת מחדל, המספר הזה מוגדר ל-1,000.

בדרך כלל, שינוי הערך של leafNodeEmbeddingCount משפיע פחות מאשר שינוי הערך של פרמטרים אחרים.

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

  • היזכרות: ירדה בגלל חיפוש פחות מטורגט
  • זמן האחזור: מופחת, כל עוד הערך לא גדול מ-15,000 ברוב תרחישי השימוש
  • זמינות: אין השפעה
  • עלות: יכולה לרדת כי נדרשות פחות רפליקות לאותו QPS

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

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

שימוש במדד של חיפוש בכוח כדי למדוד היזכרות

כדי לקבל את השכנים הקרובים המדויקים, משתמשים באינדקסים עם אלגוריתם brute-force. אלגוריתם הכוח הגס מספק 100% recall, אבל זמן האחזור גבוה יותר. שימוש באינדקס brute-force למדידת היזכרות בדרך כלל לא מומלץ להצגה בייצור, אבל יכול להיות שהוא יהיה שימושי להערכת היזכרות של אפשרויות שונות לאינדקס במצב אופליין.

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

curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/indexes \
-d '{
    displayName: "'${DISPLAY_NAME}'",
    description: "'${DESCRIPTION}'",
    metadata: {
       contentsDeltaUri: "'${INPUT_DIR}'",
       config: {
          dimensions: 100,
          approximateNeighborsCount: 150,
          distanceMeasureType: "DOT_PRODUCT_DISTANCE",
          featureNormType: "UNIT_L2_NORM",
          algorithmConfig: {
             bruteForceConfig: {}
          }
       },
    },
}'

מחיקת אינדקס

gcloud

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

  • INDEX_ID: מזהה האינדקס.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

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

‫Linux,‏ macOS או Cloud Shell

gcloud ai indexes delete INDEX_ID \
    --region=LOCATION \
    --project=PROJECT_ID

‏Windows (PowerShell)

gcloud ai indexes delete INDEX_ID `
    --region=LOCATION `
    --project=PROJECT_ID

Windows‏ (cmd.exe)

gcloud ai indexes delete INDEX_ID ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

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

  • INDEX_ID: מזהה האינדקס.
  • LOCATION: האזור שבו משתמשים ב-Agent Platform.
  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי.

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

DELETE https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeleteOperationMetadata",
    "genericMetadata": {
      "createTime": "2022-01-08T02:35:56.364956Z",
      "updateTime": "2022-01-08T02:35:56.364956Z"
    }
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.protobuf.Empty"
  }
}

Python

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

def vector_search_delete_index(
    project: str, location: str, index_name: str
) -> None:
    """Delete 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".
    """
    # 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)

    # Delete the index
    index.delete()

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של Agent Platform Java API.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.


import com.google.cloud.aiplatform.v1.IndexName;
import com.google.cloud.aiplatform.v1.IndexServiceClient;
import com.google.cloud.aiplatform.v1.IndexServiceSettings;
import java.util.concurrent.TimeUnit;

public class DeleteIndexSample {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String location = "YOUR_LOCATION";
    String indexId = "YOUR_INDEX_ID";

    deleteIndexSample(project, location, indexId);
  }

  public static void deleteIndexSample(String project, String location, String indexId)
      throws Exception {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (IndexServiceClient indexServiceClient =
        IndexServiceClient.create(
            IndexServiceSettings.newBuilder()
                .setEndpoint(location + "-aiplatform.googleapis.com:443")
                .build())) {
      String indexName = IndexName.of(project, location, indexId).toString();
      indexServiceClient.deleteIndexAsync(indexName).get(5, TimeUnit.MINUTES);
    }
  }
}

המסוף

כאן מוסבר איך למחוק אינדקס אחד או יותר.

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

    מעבר אל חיפוש וקטורי

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

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