Skip to main content

RAG evaluation library — LLM-as-judge for hallucination detection, faithfulness, answer relevancy. Local or self-hosted. Alternative to ragas.

Project description

rageval-ai

PyPI version Python versions Downloads License: MIT GitHub stars Open in HF Spaces

Drop-in RAG evaluation for Python — no server required. Evaluate any RAG/LLM output with one function call using LLM-as-judge methodology. Bring your own API key (OpenAI, OpenRouter, Azure, Anthropic), get faithfulness, hallucination, answer relevancy and 8+ more metrics back as a dict.

from rageval_sdk import evaluate

result = evaluate(
    question="What is the capital of France?",
    answer="Paris.",
    contexts=["Paris is the capital of France."],
)
print(result["overall_score"])         # 0.95
print(result["hallucination_score"])   # 0.02

That's it. No Docker, no SaaS account, no opaque internal LLM judge — your key, your model, your data.


Why rageval-ai?

rageval-ai Ragas DeepEval TruLens
Install & run in 3 lines ⚠️ ⚠️ ⚠️
No server / SaaS required
Bring-your-own LLM (any OpenAI-compatible endpoint) ⚠️ ⚠️ ⚠️
OpenRouter / Azure / Anthropic out of the box ⚠️ ⚠️ ⚠️
Two-stage judge (cheap+strong models)
Background / non-blocking evaluation ⚠️ ⚠️
Self-hosted FastAPI server option
Webhook callbacks
LangChain callback handler ⚠️ ⚠️
Type hints (PEP 561) ⚠️ ⚠️ ⚠️
Single dependency (httpx)

✅ = first-class, ⚠️ = possible but more setup, ❌ = not supported.

Use rageval-ai when you want a zero-ceremony way to score RAG outputs from a script, notebook, or production pipeline without adopting a new framework.


Installation

pip install rageval-ai

Requires Python 3.10+. The only runtime dependency is httpx.


Mode 1: Local Evaluation (No Server)

Set your API key once:

export OPENAI_API_KEY="sk-your-key"

Single Trace (3 lines)

from rageval_sdk import evaluate

result = evaluate("What is the capital of France?", "Paris.", ["Paris is the capital of France."])
print(result["overall_score"])  # 0.95

Batch Evaluation

from rageval_sdk import evaluate_batch

results = evaluate_batch([
    {"question": "What is RAG?", "answer": "Retrieval-Augmented Generation.", "contexts": ["RAG combines retrieval with generation."]},
    {"question": "What is Python?", "answer": "A programming language.", "contexts": ["Python was created by Guido van Rossum."]},
])

for r in results:
    print(f"Score: {r['overall_score']}")

Custom Provider (OpenRouter, Azure, etc.)

from rageval_sdk import evaluate, EvalConfig

config = EvalConfig(
    api_key="sk-or-...",
    base_url="https://openrouter.ai/api/v1",
    stage_1_model="qwen/qwen3-235b-a22b-2507",
    stage_2_model="qwen/qwen3-32b",
)

result = evaluate("Question?", "Answer.", ["Context."], config=config)

See examples/ for ready-to-run LangChain, LlamaIndex and OpenRouter notebooks.


Mode 2: Self-Hosted Server

Deploy the FastAPI evaluation server on your own infrastructure, then send traces from any client.

1. Deploy Server

git clone https://github.com/CYBki/llm-evaluation.git
cd llm-evaluation

# Configure
cp .env.example .env
nano .env  # set your OPENAI_API_KEY and other settings

# Start
docker compose up -d

# Verify
curl http://localhost:8000/health

2. Send Traces via SDK

from rageval_sdk import RagEvalClient

client = RagEvalClient(
    api_url="http://your-server:8000",
    api_key="your-api-key",
)

# Submit trace for evaluation
result = client.ingest(
    question="What is the capital of France?",
    answer="The capital of France is Paris.",
    contexts=["Paris is the capital and largest city of France."],
)

