ハイブリッド検索
全文検索では、正確なキーワードに基づいて文書を検索できます。ベクトル検索では、意味的な類似性に基づいて文書を検索できます。これらの2つの検索方法を組み合わせることで、検索精度を向上させ、より多くのシナリオに対応できるでしょうか?はい、このアプローチはハイブリッド検索と呼ばれ、AIアプリケーションで一般的に使用されています。
TiDBにおけるハイブリッド検索の一般的なワークフローは以下のとおりです。
- 全文検索とベクトル検索にはTiDBを使用してください。
- リランカーを使用して、両方の検索結果を統合します。
このチュートリアルでは、埋め込みと再ランキングを標準でサポートするpytidb Python SDKを使用して、TiDBでハイブリッド検索を行う方法を説明します。pytidbの使用は完全に任意です。SQLを直接使用して検索を実行し、独自の再ランキングモデルを自由に利用することもできます。
前提条件
全文検索機能はまだ開発初期段階にあり、より多くのお客様に順次展開していく予定です。現在、全文検索機能は、以下のリージョンにおけるTiDB Cloud StarterおよびTiDB Cloud Essentialでのみご利用いただけます。
- AWS:
Frankfurt (eu-central-1)およびSingapore (ap-southeast-1)
このチュートリアルを完了するには、サポートされているリージョンにTiDB Cloud Starterインスタンスがあることを確認してください。お持ちでない場合は、 TiDB Cloud Starterインスタンスを作成する。
さあ始めましょう
ステップ1. pytidb Python SDKをインストールします
pip install "pytidb[models]"
# (Alternative) If you don't want to use built-in embedding functions and rerankers:
# pip install pytidb
# (Optional) To convert query results to pandas DataFrame:
# pip install pandas
ステップ2. TiDBに接続する
from pytidb import TiDBClient
db = TiDBClient.connect(
host="HOST_HERE",
port=4000,
username="USERNAME_HERE",
password="PASSWORD_HERE",
database="DATABASE_HERE",
)
これらの接続パラメータは、次のようにTiDB Cloudコンソールから取得できます。
私のTiDBページに移動し、対象のTiDB Cloud StarterまたはEssentialインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示され、接続パラメータが表示されます。
例えば、接続パラメータが以下のように表示される場合:
HOST: gateway01.us-east-1.prod.shared.aws.tidbcloud.com PORT: 4000 USERNAME: 4EfqPF23YKBxaQb.root PASSWORD: abcd1234 DATABASE: test CA: /etc/ssl/cert.pemTiDB Cloud Starterインスタンスに接続するための対応するPythonコードは以下のとおりです。
db = TiDBClient.connect( host="gateway01.us-east-1.prod.shared.aws.tidbcloud.com", port=4000, username="4EfqPF23YKBxaQb.root", password="abcd1234", database="test", )上記の例はあくまでも説明のためのものです。パラメータにはご自身の値を入力し、安全に保管してください。
ステップ3. テーブルを作成する
例として、 chunksという名前のテーブルを作成し、以下の列を追加します。
id(int): チャンクのID。text(テキスト): チャンクのテキストコンテンツ。text_vec(ベクトル): テキストのベクトル表現。pytidb の埋め込みモデルによって自動的に生成されます。user_id(int): チャンクを作成したユーザーのID。
from pytidb.schema import TableModel, Field
from pytidb.embeddings import EmbeddingFunction
text_embed = EmbeddingFunction("openai/text-embedding-3-small")
class Chunk(TableModel, table=True):
__tablename__ = "chunks"
id: int = Field(primary_key=True)
text: str = Field()
text_vec: list[float] = text_embed.VectorField(
source_field="text"
) # 👈 Define the vector field.
user_id: int = Field()
table = db.create_table(schema=Chunk)
ステップ4.データを挿入する
table.bulk_insert(
[
Chunk(id=2, text="bar", user_id=2), # 👈 The text field will be embedded to a
Chunk(id=3, text="baz", user_id=3), # vector and stored in the "text_vec" field
Chunk(id=4, text="qux", user_id=4), # automatically.
]
)
ステップ5.ハイブリッド検索を実行する
この例では、 ジナ・リランカーモデルを使用して検索結果を再ランク付けします。
from pytidb.rerankers import Reranker
jinaai = Reranker(model_name="jina_ai/jina-reranker-m0")
df = (
table.search("<query>", search_type="hybrid")
.rerank(jinaai, "text") # 👈 Rerank the query result using the jinaai model.
.limit(2)
.to_pandas()
)
完全な例については、 pytidb ハイブリッド検索デモを参照してください。
融合方法
融合手法は、ベクトル(意味)検索と全文(キーワード)検索の結果を統合し、単一の統一されたランキングを作成します。これにより、最終結果が意味的な関連性とキーワードの一致の両方を活用できるようになります。
pytidb 2 つの融合方法をサポートしています。
rrf: 相互ランク融合 (デフォルト)weighted: 加重スコア融合
ハイブリッド検索結果を最適化するために、ご自身のユースケースに最適な融合方法を選択できます。
相互ランク融合(RRF)
相互ランク融合(RRF)は、複数の検索結果セットにおける文書のランクを活用して検索結果を評価するアルゴリズムです。
詳細については、 RRF論文参照してください。
methodメソッドで"rrf"パラメーター.fusion()有効にします。
results = (
table.search(
"AI database", search_type="hybrid"
)
.fusion(method="rrf")
.limit(3)
.to_list()
)
パラメータ:
k: ゼロ除算を防ぎ、高ランクのドキュメントの影響を制御するための定数 (デフォルト: 60)。
加重スコア融合
加重スコア融合は、ベクトル検索と全文検索のスコアを加重和を用いて組み合わせます。
final_score = vs_weight * vector_score + fts_weight * fulltext_score
methodメソッドで"weighted"パラメーター.fusion()有効にします。
例えば、ベクトル検索の重みを大きくするには、 vs_weightパラメータを 0.7 に、 fts_weightパラメータを 0.3 に設定します。
results = (
table.search(
"AI database", search_type="hybrid"
)
.fusion(method="weighted", vs_weight=0.7, fts_weight=0.3)
.limit(3)
.to_list()
)
パラメータ:
vs_weight: ベクトル検索スコアの重み。fts_weight: 全文検索スコアの重み。
再ランク法
ハイブリッド検索は、リランカー専用モデルを使用したリランキングもサポートしています。
rerank()メソッドを使用して、クエリとドキュメント間の関連性に基づいて検索結果を並べ替えるリランカーを指定します。
例:Jina AI Rerankerを使用してハイブリッド検索結果の順位を再設定する
reranker = Reranker(
# Use the `jina-reranker-m0` model
model_name="jina_ai/jina-reranker-m0",
api_key="{your-jinaai-api-key}"
)
results = (
table.search(
"AI database", search_type="hybrid"
)
.fusion(method="rrf", k=60)
.rerank(reranker, "text")
.limit(3)
.to_list()
)
他のリランカーモデルを確認するには、ランキング変更ご覧ください。
関連項目
フィードバックとヘルプ
全文検索はまだ開発初期段階であり、利用できる地域が限られています。まだ利用できない地域で全文検索を試してみたい場合、またはご意見やご質問がある場合は、お気軽にお問い合わせください。
- 不和or スラックコミュニティに質問してください。
- TiDB Cloudのサポートチケットを送信してください