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

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

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

הגדרת התוסף

  1. מתחברים למסד הנתונים באמצעות psql או AlloyDB ל-PostgreSQL Studio באמצעות המשתמש postgres.

  2. אופציונלי: בקשת גישה לאינטראקציה עם תכונות של פונקציות AI ב-AlloyDB ל-PostgreSQL (תצוגה מקדימה) כולל תמיכה במודלים מרובי-מוֹדָלִים, במודלים של דירוג ובפונקציות של אופרטורים.

  3. אופציונלי: מעניקים הרשאה למשתמש PostgreSQL שאינו סופר-אדמין לנהל מטא-נתונים של מודל:

      GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA google_ml TO NON_SUPER_USER;
    

    מחליפים את המשתנה הבא:

    • NON_SUPER_USER: שם המשתמש ב-PostgreSQL שאינו משתמש-על.
  4. מוודאים שכתובת ה-IP היוצאת מופעלת כדי לגשת למודלים שמארחים מחוץ ל-VPC, כמו מודלים של צד שלישי. מידע נוסף זמין במאמר בנושא הוספת קישוריות יוצאת.

מגדירים אימות

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

אינטגרציה עם Vertex AI והתקנת התוסף

כדי להשתמש בנקודות הקצה של מודל Vertex AI, צריך להוסיף הרשאות Vertex AI לחשבון השירות מבוסס-IAM של AlloyDB שמשמש להתחברות למסד הנתונים.

  1. הגדרת גישת משתמשים למודלים של Vertex AI.
  2. מוודאים שהגרסה העדכנית של google_ml_integration מותקנת.
    1. כדי לבדוק את הגרסה המותקנת, מריצים את הפקודה הבאה:

      SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
      extversion 
      ------------
      1.5.2
      (1 row)
    2. אם התוסף לא מותקן או אם הגרסה המותקנת קודמת לגרסה 1.5.2, צריך לעדכן את התוסף.

      CREATE EXTENSION IF NOT EXISTS google_ml_integration;
      ALTER EXTENSION google_ml_integration UPDATE;

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

  3. כדי להשתמש בפונקציונליות של מנוע השאילתות של AlloyDB AI, מגדירים את הדגל google_ml_integration.enable_ai_query_engine לערך on.

    SQL

    1. הפעלת מנוע השאילתות מבוסס-AI בסשן הנוכחי.
      SET google_ml_integration.enable_ai_query_engine = on;
    2. הפעלה של תכונות למסד נתונים ספציפי בסשנים שונים.
      ALTER DATABASE DATABASE_NAME SET google_ml_integration.enable_ai_query_engine = 'on';
    3. הפעלת מנוע השאילתות מבוסס ה-AI למשתמש ספציפי בסשנים ובמסדי נתונים.
      ALTER ROLE postgres SET google_ml_integration.enable_ai_query_engine = 'on';

    המסוף

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

    gcloud

    כדי להשתמש ב-CLI של gcloud, אפשר להתקין ולהפעיל את Google Cloud CLI, או להשתמש ב-Cloud Shell.

    אפשר לשנות את הערך של הדגל google_ml_integration.enable_ai_query_engine. מידע נוסף זמין במאמר הגדרת דגלים של מסד נתונים במופע.

    gcloud alloydb instances update INSTANCE_ID \
      --database-flags google_ml_integration.enable_ai_query_engine=on \
      --region=REGION_ID \
      --cluster=CLUSTER_ID \
      --project=PROJECT_ID

הגדרת אימות באמצעות Secret Manager

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

השלב הזה הוא אופציונלי אם נקודת הקצה של המודל לא מטפלת באימות באמצעות Secret Manager – לדוגמה, אם נקודת הקצה של המודל משתמשת בכותרות HTTP כדי להעביר פרטי אימות או לא משתמשת באימות בכלל.

כדי ליצור מפתח API או אסימון מסוג bearer ולהשתמש בהם, צריך לבצע את השלבים הבאים:

  1. יוצרים את הסוד ב-Secret Manager. מידע נוסף זמין במאמר בנושא יצירת סוד וגישה לגרסה של סוד.

    הנתיב של הסוד משמש בפונקציית ה-SQL‏ google_ml.create_sm_secret().

  2. נותנים הרשאות לאשכול AlloyDB לגשת לסוד.

      gcloud secrets add-iam-policy-binding 'SECRET_NAME' \
          --member="serviceAccount:SERVICE_ACCOUNT_ID" \
          --role="roles/secretmanager.secretAccessor"
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SECRET_NAME: שם הסוד ב-Secret Manager.
    • SERVICE_ACCOUNT_ID: המזהה של חשבון השירות שמבוסס על IAM בפורמט serviceAccount:service-PROJECT_ID@gcp-sa-alloydb.iam.gserviceaccount.com. לדוגמה: service-212340152456@gcp-sa-alloydb.iam.gserviceaccount.com.

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

