Ranking API を使用して検索と RAG の品質を改善する

Vertex AI Search の検索拡張生成(RAG)エクスペリエンスの一部として、クエリに基づいて一連のドキュメントをランク付けできます。

Ranking API は、ドキュメントのリストを取得し、ドキュメントが特定のクエリにどの程度関連しているかに基づいてドキュメントを再ランク付けします。ドキュメントとクエリの意味的な類似性のみを考慮するエンベディングと比較して、Ranking API では、ドキュメントが特定のクエリにどの程度適切に回答しているかを正確にスコア付けできます。ランキング API を使用すると、候補ドキュメントの初期セットを取得した後で、検索結果の品質を改善できます。

ランキング API はステートレスであるため、API を呼び出す前にドキュメントのインデックス登録を行う必要はありません。クエリとドキュメントを渡すだけです。 そのため、この API はベクトル検索や他の検索ソリューションのドキュメントの再ランキングに適しています。

このページでは、ランキング API を使用して、クエリに基づいて一連のドキュメントをランク付けする方法について説明します。

ユースケース

ランキング API の主なユースケースは、検索結果の品質を向上させることです。

ただし、ランキング API は、ユーザーのクエリに最も関連性の高いコンテンツを見つける必要があるシナリオで役立ちます。たとえば、Ranking API は次の場合に役立ちます。

  • グラウンディングのために LLM に提供する適切なコンテンツの発見

  • 既存の検索エクスペリエンスの関連性を高める

  • ドキュメントの関連するセクションを特定する

次のフローは、ランキング API を使用してチャンク化されたドキュメントの結果の品質を改善する方法の概要を示しています。

  1. Document AI レイアウト パーサー API を使用して、一連のドキュメントをチャンクに分割します。

  2. Embeddings API を使用して、各チャンクのエンベディングを作成します。

  3. エンベディングをベクトル検索または別の検索ソリューションに読み込みます。

  4. 検索インデックスにクエリを実行し、最も関連性の高いチャンクを取得します。

  5. Ranking API を使用して、関連するチャンクを再ランク付けします。

入力データ

Ranking API には、次の入力が必要です。

  • レコードのランク付けに使用するクエリ。

    例:

    "query": "Why is the sky blue?"
    
  • クエリに関連するレコードのセット。レコードはオブジェクトの配列として提供されます。各レコードには、一意の ID、タイトル、ドキュメントのコンテンツを含めることができます。各レコードには、タイトル、コンテンツ、またはその両方を含めます。レコードあたりの最大サポート トークン数は、使用されているモデル バージョンによって異なります。たとえば、バージョン 003 までのモデルは 512 個のトークンをサポートしますが、バージョン 004 は 1,024 個のトークンをサポートします。タイトルとコンテンツの合計の長さがモデルのトークン上限を超えると、超過分のコンテンツは切り捨てられます。リクエストごとに最大 200 件のレコードを含めることができます。

    たとえば、レコード配列は次のようになります。実際には、配列にはさらに多くのレコードが含まれ、コンテンツははるかに長くなります。

    "records": [
       {
           "id": "1",
           "title": "The Color of the Sky: A Poem",
           "content": "A canvas stretched across the day,\nWhere sunlight learns to dance and play.\nBlue, a hue of scattered light,\nA gentle whisper, soft and bright."
       },
       {
           "id": "2",
           "title": "The Science of a Blue Sky",
           "content": "The sky appears blue due to a phenomenon called Rayleigh scattering. Sunlight is comprised of all the colors of the rainbow. Blue light has shorter wavelengths than other colors, and is thus scattered more easily."
       }
    ]
    
  • 省略可: ランキング API に返してほしいレコードの最大数。デフォルトではすべてのレコードが返されますが、topN フィールドを使用して、返されるレコードの数を減らすことができます。設定された値に関係なく、すべてのレコードがランク付けされます。

    たとえば、次のコマンドは上位 10 件のランク付けされたレコードを返します。

    "topN": 10,
    
  • 省略可: API から返されるレコードの ID のみが必要か、レコードのタイトルとコンテンツも必要かを指定する設定。デフォルトでは、レコード全体が返されます。この設定を行う主な理由は、レスポンス ペイロードのサイズを小さくするためです。

    たとえば、true に設定すると、タイトルやコンテンツではなく、レコード ID のみが返されます。

    "ignoreRecordDetailsInResponse": true,
    
  • 省略可: モデル名。これは、ドキュメントのランキングに使用するモデルを指定します。モデルが指定されていない場合は、semantic-ranker-default@latest が使用されます。これは、利用可能な最新のモデルを自動的に参照します。特定のモデルを指定するには、サポートされているモデルに記載されているモデル名(semantic-ranker-512-003 など)のいずれかを指定します。

    次の例では、modelsemantic-ranker-default@latest に設定されています。 つまり、ランキング API は常に利用可能な最新のモデルを使用します。

    "model": "semantic-ranker-default@latest"
    

出力データ

Ranking API は、次のような出力でレコードのランク付けされたリストを返します。

  • スコア: レコードの関連性を示す 0~1 の浮動小数点値。

  • ID: レコードの一意の ID。

  • リクエストに応じて、オブジェクト全体(ID、タイトル、コンテンツ)。

    例:

