Redis vector search
Skill Pyfagorass/bookofspells/skills/redis/redis-vector-search
π The Book of Spells: a curated, enchanted index of real LLM tooling β and a pipeline that gathers SKILL.md skills from many houses into one searchable shelf.
npx -y skills add Pyfagorass/bookofspells --skill redis-vector-searchAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Redis vector search guidance covering HNSW vs FLAT algorithm choice, vector index configuration (dims, distance metric, datatype), filtered hybrid search combining vector similarity with TAG or NUMERIC filters, and the RAG retrieval pattern with RedisVL. Use when defining a VECTOR field in FT.CREATE, integrating embeddings (OpenAI, Cohere, sentence-transformers), tuning HNSW parameters (M, EF_CONSTRUCTION, EF_RUNTIME), building a retrieval-augmented generation pipeline, or filtering vector results by attribute.
The file declares its own license as MIT. That is the authorβs claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.6 KB, as published. Nobody here has run it
Redis Vector Search
Guidance for storing and searching embeddings in Redis. Covers index configuration, algorithm selection, hybrid filtering, and the RAG retrieval pattern with RedisVL.
When to apply
- Defining a
VECTORfield inFT.CREATE(raw RQE) or a RedisVLIndexSchema. - Choosing HNSW vs FLAT and tuning HNSW parameters.
- Adding category, date, or tenant filters to a vector query.
- Building a retrieval-augmented generation (RAG) pipeline on top of Redis.
This skill builds on the redis-query-engine skill β vector fields live inside RQE indexes and share the same FT.CREATE / FT.SEARCH machinery.
1. Configure the vector index properly
Three settings must match the embedding model:
DIMβ the model's output dimensionality (e.g. 1536 for OpenAItext-embedding-3-small). A mismatch produces silent garbage.DISTANCE_METRICβCOSINEfor normalized text embeddings (the common case),IPfor unnormalized inner-product,L2for raw Euclidean.TYPE/datatypeβ usuallyFLOAT32. UseFLOAT16or quantized variants only when memory cost is a hard constraint.
Raw 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",
}},
]
})
See references/index-creation.md for redis-py and RedisVL variants.
2. HNSW vs FLAT
| Algorithm | Speed | Accuracy | Memory | Best for |
|---|---|---|---|---|
| HNSW | Fast (approximate) | ~95%+ recall (tunable) | Higher | Large datasets (>10k vectors), latency-sensitive |
| FLAT | Slow (exact) | 100% | Lower | Small datasets (<10k), accuracy-critical |
Default to HNSW for any production-scale workload. Tuning levers:
Mβ connections per node (16β64). Higher = better recall, more memory.EF_CONSTRUCTIONβ build-time graph quality (100β500). Higher = better index, slower build.EF_RUNTIMEβ query-time candidate-list size. Higher = better recall, slower queries.
Use FLAT when the corpus is small and you need exact results (e.g. semantic dedup over a few thousand items).
See references/algorithm-choice.md.
3. Hybrid search β filter before vector
Apply attribute filters (TAG / NUMERIC) so the engine narrows the search space before the vector comparison. Don't fetch a wide result set and then filter client-side β that's slower and less accurate.
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)
For text + vector fusion (BM25-weighted text scoring combined with vector similarity), use HybridQuery on Redis β₯ 8.4 with redis-py β₯ 7.1, or AggregateHybridQuery on older Redis. That's a different "hybrid" from filtered vector search above.
See references/hybrid-search.md.
4. RAG pattern
Standard pipeline: embed the user query β vector search Redis β pass top-K context to the 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}")
Practical tips:
- Match metric to model. Most modern text embedding models pair best with
COSINE. - Chunk long documents before indexing β retrieval over 200β500-token chunks usually beats indexing whole pages.
- Batch inserts with
index.load([...])instead of one call per record. - Pre-filter with attributes (tenant, recency, document type) before the vector search.
See references/rag-pattern.md.