ハイブリッド検索のためのメタデータフィルタリング
ベクトル類似度と構造化フィルター(日時、作成者、タグ)を組み合わせ、正確で文脈に即した検索を実現します。
「ハイブリッド検索のためのメタデータフィルタリング」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
フィルタリングの理由
純粋なベクトル検索では、最も類似したK個のチャンクが返されます。たとえそれらが別のテナント、別の言語、または別のドキュメントに属していてもです。
メタデータフィルターによって検索対象を関連するサブセットに絞り込めるため、適合率と再現率の両方を高められます。
メタデータの保存
取り込み時に、すべてのチャンクへメタデータのdictを付加します。
metadata = {
'tenant_id': 'acme',
'language': 'en',
'source': 'help-docs',
'updated_at': '2024-08-12',
'tags': ['shipping', 'returns']
}
for k, v in metadata.items():
print(f"{k}: {v}")
Filtering in Pinecone
results = index.query(
vector=query_vec,
top_k=5,
filter={
'tenant_id': 'acme',
'language': 'en'
}
)範囲フィルター
ほとんどのベクトルDBは範囲フィルターにも対応しています。
filter = {
'updated_at': {'$gte': '2024-01-01'},
'score': {'$gt': 0.5}
}
print(filter)
In and Not-In
filter = {
'tags': {'$in': ['shipping', 'returns']},
'archived': {'$ne': True}
}
print(filter)
Qdrantでのフィルタリング
Qdrantには豊富なフィルタリング言語があります。
from qdrant_client.models import Filter, FieldCondition, MatchValue
filter = Filter(must=[
FieldCondition(key='tenant_id', match=MatchValue(value='acme')),
FieldCondition(key='language', match=MatchValue(value='en'))
])
results = client.search(
collection_name='docs',
query_vector=query_vec,
query_filter=filter,
limit=5
)事前フィルターと事後フィルター
方法は2つあります。
- 事前フィルター — フィルターを適用してから検索します(正確ですが、メタデータにインデックスがないと遅くなる可能性があります)
- 事後フィルター — 検索してから一致しない結果を除外します(高速ですが、結果がゼロになる可能性があります)
本番システムでは、適切なメタデータインデックスを使って事前フィルターを行います。
ベクトル + キーワードのハイブリッド検索
セマンティック検索と従来型のBM25キーワード検索を組み合わせます。両方を実行してスコアを統合します(通常は相互順位融合を使います)。
def rrf(vec_results, bm25_results, k=60):
scores = defaultdict(float)
for rank, doc in enumerate(vec_results):
scores[doc.id] += 1 / (k + rank)
for rank, doc in enumerate(bm25_results):
scores[doc.id] += 1 / (k + rank)
return sorted(scores.items(), key=lambda x: -x[1])マルチテナンシー
SaaSでは、すべてのクエリでtenant_idによるフィルタリングを行う必要があります。検索ラッパーにハードコードして、付け忘れを防いでください。
def search(query, tenant_id, top_k=5):
return index.query(
vector=embed(query),
top_k=top_k,
filter={'tenant_id': tenant_id}
)メタデータによるアクセス制御
ユーザーやロールの権限をメタデータに保存します。
metadata = {
'visibility': 'public', # or 'internal', 'restricted'
'department': 'engineering',
'allowed_roles': ['engineer', 'manager']
}
# At query time:
filter = {'allowed_roles': {'$contains': current_user_role}}新しさのブースト
新しいドキュメントを優先するには、より多くの候補を取得してから、新しさに基づいて再スコアリングします。
candidates = index.query(vector=query_vec, top_k=50)
scored = [
(c.score * recency_factor(c.metadata['updated_at']), c)
for c in candidates
]
scored.sort(reverse=True)
final = scored[:5]メタデータのカーディナリティに注意
カーディナリティの高いメタデータ(数百万件の一意な値)は、インデックスを巨大にします。可能な場合は事前に集約してください。たとえば、時間によるフィルタリングには完全なタイムスタンプではなく、年月を保存します。
常に適用するフィルター
マルチテナントエージェントが必ず含めるべきフィルターは何でしょうか。
まとめ
メタデータフィルターによって検索範囲を絞り込めます。ハイブリッド検索(ベクトル + BM25)と組み合わせると、最良の結果が得られます。マルチテナンシーとアクセス制御はこれに依存します。
よくある質問
「ハイブリッド検索のためのメタデータフィルタリング」レッスンは無料ですか?
はい。「ハイブリッド検索のためのメタデータフィルタリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「ハイブリッド検索のためのメタデータフィルタリング」で何を学びますか?
ベクトル類似度と構造化フィルター(日時、作成者、タグ)を組み合わせ、正確で文脈に即した検索を実現します。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ハイブリッド検索のためのメタデータフィルタリング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Pinecone、Weaviate、Qdrantの比較
- ハイブリッド検索のためのメタデータフィルタリング
- ベクトルの更新と削除
- 距離指標の選択(cosine、L2、dot)