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:
Per configurare l'SDK Vertex AI, consulta la sezione Configurazione.
Imposta le variabili di ambiente come segue:
PROJECT_ID=YOUR_PROJECT_ID LOCATION=YOUR_LOCATION_ID
(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()
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:
IndexUpdateMethod
deve essereSTREAM_UPDATE
; consulta Creare stream di lettura dei dati.Il tipo di misurazione della distanza deve essere impostato esplicitamente su uno dei seguenti valori:
DOT_PRODUCT_DISTANCE
COSINE_DISTANCE
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
- Per saperne di più sulla scelta dei modelli di incorporamento, consulta Utilizza modelli di incorporamento con RAG Engine.
- Per scoprire di più sull'importazione dei file, consulta Importare i file RAG.