Utilizza Vertex AI Vector Search con RAG Engine

Questa pagina mostra come connettere il tuo motore RAG a Vertex AI Vector Search.

RAG Engine è un potente strumento che utilizza un database vettoriale integrato da Spanner per archiviare e gestire le rappresentazioni vettoriali del testo documenti. Il database vettoriale consente di recuperare in modo efficiente i documenti pertinenti in base alla somiglianza semantica dei documenti a una determinata query. Integrando Vertex AI Vector Search come database vettoriale aggiuntivo con RAG Engine, puoi utilizzare le funzionalità di Vector Search per gestire volumi di dati con bassa latenza per migliorare le prestazioni e la scalabilità delle tue applicazioni RAG.

Configurazione di Vertex AI Vector Search

Vertex AI Vector Search si basa su Vector Search sviluppata da Google. Con la ricerca vettoriale è possibile utilizzare la stessa infrastruttura alla base dei prodotti Google, come Ricerca Google, YouTube e Google Play.

Per l'integrazione con RAG Engine, viene restituito un indice di Vector Search vuoto obbligatorio.

Configura l'SDK Vertex AI

Per preparare le istanze di Vertex AI Vector Search per l'applicazione RAG:

  1. Per configurare l'SDK Vertex AI, consulta la sezione Configurazione.

  2. Imposta le variabili di ambiente come segue:

    PROJECT_ID=YOUR_PROJECT_ID
    LOCATION=YOUR_LOCATION_ID
    
  3. (Facoltativo) Se utilizzi Vertex AI Workbench, e questo passaggio non è obbligatorio. In caso contrario, per eseguire il notebook, devi eseguire la seguente autenticazione delle celle:

    # If it's Colab runtime, authenticate the user with Google Cloud
    if "google.colab" in sys.modules:
        from google.colab import auth
    
        auth.authenticate_user()
    
  4. Abilita le API inserendo questo comando:

    ! gcloud services enable compute.googleapis.com aiplatform.googleapis.com --project "{PROJECT_ID}"

Inizializza l'SDK aiplatform

Per inizializzare l'SDK aiplatform:

# init the aiplatform package
from google.cloud import aiplatform
aiplatform.init(project=PROJECT_ID, location=LOCATION)

Creare l'indice Vector Search

Per creare un indice di Vector Search compatibile con la tua RAG nel corpus, l'indice deve soddisfare i seguenti criteri:

  1. IndexUpdateMethod deve essere STREAM_UPDATE; consulta Creare stream di lettura dei dati.

  2. Il tipo di misurazione della distanza deve essere impostato esplicitamente su uno dei seguenti valori:

    • DOT_PRODUCT_DISTANCE
    • COSINE_DISTANCE
  3. La dimensione del vettore deve essere coerente con il modello di incorporamento che prevedi da utilizzare nel corpus RAG. Altri parametri possono essere ottimizzati in base scelte, che determinano se i parametri aggiuntivi possono essere ottimizzato.

# create the index
my_index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
    display_name="your-display-name",
    description="your-discription",
    dimensions=768,
    approximate_neighbors_count=10,
    leaf_node_embedding_count=500,
    leaf_nodes_to_search_percent=7,
    distance_measure_type="DOT_PRODUCT_DISTANCE",
    feature_norm_type="UNIT_L2_NORM",
    index_update_method="STREAM_UPDATE",
)

Crea endpoint indice Vector Search

Gli endpoint pubblici sono supportati da RAG Engine.

# create IndexEndpoint
my_index_endpoint = aiplatform.MatchingEngineIndexEndpoint.create(
    display_name="your-display-name", public_endpoint_enabled=True
)

Esegui il deployment di un indice in un endpoint indice

Prima di eseguire la ricerca del vicino più prossimo, l'indice deve essere implementato in un endpoint dell'indice.

DEPLOYED_INDEX_ID="YOUR_DEPLOYED_INDEX_ID"

my_index_endpoint.deploy_index(index=my_index, deployed_index_id=DEPLOYED_INDEX_ID)

Se è la prima volta che esegui il deployment di un indice in un endpoint indice, impiega circa 30 minuti per creare e avviare automaticamente il backend prima di poter archiviare l'indice. Dopo il primo deployment, l'indice è pronto in pochi secondi. Per vedere lo stato del deployment dell'indice, apri la Ricerca vettoriale Google Cloud, seleziona la scheda Endpoint indice e scegli il tuo endpoint indice.

Identifica il nome della risorsa dell'indice e dell'endpoint indice, che hanno i seguenti formati:

  • projects/${PROJECT_ID}/locations/${LOCATION_ID}/indexes/${INDEX_ID}
  • projects/${PROJECT_ID}/locations/${LOCATION_ID}/indexEndpoints/${INDEX_ENDPOINT_ID}.

