RAG を使用してドキュメントのランク付けと再ランク付けを行う

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

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

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

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

ユースケース

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

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

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

  • 既存の検索エクスペリエンスの関連性の向上

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

次のフローでは、Ranking API を使用してチャンク化されたドキュメントの結果の品質を向上させる方法の概要を示します。

  1. Document AI Layout Parser API を使用して、一連のドキュメントをチャンクに分割します。

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

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

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

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

入力データ

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

  • レコードのランキング対象となるクエリ。

    例:

    "query": "Why is the sky blue?"
    
  • クエリに関連するレコードのセット。レコードはオブジェクトの配列として提供されます。各レコードには、一意の ID、タイトル、ドキュメントの内容を含めることができます。各レコードには、タイトル、コンテンツ、またはその両方を含めます。タイトルとコンテンツの長さが合計で 512 トークンを超えると、追加のコンテンツは切り捨てられます。リクエストごとに最大 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."
       }
    ]
    
  • 省略可: Ranking API から返されるレコードの最大数。デフォルトでは、すべてのレコードが返されますが、topN フィールドを使用して、返されるレコードの数を減らすことができます。設定された値に関係なく、すべてのレコードがランク付けされます。

    たとえば、次のようにすると、上位 10 件のレコードが返されます。

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

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

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

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

    "model": "semantic-ranker-512@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."
        }
    ]
}

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

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

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

    このモデルは、レコードごとに最大 512 個のトークンをサポートします。タイトルとコンテンツの合計長が 512 トークンを超える場合、余分なコンテンツは切り捨てられます。

  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-512@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-512@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 Agent Builder Python API のリファレンス ドキュメントをご覧ください。

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

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-512@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-512@latest 入力 コンテキスト ウィンドウ リリース日 廃止日
semantic-ranker-512-003 テキスト(25 言語) 512 2024 年 9 月 10日 未定
semantic-ranker-512-002 × テキスト(英語のみ) 512 2024 年 6 月 3 日 未定

次のステップ

他の RAG API でランキング方法を使用して、非構造化データから根拠のある回答を生成する方法を学びます。