Skip to main content

EvalRag

CI PyPI version Python versions License: MIT

Composable RAG evaluation library. Build experiments by plugging together extractors, chunkers, embedders, retrievers, generators, and evaluators — then compare results across configurations.

  • Composable pipeline — swap extractors, chunkers, embedders, retrievers, generators, evaluators like LEGO
  • Hybrid search proving ground — built-in demo shows BM25+Vector outperforms either alone (+21% F1 lift)
  • Interactive HTML reports — F1 scorecards, D3 charts, light/dark mode, timestamped exports
  • Embedding space visualizations — PCA scatter plot with retrieval edges + cosine similarity heatmap
  • Local or cloud models — run fully local with SentenceTransformers + Ollama (no API keys), or plug in cloud providers like OpenAI
  • Zero-config hello world — one command, full experiment, publication-ready report
  • Pure Python BM25 — no native dependencies, no numpy
  • 20 metrics out of the box — F1, Precision, Recall, MRR, MAP at configurable k values

Embedding Space Projection (PCA) — queries and chunks projected to 2D with retrieval edges

Query × Chunk Cosine Similarity Heatmap

Install

pip install evalragkit                  # core only
pip install evalragkit[chromadb,openai] # with ChromaDB + OpenAI
pip install evalragkit[all]             # everything

Quickstart

from evalragkit.extractors.unstructured import PlainTextExtractor
from evalragkit.chunkers.token import TokenChunker
from evalragkit.embedders.openai import OpenAIEmbedder
from evalragkit.stores.chromadb import ChromaDBStore
from evalragkit.retrievers.vector import VectorRetriever
from evalragkit.generators.openai import OpenAIGenerator
from evalragkit.evaluators.ragas import RagasEvaluator
from evalragkit.core.experiment import Experiment, QAPair

# wire up the pipeline
extractor = PlainTextExtractor()
chunker = TokenChunker(chunk_size=500, chunk_overlap=50)
embedder = OpenAIEmbedder()
store = ChromaDBStore()
retriever = VectorRetriever(embedder=embedder, store=store)
generator = OpenAIGenerator()
evaluator = RagasEvaluator()

exp = Experiment(
    name="baseline",
    extractor=extractor,
    chunker=chunker,
    embedder=embedder,
    store=store,
    retriever=retriever,
    generator=generator,
    evaluator=evaluator,
)

# ingest documents
exp.ingest("docs/my_knowledge_base.txt")

# evaluate
dataset = [
    QAPair(question="What is RAG?", ground_truth="RAG combines retrieval with generation."),
]
result = exp.run(dataset)

print(result.mean_scores)
# {'faithfulness': 0.92, 'answer_relevancy': 0.88, ...}

Experiment.save_result(result, "results/baseline.json")

Swap components

from evalragkit.retrievers.keyword import BM25Retriever
from evalragkit.retrievers.hybrid import HybridRetriever

keyword = BM25Retriever()
keyword.add(chunks)  # chunks from ingest

hybrid = HybridRetriever(retrievers=[retriever, keyword], weights=[0.7, 0.3])

Ranking evaluation

from evalragkit.ranking.metrics import RankingEvaluator

ranker = RankingEvaluator(k_values=[1, 3, 5, 10])
results = ranker.rank(
    queries=["What is RAG?"],
    retrievals=[["doc1", "doc2", "doc3"]],
    relevance=[{"doc1", "doc3"}],
)
for r in results:
    print(f"{r.metric}: {r.value:.3f}")

Hello World — Hybrid vs BM25 vs Vector

Run the built-in demo that proves hybrid search outperforms either approach alone:

PYTHONPATH=src python experiments/hello_world/run.py

Generates a timestamped interactive HTML report with F1 scorecards, D3 charts, PCA embedding scatter plot, and cosine similarity heatmap. See the demo report for sample output.

To create your own experiment, duplicate the experiments/hello_world/ folder or start from experiments/template.py.

Docs

Compare experiments

from evalragkit.exploration.reporter import Reporter

table = Reporter.to_table([result_a, result_b])
print(table)

CLI

evalragkit run experiment.json --output results.json
evalragkit compare results_a.json results_b.json
evalragkit datasets
evalragkit download sample

Architecture

Strategy + Composition pattern. Every pipeline stage is a Python Protocol — implement the interface and plug it in. No base classes, no registration required.

Stage Protocol Built-in implementations
Extract Extractor PlainTextExtractor, UnstructuredExtractor, OCRExtractor
Chunk Chunker TokenChunker
Embed Embedder SentenceTransformerEmbedder, OpenAIEmbedder, OllamaEmbedder
Store Store ChromaDBStore
Retrieve Retriever VectorRetriever, BM25Retriever, HybridRetriever
Generate Generator OpenAIGenerator, OllamaGenerator
Evaluate Evaluator RagasEvaluator
Rank Ranker RankingEvaluator

License

MIT

Metadata

Release files for evalragkit 0.0.20260707040144

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for evalragkit 0.0.20260707040144
File Size Uploaded Provenance Actions
evalragkit-0.0.20260707040144.tar.gz 1.3 MB Without provenance Details for evalragkit-0.0.20260707040144.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for evalragkit 0.0.20260707040144
File Interpreter ABI Platform Actions
evalragkit-0.0.20260707040144-py3-none-any.whl Python 3 none any Details for evalragkit-0.0.20260707040144-py3-none-any.whl

Total release size: 1.4 MB

Release files / evalragkit-0.0.20260707040144.tar.gz

Download URL evalragkit-0.0.20260707040144.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
5cedb2d7731af3fa4b827eae7852ec5c319a7c7b37fb158c5de0060faa52926c
BLAKE2b-256 checksum
How to use checksums
b0a619f9b6aee8a69bbeb0e01c0876b4d5515067234d1b4978134d087e7d74a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.4.20

Release files / evalragkit-0.0.20260707040144-py3-none-any.whl

Download URL evalragkit-0.0.20260707040144-py3-none-any.whl
Size 36.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d593ebd633e64a3c59d55e9f41280ab9cf8b19af2e224304cc9b14cb84cf3995
BLAKE2b-256 checksum
How to use checksums
f4d5434d666c6670ad3aadac316e75f440f73704595ae6c3f018b1d4c27743f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.4.20

Security for evalragkit 0.0.20260707040144

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page