Vertex AI Feature Store in der RAG-Engine verwenden

Auf dieser Seite erfahren Sie, wie Sie Vertex AI Feature Store als Vektordatenbank für die RAG Engine einrichten.

Sie können auch mit diesem Notebook RAG Engine mit Vertex AI Feature Store weitermachen.

Die RAG-Engine verwendet eine integrierte Vektordatenbank, die von Spanner unterstützt wird, um Vektordarstellungen von Textdokumenten zu speichern und zu verwalten. Die Vektordatenbank ruft relevante Dokumente basierend auf ihrer semantischen Ähnlichkeit mit einer bestimmten Suchanfrage ab.

Wenn Sie Vertex AI Feature Store als zusätzliche Vektordatenbank einbinden, kann die RAG Engine damit große Datenmengen mit niedriger Latenz verarbeiten. Das trägt dazu bei, die Leistung und Skalierbarkeit Ihrer RAG-Anwendungen zu verbessern.

Vertex AI Feature Store einrichten

Vertex AI Feature Store ist ein verwalteter cloudnativer Dienst und eine wichtige Komponente von Vertex AI. Er vereinfacht die Verwaltung von ML-Features (Maschinelles Lernen) und die Onlinebereitstellung, da Sie Featuredaten in einer BigQuery-Tabelle oder -Ansicht verwalten können. So ist die Onlinebereitstellung von Funktionen mit niedriger Latenz möglich.

Bei FeatureOnlineStore-Instanzen, die mit der optimierten Onlinebereitstellung erstellt wurden, können Sie eine Suche nach Vektorähnlichkeiten verwenden, um eine Liste von semantisch ähnlichen oder verwandten Entitäten abzurufen, die als ungefähre nächste Nachbarn bezeichnet werden.

In den folgenden Abschnitten erfahren Sie, wie Sie eine Vertex AI Feature Store-Instanz für Ihre RAG-Anwendung einrichten.

BigQuery-Tabellenschema erstellen

Erstellen Sie mit der Google Cloud Console ein BigQuery-Tabellenschema. Sie muss die folgenden Felder enthalten, um als Datenquelle zu dienen.

Feldname Datentyp Status
corpus_id String Erforderlich
file_id String Erforderlich
chunk_id String Erforderlich
chunk_data_type String Nullwerte zulässig
chunk_data String Nullwerte zulässig
file_original_uri String Nullwerte zulässig
embeddings Float Wiederholt

In diesem Codebeispiel wird gezeigt, wie Sie das BigQuery-Tabellenschema definieren.

SQL

  CREATE TABLE `PROJECT_ID.input_us_central1.rag_source_new` (
    `corpus_id` STRING NOT NULL,
    `file_id` STRING NOT NULL,
    `chunk_id` STRING NOT NULL,
    `chunk_data_type` STRING,
    `chunk_data` STRING,
    `embeddings` ARRAY<FLOAT64>,
    `file_original_uri` STRING
  );

FeatureOnlineStore-Instanz bereitstellen

Wenn Sie die Onlinebereitstellung von Features aktivieren möchten, richten Sie mit der CreateFeatureOnlineStore API von Vertex AI Feature Store eine FeatureOnlineStore-Instanz ein. Wenn Sie eine FeatureOnlineStore zum ersten Mal bereitstellen, kann der Vorgang etwa fünf Minuten dauern.

REST

Senden Sie zum Erstellen einer Onlineshopinstanz eine POST-Anfrage mit der Methode featureOnlineStores.create.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION_ID: Region, in der Sie die FeatureOnlineStore-Instanz erstellen möchten, z. B. us-central1.
  • PROJECT_ID: Ihre Projekt-ID.
  • FEATUREONLINESTORE_NAME: Name der neuen FeatureOnlineStore-Instanz.

HTTP-Methode und URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores?feature_online_store_id=FEATUREONLINESTORE_NAME

JSON-Text der Anfrage:

{
  "optimized": {}
}

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores?feature_online_store_id=FEATUREONLINESTORE_NAME"

