RAG Engine でエンベディング モデルを使用する

このページでは、エンベディング モデルの選択について説明し、選択したモデルを使用して RAG コーパスを作成する方法を示します。モデルと RAG コーパスの関連付けは、RAG コーパスの存続期間中は固定されます。

エンベディングは入力の数値表現です。アプリケーションでエンベディングを使用すると、複雑な意味とセマンティックな関係を認識して、言語の処理と生成を行うことができます。

エンベディングは、テキスト、画像、動画をベクトルと呼ばれる浮動小数点数の配列に変換することで機能します。エンベディング空間内の 2 つのベクトルが近いほど、入力の類似度は高くなります。

エンベディング モデルは、セマンティック検索システムの重要なコンポーネントです。検索システムのパフォーマンスは、エンベディング モデルがデータ内のリレーションシップをマッピングする精度によって異なります。

RAG Engine は、検索拡張生成(RAG)を実装し、RAG コーパス内で使用する次のエンベディング モデルを選択できます。

  • Vertex AI テキスト エンベディング モデル: Google などのパブリッシャーがトレーニングしたモデル。これらのモデルは、大規模なテキスト データセットでトレーニングされており、多くのタスクで強力なベースラインを提供します。
  • ファインチューニングされた Vertex AI テキスト エンベディング モデル: 専門的な知識や高度にチューニングされたパフォーマンスを提供するようにトレーニングされたモデル。
  • OSS エンベディング モデル: 英語のみと多言語のバージョンで提供されるサードパーティのオープンソース エンベディング モデル。

Vertex AI テキスト エンベディング モデルを使用する

Vertex AI Text Embeddings API は Gecko エンベディング モデルを使用します。このモデルは、768 次元の密エンベディング ベクトルを生成します。密エンベディングは、単語を直接数値にマッピングする傾向があるスパース ベクトルとは異なり、テキストの意味を格納します。生成 AI で密なベクトル エンベディングを使用するメリットは、単語や構文が一致する箇所を直接検索するのではなく、同じ言語を使用していなくても、クエリの意味に一致する文章をより適切に検索できることです。

Gecko モデルは、英語のみと多言語のバージョンで利用できます。ファインチューニングされた Gecko モデルとは異なり、パブリッシャーの Gecko モデルはデプロイする必要がないため、RAG Engine で使用するモデルセットとしては最も簡単なモデルです。RAG コーパスで使用する Gecko モデルは次のとおりです。

  • text-embedding-004
  • text-multilingual-embedding-002
  • textembedding-gecko@003
  • textembedding-gecko-multilingual@001

RAG コーパスの作成時にエンベディング モデルを指定しない場合、RAG Engine はデフォルトで RAG コーパスに text-embedding-004 モデルを割り当てます。

パブリッシャーの Gecko モデルは非推奨になる可能性があります。その場合、パブリッシャーの Gecko モデルは、非推奨になる前に作成された RAG コーパスであっても、RAG Engine に使用できません。Gecko モデルが非推奨になった場合は、RAG コーパスを移行する必要があります。つまり、RAG コーパスを作成し、データをインポートする必要があります。別の方法として、ファインチューニングされた Gecko モデルまたはセルフデプロイの OSS エンベディング モデルを使用することもできます。このモデルは、モデルの非推奨化後もサポートされます。

次のコードサンプルは、パブリッシャーの Gecko モデルを使用して RAG コーパスを作成する方法を示しています。

curl

  ENDPOINT=us-central1-aiplatform.googleapis.com
  PROJECT_ID=YOUR_PROJECT_ID

  // Set this to your choice of publisher Gecko model. Note that the full resource name of the publisher model is required.
  // Example: projects/${PROJECT_ID}/locations/us-central1/publishers/google/models/text-embedding-004
  ENDPOINT_NAME=YOUR_ENDPOINT_NAME

  // Set a display name for your corpus.
  // For example, "my test corpus"
  CORPUS_DISPLAY_NAME=YOUR_CORPUS_DISPLAY_NAME

  // CreateRagCorpus
  // Input: ENDPOINT, PROJECT_ID, ENDPOINT_NAME, CORPUS_DISPLAY_NAME
  curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${ENDPOINT}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora \
  -d '{
        "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
        "rag_embedding_model_config" : {
              "vertex_prediction_endpoint": {
                    "endpoint": '\""${ENDPOINT_NAME}"\"'
              }
        }
  }'

Vertex AI SDK for Python

  import vertexai
  from vertexai.preview import rag

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

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

  # Name your corpus
  DISPLAY_NAME = "YOUR_CORPUS_DISPLAY_NAME"

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

ファインチューニングされた Vertex AI テキスト エンベディング モデルを使用する