Se hai dubbi sul nome della risorsa, puoi utilizzare il seguente comando per verificarlo:

print(my_index_endpoint.resource_name)
print(my_index.resource_name)

Utilizzare Vertex AI Vector Search in RAG Engine

Dopo aver configurato l'istanza di Vector Search, segui i passaggi in questa per impostare l'istanza di Vector Search come database vettoriale per l'applicazione RAG.

Imposta il database di vettori per creare un corpus RAG

Quando crei il corpus RAG, specifica solo i valori INDEX_ENDPOINT_NAME e INDEX_NAME. Il corpus RAG viene creato e associato automaticamente Indice di Vector Search. Le convalide vengono eseguite criteri. Se uno dei requisiti non viene soddisfatto, la richiesta viene rifiutata.

Python

CORPUS_DISPLAY_NAME = "YOUR_CORPUS_DISPLAY_NAME"
index_resource_name = my_index.resource_name
endpoint_resource_name = my_index_endpoint.resource_name
vector_db = rag.VertexVectorSearch(index=index_resource_name, index_endpoint=endpoint_resource_name)
rag_corpus = rag.create_corpus(display_name=CORPUS_DISPLAY_NAME, vector_db=vector_db)

REST

// TODO(developer): Update and un-comment the following lines:
// CORPUS_DISPLAY_NAME = "YOUR_CORPUS_DISPLAY_NAME"
// Full index/indexEndpoint resource name
// Index: projects/${PROJECT_ID}/locations/${LOCATION_ID}/indexes/${INDEX_ID}
// IndexEndpoint: projects/${PROJECT_ID}/locations/${LOCATION_ID}/indexEndpoints/${INDEX_ENDPOINT_ID}
// INDEX_RESOURCE_NAME = "YOUR_INDEX_ENDPOINT_RESOURCE_NAME"
// INDEX_NAME = "YOUR_INDEX_RESOURCE_NAME"
// Call CreateRagCorpus API to create a new RagCorpus
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora -d '{
      "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
      "rag_vector_db_config" : {
              "vertex_vector_search": {
                "index":'\""${INDEX_NAME}"\"'
            "index_endpoint":'\""${INDEX_ENDPOINT_NAME}"\"'
              }
        }
  }'

// Call ListRagCorpora API to verify the RagCorpus is created successfully
curl -sS -X GET \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora"

(Facoltativo) Crea un corpus RAG senza informazioni di Vector Search

Per creare un corpus RAG vuoto senza informazioni sulla ricerca vettoriale che puoi aggiornare in un secondo momento, seleziona uno degli esempi di codice:

Python

CORPUS_DISPLAY_NAME = "YOUR_CORPUS_DISPLAY_NAME"
vector_db = rag.VertexVectorSearch()
rag_corpus = rag.create_corpus(display_name=CORPUS_DISPLAY_NAME, vector_db=vector_db)

REST

// TODO(developer): Update and un-comment the following lines:
// Call CreateRagCorpus API to create a new RAG corpus without the Vector Search information.
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora -d '{
      "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
      "rag_vector_db_config" : {
              "vertex_vector_search": {}
        }
  }'

// Call ListRagCorpora API to verify the RagCorpus is created successfully
curl -sS -X GET \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora"

Dopo aver configurato le risorse di ricerca vettoriale, puoi aggiornare il corpus RAG con le informazioni corrispondenti.

Python

index_resource_name = my_index.resource_name
endpoint_resource_name = my_index_endpoint.resource_name
vector_db = rag.VertexVectorSearch(index=index_resource_name, index_endpoint=endpoint_resource_name)
updated_rag_corpus = rag.update_corpus(corpus_name=rag_corpus.name, vector_db=vector_db)

REST

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora -d '{
      "rag_vector_db_config" : {
"vertex_vector_search": {
                "index":'\""${INDEX_NAME}"\"'
                "index_endpoint":'\""${INDEX_ENDPOINT_NAME}"\"'
              }
}
  }'

Importa file utilizzando l'API RAG

Utilizza l'API ImportRagFiles per importare i file da Cloud Storage o Google Drive nell'indice di Ricerca vettoriale. I file sono incorporati archiviati nell'indice di Vector Search.

Python

RAG_CORPUS_RESOURCE = "projects/{PROJECT_ID}/locations/{LOCATION_ID}/ragCorpora/YOUR_RAG_CORPUS_ID"
GS_BUCKET = "YOUR_GS_BUCKET"

response = rag.import_files(
    corpus_name=RAG_CORPUS_RESOURCE,
    paths=[GS_BUCKET],
    chunk_size=512,  # Optional
    chunk_overlap=100,  # Optional
)

REST