PowerShell

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores?feature_online_store_id=FEATUREONLINESTORE_NAME" | Select-Object -Expand Content

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/featureOnlineStores/FEATUREONLINESTORE_NAME/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateFeatureOnlineStoreOperationMetadata",
    "genericMetadata": {
      "createTime": "2023-09-18T17:49:23.847496Z",
      "updateTime": "2023-09-18T17:49:23.847496Z"
    }
  }
}

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.


from google.cloud import aiplatform
from vertexai.resources.preview import feature_store


def create_optimized_public_feature_online_store_sample(
    project: str,
    location: str,
    feature_online_store_id: str,
):
    aiplatform.init(project=project, location=location)
    fos = feature_store.FeatureOnlineStore.create_optimized_store(
        feature_online_store_id
    )
    return fos

  • project: Ihre Projekt-ID.
  • location: Region, in der Sie die FeatureOnlineStore-Instanz erstellen möchten, z. B. us-central1.
  • feature_online_store_id: Name der neuen FeatureOnlineStore-Instanz.

Ressource FeatureView erstellen

Wenn Sie die BigQuery-Tabelle, in der die Feature-Datenquelle gespeichert ist, mit der FeatureOnlineStore-Instanz verknüpfen möchten, rufen Sie die CreateFeatureView API auf, um eine FeatureView-Ressource zu erstellen. Wählen Sie beim Erstellen einer FeatureView-Ressource den Standardmesswert für die Entfernung DOT_PRODUCT_DISTANCE aus. Dieser wird als negatives Skalarprodukt definiert. Je kleiner DOT_PRODUCT_DISTANCE ist, desto ähnlicher sind die Elemente.

In diesem Codebeispiel wird gezeigt, wie eine FeatureView-Ressource erstellt wird.

REST

  # TODO(developer): Update and uncomment the following lines:
  # Set feature_view_id
  # Example: "feature_view_test"
  # FEATURE_VIEW_ID = "your-feature-view-id"
  #
  # The big_query_uri generated in the above BigQuery table schema creation step
  # The format should be "bq://" + BigQuery table ID
  # Example: "bq://tester.ragtest1.rag_testdata"
  # BIG_QUERY_URI=YOUR_BIG_QUERY_URI

  # Call CreateFeatureView API to create a FeatureView
  curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/featureOnlineStores/${FEATURE_ONLINE_STORE_ID}/featureViews?feature_view_id=${FEATURE_VIEW_ID} \
    -d '{
          "vertex_rag_source": {
            "uri": '\""${BIG_QUERY_URI}"\"'
          }
      }'

  # Call ListFeatureViews API to verify the FeatureView is created successfully
  curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/featureOnlineStores/${FEATURE_ONLINE_STORE_ID}/featureViews

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.


from google.cloud import aiplatform
from vertexai.resources.preview import feature_store


def create_feature_view_from_rag_source(
    project: str,
    location: str,
    existing_feature_online_store_id: str,
    feature_view_id: str,
    bq_table_uri: str,
):
    aiplatform.init(project=project, location=location)
    fos = feature_store.FeatureOnlineStore(existing_feature_online_store_id)
    fv = fos.create_feature_view(
        name=feature_view_id,
        source=feature_store.utils.FeatureViewVertexRagSource(uri=bq_table_uri),
    )
    return fv

Daten hochladen und online bereitstellen

Die RAG API verarbeitet den Datenupload und die Onlinebereitstellung.

Vertex AI Feature Store in der RAG-Engine verwenden

Nachdem die Vertex AI Feature Store-Instanz eingerichtet ist, erfahren Sie in den folgenden Abschnitten, wie Sie sie als Vektordatenbank für die RAG-Anwendung einrichten.

Vertex AI Feature Store-Instanz als Vektordatenbank verwenden, um einen RAG-Korpus zu erstellen

Zum Erstellen des RAG-Corpus müssen Sie FEATURE_VIEW_RESOURCE_NAME verwenden. Der RAG-Korpus wird erstellt und automatisch mit der Vertex AI Feature Store-Instanz verknüpft. RAG APIs verwenden die generierte rag_corpus_id, um den Datenupload in die Vertex AI Feature Store-Instanz zu verarbeiten und relevante Kontexte aus der rag_corpus_id abzurufen.