# Get evaluation results
trace = client.get_trace(result["id"])
print(trace["evaluation"]["overall_score"])

3. Auto-Evaluate in Your RAG Pipeline

from rageval_sdk import RagEvalClient

client = RagEvalClient(api_url="http://your-server:8000", api_key="key")

def handle_query(query):
    answer, contexts = my_rag_pipeline(query)  # your existing code

    # Non-blocking: sends to server for background evaluation
    client.ingest(question=query, answer=answer, contexts=contexts)

    return answer  # user gets answer immediately

4. Webhook Notifications

client.ingest(
    question="Q",
    answer="A",
    contexts=["C"],
    webhook_url="https://your-app.com/webhook",  # results POSTed here when ready
)

Background Evaluation (Local, Non-blocking)

from rageval_sdk import RagEvaluator

evaluator = RagEvaluator(api_key="sk-...", max_workers=4)

for query in user_queries:
    answer, contexts = my_rag_pipeline(query)
    evaluator.submit(question=query, answer=answer, contexts=contexts)

results = evaluator.wait()
evaluator.shutdown()

LangChain Integration

from langchain_openai import ChatOpenAI
from rageval_sdk import RagEvalCallback

callback = RagEvalCallback(api_key="sk-...")
llm = ChatOpenAI(callbacks=[callback])
# every LLM call in your chain is auto-evaluated in the background

A full RetrievalQA example is in examples/langchain_integration.py.


Evaluation Metrics

Metric Description
overall_score Weighted composite score (0-1)
hallucination_score Detects fabricated information
faithfulness Answer grounded in context
answer_relevancy Answer relevance to question
context_precision Quality of retrieved context
context_recall Coverage of necessary information
clarity Answer clarity
coherence Answer coherence
helpfulness Answer helpfulness
completeness Answer completeness
citation_check Source citation validation

API Reference

Local Mode

Function Description
evaluate(question, answer, contexts) Evaluate single trace (sync)
evaluate_batch(traces) Evaluate multiple traces in parallel
evaluate_trace(question, answer, contexts, config=) Async version
RagEvaluator(max_workers=4) Background evaluator
EvalConfig(api_key=, base_url=, ...) Custom configuration

Server Mode

Method Description
RagEvalClient(api_url, api_key) Connect to server
client.ingest(question, answer, contexts) Submit trace
client.get_trace(trace_id) Get results
client.list_traces(limit, offset) List all traces
client.health() Check server health

Roadmap

  • v0.3 — Async batch API, retry/backoff, deterministic-mode for CI
  • v0.4 — Native LlamaIndex evaluator
  • v1.0 — Stable API, semantic-versioning guarantees

See CHANGELOG.md for release history.


Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md.


License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rageval_ai-0.2.4.tar.gz (29.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rageval_ai-0.2.4-py3-none-any.whl (32.3 kB view details)

Uploaded Python 3

File details

Details for the file rageval_ai-0.2.4.tar.gz.

File metadata

  • Download URL: rageval_ai-0.2.4.tar.gz
  • Upload date:
  • Size: 29.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for rageval_ai-0.2.4.tar.gz
Algorithm Hash digest
SHA256 fd40fbb25759bf56a62a6a231b85b2dc67510eaa2c267be4e715f24ff7f7c4a2
MD5 b432694f987f3f60520429c016963592
BLAKE2b-256 d8093cf97ca433fd9cf0d439f59bdf52599924d010291e4e46c86ca1db798eef

See more details on using hashes here.

File details

Details for the file rageval_ai-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: rageval_ai-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 32.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for rageval_ai-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 af5fee7290c49696c76e74531efb5cc599910519f1fe8b29d402b03e41bf8d3a
MD5 289eb131f2c81d57ada0643dc2f31576
BLAKE2b-256 44323a49b1a5a3ea4b010a7dae6accf138a4e86a08aeddb4c231cd5339ff424a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page