{
    "records": [
        {
            "id": "2",
            "score": 0.98,
            "title": "The Science of a Blue Sky",
            "content": "The sky appears blue due to a phenomenon called Rayleigh scattering. Sunlight is comprised of all the colors of the rainbow. Blue light has shorter wavelengths than other colors, and is thus scattered more easily."
        },
        {
            "id": "1",
            "score": 0.64,
            "title": "The Color of the Sky: A Poem",
            "content": "A canvas stretched across the day,\nWhere sunlight learns to dance and play.\nBlue, a hue of scattered light,\nA gentle whisper, soft and bright."
        }
    ]
}

クエリに従って一連のレコードをランク付け(または再ランク付け)する

通常、ランキング API には、クエリと、そのクエリに関連する一連のレコードが提供されます。これらのレコードは、キーワード検索やベクトル検索などの他の方法ですでにランク付けされています。次に、ランキング API を使用してランキングの品質を向上させ、各レコードのクエリとの関連性を示すスコアを決定します。

  1. クエリと結果のレコードを取得します。各レコードに ID と、タイトル、コンテンツ、またはその両方があることを確認します。

    レコードあたりのサポートされるトークンの最大数は、モデルのバージョンによって異なります。semantic-ranker-512-003 などのバージョン 003 までのモデルは、レコードあたり 512 トークンをサポートします。バージョン 004 以降では、この上限は 1, 024 トークンに引き上げられます。タイトルとコンテンツの合計の長さがモデルのトークン上限を超えると、超過したコンテンツは切り捨てられます。

  2. 次のコードを使用して rankingConfigs.rank メソッドを呼び出します。

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: PROJECT_ID" \
"https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/rankingConfigs/default_ranking_config:rank" \
-d '{
"model": "semantic-ranker-default@latest",
"query": "QUERY",
"records": [
    {
        "id": "RECORD_ID_1",
        "title": "TITLE_1",
        "content": "CONTENT_1"
    },
    {
        "id": "RECORD_ID_2",
        "title": "TITLE_2",
        "content": "CONTENT_2"
    },
    {
        "id": "RECORD_ID_3",
        "title": "TITLE_3",
        "content": "CONTENT_3"
    }
]
}'

次のように置き換えます。

  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • QUERY: レコードのランク付けとスコア付けに使用するクエリ。
  • RECORD_ID_n: レコードを識別する一意の文字列。
  • TITLE_n: レコードのタイトル。
  • CONTENT_n: レコードのコンテンツ。

このメソッドの一般的な情報については、rankingConfigs.rank をご覧ください。

クリックして curl コマンドとレスポンスの例を表示します。

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: my-project-123" \
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/rankingConfigs/default_ranking_config:rank" \
    -d '{
        "model": "semantic-ranker-default@latest",
        "query": "what is Google gemini?",
        "records": [
            {
                "id": "1",
                "title": "Gemini",
                "content": "The Gemini zodiac symbol often depicts two figures standing side-by-side."
            },
            {
                "id": "2",
                "title": "Gemini",
                "content": "Gemini is a cutting edge large language model created by Google."
            },
            {
                "id": "3",
                "title": "Gemini Constellation",
                "content": "Gemini is a constellation that can be seen in the night sky."
            }
        ]
    }'
    
{
    "records": [
        {
            "id": "2",
            "title": "Gemini",
            "content": "Gemini is a cutting edge large language model created by Google.",
            "score": 0.97
        },
        {
            "id": "3",
            "title": "Gemini Constellation",
            "content": "Gemini is a constellation that can be seen in the night sky.",
            "score": 0.18
        },
        {
            "id": "1",
            "title": "Gemini",
            "content": "The Gemini zodiac symbol often depicts two figures standing side-by-side.",
            "score": 0.05
        }
    ]
}

Python

詳細については、Vertex AI Search Python API のリファレンス ドキュメントをご覧ください。

Vertex AI Search に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"

client = discoveryengine.RankServiceClient()

# The full resource name of the ranking config.
# Format: projects/{project_id}/locations/{location}/rankingConfigs/default_ranking_config
ranking_config = client.ranking_config_path(
    project=project_id,
    location="global",
    ranking_config="default_ranking_config",
)
request = discoveryengine.RankRequest(
    ranking_config=ranking_config,
    model="semantic-ranker-default@latest",
    top_n=10,
    query="What is Google Gemini?",
    records=[
        discoveryengine.RankingRecord(
            id="1",
            title="Gemini",
            content="The Gemini zodiac symbol often depicts two figures standing side-by-side.",
        ),
        discoveryengine.RankingRecord(
            id="2",
            title="Gemini",
            content="Gemini is a cutting edge large language model created by Google.",
        ),
        discoveryengine.RankingRecord(
            id="3",
            title="Gemini Constellation",
            content="Gemini is a constellation that can be seen in the night sky.",
        ),
    ],
)

response = client.rank(request=request)

# Handle the response
print(response)

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

次のモデルを使用できます。

モデル名 最新モデル(semantic-ranker-default@latest 入力 コンテキスト ウィンドウ リリース日 廃止日
semantic-ranker-default-004 テキスト(25 言語) 1024 2025 年 4 月 9 日 未定
semantic-ranker-fast-004 いいえ テキスト(25 言語) 1024 2025 年 4 月 9 日 未定
semantic-ranker-default-003 いいえ テキスト(25 言語) 512 2024 年 9 月 10日 未定
semantic-ranker-default-002 × テキスト(英語のみ) 512 2024 年 6 月 3 日 未定

次のステップ

他の RAG API でランキング方法を使用して、非構造化データからグラウンディングされた回答を生成する方法を学習する。