メインコンテンツまでスキップ
バージョン: User Guides (Cloud)

ランダムサンプリング
Public Preview

大規模なデータセットを扱う際、洞察を得たりフィルタリングロジックをテストしたりするためにすべてのデータを処理する必要はありません。ランダムサンプリングは、統計的に代表的なデータサブセットで作業できるようにすることで、クエリ時間とリソース消費を大幅に削減する解決策を提供します。

ランダムサンプリングはセグメントレベルで動作し、コレクションのデータ分布全体でサンプルのランダム性を維持しながら効率的なパフォーマンスを確保します。

主な利用例:

  • データ探索:最小限のリソース使用でコレクション構造と内容を素早くプレビュー

  • 開発テスト:完全展開前に管理しやすいデータサンプルで複雑なフィルタリングロジックをテスト

  • リソース最適化:探索的クエリと統計分析のための計算コストを削減

構文

filter = "RANDOM_SAMPLE(sampling_factor)"

パラメータ:

  • sampling_factor:範囲 (0, 1) のサンプリング係数(境界を除く)。たとえば、RANDOM_SAMPLE(0.001) は結果のおよそ 0.1% を選択します。

重要なルール:

  • 式は大文字小文字を区別しません(RANDOM_SAMPLE または random_sample

  • サンプリング係数は範囲 (0, 1) で境界を除かなければなりません

他のフィルターとの組み合わせ

ランダムサンプリング演算子は、論理的な AND を使用して他のフィルター式と組み合わせる必要があります。フィルターを組み合わせる場合、Milvus は最初に他の条件を適用し、その後結果セットでランダムサンプリングを実行します。

# 正しい:最初にフィルター、その後サンプル
filter = 'color == "red" AND RANDOM_SAMPLE(0.001)'
# 処理:すべての赤いアイテムを検索 → その赤いアイテムの0.1%をサンプル

# 誤り:OR は論理的に意味をなしません
filter = 'color == "red" OR RANDOM_SAMPLE(0.001)' # ❌ 無効なロジック
# これは「赤いアイテムまたはすべてをサンプル」を意味し、意味がありません

例1: データ探索

コレクション構造を素早くプレビュー:

from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

# コレクション全体の約1%をサンプル
result = client.query(
collection_name="product_catalog",
filter="RANDOM_SAMPLE(0.01)",
output_fields=["id", "product_name"],
limit=10
)

print(f"コレクションから {len(result)} 個の商品をサンプルしました")

例2: ランダムサンプリングとの組み合わせフィルタリング

管理しやすいサブセットでフィルタリングロジックをテスト:

# 最初にカテゴリと価格でフィルター、その後結果の0.5%をサンプル
filter_expression = 'category == "electronics" AND price > 100 AND RANDOM_SAMPLE(0.005)'

result = client.query(
collection_name="product_catalog",
filter=filter_expression,
output_fields=["product_name", "price", "rating"],
limit=10
)

print(f"サンプル中の {len(result)} 個の電子機器製品が見つかりました")

例3: 簡易分析

フィルターされたデータで迅速な統計分析を実行:

# プレミアム顧客データの約0.1%から洞察を得る
filter_expression = 'customer_tier == "premium" AND region == 'North America' AND RANDOM_SAMPLE(0.001)'

result = client.query(
collection_name="customer_profiles",
filter=filter_expression,
output_fields=["purchase_amount", "satisfaction_score", "last_purchase_date"],
limit=10
)

# 素早い洞察のためのサンプル分析
if result:
average_purchase = sum(r["purchase_amount"] for r in result) / len(result)
average_satisfaction = sum(r["satisfaction_score"] for r in result) / len(result)

print(f"サンプルサイズ: {len(result)}")
print(f"平均購入額: ${average_purchase:.2f}")
print(f"平均満足度スコア: {average_satisfaction:.2f}")

フィルターされた検索シナリオでランダムサンプリングを使用:

# サンプルされたサブセット内で類似製品を検索
search_results = client.search(
collection_name="product_catalog",
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # クエリベクトル
filter='category == "books" AND RANDOM_SAMPLE(0.01)',
search_params={"metric_type": "L2", "params": {}},
output_fields=["title", "author", "price"],
limit=10
)

print(f"サンプル中に {len(search_results[0])} 個の類似書籍が見つかりました")

ベストプラクティス

  • 小さな値から始める:初期探索には小さなサンプリング係数(0.001-0.01)から始める

  • 開発ワークフロー:開発中はサンプリングを使用し、プロダクションクエリでは削除する

  • 統計的妥当性:大きなサンプルはより正確な統計的表現を提供する

  • パフォーマンステスト:クエリパフォーマンスを監視し、必要に応じてサンプリング係数を調整する