Utilizzare Pinecone con RAG Engine

Questa pagina mostra come connettere il corpus RAG al database Pinecone.

Puoi anche seguire i passaggi utilizzando questo notebook RAG Engine con Pinecone.

Puoi utilizzare l'istanza del database Pinecone con RAG Engine per indicizzare ed eseguire una ricerca di somiglianza basata su vettori. Una ricerca di somiglianze è un modo per trovare parti di testo simili al testo che stai cercando, il che richiede l'utilizzo di un modello di embedding. Il modello di embedding produce dati vettoriali per ogni parte di testo confrontata. La ricerca per somiglianza viene utilizzata per recuperare i contesti semantici per il grounding, in modo da restituire i contenuti più accurati dal tuo LLM.

Con RAG Engine, puoi continuare a utilizzare l'istanza del database vettoriale completamente gestita, di cui sei responsabile del provisioning. RAG Engine utilizza il tuo database vettoriale per l'archiviazione, la gestione degli indici e la ricerca.

Valuta se utilizzare Pinecone con RAG Engine

Valuta se l'utilizzo del database Pinecone è la scelta migliore per la tua applicazione RAG esaminando quanto segue:

  • Devi creare, configurare e gestire lo scale up e lo scale down dell'istanza del database Pinecone.

  • Il motore RAG utilizza lo spazio dei nomi predefinito nell'indice. Assicurati che questo spazio dei nomi non sia modificabile da altri elementi.

  • Devi fornire una chiave API Pinecone, che consente a RAG Engine di interagire con il database Pinecone. RAG Engine non archivia e non gestisce la tua chiave API Pinecone. Devi invece procedere come segue:

    • Archivia la chiave in Google Cloud Secret Manager.
    • Concedi al account di servizio del tuo progetto le autorizzazioni per accedere al secret.
    • Fornisci a RAG Engine l'accesso al nome della risorsa del secret.
    • Quando interagisci con il tuo corpus RAG, il motore RAG accede alla risorsa secret utilizzando il tuo account di servizio.

    • Il corpus RAG e l'indice Pinecone hanno una mappatura uno a uno. Questa associazione viene effettuata nell'ambito del metodo ragCorpora.create o del metodo ragCorpora.patch.

Crea l'indice Pinecone

Per creare l'indice Pinecone, devi seguire questi passaggi:

  1. Consulta la guida rapida di Pinecone per ottenere le configurazioni dell'indice che devono essere specificate nell'indice per renderlo compatibile con il corpus RAG.

  2. Assicurati che la località dell'indice Pinecone sia la stessa o vicina a quella in cui utilizzi il motore RAG per i seguenti motivi:

    • Vuoi mantenere latenze ridotte.
    • Vuoi soddisfare i requisiti di residenza dei dati stabiliti dalle leggi vigenti.
  3. Durante la creazione dell'indice Pinecone, specifica la dimensione dell'embedding da utilizzare con il motore RAG. Questa tabella fornisce le dimensioni o la posizione delle dimensioni:

    Modello Dimensioni
    Gecko proprietario 768
    Gecko proprietario ottimizzato 768
    E5 Consulta Utilizza i modelli di embedding OSS.
  4. Scegli una delle seguenti metriche di distanza supportate:

    • cosine
    • dotproduct
    • euclidean
  5. (Facoltativo) Quando crei un indice basato su pod, devi specificare file_id nel campo pod.metadata_config.indexed. Per saperne di più, consulta Indicizzazione selettiva dei metadati.

Crea la tua chiave API Pinecone

RAG Engine può connettersi all'indice Pinecone solo utilizzando la chiave API per l'autenticazione e l'autorizzazione. Per configurare l'autenticazione basata su chiave API nel tuo progetto Pinecone, devi seguire la guida ufficiale di Pinecone per l'autenticazione.

Archivia la chiave API in Secret Manager

Una chiave API contiene informazioni sensibili che consentono l'identificazione personale (SPII), soggette a requisiti legali. Se i dati SPII vengono compromessi o utilizzati in modo improprio, un individuo potrebbe subire un rischio o un danno significativo. Per ridurre al minimo i rischi per un individuo durante l'utilizzo di RAG Engine, non archiviare e gestire la chiave API ed evita di condividere la chiave API non criptata.

