Caching based RAG primitives
Project description
rager
Composable RAG primitives with caching baked in.
Install
uv add rager
Getting started
uv run pytest
uv run prek install
For GPU (CUDA/ROCm) torch, add the matching PyTorch index to your own project and install torch from it — those builds aren't on PyPI.
Example
Wire the primitives together yourself — there is no hidden pipeline. This chunks documents, embeds and indexes each chunk, then answers a query from the nearest chunk:
chunker = SemanticChunker()
embedder = SentenceTransformerDenseEmbedder()
index = DenseIndex()
chunks = ChunkStore()
generator = TransformersGenerator()
for document in documents:
for chunk in chunker.chunk(document):
embedding = await embedder.embed(chunk)
key = await index.add(embedding)
chunks.add(key, chunk)
query = "Why do cats purr?"
(key,) = await index.similar(await embedder.embed(query), results=1)
answer = await generator.prompt(f"Answer using only the context.\n{chunks.get(key)}\n{query}")
tests/application/ has full dense and hybrid recipes.
API
Every stage is a Protocol with concrete implementations. async methods batch concurrent calls; model-backed methods cache results under .jar/.
Parsers — extract text units from files
Parser— protocol:units(file)returns text units,id(file)returns the contentHash.UnstructuredFileParser— parses any file supported byunstructured.PdfFileParser,MarkdownFileParser,CsvFileParser— aliases ofUnstructuredFileParserfor readable call sites.
Chunkers — split units into chunks
Chunker— protocol:chunk(unit) -> list[str].SemanticChunker— splits on semantic boundaries with a token budget:SemanticChunker(model_name="gpt-3.5-turbo", chunk_size=1000, overlap=0).
Embedders — turn chunks into vectors
Embedder[E]— protocol:async embed(chunk) -> E.SentenceTransformerDenseEmbedder— dense, L2-normalizedDenseEmbeddingvia SentenceTransformers (defaultall-MiniLM-L6-v2).SpladeSparseEmbedder— sparseSparseEmbeddingvia a SPLADE encoder (defaultprithivida/Splade_PP_en_v1).
Indexes — store vectors and search by similarity
Index[E, K]— protocol:async add(embedding) -> key,async remove(key),async similar(embedding, results=100) -> list[key]. Ranks by inner product (equals cosine for L2-normalized vectors). Keys are derived from embedding content, so adding the same vector twice yields one entry.DenseIndex— flat FAISS index;DenseIndex(dimensions=None)infers width from the first vector unless fixed.SparseIndex— inner-product search over sparse weight maps.
Fusers — merge ranked lists
Fuser[V]— protocol:fuse(*rankings) -> list[V].ReciprocalRankFuser— reciprocal rank fusion with smoothing constantk(default 60).BordaCountFuser— Borda count fusion.
Scorers — rerank chunks against a query
Scorer— protocol:async score(query, chunk) -> float.CrossEncoderScorer— cross-encoder reranker (defaultcross-encoder/ms-marco-MiniLM-L6-v2).
Generators — produce an answer
Generator— protocol:async prompt(query) -> str.TransformersGenerator— local Transformers text-generation model (defaultHuggingFaceTB/SmolLM2-135M-Instruct,max_new_tokens=512).
Stores — map index keys back to data
Store[V, K]— protocol:add(key, value),get(key) -> value | None,remove(key).ChunkStore— in-memory map from key to chunk text, resolving a search hit to its source.MetadataStore[M: Metadata]— in-memory map from key to per-chunk metadata.
Types
Hash— ablake3hasher; the content ID returned by parsers.DenseEmbedding—list[float].SparseEmbedding—dict[int, float]mapping token id to weight.Metadata— protocol for metadata classes used withMetadataStore.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rager-0.1.5.tar.gz.
File metadata
- Download URL: rager-0.1.5.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fce0cb752bcdcbe1eedff70763616c35395b84233c1f2fd133317f3759bcd0dc
|
|
| MD5 |
227e4f60eb8c2da14f90b4cdb95497a8
|
|
| BLAKE2b-256 |
5cf9a185f40a921e82349d4f28f54cd4e708157b3dd0f95988bef7d376226429
|
File details
Details for the file rager-0.1.5-py3-none-any.whl.
File metadata
- Download URL: rager-0.1.5-py3-none-any.whl
- Upload date:
- Size: 17.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.24 {"installer":{"name":"uv","version":"0.11.24","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1bcc33e54a91533a38a886b6f6832f816b75c63415aa98c554d66b3947dfea38
|
|
| MD5 |
978251619b430e9afeb0d9bd65ef48f3
|
|
| BLAKE2b-256 |
80c56d0461c78e6f86b2ef261747cc9a6ab15a8452ced2dd2e505dbc8f5a61bc
|