Skip to main content

Retriever API Reference

SynapseKit provides 16 retriever strategies. All implement BaseRetriever.

BaseRetriever interface​

class BaseRetriever(ABC):
async def get_relevant_documents(self, query: str) -> list[Document]: ...
async def aget_relevant_documents(self, query: str) -> list[Document]: ...

Retriever​

Standard dense vector similarity retriever.

from synapsekit.rag import Retriever

retriever = Retriever(
vector_store: VectorStore,
k: int = 4,
score_threshold: float | None = None,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store to search
kint4Number of documents to return
score_thresholdfloat | NoneNoneMinimum similarity score (0.0–1.0); results below are filtered out
retriever = Retriever(vector_store=store, k=5, score_threshold=0.7)
docs = await retriever.get_relevant_documents("What is SynapseKit?")

HybridSearchRetriever​

Combines dense vector search with BM25 sparse keyword search using Reciprocal Rank Fusion (RRF).

from synapsekit.rag import HybridSearchRetriever

retriever = HybridSearchRetriever(
vector_store: VectorStore,
k: int = 4,
alpha: float = 0.5,
bm25_weight: float = 0.5,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store for dense search
kint4Number of documents to return
alphafloat0.5Weight for dense results (1.0 = dense only, 0.0 = sparse only)
bm25_weightfloat0.5Weight for BM25 sparse results

When to use: Queries that mix keyword terms with semantic intent (e.g., product names + conceptual questions).

retriever = HybridSearchRetriever(vector_store=store, alpha=0.6)
docs = await retriever.get_relevant_documents("gpt-4o token limits")

MMRRetriever​

Maximal Marginal Relevance — balances relevance with diversity to avoid redundant results.

from synapsekit.rag import MMRRetriever

retriever = MMRRetriever(
vector_store: VectorStore,
k: int = 4,
fetch_k: int = 20,
lambda_mult: float = 0.5,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store to search
kint4Number of documents to return
fetch_kint20Candidate pool size before MMR re-ranking
lambda_multfloat0.5Diversity weight: 0.0 = max diversity, 1.0 = max relevance

When to use: Long-form summarization tasks where you want broad coverage without repeated information.

retriever = MMRRetriever(vector_store=store, k=6, lambda_mult=0.3)
docs = await retriever.get_relevant_documents("overview of SynapseKit features")

ContextualCompressionRetriever​

Wraps another retriever and compresses each retrieved document to only the sentences relevant to the query.

from synapsekit.rag import ContextualCompressionRetriever

retriever = ContextualCompressionRetriever(
base_retriever: BaseRetriever,
llm: BaseLLM,
k: int = 4,
compression_prompt: str | None = None,
)
ParameterTypeDefaultDescription
base_retrieverBaseRetrieverrequiredRetriever to wrap
llmBaseLLMrequiredLLM used to compress documents
kint4Number of compressed documents to return
compression_promptstr | NoneNoneCustom compression prompt

When to use: Documents are large and noisy; you want to pass only the relevant excerpt to the LLM.

retriever = ContextualCompressionRetriever(
base_retriever=Retriever(store, k=10),
llm=llm,
)
docs = await retriever.get_relevant_documents("What are the memory backends?")

SelfQueryRetriever​

Uses an LLM to parse natural-language filters from the query and passes structured metadata filters to the vector store.

from synapsekit.rag import SelfQueryRetriever

retriever = SelfQueryRetriever(
vector_store: VectorStore,
llm: BaseLLM,
document_description: str,
metadata_field_info: list[dict],
k: int = 4,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store that supports metadata filtering
llmBaseLLMrequiredLLM for query parsing
document_descriptionstrrequiredPlain-English description of the document collection
metadata_field_infolist[dict]requiredSchema for filterable metadata fields
kint4Number of documents to return

When to use: Documents have structured metadata (author, date, category) and users ask filter-style questions.

retriever = SelfQueryRetriever(
vector_store=store,
llm=llm,
document_description="Technical documentation pages",
metadata_field_info=[
{"name": "version", "type": "string", "description": "Library version"},
{"name": "category", "type": "string", "description": "Doc category"},
],
)
docs = await retriever.get_relevant_documents("v1.2.0 changelog entries")

ParentDocumentRetriever​

Stores small child chunks for precise retrieval but returns their full parent documents for richer context.

from synapsekit.rag import ParentDocumentRetriever

retriever = ParentDocumentRetriever(
vector_store: VectorStore,
docstore: BaseDocStore,
child_splitter: BaseSplitter,
parent_splitter: BaseSplitter | None = None,
k: int = 4,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredStores child chunk embeddings
docstoreBaseDocStorerequiredStores full parent documents
child_splitterBaseSplitterrequiredSplits documents into small child chunks
parent_splitterBaseSplitter | NoneNoneSplits into parent chunks; None = use full document
kint4Number of parent documents to return

When to use: Documents are long; small chunks improve retrieval precision but strip useful context.


MultiQueryRetriever​

Generates multiple query variations with an LLM, retrieves documents for each, and deduplicates results.

from synapsekit.rag import MultiQueryRetriever

retriever = MultiQueryRetriever(
base_retriever: BaseRetriever,
llm: BaseLLM,
num_queries: int = 3,
k: int = 4,
)
ParameterTypeDefaultDescription
base_retrieverBaseRetrieverrequiredRetriever to call for each query
llmBaseLLMrequiredLLM for generating query variations
num_queriesint3Number of query reformulations to generate
kint4Number of documents to return after deduplication

When to use: The original query is ambiguous or could benefit from paraphrasing to improve recall.

retriever = MultiQueryRetriever(
base_retriever=Retriever(store, k=4),
llm=llm,
num_queries=5,
)
docs = await retriever.get_relevant_documents("how does it handle memory")

EnsembleRetriever​

Fuses results from multiple retrievers using Reciprocal Rank Fusion.

from synapsekit.rag import EnsembleRetriever

retriever = EnsembleRetriever(
retrievers: list[BaseRetriever],
weights: list[float] | None = None,
k: int = 4,
)
ParameterTypeDefaultDescription
retrieverslist[BaseRetriever]requiredRetrievers to combine
weightslist[float] | NoneNonePer-retriever weights; None = equal weights
kint4Number of documents to return after fusion
retriever = EnsembleRetriever(
retrievers=[dense_retriever, bm25_retriever, mmr_retriever],
weights=[0.5, 0.3, 0.2],
)
docs = await retriever.get_relevant_documents("async graph execution")

BM25Retriever​

Pure sparse keyword retrieval using the BM25 ranking function. No embedding required.

from synapsekit.rag import BM25Retriever

retriever = BM25Retriever(
documents: list[Document],
k: int = 4,
b: float = 0.75,
k1: float = 1.5,
)
ParameterTypeDefaultDescription
documentslist[Document]requiredCorpus to index
kint4Number of documents to return
bfloat0.75BM25 length normalization parameter
k1float1.5BM25 term frequency saturation parameter

Extra dependency: pip install synapsekit[bm25]

When to use: Exact keyword matching is important (product codes, error messages, named entities).


TimeWeightedRetriever​

Boosts recently added documents in the ranking. Useful for news, logs, or versioned content.

from synapsekit.rag import TimeWeightedRetriever

retriever = TimeWeightedRetriever(
vector_store: VectorStore,
decay_rate: float = 0.01,
k: int = 4,
other_score_keys: list[str] | None = None,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store with last_accessed_at metadata
decay_ratefloat0.01Exponential decay rate per hour
kint4Number of documents to return
other_score_keyslist[str] | NoneNoneAdditional metadata keys to incorporate into score

When to use: Knowledge base has time-sensitive content and recent documents should rank higher.


MetadataRetriever​

Filters documents by metadata before running vector similarity search.

from synapsekit.rag import MetadataRetriever

retriever = MetadataRetriever(
vector_store: VectorStore,
filter: dict,
k: int = 4,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store that supports metadata filtering
filterdictrequiredMetadata filter expression
kint4Number of documents to return
retriever = MetadataRetriever(
vector_store=store,
filter={"category": "api", "version": "1.2"},
)
docs = await retriever.get_relevant_documents("authentication parameters")

LongContextReorderRetriever​

Reorders results so the most relevant documents appear at the beginning and end of the context window, addressing the "lost in the middle" problem.

from synapsekit.rag import LongContextReorderRetriever

retriever = LongContextReorderRetriever(
base_retriever: BaseRetriever,
k: int = 4,
)
ParameterTypeDefaultDescription
base_retrieverBaseRetrieverrequiredRetriever to wrap
kint4Number of documents to return

When to use: You are passing many retrieved chunks to the LLM and accuracy on middle context matters.


StepBackRetriever​

Uses an LLM to generate a more abstract "step-back" question before retrieval to improve coverage on specific, narrow queries.

from synapsekit.rag import StepBackRetriever

retriever = StepBackRetriever(
base_retriever: BaseRetriever,
llm: BaseLLM,
k: int = 4,
include_original: bool = True,
)
ParameterTypeDefaultDescription
base_retrieverBaseRetrieverrequiredRetriever to call with the abstracted query
llmBaseLLMrequiredLLM for generating the step-back question
kint4Number of documents to return
include_originalboolTrueAlso retrieve using the original query and merge results

When to use: Queries are very specific (e.g., a particular function name) and benefit from broader background context.


GraphRAGRetriever​

Traverses a knowledge graph to retrieve multi-hop relationships before returning documents.

from synapsekit.rag import GraphRAGRetriever

retriever = GraphRAGRetriever(
vector_store: VectorStore,
graph_store: BaseGraphStore,
k: int = 4,
max_hops: int = 2,
include_neighbors: bool = True,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store for initial retrieval
graph_storeBaseGraphStorerequiredGraph store for relationship traversal
kint4Number of documents to return
max_hopsint2Maximum graph traversal depth
include_neighborsboolTrueInclude neighbor node documents in results

Extra dependency: pip install synapsekit[graphrag]

When to use: Documents have rich relational structure (legal documents, scientific literature, ontologies).


HyDERetriever​

Hypothetical Document Embeddings — generates a hypothetical answer with an LLM, embeds it, then retrieves real documents most similar to that hypothetical.

from synapsekit.rag import HyDERetriever

retriever = HyDERetriever(
vector_store: VectorStore,
llm: BaseLLM,
k: int = 4,
hyde_prompt: str | None = None,
)
ParameterTypeDefaultDescription
vector_storeVectorStorerequiredVector store to search
llmBaseLLMrequiredLLM for generating the hypothetical document
kint4Number of documents to return
hyde_promptstr | NoneNoneCustom prompt for hypothetical generation

When to use: The query is a question and the document corpus contains factual passages (good embedding alignment between hypothetical answer and real answer).

retriever = HyDERetriever(vector_store=store, llm=llm, k=5)
docs = await retriever.get_relevant_documents("How does SynapseKit handle retries?")

CachingRetriever​

Wraps any retriever and caches results in memory or Redis to avoid redundant embedding lookups.

from synapsekit.rag import CachingRetriever

retriever = CachingRetriever(
base_retriever: BaseRetriever,
ttl_seconds: int = 300,
backend: str = "memory",
redis_url: str | None = None,
)
ParameterTypeDefaultDescription
base_retrieverBaseRetrieverrequiredRetriever to cache results for
ttl_secondsint300Cache entry TTL in seconds
backendstr"memory"Cache backend: "memory" or "redis"
redis_urlstr | NoneNoneRedis URL (required when backend="redis")
retriever = CachingRetriever(
base_retriever=HyDERetriever(store, llm),
ttl_seconds=600,
backend="redis",
redis_url="redis://localhost:6379",
)

Retriever selection guide​

Use caseRecommended retriever
Standard RAGRetriever
Keyword-heavy queriesBM25Retriever or HybridSearchRetriever
Diverse, broad coverageMMRRetriever
Long, noisy documentsContextualCompressionRetriever
Metadata-filtered searchMetadataRetriever or SelfQueryRetriever
Ambiguous or vague queriesMultiQueryRetriever or StepBackRetriever
Question to factual passageHyDERetriever
Time-sensitive contentTimeWeightedRetriever
Relational / multi-hopGraphRAGRetriever
High-traffic, repeated queriesCachingRetriever
Large documents, need full contextParentDocumentRetriever
Many chunks passed to LLMLongContextReorderRetriever

See also​