Ottenere gli embedding di testo di Vertex AI

Questa pagina descrive come utilizzare l'API Vertex AI text-embeddings per generare, archiviare e aggiornare gli embedding di testo per i dati archiviati in Spanner per i database con dialetto GoogleSQL e PostgreSQL.

Un incorporamento di testo è una rappresentazione vettoriale dei dati di testo e viene utilizzato in molti modi per trovare elementi simili. Interagisci con loro ogni volta che completi una ricerca Google o vedi consigli quando fai acquisti online. Quando crei incorporamenti di testo, ottieni rappresentazioni vettoriali di testo naturale come array di numeri in virgola mobile. Ciò significa che a tutto il testo inserito viene assegnata una rappresentazione numerica. Confrontando la distanza numerica tra le rappresentazioni vettoriali di due testi, un'applicazione può determinare la somiglianza tra il testo o gli oggetti rappresentati dal testo.

Con l'API Vertex AI text-embeddings, puoi creare un text embedding con l'AI generativa. In questo tutorial, utilizzi il modello text-embedding di Vertex AI per generare incorporamenti di testo per i dati archiviati in Spanner.

Per scoprire di più sugli incorporamenti, consulta Recuperare gli incorporamenti di testo.

Obiettivo

In questo tutorial imparerai a:

  • Registra il modello Vertex AI text-embedding in uno schema Spanner utilizzando istruzioni DDL.
  • Fai riferimento al modello registrato utilizzando query SQL per generare embedding dai dati archiviati in Spanner.

Prezzi

Questo tutorial utilizza componenti fatturabili di Google Cloud, tra cui:

  • Spanner
  • Vertex AI

Per ulteriori informazioni sui costi di Spanner, consulta la pagina Prezzi di Spanner.

Per ulteriori informazioni sui costi di Vertex AI, consulta la pagina Prezzi di Vertex AI.

Generare e archiviare incorporamenti di testo

A seconda del modello utilizzato, la generazione degli incorporamenti potrebbe richiedere del tempo. Per i carichi di lavoro più sensibili alle prestazioni, la best practice consiste nell'evitare di generare incorporamenti nelle transazioni di lettura/scrittura. Genera invece gli embedding in una transazione di sola lettura utilizzando i seguenti esempi SQL.

GoogleSQL

Registra un modello di incorporamento di testo in Spanner

In GoogleSQL, devi registrare un modello prima di utilizzarlo con la funzione ML.PREDICT. Per registrare il modello text-embedding in un database Spanner, esegui la seguente istruzione DDL:

CREATE MODEL MODEL_NAME
INPUT(content STRING(MAX))
OUTPUT(
  embeddings
    STRUCT<
      statistics STRUCT<truncated BOOL, token_count FLOAT64>,
      values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/text-embedding$MODEL_VERSION'
);

Sostituisci quanto segue:

  • MODEL_NAME: il nome del modello di incorporamento
  • PROJECT: il progetto che ospita l'endpoint Vertex AI
  • LOCATION: la posizione dell'endpoint Vertex AI
  • MODEL_VERSION: la versione del modello di incorporamento text-embedding

Spanner concede automaticamente le autorizzazioni appropriate. In caso contrario, rivedi il controllo dell'accesso all'endpoint del modello.

Il rilevamento e la convalida dello schema non sono disponibili per i modelli di IA generativa. Devi fornire le clausole INPUT e OUTPUT che corrispondono allo schema dei modelli. Per lo schema completo del modello di incorporamento di testo, consulta Recuperare gli incorporamenti di testo.

Generare incorporamenti di testo

Per generare gli embedding, passa un testo direttamente alla funzione ML.PREDICT utilizzando il seguente SQL:

SELECT embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT "A product description" as content)
);

Per generare embedding per i dati archiviati in una tabella, utilizza il seguente SQL:

SELECT id, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT id, description as content FROM Products)
);

Incorporamenti di testo dello Store

Dopo aver generato gli incorporamenti in una transazione di sola lettura, memorizzali in Spanner in modo che possano essere gestiti con i tuoi dati operativi. Per memorizzare gli incorporamenti, utilizza una transazione di lettura/scrittura.

Per i workload meno sensibili alle prestazioni, puoi generare e inserire incorporamenti con il seguente SQL in una transazione di lettura/scrittura:

CREATE TABLE Products(
  id INT64 NOT NULL,
  description STRING(MAX),
  embeddings ARRAY<FLOAT32>,
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT @Description as content)
);

PostgreSQL

Generare incorporamenti di testo

Per generare gli embedding, passa un testo direttamente alla funzione spanner.ML_PREDICT_ROW utilizzando il seguente SQL:

SELECT
  spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/text-embedding$MODEL_VERSION',
    '{"instances": [{"content": "A product description"}]}'::jsonb
  ) ->'predictions'->0->'embeddings'->'values';

Sostituisci quanto segue:

  • PROJECT: il progetto che ospita l'endpoint Vertex AI
  • LOCATION: la posizione dell'endpoint Vertex AI
  • MODEL_VERSION: la versione del modello di incorporamento text-embedding

Per generare embedding per i dati archiviati in una tabella, utilizza il seguente SQL:

SELECT id, spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/text-embedding$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
  ) -> `predictions`->0->`embeddings`->`values``
FROM Products;

Sostituisci quanto segue:

  • PROJECT: il progetto che ospita l'endpoint Vertex AI
  • LOCATION: la posizione dell'endpoint Vertex AI
  • MODEL_VERSION: la versione del modello di incorporamento text-embedding

Incorporamenti di testo dello Store

Dopo aver generato gli incorporamenti in una transazione di sola lettura, memorizzali in Spanner in modo che possano essere gestiti con i tuoi dati operativi. Per memorizzare gli incorporamenti, utilizza una transazione di lettura/scrittura.

Per i workload meno sensibili alle prestazioni, puoi generare e inserire incorporamenti con il seguente SQL in una transazione di lettura/scrittura:

CREATE TABLE Products (
  id INT8 NOT NULL,
  description TEXT,
  embeddings REAL[],
  PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/text-embedding$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))
  ) -> 'predictions'->0->'embeddings'->'values'
));

Sostituisci quanto segue:

  • PROJECT: il progetto che ospita l'endpoint Vertex AI
  • LOCATION: la posizione dell'endpoint Vertex AI
  • MODEL_VERSION: la versione del modello di incorporamento text-embedding

Aggiornare gli incorporamenti di testo

Per aggiornare gli incorporamenti o importare i dati in tempo reale, utilizza l'istruzione UPDATE (GoogleSQL e PostgreSQL).

Per aggiornare la tabella Products nell'esempio precedente, utilizza il seguente SQL:

GoogleSQL

UPDATE Products
SET
  description = @description,
  embeddings = (SELECT embeddings.values
                  FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
              )
WHERE id = @id;

Sostituisci quanto segue:

  • MODEL_NAME: il nome del modello di incorporamento

PostgreSQL

UPDATE
  Products
SET
  description = $1,
  embeddings = spanner.FLOAT32_ARRAY(
    spanner.ML_PREDICT_ROW(
      'projects/PROJECT/locations/LOCATION/publishers/google/models/text-embedding$MODEL_VERSION',
      JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', $1)))
    ) -> 'predictions'->0->'embeddings'->'values')
WHERE
  id = $2;

Sostituisci quanto segue:

  • PROJECT: il progetto che ospita l'endpoint Vertex AI
  • LOCATION: la posizione dell'endpoint Vertex AI
  • MODEL_VERSION: la versione del modello di incorporamento text-embedding

Passaggi successivi