הגדרה של אימות באמצעות כותרות

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

  CREATE OR REPLACE FUNCTION HEADER_GEN_FUNCTION(
    model_id VARCHAR(100),
    input_text TEXT
  )
  RETURNS JSON
  LANGUAGE plpgsql
  AS $$
  #variable_conflict use_variable
  DECLARE
    api_key VARCHAR(255) := 'API_KEY';
    header_json JSON;
  BEGIN
    header_json := json_build_object(
      'Content-Type', 'application/json',
      'Authorization', 'Bearer ' || api_key
    );
    RETURN header_json;
  END;
  $$;

מחליפים את מה שכתוב בשדות הבאים:

  • HEADER_GEN_FUNCTION: השם של פונקציית יצירת הכותרת שאפשר להשתמש בה כשרושמים מודל.
  • API_KEY: מפתח ה-API של ספק המודל.

פריסת מודלים מ-Model Garden לנקודת קצה ב-Vertex AI

בנוסף ל-Gemini או למודלים אחרים של Vertex AI שזמינים כברירת מחדל, אתם יכולים לארח מודלים מ-Model Garden שעברו אופטימיזציה למשימות ספציפיות. התהליך הנפוץ הוא קודם לפרוס מודל מ-Model Garden לנקודת קצה ציבורית של Vertex AI, ואז לרשום את נקודת הקצה הזו ב-AlloyDB ל-PostgreSQL. המודלים האלה שמותאמים למשימות ספציפיות רשומים עם model_type תואם, כמו ts_forecasting במקרה של מודל TimesFM, והם משמשים עם פונקציות SQL מיוחדות.

כדי לפרוס מודל שמתארח ב-Model Garden לנקודת קצה של Vertex AI:

  1. נכנסים לדף Model Garden במסוף Google Cloud :

    כניסה ל-Model Garden

  2. מוצאים את המודל ולוחצים על Deploy (פריסה).

  3. בהגדרות הפריסה, בוחרים באפשרות Public (Shared endpoint) (ציבורי (נקודת קצה משותפת)) בקטע Endpoint access (גישה לנקודת קצה) כדי להפוך את נקודת הקצה לנגישה לציבור ול-AlloyDB ל-PostgreSQL.

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

מודלים להטמעת טקסט

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

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

הדגם gemini-embedding-001 זמין רק באזור us-central1.

לדוגמה, כדי להפעיל את מודל gemini-embedding-001 שנרשם מראש, אפשר להפעיל את המודל ישירות באמצעות פונקציית ההטמעה:

SELECT
      embedding(
        model_id => 'gemini-embedding-001',
        content => 'AlloyDB is a managed, cloud-hosted SQL database service');

אם אשכול AlloyDB ונקודת הקצה של Vertex AI נמצאים בפרויקטים שונים, צריך להגדיר את model_id לנתיב המלא של נקודת הקצה – לדוגמה, projects/PROJECT_ID/locations/REGION_ID/publishers/google/models/gemini-embedding-001.

באופן דומה, כדי להפעיל את מודל gemini-1.5-pro:generateContent שנרשם מראש, אפשר להפעיל את המודל ישירות באמצעות פונקציית החיזוי:

 SELECT google_ml.predict_row(
            model_id => 'gemini-1.5-pro:generateContent',
            request_body => '{
        "contents": [
            {
                "role": "user",
                "parts": [
                    {
                        "text": "For TPCH database schema as mentioned here https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf , generate a SQL query to find all supplier names which are located in the India nation. Only provide SQL query with no explanation."
                    }
                ]
            }
        ]
        }')-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text';

הוראות ליצירת הטמעות מפורטות במאמר יצירת הטמעת טקסט. הוראות להפעלת חיזויים מפורטות במאמר הפעלת חיזויים.

מודלים להטמעת טקסט עם תמיכה מובנית

ניהול נקודות הקצה של המודלים מספק תמיכה מובנית בחלק מהמודלים של Vertex AI ו-OpenAI. רשימת הדגמים עם תמיכה מובנית מופיעה כאן.

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

מודלים של הטמעה ב-Vertex AI

בשלבים הבאים מוסבר איך לרשום מודלים של Vertex AI עם תמיכה מובנית. נקודת הקצה של המודל gemini-embedding-001 ושל text-multilingual-embedding-002 משמשת כדוגמה.