Per proteggere le SPII, devi:

  1. Archivia la chiave API in Secret Manager.

  2. Concedi al tuo account di servizio RAG Engine le autorizzazioni per i tuoi secret e gestisci il controllo dell'accesso a livello di risorsa secret.

    1. Vai alle autorizzazioni del progetto.

    2. Attiva l'opzione Includi concessioni di ruoli fornite da Google.

    3. Trova il account di servizio, che ha il seguente formato:

      service-{project number}@gcp-sa-vertex-rag.iam.gserviceaccount.com

    4. Modifica le entità del account di servizio.

    5. Aggiungi il ruolo Secret Manager Secret Accessor al service account.

  3. Durante la creazione o l'aggiornamento del corpus RAG, passa il nome della risorsa secret al motore RAG e memorizzalo.

Quando effettua richieste API ai tuoi indici Pinecone, RAG Engine utilizza ogni account di servizio per leggere la chiave API corrispondente alle tue risorse secret in Secret Manager dai tuoi progetti.

Esegui il provisioning del account di servizio RAG Engine

Quando crei il primo corpus RAG nel tuo progetto, RAG Engine crea un account di servizio dedicato. Puoi trovare il tuo account di servizio nella pagina Identity and Access Management del tuo progetto.

Il account di servizio segue questo formato fisso:

service-{project number}@gcp-sa-vertex-rag.iam.gserviceaccount.com

Ad esempio,

service-123456789@gcp-sa-vertex-rag.iam.gserviceaccount.com

Prepara il corpus RAG

Per utilizzare l'indice Pinecone con RAG Engine, devi associarlo a un corpus RAG durante la fase di creazione. Una volta effettuata l'associazione, questa associazione è permanente per tutta la durata del corpus RAG. L'associazione può essere eseguita utilizzando l'API CreateRagCorpus o l'API UpdateRagCorpus.

Affinché l'associazione sia considerata completa, devi impostare tre campi chiave nel corpus RAG:

  • rag_vector_db_config.pinecone: questo campo ti consente di impostare la scelta di un database vettoriale che vuoi associare al tuo corpus RAG e deve essere impostato durante la chiamata API CreateRagCorpus. Se non è impostata, al tuo corpus RAG viene assegnata la scelta predefinita del database vettoriale RagManagedDb.

  • rag_vector_db_config.pinecone.index_name: questo è il nome utilizzato per creare l'indice Pinecone utilizzato con il corpus RAG. Puoi impostare il nome durante la chiamata CreateRagCorpus o specificarlo quando chiami l'API UpdateRagCorpus.

  • rag_vector_db_config.api_auth.api_key_config.api_key_secret_version: questo è il nome completo della risorsa del secret archiviato in Secret Manager, che contiene la tua chiave API Pinecone. Puoi impostare il nome durante la chiamata CreateRagCorpus oppure puoi specificarlo quando chiami l'API UpdateRagCorpus. Finché non specifichi questo campo, non puoi importare dati nel corpus RAG.

    Questo campo deve avere il seguente formato:

    projects/{PROJECT_NUMBER}/secrets/{SECRET_ID}/versions/{VERSION_ID}

Crea il tuo corpus RAG

Se hai accesso al nome dell'indice Pinecone e al nome della risorsa secret con il set di autorizzazioni, puoi creare il corpus RAG e associarlo all'indice Pinecone, come mostrato in questo codice campione.

Quando crei un corpus RAG per la prima volta, non avrai a disposizione i dati del service account. Tuttavia, i campi sono facoltativi e possono essere associati al corpus RAG utilizzando l'API UpdateRagCorpus.

Per un esempio di come creare il corpus RAG senza fornire le informazioni del service account, consulta Crea un corpus RAG senza un nome indice o una chiave API.

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Agent Platform per l'utilizzo delle librerie client.

Per eseguire l'autenticazione in Agent Platform, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configura l'autenticazione per un ambiente di sviluppo locale.