基盤のパブリッシャー モデルは、大規模なテキスト データセットでトレーニングされており、多くのタスクで強力なベースラインを提供しますが、モデルに専門的な知識や高度にカスタマイズされたパフォーマンスが必要なシナリオもあります。このような場合は、モデルのチューニングを行い、関連するデータを使用してモデルの表現をファインチューニングできます。このアプローチのもう一つの利点は、モデルをファインチューニングすると、生成された画像がユーザー所有になり、Gecko モデルの非推奨の影響を受けないことです。ファインチューニングされた Gecko エンベディング モデルはすべて、768 次元のベクトルを持つエンベディングを生成します。これらのモデルの詳細については、テキスト エンベディングを取得するをご覧ください。

Gecko モデルをファインチューニングするには、テキスト エンベディングをチューニングするをご覧ください。

次のコードサンプルは、デプロイされたファインチューニング済みの Gecko モデルを使用して RAG コーパスを作成する方法を示しています。

curl

  ENDPOINT=us-central1-aiplatform.googleapis.com
  PROJECT_ID=YOUR_PROJECT_ID

  // Your Vertex AI endpoint resource with the deployed fine-tuned Gecko model
  // Example: projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/${ENDPOINT_ID}
  ENDPOINT_NAME=YOUR_ENDPOINT_NAME

  // Set a display name for your corpus.
  // For example, "my test corpus"
  CORPUS_DISPLAY_NAME=YOUR_CORPUS_DISPLAY_NAME

  // CreateRagCorpus
  // Input: ENDPOINT, PROJECT_ID, ENDPOINT_NAME, CORPUS_DISPLAY_NAME
  curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${ENDPOINT}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora \
  -d '{
        "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
        "rag_embedding_model_config" : {
                "vertex_prediction_endpoint": {
                      "endpoint": '\""${ENDPOINT_NAME}"\"'
                }
        }
    }'

Vertex AI SDK for Python

  import vertexai
  from vertexai.preview import rag

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

  # Your Vertex Endpoint resource with the deployed fine-tuned Gecko model
  ENDPOINT_ID = "YOUR_MODEL_ENDPOINT_ID"
  MODEL_ENDPOINT = "projects/${PROJECT_ID}/locations/us-central1/endpoints/${ENDPOINT_ID}"

  embedding_model_config = rag.EmbeddingModelConfig(
      endpoint=${MODEL_ENDPOINT},
  )

  # Name your corpus
  DISPLAY_NAME = "YOUR_CORPUS_DISPLAY_NAME"

  rag_corpus = rag.create_corpus(
      display_name=${DISPLAY_NAME}, embedding_model_config=embedding_model_config
  )

OSS エンベディング モデルを使用する

RAG Engine は、英語のみと多言語のサードパーティのオープンソース エンベディング モデルをサポートしています。次の表に、サポートされている E5 モデルを示します。

モデル バージョン ベースモデル パラメータ エンベディングの次元 英語のみ
e5-base-v2 MiniLM 109M 768
e5-large-v2 MiniLM 335M 1,024
e5-small-v2 MiniLM 33M 384
multilingual-e5-large xlm-roberta-large 560M 1,024
multilingual-e5-small microsoft/Multilingual-MiniLM-L12-H384 118M 384

RAG Engine で E5 モデルを使用するには、Model Garden から E5 モデルをデプロイする必要があります。Google Cloud コンソールの E5 テキスト エンベディングで、E5 モデルをデプロイします。

次のコードサンプルは、デプロイされた E5 モデルを使用して RAG コーパスを作成する方法を示しています。

curl

  ENDPOINT=us-central1-aiplatform.googleapis.com
  PROJECT_ID=YOUR_PROJECT_ID

  // Your Vertex Endpoint resource with the deployed E5 model
  // Example: projects/${PROJECT_ID}/locations/${LOCATION}/endpoints/${ENDPOINT_ID}
  ENDPOINT_NAME=YOUR_ENDPOINT_NAME

  // Set a display name for your corpus.
  // For example, "my test corpus"
  CORPUS_DISPLAY_NAME=YOUR_CORPUS_DISPLAY_NAME

  // CreateRagCorpus
  // Input: ENDPOINT, PROJECT_ID, ENDPOINT_NAME, CORPUS_DISPLAY_NAME
  curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${ENDPOINT}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/ragCorpora \
  -d '{
        "display_name" : '\""${CORPUS_DISPLAY_NAME</var>}"\"',
        "rag_embedding_model_config" : {
                "vertex_prediction_endpoint": {
                      "endpoint": '\""${ENDPOINT_NAME}"\"'
                }
        }
    }'

Vertex AI SDK for Python

  import vertexai
  from vertexai.preview import rag

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

  # Your Vertex Endpoint resource with the deployed E5 model
  ENDPOINT_ID = "YOUR_MODEL_ENDPOINT_ID"
  MODEL_ENDPOINT = "projects/{PROJECT_ID}/locations/us-central1/endpoints/{ENDPOINT_ID}"

  embedding_model_config = rag.EmbeddingModelConfig(
      endpoint=MODEL_ENDPOINT,
  )

  # Name your corpus
  DISPLAY_NAME = "YOUR_CORPUS_DISPLAY_NAME"

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

次のステップ