In diesem Codebeispiel wird gezeigt, wie Sie die Vertex AI Feature Store-Instanz als Vektordatenbank verwenden, um einen RAG-Korpus zu erstellen.

REST

# TODO(developer): Update and uncomment the following lines:
# CORPUS_DISPLAY_NAME = "your-corpus-display-name"
#
# Full feature view resource name
# Format: projects/${PROJECT_ID}/locations/us-central1/featureOnlineStores/${FEATURE_ONLINE_STORE_ID}/featureViews/${FEATURE_VIEW_ID}
# FEATURE_VIEW_RESOURCE_NAME = "your-feature-view-resource-name"

# Call CreateRagCorpus API to create a new RAG corpus
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" : {
      "vertex_feature_store": {
        "feature_view_resource_name":'\""${FEATURE_VIEW_RESOURCE_NAME}"\"'
      }
    }
  }'

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

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.


from vertexai.preview import rag
import vertexai

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# feature_view_name = "projects/{PROJECT_ID}/locations/{LOCATION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}/featureViews/{FEATURE_VIEW_ID}"
# display_name = "test_corpus"
# description = "Corpus Description"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="us-central1")

# Configure embedding model (Optional)
embedding_model_config = rag.EmbeddingModelConfig(
    publisher_model="publishers/google/models/text-embedding-004"
)

# Configure Vector DB
vector_db = rag.VertexFeatureStore(resource_name=feature_view_name)

corpus = rag.create_corpus(
    display_name=display_name,
    description=description,
    embedding_model_config=embedding_model_config,
    vector_db=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=...
# ...

Dateien mit der RAG API in die BigQuery-Tabelle importieren

Verwenden Sie die ImportRagFiles API, um Dateien aus Google Cloud Storage oder Google Drive in die BigQuery-Tabelle der Vertex AI Feature Store-Instanz zu importieren. Die Dateien werden eingebettet und in der BigQuery-Tabelle gespeichert.

In diesem Codebeispiel wird gezeigt, wie Sie mit der RAG API Dateien in die BigQuery-Tabelle importieren.

REST

# TODO(developer): Update and uncomment the following lines:
# RAG_CORPUS_ID = "your-rag-corpus-id"
#
# Google Cloud Storage bucket/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://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/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 the files are imported successfully
curl -X GET \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora/${RAG_CORPUS_ID}/ragFiles

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.


from vertexai.preview import rag
import vertexai

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# corpus_name = "projects/{PROJECT_ID}/locations/us-central1/ragCorpora/{rag_corpus_id}"
# paths = ["https://drive.google.com/file/123", "gs://my_bucket/my_files_dir"]  # Supports Google Cloud Storage and Google Drive Links

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="us-central1")

response = rag.import_files(
    corpus_name=corpus_name,
    paths=paths,
    chunk_size=512,  # Optional
    chunk_overlap=100,  # Optional
    max_embedding_requests_per_min=900,  # Optional
)
print(f"Imported {response.imported_rag_files_count} files.")
# Example response:
# Imported 2 files.

Synchronisierungsprozess ausführen, um einen FeatureOnlineStore-Index zu erstellen

Nachdem Sie Ihre Daten in die BigQuery-Tabelle hochgeladen haben, führen Sie einen Synchronisierungsprozess aus, um Ihre Daten für die Onlinebereitstellung verfügbar zu machen. Sie müssen einen FeatureOnlineStore-Index mit dem FeatureView generieren. Die Synchronisierung kann 20 Minuten dauern.

In diesem Codebeispiel wird gezeigt, wie ein Synchronisierungsprozess ausgeführt wird, um einen FeatureOnlineStore-Index zu erstellen.

REST

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • LOCATION_ID: Die Region, in der sich der Onlinespeicher befindet, z. B. us-central1.
  • PROJECT_ID ist die Projekt-ID.
  • FEATUREONLINESTORE_NAME: Der Name des Onlinespeichers, der die Featureansicht enthält.
  • FEATUREVIEW_NAME: Der Name der Featureansicht, für die Sie die Datensynchronisierung manuell starten möchten.

