エンベディングのタスクタイプを選択する

Vertex AI エンベディング モデルは、ドキュメントの検索、質問と回答、事実の検証など、さまざまなタスクタイプに最適化されたエンベディングを生成できます。タスクタイプは、目的のユースケースに基づいてモデルが生成するエンベディングを最適化するラベルです。このドキュメントでは、エンベディングに最適なタスクタイプを選択する方法について説明します。

サポートされているモデル

タスクタイプは、次のモデルでサポートされています。

  • text-embedding-005
  • text-multilingual-embedding-002
  • gemini-embedding-001

タスクタイプのメリット

タスクタイプを使用すると、エンベディング モデルによって生成されるエンベディングの品質を向上させることができます。

質問とその回答が意味的に類似していない
図 1. 質問と回答が意味的に類似していないため、エンベディングではそれらの関連性が自動的に示されません。

たとえば、検索拡張生成(RAG)システムを構築する場合、一般的な設計では、テキスト エンベディングとベクトル検索を使用して類似性検索を行います。質問とその回答が意味的に類似していないため、検索の品質が低下することがあります。たとえば、「空はなぜ青いのか」という質問とその回答である「太陽光の散乱によって青色になる」は、文面として明らかに意味が異なります。つまり、図 1 に示すように、RAG システムはこれらの関係を自動的に認識しません。タスクタイプを使用しない場合、RAG デベロッパーはモデルをトレーニングしてクエリと回答の関係を学習させる必要がありますが、これにはデータ サイエンスの高度なスキルと経験が必要になります。また、LLM ベースのクエリ拡張HyDE を使用するため、レイテンシと費用が増加する可能性があります。

タスクタイプにより、エンベディング空間で質問と回答が近づきます
図 2. タスクタイプは、特定のタスクに合わせてエンベディングを最適化します。この場合、質問と回答がエンベディング空間で近づきます。

タスクタイプを使用すると、特定のタスク用に最適化されたエンベディングを生成できます。これにより、タスク固有のエンベディングを独自に開発する時間と費用を節約できます。図 2 に示すように、「なぜ空は青いのか」という質問と「太陽光の散乱によって青色になる」という回答から生成されたエンベディングは、それらの関係を表す共有エンベディング空間に存在します。この RAG の例では、最適化されたエンベディングにより、類似性検索が改善されます。

タスクタイプは、質問と回答のユースケースだけでなく、分類、クラスタリング、事実確認などのタスクにも最適化されたエンベディング空間を提供します。

サポートされているタスクタイプ

タスクタイプを使用するエンベディング モデルは、次のタスクタイプをサポートしています。

タスクタイプ 説明
CLASSIFICATION 事前設定されたラベルに従ってテキストを分類するように最適化されたエンベディングの生成に使用
CLUSTERING 類似性に基づいてテキストをクラスタ化するように最適化されたエンベディングの生成に使用
RETRIEVAL_DOCUMENTRETRIEVAL_QUERYQUESTION_ANSWERINGFACT_VERIFICATION ドキュメント検索や情報検索に最適化されたエンベディングの生成に使用
CODE_RETRIEVAL_QUERY 配列を並べ替えるリンクリストを逆にするなど、自然言語クエリに基づいてコードブロックを取得するために使用。コードブロックのエンベディングは RETRIEVAL_DOCUMENT を使用して計算されます。
SEMANTIC_SIMILARITY テキストの類似性を評価するために最適化されたエンベディングの生成に使用されます。これは検索ユースケースを対象としていません。

エンベディング ジョブに最適なタスクタイプは、エンベディングのユースケースによって異なります。タスクタイプを選択する前に、エンベディングのユースケースを決定します。

エンベディングのユースケースを決定する

エンベディングのユースケースは通常、テキストの類似性の評価、テキストの分類、テキストのクラスタリング、テキストからの情報の取得、の 4 つのカテゴリのいずれかに分類されます。ユースケースがこれらのカテゴリに該当しない場合は、デフォルトで RETRIEVAL_QUERY タスクタイプを使用します。

タスク指示の形式には、非対称形式と対称形式の 2 種類があります。ユースケースに基づいて適切なものを使用する必要があります。

検索のユースケース
(非対称形式)
クエリタスクのタイプ ドキュメント タスクのタイプ
検索クエリ RETRIEVAL_QUERY RETRIEVAL_DOCUMENT
質問応答 QUESTION_ANSWERING
ファクト チェック FACT_VERIFICATION
コードの取得 CODE_RETRIEVAL_QUERY