import agentplatform
from agentplatform import types

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# pinecone_index_name = "pinecone-index-name"
# display_name = "test_corpus"
# description = "Corpus Description"

# Initialize Agent Platform client once per session.
# See https://docs.cloud.google.com/gemini-enterprise-agent-platform/build/rag-engine/rag-overview#supported-regions
client = agentplatform.Client(project=PROJECT_ID, location="us-east5")

# Configure embedding model (Optional)
embedding_model_config = types.RagEmbeddingModelConfig(
    vertex_prediction_endpoint=types.RagEmbeddingModelConfigVertexPredictionEndpoint(
        endpoint="publishers/google/models/text-embedding-005"
    )
)

# Configure Vector DB
vector_db = types.RagVectorDbConfig(
    pinecone=types.RagVectorDbConfigPinecone(
        index_name=pinecone_index_name,
    ),
    api_auth=types.ApiAuth(
        api_key_config=types.ApiAuthApiKeyConfig(
            api_key_secret_version=pinecone_api_key_secret_manager_version
        )
    ),
    rag_embedding_model_config=embedding_model_config,
)

corpus = client.rag.create_corpus(
    rag_corpus=types.RagCorpus(
        display_name=display_name,
        description=description,
        rag_vector_db_config=vector_db,
    )
)
print(corpus)
# Example response:
# RagCorpus(name='projects/1234567890/locations/us-central1/ragCorpora/1234567890',
# display_name='test_corpus', description='Corpus Description', embedding_model_config=...
# ...

REST

   # Set your project ID under which you want to create the corpus
   PROJECT_ID = "YOUR_PROJECT_ID"

   # Choose a display name for your corpus
   CORPUS_DISPLAY_NAME=YOUR_CORPUS_DISPLAY_NAME

   # Set your Pinecone index name
   PINECONE_INDEX_NAME=YOUR_INDEX_NAME

   # Set the full resource name of your secret. Follows the format
   # projects/{PROJECT_NUMER}/secrets/{SECRET_ID}/versions/{VERSION_ID}
   SECRET_RESOURCE_NAME=YOUR_SECRET_RESOURCE_NAME

   # Call CreateRagCorpus API with all the Vector DB information.
   # You can also add the embedding model choice or set other RAG corpus parameters on
   # this call per your choice.
   curl -X POST \
   -H "Authorization: Bearer $(gcloud auth print-access-token)" \
   -H "Content-Type: application/json" \
   https://us-central1-aiplatform.googleapis.com}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora -d '{
         "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
         "rag_vector_db_config" : {
            "pinecone": {"index_name": '\""${PINECONE_INDEX_NAME}"\"'},
            "api_auth": {"api_key_config":
                  {"api_key_secret_version": '\""${SECRET_RESOURCE_NAME}"\"'}
            }
         }
      }'

   # To poll the status of your RAG corpus creation, get the operation_id returned in
   # response of your CreateRagCorpus call.
   OPERATION_ID="YOUR_OPERATION_ID"

   # Poll Operation status until done = true in the response.
   # The response to this call will contain the ID for your created RAG corpus
   curl -X GET \
   -H "Authorization: Bearer $(gcloud auth print-access-token)" \
   -H "Content-Type: application/json" \
   https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/operations/${OPERATION_ID}

Crea un corpus RAG senza un nome indice o una chiave API

Se questo è il tuo primo corpus RAG e non hai accesso ai dettagli del tuo service account o non hai completato i passaggi di provisioning per l'indice Pinecone, puoi comunque creare il corpus RAG. Puoi quindi associare il corpus RAG a una configurazione Pinecone vuota e aggiungere i dettagli in un secondo momento.

È necessario tenere conto di quanto segue:

  • Se non fornisci il nome dell'indice e il nome del secret della chiave API, i file non possono essere importati nel corpus RAG.

  • Se scegli Pinecone come database vettoriale per il corpus RAG, non potrai passare a un altro database in un secondo momento.

