2024.11.12 コラム
Ranking API を使ってみた

※ Ranking API を使って、アップロードした PDF に対し、文章で検索をかけるデモです。GIF は 2 倍速ですが、高速にレスポンスが返ってきます。
DataCurrentの金子です。Ranking API を検証してみました。
Ranking API は、ベクトルデータベースを建てるまでもないが自然言語による検索をクイックに行いたい場合に便利です。例えば、ドキュメント中の特定箇所を検索する際は、これまで完全一致で検索していたと思いますが、この API を使うと文章ベースで検索をかけることができるようになります。
※ こちらは、2024 年 10 月時点の Google Cloud の公式ドキュメント Rank and rerank documents with RAG を参考にしています。
Ranking API とは
Ranking API は、ドキュメントのリストを入力として受け取り、ユーザーの質問に対してドキュメントを再ランク付けする API です。
従来のベクトルを使った検索と比較すると、Ranking API は、そのドキュメントがユーザーの質問にどれだけ適切に答えているかを評価することができるようになります。
また、Ranking API はステートレスなので、ベクトルデータベースのようにあらかじめインデックスを登録する必要はありません。
このため、既存の検索エンジンの品質を強化したり、既に表示されている文章の関連セクションを特定したりするために使用することが可能です。
利用可能なモデルは 2024 年 10 月時点で 2 つありますが、semantic-ranker-512-003 *1 は日本語にも対応しています。*2
Ranking API を試す
ドキュメント通りの内容になりますが、以下のようなステップで Ranking API を試すことができます。
API のレスポンスはコメントアウトで記しました。
# ~~ ドキュメント通りなので省略しています。 ~~
# ドキュメントは英語ですが、日本語でリクエストしてみました。
request = discoveryengine.RankRequest(
ranking_config=ranking_config,
model="semantic-ranker-512@latest",
top_n=10,
query="Google Gemini とは",
records=[
discoveryengine.RankingRecord(
id="1",
title="Gemini",
content="双子座の星座シンボルには、並んで立っている 2 人の人物が描かれていることが多いです。",
),
discoveryengine.RankingRecord(
id="2",
title="Gemini",
content="Gemini は、Google が作成した最先端の大規模言語モデルです。",
),
discoveryengine.RankingRecord(
id="3",
title="Gemini Constellation",
content="ふたご座は夜空に見える星座です。",
),
],
)
response = client.rank(request=request)
# Handle the response
print(response)
# records {
# id: "2"
# title: "Gemini"
# content: "Gemini は、Google が作成した最先端の大規模言語モデルです。"
# score: 0.96
# }
# records {
# id: "1"
# title: "Gemini"
# content: "双子座の星座シンボルには、並んで立っている 2 人の人物が描かれていることが多いです。"
# score: 0.02
# }
# records {
# id: "3"
# title: "Gemini Constellation"
# content: "ふたご座は夜空に見える星座です。"
# score: 0.01
# }
リクエストの解説
request に格納されている内容は RankRequest クラスとして渡されます。
ranking_configは、projects/{project_num}/locations/{location}/rankingConfigs/default_ranking_configの形式で指定します。modelは、利用するモデルを指定します。日本語に対応しているモデルにするには、semantic-ranker-512-003かsemantic-ranker-512@latestを指定します。top_nは、ランキングされたドキュメントの上位何件を返すかを指定します。queryは、検索クエリを指定します。recordsは、ランキングするドキュメントのリストを指定します。
レスポンスの解説
response に格納されている内容は proto.Message のサブクラスである RankResponse クラスとして返されます。出力時に records は複数表示されていますが、これは配列のように参照することができるという意味です。
recordsは、ランキングされたドキュメントのリストを score が高い順に返されます。id、title、contentは、それぞれリクエスト時に指定したドキュメントの id、タイトル、コンテンツを返します。scoreは、関連度のスコアです。スコアが高いほど、検索クエリに対して適切なドキュメントとなります。
制限
Ranking API は、以下の制限があります。
recordsは 200 件まで指定可能です。recordsの各タイトルとコンテンツの合計の長さが 512 トークンを超える場合、追加のコンテンツは切り捨てられます。
価格
ドキュメントの Ranking API pricing によると、クエリ 1,000 件あたり $1 と記されています。
但し、1 クエリは 100 ドキュメントを備えたものとしてカウントされます。1 リクエストにドキュメントを 100 以上指定する場合は、100 の倍数ごとに 1 ずつカウントされます。
例えば、132 ドキュメントを指定した場合は、2 クエリとしてカウントされます。
まとめ
今回は Ranking API を検証してみました。デモ画面のように、ベクトルデータベースを建てるまでもないが、自然言語による検索をクイックに行いたい場合に便利です。また、日本語にも対応しているので、日本語のドキュメントにも適用可能です。
Google の検索技術を使って、検索体験の向上に役立ててみてはいかがでしょうか。
最後に
自社に専門人材がいない、リソースが足りない等の課題をお持ちの方に、エンジニア領域の支援サービス(Data Engineer Hub)をご提供しています。
お困りごとございましたら是非お気軽にご相談ください。
本記事に関するお問い合わせは下記にて承ります。
株式会社DataCurrent
info@datacurrent.co.jp