mcpField
R
redis-vector-search

redis-vector-search

github.com/redisデータ・データベース171415 回インストール7 週間前に更新
リポジトリ

redis-vector-search について

Redis で埋め込みベクトルを保存、検索する方法を解説するスキルです。ベクトル検索や RAG パイプラインを構築する開発者向けに、インデックス設定、HNSW と FLAT の選択、属性フィルター、RedisVL の検索パターンを扱います。

主な機能

  1. 01VECTOR インデックス設定のガイダンス
  2. 02HNSW と FLAT の比較
  3. 03ベクトル検索の属性フィルター
  4. 04テキストとベクトルのハイブリッド検索
  5. 05Redis の RAG 検索フローを解説

活用シーン

  1. 01埋め込みベクトルのインデックス作成
  2. 02カテゴリや日付で検索結果を絞り込み
  3. 03ベクトルアルゴリズムとパラメーターの選択
  4. 04Redis で RAG フローを構築

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/redis/agent-skills --skill redis-vector-search

インストール後、Claude Code で/redis-vector-searchを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.cursor-plugin/
plugin.json
references/
algorithm-choice.md
hybrid-search.md
index-creation.md
rag-pattern.md

詳細

Redis Vector Search

Redis で埋め込みを保存・検索するためのガイダンスです。インデックス設定、アルゴリズムの選択、ハイブリッドフィルタリング、RedisVL を使った RAG 検索パターンを解説します。

適用する場面

  • FT.CREATE(生の RQE)または RedisVL の IndexSchema で VECTOR フィールドを定義するとき。
  • HNSW と FLAT のどちらを選ぶか、また HNSW のパラメーターを調整するとき。
  • ベクトルクエリにカテゴリ、日付、またはテナントのフィルターを追加するとき。
  • Redis 上に検索拡張生成(RAG)パイプラインを構築するとき。

このスキルは redis-query-engine スキルを基盤としています。ベクトルフィールドは RQE インデックス内にあり、同じ FT.CREATE/FT.SEARCH の仕組みを共有します。

1. ベクトルインデックスを適切に設定する

次の 3 つの設定を埋め込みモデルに合わせる必要があります。

  • DIM — モデルの出力次元数です(例:OpenAI text-embedding-3-small の場合は 1536)。不一致があると、気付かないまま無意味な結果が生成されます。
  • DISTANCE_METRIC — 正規化されたテキスト埋め込みには COSINE(一般的なケース)、正規化されていない内積には IP、生のユークリッド距離には L2 を使います。
  • TYPE / datatype — 通常は FLOAT32 です。FLOAT16 や量子化バリアントは、メモリコストが厳しい制約となる場合に限り使用してください。

生の RQE:

FT.CREATE idx:docs ON HASH PREFIX 1 doc:
    SCHEMA
        content TEXT
        embedding VECTOR HNSW 6
            TYPE FLOAT32
            DIM 1536
            DISTANCE_METRIC COSINE

RedisVL:

schema = IndexSchema.from_dict({
    "index": {"name": "idx:docs", "prefix": "doc:"},
    "fields": [
        {"name": "content", "type": "text"},
        {"name": "embedding", "type": "vector", "attrs": {
            "dims": 1536, "algorithm": "HNSW",
            "datatype": "FLOAT32", "distance_metric": "COSINE",
        }},
    ]
})

redis-py と RedisVL のバリエーションについては、references/index-creation.md を参照してください。

2. HNSW と FLAT

アルゴリズム速度精度メモリ最適な用途
HNSW高速(近似)約 95% 以上の再現率(調整可能)多い大規模データセット(ベクトル数 >10k)、低レイテンシが重要な場合
FLAT低速(厳密)100%少ない小規模データセット(ベクトル数 <10k)、精度が重要な場合

本番規模のワークロードでは、デフォルトで HNSW を使用してください。調整できる項目は次のとおりです。

  • M — ノードあたりの接続数(16–64)。値を大きくすると再現率が向上しますが、メモリ使用量も増えます。
  • EF_CONSTRUCTION — 構築時のグラフ品質(100–500)。値を大きくするとインデックスの品質が向上しますが、構築に時間がかかります。
  • EF_RUNTIME — クエリ時の候補リストのサイズ。値を大きくすると再現率が向上しますが、クエリが遅くなります。

コーパスが小さく、厳密な結果が必要な場合(例:数千件程度のアイテムのセマンティック重複排除)には FLAT を使用してください。

references/algorithm-choice.md を参照してください。

3. ハイブリッド検索 — ベクトル検索の前にフィルタリングする

属性フィルター(TAG/NUMERIC)を適用し、ベクトル比較の前にエンジンが検索範囲を絞り込めるようにしてください。広い範囲の結果を取得してからクライアント側でフィルタリングするのは避けてください。処理が遅くなり、精度も低下します。

from redisvl.query import VectorQuery
from redisvl.query.filter import Num, Tag

filters = (Tag("category") == "technology") & (Num("date") >= 2024)

query = VectorQuery(
    vector=query_embedding,
    vector_field_name="embedding",
    return_fields=["content", "category", "date"],
    num_results=10,
    filter_expression=filters,
)
results = index.query(query)

テキストとベクトルの融合(BM25 による重み付けテキストスコアとベクトル類似度の組み合わせ)には、Redis ≥ 8.4 かつ redis-py ≥ 7.1 では HybridQuery を、古い Redis では AggregateHybridQuery を使用してください。これは、上記のフィルタ付きベクトル検索とは別の「ハイブリッド」です。

references/hybrid-search.md を参照してください。

4. RAG パターン

標準的なパイプライン:ユーザーのクエリを埋め込む → Redis でベクトル検索する → 上位 K 件のコンテキストを LLM に渡す。

# Index documents with embeddings
records = [{"content": doc.content,
            "embedding": embed_model.encode(doc.content).tolist(),
            "source": doc.source}
           for doc in documents]
index.load(records)

# Retrieve relevant context for a user question
q_emb = embed_model.encode(user_question)
results = index.query(VectorQuery(
    vector=q_emb,
    vector_field_name="embedding",
    return_fields=["content", "source"],
    num_results=5,
))

# Generate with retrieved context
context = "\n".join(r["content"] for r in results)
response = llm.generate(f"Context: {context}\n\nQuestion: {user_question}")

実践的なヒント:

  • モデルに合わせてメトリックを選ぶ。 最新のテキスト埋め込みモデルの多くは COSINE との相性が最適です。
  • インデックス作成前に長いドキュメントをチャンク化してください。200~500 トークンのチャンクを使った検索は、通常、ページ全体をインデックス化するよりも効果的です。
  • レコードごとに呼び出すのではなく、index.load([...]) で一括挿入してください。
  • ベクトル検索の前に、属性(テナント、最新度、ドキュメントの種類)で事前にフィルタリングしてください。

references/rag-pattern.md を参照してください。

参考資料

コメント