Questo esempio di codice mostra come creare un corpus RAG con Pinecone senza fornire un nome dell'indice Pinecone o un nome dell'API secret. Utilizza l'API UpdateRagCorpus per specificare in un secondo momento le informazioni mancanti.

Python

import vertexai
from vertexai.preview import rag

# Set Project
PROJECT_ID = "YOUR_PROJECT_ID"
vertexai.init(project=PROJECT_ID, location="us-central1")

# Configure the Pinecone vector DB information
vector_db = rag.Pinecone()

# Name your corpus
DISPLAY_NAME = "YOUR_CORPUS_NAME"

rag_corpus = rag.create_corpus(display_name=DISPLAY_NAME, vector_db=vector_db)

REST

# Set your project ID under which you want to create the corpus
PROJECT_ID = "YOUR_PROJECT_ID"

# Choose a display name for your corpus
CORPUS_DISPLAY_NAME=YOUR_CORPUS_DISPLAY_NAME

# Call CreateRagCorpus API with all the Vector DB information.
# You can also add the embedding model choice or set other RAG corpus parameters on
# this call per your choice.
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora -d '{
      "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
      "rag_vector_db_config" : {
         "pinecone": {}
      }
   }'

# To poll the status of your RAG corpus creation, get the operation_id returned in
# response of your CreateRagCorpus call.
OPERATION_ID="YOUR_OPERATION_ID"

# Poll Operation status until done = true in the response.
# The response to this call will contain the ID for your created RAG corpus
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/operations/${OPERATION_ID}

Aggiorna il corpus RAG

L'API UpdateRagCorpus consente di aggiornare la configurazione del database vettoriale. Se il nome dell'indice Pinecone e la versione del secret della chiave API non sono stati impostati in precedenza, puoi utilizzare l'API Pinecone per aggiornare i campi. La scelta di un database vettoriale non può essere aggiornata. La specifica del secret della chiave API è facoltativa. Tuttavia, se non specifichi il secret della chiave API, puoi importare i dati nel corpus RAG.

Campo Mutabilità Obbligatorio o facoltativo
rag_vector_db_config.vector_db Immutabile dopo aver effettuato una scelta. Obbligatorio
rag_vector_db_config.pinecone.index_name Immutabile dopo aver impostato il campo nel corpus RAG. Obbligatorio
rag_vector_db_config.api_auth.api_key_config.api_key_secret_version Modificabile. Dopo aver impostato la chiave API, non puoi eliminarla. Facoltativo

Python

import vertexai
from vertexai.preview import rag

# Set Project
PROJECT_ID = "YOUR_PROJECT_ID"
vertexai.init(project=PROJECT_ID, location="us-central1")

# Configure the Pinecone vector DB information
vector_db = rag.Pinecone(index_name=)

# Name your corpus
DISPLAY_NAME = "YOUR_CORPUS_NAME"

rag_corpus = rag.create_corpus(display_name=DISPLAY_NAME, vector_db=vector_db)

REST

# Set your project ID for the corpus that you want to create.
PROJECT_ID = "YOUR_PROJECT_ID"

# Set your Pinecone index name
PINECONE_INDEX_NAME=YOUR_INDEX_NAME

# Set the full resource name of your secret. Follows the format
# projects/{PROJECT_NUMER}/secrets/{SECRET_ID}/versions/{VERSION_ID}
SECRET_RESOURCE_NAME=YOUR_SECRET_RESOURCE_NAME

# Call UpdateRagCorpus API with the Vector DB information.
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora -d '{
      "rag_vector_db_config" : {
         "pinecone": {"index_name": '\""${PINECONE_INDEX_NAME}"\"'},
         "api_auth": {"api_key_config":
               {"api_key_secret_version": '\""${SECRET_RESOURCE_NAME}"\"'}
         }
      }
   }'

# To poll the status of your RAG corpus creation, get the operation_id returned in
# response of your CreateRagCorpus call.
OPERATION_ID="YOUR_OPERATION_ID"

# Poll Operation status until done = true in the response.
# The response to this call will contain the ID for your created RAG corpus
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/operations/${OPERATION_ID}

Passaggi successivi