// TODO(developer): Update and un-comment the following lines:
// RAG_CORPUS_ID = "YOUR_RAG_CORPUS_ID"
//
// Google Cloud Storage bucket and file location.
// For example, "gs://rag-fos-test/"
// GCS_URIS= "YOUR_GCS_URIS"

// Call ImportRagFiles API to embed files and store in the BigQuery table
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora/${RAG_CORPUS_ID}/ragFiles:import \
-d '{
  "import_rag_files_config": {
    "gcs_source": {
      "uris": '\""${GCS_URIS}"\"'
    },
    "rag_file_chunking_config": {
      "chunk_size": 512
    }
  }
}'

// Call ListRagFiles API to verify that the files are imported successfully
curl -X GET \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora/${RAG_CORPUS_ID}/ragFiles

Recupera i contesti pertinenti utilizzando l'API RAG

Al termine delle importazioni dei file, il contesto pertinente può essere recuperato dall'indice di ricerca vettoriale utilizzando l'API RetrieveContexts.

Python

RAG_CORPUS_RESOURCE = "projects/{PROJECT_ID}/locations/{LOCATION_ID}/ragCorpora/YOUR_RAG_CORPUS_ID"
RETRIEVAL_QUERY = "YOUR_RETRIEVAL_QUERY"

response = rag.retrieval_query(
    rag_resources=[
        rag.RagResource(
            rag_corpus=RAG_CORPUS_RESOURCE,
            # Optional: supply IDs from `rag.list_files()`.
            # rag_file_ids=["rag-file-1", "rag-file-2", ...],
        )
    ],
    text=RETRIEVAL_QUERY,
    similarity_top_k=10,  # Optional
    vector_distance_threshold=0.3,  # Optional
)
print(response)

REST

// TODO(developer): Update and un-comment the following lines:
// RETRIEVAL_QUERY="YOUR_RETRIEVAL_QUERY"
//
// Full RagCorpus resource name
// Format:
// "projects/${PROJECT_ID}/locations/${LOCATION_ID}/ragCorpora/${RAG_CORPUS_ID}"
// RAG_CORPUS_RESOURCE="YOUR_RAG_CORPUS_RESOURCE"

// Call RetrieveContexts API to retrieve relevant contexts
curl -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}:retrieveContexts \
  -d '{
    "vertex_rag_store": {
      "rag_resources": {
          "rag_corpus": '\""${RAG_CORPUS_RESOURCE}"\"',
        },
      "vector_distance_threshold": 0.3
    },    
    "query": {
      "text": '\""${RETRIEVAL_QUERY}"\"', 
      "similarity_top_k": 10
    }
  }'

Generare contenuti utilizzando l'API Gemini di Vertex AI

Per generare contenuti utilizzando i modelli Gemini, effettua una chiamata all'API GenerateContent Vertex AI. Se specifichi RAG_CORPUS_RESOURCE nella richiesta, l'API recupera automaticamente i dati dall'indice di ricerca vettoriale.

Python

from vertexai.preview.generative_models import GenerativeModel, Tool

RAG_CORPUS_RESOURCE = "projects/{PROJECT_ID}/locations/{LOCATION_ID}/ragCorpora/YOUR_RAG_CORPUS_ID"

rag_retrieval_tool = Tool.from_retrieval(
    retrieval=rag.Retrieval(
        source=rag.VertexRagStore(
            rag_resources=[
                rag.RagResource(
                    rag_corpus=RAG_CORPUS_RESOURCE,
                    # Optional: supply IDs from `rag.list_files()`.
                    # rag_file_ids=["rag-file-1", "rag-file-2", ...],
                )
            ],
            similarity_top_k=10,  # Optional
            vector_distance_threshold=0.3,   # Optional
        ),
    )
)

rag_model = GenerativeModel(
  model_name="gemini-1.5-flash-001", tools=[rag_retrieval_tool]
)

GENERATE_CONTENT_PROMPT="YOUR_GENERATE_CONTENT_PROMPT"

response = rag_model.generate_content(GENERATE_CONTENT_PROMPT)
print(response.text)

REST

// TODO(developer): Update and un-comment the following lines:
// MODEL_ID=gemini-pro
// GENERATE_CONTENT_PROMPT="YOUR_GENERATE_CONTENT_PROMPT"

// GenerateContent with contexts retrieved from the FeatureStoreOnline index
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json"  https://${LOCATION_ID}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:generateContent \
-d '{
  "contents": { 
    "role": "user", 
    "parts": { 
      "text": '\""${GENERATE_CONTENT_PROMPT}"\"' 
    } 
  },
  "tools": {
    "retrieval": {
      "vertex_rag_store": {
        "rag_resources": {
            "rag_corpus": '\""${RAG_CORPUS_RESOURCE}"\"',
          },
        "similarity_top_k": 8,
        "vector_distance_threshold": 0.32
      }
    }
  }
}'

Passaggi successivi