HTTP-Methode und URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores/FEATUREONLINESTORE_NAME/featureViews/FEATUREVIEW_NAME:sync

Senden Sie die Anfrage mithilfe einer der folgenden Optionen:

curl

Führen Sie folgenden Befehl aus:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores/FEATUREONLINESTORE_NAME/featureViews/FEATUREVIEW_NAME:sync"

PowerShell

Führen Sie folgenden Befehl aus:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores/FEATUREONLINESTORE_NAME/featureViews/FEATUREVIEW_NAME:sync" | Select-Object -Expand Content

Sie sollten in etwa folgende JSON-Antwort erhalten:

{
  "featureViewSync": "projects/PROJECT_ID/locations/LOCATION_ID/featureOnlineStores/FEATUREONLINESTORE_NAME/featureViews/FEATUREVIEW_NAME/featureViewSyncs/OPERATION_ID"
}

Relevante Kontexte mit der RAG API abrufen

Nach Abschluss der Synchronisierung können Sie relevante Kontexte über die RetrieveContexts API aus dem FeatureOnlineStore-Index abrufen.

REST

# TODO(developer): Update and uncomment the following lines:
# RETRIEVAL_QUERY="your-retrieval-query"
#
# Full RAG corpus resource name
# Format:
# "projects/${PROJECT_ID}/locations/us-central1/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://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1:retrieveContexts \
  -d '{
    "vertex_rag_store": {
      "rag_resources": {
          "rag_corpus": '\""${RAG_CORPUS_RESOURCE}"\"',
        },
    },
    "query": {
      "text": '\""${RETRIEVAL_QUERY}"\"',
      "similarity_top_k": 10
    }
  }'

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.


from vertexai.preview import rag
import vertexai

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# corpus_name = "projects/[PROJECT_ID]/locations/us-central1/ragCorpora/[rag_corpus_id]"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="us-central1")

response = rag.retrieval_query(
    rag_resources=[
        rag.RagResource(
            rag_corpus=corpus_name,
            # Optional: supply IDs from `rag.list_files()`.
            # rag_file_ids=["rag-file-1", "rag-file-2", ...],
        )
    ],
    text="Hello World!",
    similarity_top_k=10,  # Optional
    vector_distance_threshold=0.5,  # Optional
)
print(response)
# Example response:
# contexts {
#   contexts {
#     source_uri: "gs://your-bucket-name/file.txt"
#     text: "....
#   ....

Inhalte mit der Vertex AI Gemini API generieren

Rufen Sie die Vertex AI GenerateContent API auf, um Inhalte mit Gemini-Modellen zu generieren, und geben Sie RAG_CORPUS_RESOURCE in der Anfrage an, um Daten aus dem FeatureOnlineStore-Index abzurufen.

REST

# TODO(developer): Update and uncomment the following lines:
# MODEL_ID=gemini-1.5-flash-001
# 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://us-central1-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/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,
      }
    }
  }
}'

Python

Informationen zur Installation des Vertex AI SDK for Python finden Sie unter Vertex AI SDK for Python installieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Python API.


from vertexai.preview import rag
from vertexai.preview.generative_models import GenerativeModel, Tool
import vertexai

# TODO(developer): Update and un-comment below lines
# PROJECT_ID = "your-project-id"
# corpus_name = "projects/{PROJECT_ID}/locations/us-central1/ragCorpora/{rag_corpus_id}"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="us-central1")

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

rag_model = GenerativeModel(
    model_name="gemini-1.5-flash-001", tools=[rag_retrieval_tool]
)
response = rag_model.generate_content("Why is the sky blue?")
print(response.text)
# Example response:
#   The sky appears blue due to a phenomenon called Rayleigh scattering.
#   Sunlight, which contains all colors of the rainbow, is scattered
#   by the tiny particles in the Earth's atmosphere....
#   ...

Nächste Schritte