単一入力のユースケース
(対称形式)
入力タスクのタイプ
分類 分類
クラスタリング クラスタリング
意味的類似性
(検索ユースケースには使用しないでください。
STS 用です)
SEMANTIC_SIMILARITY

テキストを分類する

エンベディングを使用して、事前設定されたラベルに従ってテキストを分類する場合は、CLASSIFICATION タスクタイプを使用します。このタスクタイプは、分類用に最適化されたエンベディング空間でエンベディングを生成します。

たとえば、ソーシャル メディアの投稿のエンベディングを生成して、そのエンベディングを使用して投稿の感情をポジティブ、ネガティブ、ニュートラルのいずれかに分類したいとします。ソーシャル メディアの投稿のエンベディングが「飛行機での旅行は好きではない」と分類された場合、感情は否定的と分類されます。

テキストをクラスタリングする

エンベディングを使用して類似性に基づいてテキストをクラスタリングする場合は、CLUSTERING タスクタイプを使用します。このタスクタイプは、類似性に基づいてグループ化するように最適化されたエンベディングを生成します。

たとえば、ニュース記事のエンベディングを生成して、ユーザーが以前に読んだ記事とトピックが関連している記事をユーザーに表示するとします。エンベディングが生成されてクラスタリングされたら、スポーツに関する記事をよく読むユーザーに、スポーツ関連の追加記事をおすすめできます。

クラスタリングのその他のユースケースには次のものがあります。

  • 顧客セグメンテーション: ターゲット マーケティングとパーソナライズされたエクスペリエンスのため、プロフィールやアクティビティから生成された類似のエンベディングを持つ顧客をグループ化します。
  • 商品セグメント: 商品のタイトルや説明、商品画像、顧客レビューに基づいて商品エンベディングをクラスタリングすることで、商品のセグメント分析を行うことができます。
  • 市場調査: 消費者アンケートの回答やソーシャル メディア データのエンベディングをクラスタリングすることで、消費者の意見、好み、行動に隠れたパターンや傾向を明らかにし、市場調査の取り組みや商品の開発戦略に役立てることができます。
  • ヘルスケア: 医療データから得られた患者のエンベディングをクラスタリングすることで、類似の病状や治療に対する反応を持つグループを特定し、よりパーソナライズされた医療計画の作成やターゲット療法に役立てることができます。
  • 顧客からのフィードバックの傾向: さまざまなチャネル(アンケート、ソーシャル メディア、サポート チケット)からの顧客からのフィードバックをグループに分類し、共通の問題点、機能リクエスト、製品の改善分野を特定できます。

テキストから情報を取得する

検索システムまたは取得システムを構築する際は、次の 2 種類のテキストを扱います。

  • コーパス: 検索対象のドキュメントのコレクション。
  • クエリ: コーパス内の情報を検索するためにユーザーが提供するテキスト。

最適なパフォーマンスを得るには、異なるタスクタイプを使用して、コーパスとクエリのエンベディングを生成する必要があります。

まず、ドキュメントのコレクション全体のエンベディングを生成します。これは、ユーザーのクエリによって取得されるコンテンツです。これらのドキュメントをエンベディングする場合は、RETRIEVAL_DOCUMENT タスクタイプを使用します。通常、このステップは 1 回実行してコーパス全体をインデックスに登録し、結果のエンベディングをベクトル データベースに保存します。

次に、ユーザーが検索を送信すると、クエリテキストのエンベディングがリアルタイムで生成されます。そのためには、ユーザーの意図に一致するタスクタイプを使用する必要があります。システムは、このクエリ エンベディングを使用して、ベクトル データベースで最も類似したドキュメント エンベディングを検索します。

クエリには次のタスクタイプが使用されます。

  • RETRIEVAL_QUERY: 関連するドキュメントを検索する標準の検索クエリに使用します。モデルは、クエリ エンベディングに意味的に近いドキュメント エンベディングを探します。
  • QUESTION_ANSWERING: すべてのクエリが「空はなぜ青いのか」「靴ひもを結ぶにはどうすればよいか」など、適切な質問の形式になっている場合に使用します。
  • FACT_VERIFICATION: ステートメントを証明または反証するコーパスからドキュメントを取得する場合に使用します。たとえば、「リンゴは地下で育つ」というクエリでは、最終的にその主張を反証する、リンゴに関する記事が取得される可能性があります。