מוודאים שאשכול AlloyDB ומודל Vertex AI ששולחים אליו שאילתה נמצאים באותו אזור.

  1. מתחברים למסד הנתונים באמצעות psql.

  2. הגדרת התוסף google_ml_integration

  3. קוראים לפונקציה ליצירת מודל כדי להוסיף את נקודת הקצה של המודל:

    gemini-embedding-001

      CALL
        google_ml.create_model(
          model_id => 'gemini-embedding-001',
          model_request_url => 'publishers/google/models/gemini-embedding-001',
          model_provider => 'google',
          model_qualified_name => 'gemini-embedding-001',
          model_type => 'text_embedding',
          model_auth_type => 'alloydb_service_agent_iam');
    

    text-multilingual-embedding-002

      CALL
        google_ml.create_model(
          model_id => 'text-multilingual-embedding-002',
          model_request_url => 'publishers/google/models/text-multilingual-embedding-002',
          model_provider => 'google',
          model_qualified_name => 'text-multilingual-embedding-002',
          model_type => 'text_embedding',
          model_auth_type => 'alloydb_service_agent_iam'
          model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
          model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');
    

אם המודל מאוחסן בפרויקט ובאזור אחרים מאלה של אשכול AlloyDB, צריך להגדיר את כתובת ה-URL של הבקשה ל-projects/PROJECT_ID/locations/REGION_ID/publishers/google/models/MODEL_ID, כאשר REGION_ID הוא האזור שבו המודל מתארח ו-MODEL_ID הוא שם המודל המלא.

בנוסף, צריך להקצות את התפקיד Vertex AI User (roles/aiplatform.user) לחשבון השירות של AlloyDB בפרויקט שבו נמצא מופע AlloyDB, כדי ש-AlloyDB יוכל לגשת למודל שמתארח בפרויקט השני.

מודל הטמעת טקסט של Open AI

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

בדוגמה הבאה מוסיפים את נקודת הקצה של מודל OpenAI‏ text-embedding-ada-002. אפשר לרשום את נקודות הקצה של מודל OpenAI text-embedding-3-small ו-text-embedding-3-large באמצעות אותם שלבים ולהגדיר את השמות המוסמכים של המודלים שספציפיים למודלים.

  1. מתחברים למסד הנתונים באמצעות psql.
  2. הגדרת התוסף google_ml_integration
  3. מוסיפים את מפתח OpenAI API כסוד ל-Secret Manager לצורך אימות.
  4. קוראים לסוד שמאוחסן ב-Secret Manager:

    CALL
    google_ml.create_sm_secret(
      secret_id => 'SECRET_ID',
      secret_path => 'projects/PROJECT_ID/secrets/SECRET_MANAGER_SECRET_ID/versions/VERSION_NUMBER');
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SECRET_ID: מזהה הסוד שהגדרתם ומשמש בהמשך לרישום של נקודת קצה של מודל, לדוגמה key1.
    • SECRET_MANAGER_SECRET_ID: מזהה הסוד שהוגדר ב-Secret Manager כשיוצרים את הסוד.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • VERSION_NUMBER: מספר הגרסה של מזהה הסוד.
  5. קוראים לפונקציה ליצירת מודל כדי לרשום את נקודת הקצה של מודל text-embedding-ada-002:

    CALL
      google_ml.create_model(
        model_id => 'MODEL_ID',
        model_provider => 'open_ai',
        model_type => 'text_embedding',
        model_qualified_name => 'text-embedding-ada-002',
        model_auth_type => 'secret_manager',
        model_auth_id => 'SECRET_ID');
    

    מחליפים את מה שכתוב בשדות הבאים:

    • MODEL_ID: מזהה ייחודי של נקודת הקצה של המודל שאתם מגדירים. מזהה המודל הזה משמש כהפניה למטא-נתונים שנקודת הקצה של המודל צריכה כדי ליצור הטמעות או להפעיל תחזיות.
    • SECRET_ID: מזהה הסוד שבו השתמשתם קודם בהליך google_ml.create_sm_secret().

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

מודל להטמעת טקסט באירוח מותאם אישית

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

בדוגמה הבאה מוסיפים את נקודת הקצה של המודל המותאם אישית custom-embedding-model שמארח Cymbal. הפונקציות cymbal_text_input_transform ו-cymbal_text_output_transform משמשות לשינוי פורמט הקלט והפלט של המודל לפורמט הקלט והפלט של פונקציית החיזוי.

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

  1. מתחברים למסד הנתונים באמצעות psql.

  2. הגדרת התוסף google_ml_integration

  3. אופציונלי: מוסיפים את מפתח ה-API כסוד ל-Secret Manager לצורך אימות.

  4. קוראים לסוד שמאוחסן ב-Secret Manager:

    CALL
      google_ml.create_sm_secret(
        secret_id => 'SECRET_ID',
        secret_path => 'projects/project-id/secrets/SECRET_MANAGER_SECRET_ID/versions/VERSION_NUMBER');
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SECRET_ID: מזהה הסוד שהגדרתם ומשמש בהמשך לרישום של נקודת קצה של מודל, לדוגמה key1.
    • SECRET_MANAGER_SECRET_ID: מזהה הסוד שהוגדר ב-Secret Manager כשיוצרים את הסוד.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • VERSION_NUMBER: מספר הגרסה של מזהה הסוד.
  5. יוצרים את פונקציות ההמרה של הקלט והפלט על סמך החתימה הבאה של פונקציית החיזוי עבור נקודות קצה של מודלים להטמעת טקסט. מידע נוסף על יצירת פונקציות טרנספורמציה זמין במאמר דוגמה לפונקציות טרנספורמציה.

    אלה דוגמאות לפונקציות טרנספורמציה שספציפיות לנקודת הקצה של מודל הטמעת הטקסט custom-embedding-model:

    -- Input Transform Function corresponding to the custom model endpoint
    CREATE OR REPLACE FUNCTION cymbal_text_input_transform(model_id VARCHAR(100), input_text TEXT)
    RETURNS JSON
    LANGUAGE plpgsql
    AS $$
    DECLARE
      transformed_input JSON;
      model_qualified_name TEXT;
    BEGIN
      SELECT json_build_object('prompt', json_build_array(input_text))::JSON INTO transformed_input;
      RETURN transformed_input;
    END;
    $$;
    -- Output Transform Function corresponding to the custom model endpoint
    CREATE OR REPLACE FUNCTION cymbal_text_output_transform(model_id VARCHAR(100), response_json JSON)
    RETURNS REAL[]
    LANGUAGE plpgsql
    AS $$
    DECLARE
      transformed_output REAL[];
    BEGIN
      SELECT ARRAY(SELECT json_array_elements_text(response_json->0)) INTO transformed_output;
      RETURN transformed_output;
    END;
    $$;
    
  6. קוראים לפונקציה ליצירת מודל כדי לרשום את נקודת הקצה של מודל ההטמעה המותאם אישית:

    CALL
      google_ml.create_model(
        model_id => 'MODEL_ID',
        model_request_url => 'REQUEST_URL',
        model_provider => 'custom',
        model_type => 'text_embedding',
        model_auth_type => 'secret_manager',
        model_auth_id => 'SECRET_ID',
        model_qualified_name => 'MODEL_QUALIFIED_NAME',
        model_in_transform_fn => 'cymbal_text_input_transform',
        model_out_transform_fn => 'cymbal_text_output_transform');
    

    מחליפים את מה שכתוב בשדות הבאים:

    • MODEL_ID: שדה חובה. מזהה ייחודי לנקודת הקצה של המודל שאתם מגדירים – לדוגמה, custom-embedding-model. מזהה המודל הזה משמש כהפניה למטא-נתונים שנקודת הקצה של המודל צריכה כדי ליצור הטמעות או להפעיל תחזיות.
    • REQUEST_URL: שדה חובה. נקודת הקצה הספציפית למודל כשמוסיפים הטמעת טקסט בהתאמה אישית ונקודות קצה של מודלים גנריים – לדוגמה, https://cymbal.com/models/text/embeddings/v1. מוודאים שאפשר לגשת לנקודת הקצה של המודל דרך כתובת IP פנימית. ניהול נקודות קצה של מודלים לא תומך בכתובות IP ציבוריות.
    • MODEL_QUALIFIED_NAME: חובה אם נקודת הקצה של המודל משתמשת בשם מלא. השם המוגדר במלואו אם לנקודת הקצה של המודל יש כמה גרסאות.
    • SECRET_ID: מזהה הסוד שבו השתמשתם קודם בהליך google_ml.create_sm_secret().

מודל מולטימודאלי עם תמיכה מובנית

אינטגרציה עם Vertex AI והתקנת התוסף

  1. הגדרת גישת משתמשים למודלים של Vertex AI.
  2. מוודאים שהגרסה העדכנית של google_ml_integration מותקנת.
    1. כדי לבדוק את הגרסה המותקנת, מריצים את הפקודה הבאה:

      SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
      extversion 
      ------------
      1.5.2
      (1 row)
    2. אם התוסף לא מותקן או אם הגרסה המותקנת קודמת לגרסה 1.5.2, צריך לעדכן את התוסף.

      CREATE EXTENSION IF NOT EXISTS google_ml_integration;
      ALTER EXTENSION google_ml_integration UPDATE;

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

  3. כדי להשתמש בפונקציונליות של מנוע השאילתות של AlloyDB AI, מגדירים את הדגל google_ml_integration.enable_ai_query_engine לערך on.

    SQL

    1. הפעלת מנוע השאילתות מבוסס-AI בסשן הנוכחי.
      SET google_ml_integration.enable_ai_query_engine = on;
    2. הפעלה של תכונות למסד נתונים ספציפי בסשנים שונים.
      ALTER DATABASE DATABASE_NAME SET google_ml_integration.enable_ai_query_engine = 'on';
    3. הפעלת מנוע השאילתות מבוסס ה-AI למשתמש ספציפי בסשנים ובמסדי נתונים.
      ALTER ROLE postgres SET google_ml_integration.enable_ai_query_engine = 'on';

    המסוף

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

    gcloud

    כדי להשתמש ב-CLI של gcloud, אפשר להתקין ולהפעיל את Google Cloud CLI, או להשתמש ב-Cloud Shell.

    אפשר לשנות את הערך של הדגל google_ml_integration.enable_ai_query_engine. מידע נוסף זמין במאמר הגדרת דגלים של מסד נתונים במופע.

    gcloud alloydb instances update INSTANCE_ID \
      --database-flags google_ml_integration.enable_ai_query_engine=on \
      --region=REGION_ID \
      --cluster=CLUSTER_ID \
      --project=PROJECT_ID

קריאה למודל כדי ליצור הטמעות מולטימודאליות

ניהול נקודות קצה של מודלים מספק תמיכה מובנית במודל multimodalembedding@001 של Vertex AI, כך שאפשר להפעיל את המודל ישירות כדי ליצור הטמעות מולטימודאליות.

בדוגמה הבאה השתמשנו בשם המודל המלא multimodalembedding@001 כמזהה המודל כדי ליצור הטמעות של תמונות מולטי-מודאליות:

  1. מתחברים למסד הנתונים באמצעות psql.
  2. הגדרת התוסף google_ml_integration
  3. יצירת הטבעות של תמונות מולטי-מודאליות:

    SELECT
      ai.image_embedding(
        model_id => 'multimodalembedding@001',
        image => 'IMAGE_PATH_OR_TEXT',
        mimetype => 'MIMETYPE');
    

מחליפים את מה שכתוב בשדות הבאים:

  • IMAGE_PATH_OR_TEXT עם נתיב Cloud Storage לתמונה, לדוגמה – gs://cymbal_user_data/image-85097193-cd9788aacebb.jpeg ל-gs://cymbal_user_data/image-85097193-cd9788aacebb.jpeg כדי לתרגם להטמעה וקטורית או למחרוזת Base64 של התמונה.
  • MIMETYPE עם סוג ה-MIME של התמונה.

מודלים לדירוג

מודלים לדירוג ב-Vertex AI

אתם יכולים להשתמש במודלים של Vertex AI שמוזכרים במאמר מודלים נתמכים בלי להירשם.

כדי ללמוד איך לדרג את תוצאות החיפוש באמצעות מודל דירוג של Vertex AI, אפשר לעיין במאמר בנושא דירוג תוצאות החיפוש.

רישום של מודל דירוג של צד שלישי

בדוגמה הבאה אפשר לראות איך רושמים מודל לדירוג מחדש של Cohere.

CREATE OR REPLACE FUNCTION cohere_rerank_input_transform(
    model_id VARCHAR(100),
    search_string TEXT,
    documents TEXT[],
    top_n INT DEFAULT NULL
)
RETURNS JSON
LANGUAGE plpgsql
AS $$
#variable_conflict use_variable
DECLARE
  transformed_input JSONB;
BEGIN
  -- Basic Input Validation
  IF search_string IS NULL OR search_string = '' THEN
    RAISE EXCEPTION 'Invalid input: search_string cannot be NULL or empty.';
  END IF;

  IF documents IS NULL OR array_length(documents, 1) IS NULL OR array_length(documents, 1) = 0 THEN
    RAISE EXCEPTION 'Invalid input: documents array cannot be NULL or empty.';
  END IF;

  IF top_n IS NOT NULL AND top_n < 0 THEN
    RAISE EXCEPTION 'Invalid input: top_n must be greater than or equal to zero. Provided value: %', top_n;
  END IF;

  -- Construct the base JSON payload for Cohere Rerank API
  transformed_input := jsonb_build_object(
    'model', google_ml.model_qualified_name_of(model_id),
    'query', search_string,
    'documents', to_jsonb(documents), -- Convert TEXT[] directly to JSON array
    'return_documents', false -- Explicitly set to false (optional, as its default)
  );

  -- Add top_n to the payload only if it's provided and valid
  IF top_n IS NOT NULL THEN
     transformed_input := transformed_input || jsonb_build_object('top_n', top_n);
  END IF;

  -- Return the final JSON payload
  RETURN transformed_input::JSON;

END;
$$;

CREATE OR REPLACE FUNCTION cohere_rerank_output_transform(
    model_id VARCHAR(100),
    response_json JSON
)
RETURNS TABLE (index INT, score REAL)
LANGUAGE plpgsql
AS $$
DECLARE
  result_item JSONB;
  response_jsonb JSONB;
  cohere_index INT; -- 0-based index from Cohere response
BEGIN
  -- Validate response_json
  IF response_json IS NULL THEN
    RAISE EXCEPTION 'Invalid model response: response cannot be NULL.';
  END IF;

  -- Convert JSON to JSONB for easier processing
  response_jsonb := response_json::JSONB;

  -- Check top-level structure
  IF jsonb_typeof(response_jsonb) != 'object' THEN
    RAISE EXCEPTION 'Invalid model response: response must be a JSON object. Found: %', jsonb_typeof(response_jsonb);
  END IF;

  -- Check for the 'results' array
  IF response_jsonb->'results' IS NULL OR jsonb_typeof(response_jsonb->'results') != 'array' THEN
    -- Check for potential Cohere error structure
    IF response_jsonb->'message' IS NOT NULL THEN
       RAISE EXCEPTION 'Cohere API Error: %', response_jsonb->>'message';
    ELSE
       RAISE EXCEPTION 'Invalid model response: response does not contain a valid "results" array.';
    END IF;
  END IF;

  -- Loop through the 'results' array (JSONB array indices are 0-based)
  FOR i IN 0..jsonb_array_length(response_jsonb->'results') - 1 LOOP
    result_item := response_jsonb->'results'->i;

    -- Validate individual result item structure
    IF result_item IS NULL OR jsonb_typeof(result_item) != 'object' THEN
      RAISE WARNING 'Skipping invalid result item at array index %.', i;
      CONTINUE;
    END IF;

    IF result_item->'index' IS NULL OR jsonb_typeof(result_item->'index') != 'number' THEN
       RAISE WARNING 'Missing or invalid "index" field in result item at array index %.', i;
       CONTINUE;
    END IF;

    IF result_item->'relevance_score' IS NULL OR jsonb_typeof(result_item->'relevance_score') != 'number' THEN
       RAISE WARNING 'Missing or invalid "relevance_score" field in result item at array index %.', i;
       CONTINUE;
    END IF;

    -- Extract values
    BEGIN
      cohere_index := (result_item->>'index')::INT;
      -- Assign values to the output table columns
      -- Cohere returns 0-based index, map it to 1-based for consistency
      -- with input document array position
      index := cohere_index + 1;
      score := (result_item->>'relevance_score')::REAL;
      RETURN NEXT; -- Return the current row
    EXCEPTION WHEN others THEN
      RAISE WARNING 'Error processing result item at array index %: %', i, SQLERRM;
      CONTINUE; -- Skip this item and continue with the next
    END;
  END LOOP;

  RETURN; -- End of function
END;
$$;

CALL
  google_ml.create_sm_secret(
    '<SECRET_ID>',
    'projects/<PROJECT_NUMBER>/secrets/<SECRET_ID>/versions/latest');

CALL
  google_ml.create_model(
    model_id => 'cohere-reranker',
    model_type => 'reranking',
    model_provider => 'custom',
    model_request_url => 'https://api.cohere.com/v2/rerank',
    model_qualified_name => 'rerank-v3.5',
    model_auth_type => 'secret_manager',
    model_auth_id => '<SECRET_ID>',
    model_in_transform_fn => 'cohere_rerank_input_transform',
    model_out_transform_fn => 'cohere_rerank_output_transform'
  );

מודלים גנריים

בקטע הזה מוסבר איך לרשום כל נקודת קצה של מודל גנרי שזמינה אצל ספק של מודלים מתארחים, כמו Hugging Face, ‏ OpenAI, ‏ Vertex AI, ‏ Anthropic או כל ספק אחר. בקטע הזה מוצגות דוגמאות לרישום של נקודת קצה של מודל כללי שמתארח ב-Hugging Face, מודל כללי של gemini-pro מ-Vertex AI Model Garden ונקודת הקצה של מודל claude-haiku.

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

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

מודלים גנריים של Gemini

בקטע הזה מוסבר איך לרשום מודלים גנריים של Gemini.

מודל Gemini-1.5-Pro

חלק ממודלי gemini-pro רשומים מראש, כך שאפשר להתקשר ישירות למזהה המודל כדי להפעיל תחזיות.

בדוגמה הבאה נעשה שימוש בנקודת הקצה של מודל gemini-1.5-pro:generateContent מ-Vertex AI Model Garden.

  1. מתחברים למסד הנתונים באמצעות psql.
  2. הגדרת התוסף google_ml_integration
  3. מפעילים חיזויים באמצעות מזהה המודל שנרשם מראש:

    SELECT
        json_array_elements(
        google_ml.predict_row(
            model_id => 'gemini-1.5-pro:generateContent',
            request_body => '{
        "contents": [
            {
                "role": "user",
                "parts": [
                    {
                        "text": "For TPCH database schema as mentioned here https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf , generate a SQL query to find all supplier names which are located in the India nation."
                    }
                ]
            }
        ]
        }'))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text';
    

מודל כללי ב-Hugging Face

בדוגמה הבאה מוסיפים את נקודת הקצה של מודל הסיווג המותאם אישית facebook/bart-large-mnli שמתארח ב-Hugging Face.

  1. מתחברים למסד הנתונים באמצעות psql.
  2. הגדרת התוסף google_ml_integration
  3. מוסיפים את מפתח OpenAI API כסוד ל-Secret Manager לצורך אימות. אם כבר יצרתם סוד למודל אחר של OpenAI, אתם יכולים להשתמש באותו סוד.
  4. קוראים לסוד שמאוחסן ב-Secret Manager:

    CALL
      google_ml.create_sm_secret(
        secret_id => 'SECRET_ID',
        secret_path => 'projects/project-id/secrets/SECRET_MANAGER_SECRET_ID/versions/VERSION_NUMBER');
    

    מחליפים את מה שכתוב בשדות הבאים:

    • SECRET_ID: מזהה הסוד שהגדרתם ומשמש בהמשך כשרושמים נקודת קצה של מודל.
    • SECRET_MANAGER_SECRET_ID: מזהה הסוד שהוגדר ב-Secret Manager כשיוצרים את הסוד.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • VERSION_NUMBER: מספר הגרסה של מזהה הסוד.
  5. קוראים לפונקציה ליצירת מודל כדי לרשום את נקודת הקצה של מודל facebook/bart-large-mnli:

    CALL
      google_ml.create_model(
        model_id => 'MODEL_ID',
        model_provider => 'hugging_face',
        model_request_url => 'REQUEST_URL',
        model_qualified_name => 'MODEL_QUALIFIED_NAME',
        model_auth_type => 'secret_manager',
        model_auth_id => 'SECRET_ID');
    

    מחליפים את מה שכתוב בשדות הבאים:

    • MODEL_ID: מזהה ייחודי לנקודת הקצה של המודל שאתם מגדירים, לדוגמה: custom-classification-model. מזהה המודל הזה משמש כהפניה למטא-נתונים שנקודת הקצה של המודל צריכה כדי ליצור הטמעות או להפעיל תחזיות.
    • REQUEST_URL: נקודת הקצה הספציפית למודל כשמוסיפים הטמעת טקסט בהתאמה אישית ונקודות קצה של מודלים גנריים, לדוגמה https://api-inference.huggingface.co/models/facebook/bart-large-mnli.
    • MODEL_QUALIFIED_NAME: השם המוגדר במלואו של נקודת הקצה של גרסת המודל, לדוגמה facebook/bart-large-mnli.
    • SECRET_ID: מזהה הסוד שבו השתמשתם קודם בהליך google_ml.create_sm_secret().

מודל כללי של Anthropic

בדוגמה הבאה מוסיפים את נקודת הקצה של מודל claude-3-opus-20240229. ניהול נקודות קצה של מודלים מספק את פונקציית הכותרת שנדרשת לרישום מודלים של Anthropic.

  1. מתחברים למסד הנתונים באמצעות psql.
  2. יוצרים ומפעילים את התוסף google_ml_integration.

    Secret Manager

    1. מוסיפים את טוקן ה-Bearer כסוד ל-Secret Manager לצורך אימות.
    2. קוראים לסוד שמאוחסן ב-Secret Manager:

      CALL
        google_ml.create_sm_secret(
          secret_id => 'SECRET_ID',
          secret_path => 'projects/PROJECT_ID/secrets/SECRET_MANAGER_SECRET_ID/versions/VERSION_NUMBER');
      

      מחליפים את מה שכתוב בשדות הבאים:

      • SECRET_ID: מזהה הסוד שהגדרתם ומשמש בהמשך כשרושמים נקודת קצה של מודל.
      • SECRET_MANAGER_SECRET_ID: מזהה הסוד שהוגדר ב-Secret Manager כשיוצרים את הסוד.
      • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
      • VERSION_NUMBER: מספר הגרסה של מזהה הסוד.
    3. קוראים לפונקציה ליצירת מודל כדי לרשום את נקודת הקצה של מודל claude-3-opus-20240229.

      CALL
        google_ml.create_model(
          model_id => 'MODEL_ID',
          model_provider => 'anthropic',
          model_request_url => 'REQUEST_URL',
          model_auth_type => 'secret_manager',
          model_auth_id => 'SECRET_ID',
          generate_headers_fn => 'google_ml.anthropic_claude_header_gen_fn');
      

      מחליפים את מה שכתוב בשדות הבאים:

      • MODEL_ID: מזהה ייחודי לנקודת הקצה של המודל שאתם מגדירים, לדוגמה: anthropic-opus. מזהה המודל הזה משמש כהפניה למטא-נתונים שנקודת הקצה של המודל צריכה כדי ליצור הטמעות או להפעיל תחזיות.
      • REQUEST_URL: נקודת הקצה הספציפית למודל כשמוסיפים הטמעת טקסט בהתאמה אישית ונקודות קצה של מודלים גנריים, לדוגמה https://api.anthropic.com/v1/messages.

    כותרת אימות

    1. משתמשים בפונקציה google_ml.anthropic_claude_header_gen_fn ליצירת כותרות שמוגדרת כברירת מחדל או יוצרים פונקציה ליצירת כותרות.

        CREATE OR REPLACE FUNCTION anthropic_sample_header_gen_fn(model_id VARCHAR(100), request_body JSON)
        RETURNS JSON
        LANGUAGE plpgsql
        AS $$
        #variable_conflict use_variable
        BEGIN
              RETURN json_build_object('x-api-key', 'ANTHROPIC_API_KEY', 'anthropic-version', 'ANTHROPIC_VERSION')::JSON;
        END;
        $$;
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ANTHROPIC_API_KEY: מפתח ה-API של Anthropic.
      • ANTHROPIC_VERSION (אופציונלי): גרסת המודל הספציפית שרוצים להשתמש בה – לדוגמה, 2023-06-01.
    2. קוראים לפונקציה ליצירת מודל כדי לרשום את נקודת הקצה של מודל claude-3-opus-20240229.

      CALL
        google_ml.create_model(
          model_id => 'MODEL_ID',
          model_provider => 'anthropic',
          model_request_url => 'REQUEST_URL',
          generate_headers_fn => 'google_ml.anthropic_claude_header_gen_fn');
      

      מחליפים את מה שכתוב בשדות הבאים:

      • MODEL_ID: מזהה ייחודי לנקודת הקצה של המודל שאתם מגדירים, לדוגמה: anthropic-opus. מזהה המודל הזה משמש כהפניה למטא-נתונים שנקודת הקצה של המודל צריכה כדי ליצור הטמעות או להפעיל תחזיות.
      • REQUEST_URL: נקודת הקצה הספציפית למודל כשמוסיפים הטמעת טקסט בהתאמה אישית ונקודות קצה של מודלים גנריים, לדוגמה https://api.anthropic.com/v1/messages.

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

מודלים של תחזיות

בנוסף למודלים גנריים, אפשר לרשום מודלים לחיזוי מ-Vertex AI Model Garden.

חיזוי של סדרות זמנים באמצעות מודל TimesFM

תרחיש נפוץ לשימוש במודלים ספציפיים למשימות הוא ביצוע חיזוי של סדרת זמנים באמצעות מודל TimesFM.

כדי לפרוס ולרשום את המודל הזה:

  1. פורסים את מודל TimesFM מ-Model Garden לנקודת קצה של Vertex AI כדי לקבל כתובת URL לבקשת מודל שנגישה לכולם. מידע נוסף זמין במאמר פריסת מודלים מ-Model Garden לנקודת קצה של Vertex AI.

  2. כדי לרשום את מודל TimesFM שנפרס ב-AlloyDB ל-PostgreSQL, משתמשים בפונקציה google_ml.create_model. כדי ליצור תחזית של סדרת זמן, הערך של model_type צריך להיות ts_forecasting:

CALL
google_ml.create_model(
  model_id => 'vertex_timesfm',
  model_qualified_name => 'timesfm_v2',
  model_type => 'ts_forecasting',
  model_provider => 'google',
  model_request_url => 'https://REGION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/endpoints/ENDPOINT_ID:predict',
  model_auth_type => 'alloydb_service_agent_iam'
);

אחרי שרושמים את המודל, אפשר להשתמש בפונקציה ai.forecast() או בפונקציה google_ml.forecast() כדי ליצור תחזיות.

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