取得クエリが役立つ次のような実際のシナリオについて考えてみましょう。

  • e コマース プラットフォームの場合。エンベディングを使用して、ユーザーがテキストクエリと画像の両方を使用して商品を検索できるようにし、より直感的で魅力的なショッピング エクスペリエンスを提供します。
  • 教育プラットフォームの場合。教科書の内容や教育リソースに基づいて生徒の質問に答えられる質問応答システムを構築して、個別化された学習体験を提供し、生徒が複雑な概念を理解できるようにします。

コードの取得

text-embedding-005 は、新しいタスクタイプ CODE_RETRIEVAL_QUERY をサポートしています。このタスクタイプを使用すると、プレーン テキスト クエリを使用して関連するコードブロックを取得できます。この機能を使用するには、RETRIEVAL_DOCUMENT タスクタイプを使用してコードブロックを埋め込み、CODE_RETRIEVAL_QUERY を使用してテキストクエリを埋め込む必要があります。

すべてのタスクタイプを確認するには、モデル リファレンスをご覧ください。

以下に例を示します。

REST

PROJECT_ID=PROJECT_ID

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/publishers/google/models/text-embedding-005:predict -d \
$'{
  "instances": [
    {
      "task_type": "CODE_RETRIEVAL_QUERY",
      "content": "Function to add two numbers"
    }
  ],
}'

テキストの類似性を評価する

エンベディングを使用してテキストの類似性を評価する場合は、SEMANTIC_SIMILARITY タスクタイプを使用します。このタスクタイプは、類似性スコアの生成用に最適化されたエンベディングを生成します。

たとえば、次のテキストの類似性を比較するために使用するエンベディングを生成するとします。

  • 猫が寝ている
  • ネコ科の動物が昼寝をしている

エンベディングを使用して類似度スコアを作成すると、両方のテキストの意味はほぼ同じであるため、類似度スコアは高くなります。

入力の類似性を評価する必要がある次のような実際のシナリオについて考えてみましょう。

  • レコメンデーション システムでは、ユーザーが好むアイテムと意味的に類似したアイテム(商品、記事、映画など)を特定して、パーソナライズされたおすすめ情報を提供することでユーザー満足度を高めます。

Python

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、 Python API リファレンス ドキュメントをご覧ください。

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

MODEL_NAME = "gemini-embedding-001"
DIMENSIONALITY = 3072


def embed_text(
    texts: list[str] = ["Retrieve a function that adds two numbers"],
    task: str = "CODE_RETRIEVAL_QUERY",
    model_name: str = "gemini-embedding-001",
    dimensionality: int | None = 3072,
) -> list[list[float]]:
    """Embeds texts with a pre-trained, foundational model."""
    model = TextEmbeddingModel.from_pretrained(model_name)
    kwargs = dict(output_dimensionality=dimensionality) if dimensionality else {}

    embeddings = []
    # gemini-embedding-001 takes one input at a time
    for text in texts:
        text_input = TextEmbeddingInput(text, task)
        embedding = model.get_embeddings([text_input], **kwargs)
        print(embedding)
        # Example response:
        # [[0.006135190837085247, -0.01462465338408947, 0.004978656303137541, ...]]
        embeddings.append(embedding[0].values)

    return embeddings


if __name__ == "__main__":
    # Embeds code block with a pre-trained, foundational model.
    # Using this function to calculate the embedding for corpus.
    texts = ["Retrieve a function that adds two numbers"]
    task = "CODE_RETRIEVAL_QUERY"
    code_block_embeddings = embed_text(
        texts=texts, task=task, model_name=MODEL_NAME, dimensionality=DIMENSIONALITY
    )

    # Embeds code retrieval with a pre-trained, foundational model.
    # Using this function to calculate the embedding for query.
    texts = [
        "def func(a, b): return a + b",
        "def func(a, b): return a - b",
        "def func(a, b): return (a ** 2 + b ** 2) ** 0.5",
    ]
    task = "RETRIEVAL_DOCUMENT"
    code_query_embeddings = embed_text(
        texts=texts, task=task, model_name=MODEL_NAME, dimensionality=DIMENSIONALITY
    )

これらのモデルを使用する場合は、次の制限事項が適用されます。

  • ミッション クリティカルなシステムや本番環境のシステムでは、これらのプレビュー モデルを使用しません。
  • これらのモデルは us-central1 でのみ使用できます。
  • バッチ予測はサポートされていません。
  • カスタマイズはサポートされていません。

次のステップ