Benchmark report · September 2026

Same embedding model. Higher on every dataset.

cob-rag-engine measured on six public BEIR datasets, 272,117 documents and 3,727 judged queries, through its public API with no LLM and no API key. Every number on this page can be re-run from the repository.

Mean nDCG@10, six BEIR datasets

Grey bars are hosted embedding APIs used alone (published MTEB scores); amber are the baselines this engine builds on.

6 / 6datasets where hybrid retrieval beats bge-base-en-v1.5's published score
100%of 55 questions over real PDFs, scans, DOCX, XLSX and slides answered in the top 5
412 / 412cross-tenant and account attacks refused
2.1 GBmemory for the whole default stack on CPU, 270k chunks indexed

Retrieval quality

BEIR: six datasets, official judgements

Science, medicine, finance and argument retrieval; the test split of each. Documents go in through POST /api/v1/ingest/records, queries through POST /api/v1/query/retrieve. Embedding model BAAI/bge-base-en-v1.5, the default when these were measured; it is now BAAI/bge-m3, and a BGE-M3 re-run is pending. nDCG@10 measures how good the top ten results are.

BM25 (BEIR paper) bge-base-en-v1.5, published cob-rag-engine, default hybrid
nDCG@10SciFactNFCorpusArguAnaSCIDOCSFiQATREC-COVIDMean
BM25 keyword search (BEIR paper)0.6650.3250.3150.1580.2360.6560.393
bge-base-en-v1.5, published (MTEB)0.7430.3740.6380.2170.4060.7800.526
Engine, dense only0.7400.3740.6390.2170.4050.7920.528
Engine, hybrid with reciprocal-rank fusion0.7360.3650.5600.1980.3700.8020.505
Engine, hybrid (default)0.7610.3820.6400.2210.4170.8030.537
Engine, hybrid + cross-encoder reranker0.7550.3680.5290.2010.4300.8520.523
Recall@100SciFactNFCorpusArguAnaSCIDOCSFiQATREC-COVID*
BM25 (BEIR paper)0.9080.2500.9420.3560.5390.498
bge-base-en-v1.5, published0.9630.3370.9930.4960.742n/a
Engine, dense only0.9630.3370.9930.4950.7390.590
Engine, hybrid (default)0.9760.3420.9920.4820.7340.610

* Capped recall, as BEIR reports it for TREC-COVID, whose queries have up to ~500 relevant documents. Sources: BM25 from the BEIR paper, Tables 2 and 9; bge-base-en-v1.5 from the MTEB results repository (FiQA from the model authors' own run). Hosted APIs in the hero chart: MTEB published scores for OpenAI text-embedding-3-small and -3-large and Cohere embed-english-v3.0.

The harness reproduces the published model

Dense retrieval lands within 0.003 of bge-base's published nDCG@10 on five datasets and 0.012 above it on TREC-COVID. Chunking, the query instruction and the index lose nothing.

Hybrid wins on all six

A BM25 keyword leg with stemming, fused with dense search, beats the model alone everywhere and beats BM25 by a wide margin. No larger model, no LLM, nothing paid.

How you fuse decides whether hybrid helps

Reciprocal-rank fusion, the common default, lost to dense-only on five of six datasets. Weighted score fusion (0.75 dense, 0.25 keyword, normalized per query) wins on five and ties the sixth. The weight was chosen on BEIR's dev and train judgements and only then measured on test.

The reranker is a trade, not a free win

The cross-encoder lifts the question-answering sets (FiQA +0.013, TREC-COVID +0.048) and hurts the other four, ArguAna by 0.11. It costs about 0.3 s per query on a GPU and 15 s on CPU, so it ships off and is enabled per knowledge base.

Real documents

55 questions over the files customers actually upload

Seven files go through the same upload path a customer uses: parse, chunk, embed. Answers sit in prose, in tables, in spreadsheet cells, on slides, and on a scanned page that only OCR can read. A question counts when a chunk from the right file holds every fact of the answer, including both the row label and the value for a table.

Answer lives inQuestionsHit@5
PDF text, two columns and a running header18100%
PDF table3100%
Scanned PDF, image only (OCR)4100%
DOCX text and table8100%
XLSX spreadsheet, two sheets7100%
PPTX slides4100%
HTML with navigation and footer6100%
Markdown with a table and code5100%
ConfigurationHit@1Hit@5MRR
Dense87%100%0.93
Hybrid (default)91%100%0.95
Hybrid + reranker94%100%0.97

On this question-and-answer set the reranker helps, as the BEIR results predict for Q&A content. Each answer's section heading reaches the model with the chunk, so "Which release added offline checkout?" is answerable when the version number lives only in the heading.

Answer models

Which model writes the best reply, in English, Hindi and Hinglish

Each model answers the same 94 questions from the same passages, through the engine's own answer path. We score the answer, not the style: did it state the right facts, cite its sources, build a table when asked, and decline when the passages do not say. A model that invents an answer to a question it cannot know never counts as recommended, however good it sounds. A judge model grades how natural the Hindi and Hinglish read.

Recommended setup

English answersgpt-oss-120b (thinking low)openai/gpt-oss-120b

Best overall: 93% of answers passed, 100% of unanswerable questions correctly declined, ₹7.2 per 1,000 answers.

Hindi and Hinglish answersGemma 4 31Bgoogle/gemma-4-31b-it

90% passed on Hindi and Hinglish, 100% declined correctly, 100% in the right register, first word in 609 ms.

Hindi and Hinglish, budgetGemma 4 26Bgoogle/gemma-4-26b-a4b-it

93% passed on Hindi and Hinglish at ₹9.4 per 1,000 answers.

Fast modelGPT-6 Lunaopenai/gpt-6-luna

Reads each message in 1.94 s at p90: 98.9% accurate, ₹13.6 per 1,000 messages.

Fast model, budgetGemma 4 26Bgoogle/gemma-4-26b-a4b-it

97.7% accurate at ₹4.9 per 1,000 messages, 64% less than GPT-6 Luna.

Save 64%: switch to Gemma 4 26B (₹4.9 vs ₹13.6 per 1,000 messages, 97.7% accurate).
Every answer model, best first
ModelPassedDeclines when unsureTablesFirst word p50₹ per 1,000$ per 1,000Result
openai/gpt-oss-120b thinking low
Recommended cheapest most accurate Self-hostable
93%100%90%1.14 s₹7.20.086Meets the bar
google/gemma-4-26b-a4b-it
Hindi budget Self-hostable
88%100%80%1.23 s₹9.40.112Meets the bar
google/gemma-4-31b-it
Recommended for Hindi Self-hostable
88%100%80%594 ms₹38.00.452Meets the bar
google/gemini-2.5-flash
88%100%20%1.25 s₹42.00.500Meets the bar
meta-llama/llama-3.3-70b-instruct via groq
fastest Self-hostable
86%100%10%547 ms₹62.90.749Meets the bar
openai/gpt-6-luna
85%100%60%1.32 s₹13.60.161Meets the bar
deepseek/deepseek-v4.1-flash
Self-hostable
91%88%100%1.27 s₹16.20.193Below the bar
invents answers to questions it cannot know
mistralai/mistral-small-3.2-24b-instruct
Self-hostable
89%81%60%860 ms₹11.00.131Below the bar
invents answers to questions it cannot know
google/gemini-2.5-flash-lite
89%81%70%1.00 s₹12.50.148Below the bar
invents answers to questions it cannot know
openai/gpt-4.1-mini
88%94%60%953 ms₹45.50.542Below the bar
invents answers to questions it cannot know
qwen/qwen3.8-27b via cerebras
Self-hostable
88%88%70%672 ms₹1191.415Below the bar
invents answers to questions it cannot know
qwen/qwen3-next-80b-a3b-instruct
Self-hostable
87%94%20%734 ms₹16.60.198Below the bar
invents answers to questions it cannot know
qwen/qwen3-30b-a3b-instruct-2507
Self-hostable
86%81%50%1.04 s₹9.10.108Below the bar
invents answers to questions it cannot know
openai/gpt-5.4-nano
84%63%60%937 ms₹24.20.288Below the bar
invents answers to questions it cannot know
anthropic/claude-haiku-4.5
best Hindi tone
82%69%90%1.52 s₹1521.815Below the bar
invents answers to questions it cannot know
meta-llama/llama-4-scout
Self-hostable
77%31%20%1.16 s₹15.10.180Below the bar
pass rate too low, invents answers to questions it cannot know
mistralai/mistral-small-2603
Self-hostable
76%100%70%719 ms₹13.50.160Below the bar
pass rate too low
qwen/qwen3.5-35b-a3b
Self-hostable
71%25%30%1.23 s₹24.40.290Below the bar
pass rate too low, invents answers to questions it cannot know
qwen/qwen3.5-9b
Self-hostable
67%25%0%1.09 s₹12.50.149Below the bar
pass rate too low, invents answers to questions it cannot know

By language

Passed on English, Hindi and Hinglish, then everything measured on Hindi and Hinglish together. Naturalness and register come from a judge model (openai/gpt-4.1-mini) and are graded for Hindi and Hinglish only.

The same models, per language
ModelEnglishHindiHinglishHi + Hing: passedDeclinesTablesFirst word₹ per 1,000NaturalnessRegister
openai/gpt-oss-120b96%95%80%88%100%100%1.23 s₹7.43.40 / 573%
google/gemma-4-26b-a4b-it85%90%95%93%100%100%1.14 s₹8.93.83 / 593%
google/gemma-4-31b-it87%85%95%90%100%100%609 ms₹39.63.77 / 5100%
google/gemini-2.5-flash89%85%90%88%100%50%1.25 s₹42.93.62 / 593%
meta-llama/llama-3.3-70b-instruct89%90%75%83%100%25%578 ms₹65.63.65 / 598%
openai/gpt-6-luna85%85%85%85%100%100%1.59 s₹14.23.38 / 573%
deepseek/deepseek-v4.1-flash94%85%90%88%75%100%1.27 s₹18.24.10 / 598%
mistralai/mistral-small-3.2-24b-instruct93%85%85%85%63%100%844 ms₹11.63.50 / 588%
google/gemini-2.5-flash-lite94%85%80%83%63%100%1.01 s₹12.83.73 / 5100%
openai/gpt-4.1-mini93%95%70%83%88%100%1.00 s₹47.83.80 / 585%
qwen/qwen3.8-27b87%85%95%90%75%100%703 ms₹1264.03 / 595%
qwen/qwen3-next-80b-a3b-instruct89%95%75%85%88%50%844 ms₹19.93.90 / 598%
qwen/qwen3-30b-a3b-instruct-250791%80%80%80%63%75%984 ms₹10.13.62 / 585%
openai/gpt-5.4-nano91%75%75%75%38%100%1.05 s₹26.03.38 / 580%
anthropic/claude-haiku-4.589%80%65%73%50%100%1.53 s₹1784.38 / 593%
meta-llama/llama-4-scout76%75%80%78%38%50%1.28 s₹17.53.62 / 5100%
mistralai/mistral-small-260387%70%50%60%100%75%719 ms₹14.23.52 / 593%
qwen/qwen3.5-35b-a3b74%70%65%68%25%50%1.17 s₹28.64.10 / 5100%
qwen/qwen3.5-9b76%55%55%55%0%0%1.07 s₹13.53.65 / 5100%

A model meets the bar when it answers every item, keeps thinking as stated, passes at least 80% of the items and declines at least 95% of the questions its passages cannot answer. Recommended is the highest pass rate among those, then the lowest cost. The Hindi pick also needs, on the Hindi and Hinglish items together, 85% passed, 95% declined correctly and the right register in 95% of the judged replies; among those the highest Hindi pass rate wins, then the fastest first word. The Hindi budget pick is the cheapest model that meets the same bars (register 90%) and matches the Hindi pick's pass rate.

Best Hindi tone: anthropic/claude-haiku-4.5 (4.4 of 5 from the judge), not recommended: it declines only 69% of the unanswerable questions overall (50% on Hindi and Hinglish) and invents an answer for the rest.

94 frozen items (54 English, 20 Hindi, 20 Hinglish; 16 cannot be answered from the passages, 10 ask for a comparison table), the same passages for every model, measured 2026-10-03. Costs are what the provider billed, in rupees at 84 to the dollar. The benchmark cost $0.88 in all (answers $0.72, the Hindi and Hinglish judge $0.16).

Fast models

Which small model understands visitors, and how fast

The assistant labels every message its rules cannot decide (a business question, buying intent, off topic, a request for a person) with a small, fast model. Each model below ran once with a frozen prompt over the same 266 held-out turns in English, Hindi and Hinglish, each asked of the business it was written for. Latency is the label call alone; cost is what the provider billed. The engine serves this table and the dashboard shows it beside the fast-model setting.

Save 64%: switch to Gemma 4 26B (₹4.9 vs ₹13.6 per 1,000 messages, 97.7% accurate). Set RAG_LLM_FAST_MODEL=google/gemma-4-26b-a4b-it, or pick it in the setup wizard or on a knowledge base's Model & keys tab (one click, owners only).
ModelOverallen / hi / hi-LatnBusiness recallReply languageFallbacksLabel p50 / p90 / p99$ per 1,000 labelsResult
meta-llama/llama-3.1-8b-instruct via groq91.0%92.1 / 90.8 / 90.093.1%100.0%0.0%0.18 / 0.21 / 0.40 s0.039Below the bar: recall
meta-llama/llama-3.3-70b-instruct via groq92.1%89.9 / 93.1 / 93.390.3%100.0%1.2%0.47 / 0.56 / 3.59 s0.725Below the bar: recall
google/gemini-2.5-flash-lite (effort none)95.9%96.6 / 95.4 / 95.695.8%100.0%4.3%0.79 / 0.91 / 2.77 s0.134Below the bar: recall
mistralai/mistral-small-2603 (effort none)95.9%97.8 / 94.3 / 95.695.8%100.0%0.0%0.85 / 1.22 / 1.93 s0.056Below the bar: recall
openai/gpt-4.1-nano94.0%95.5 / 93.1 / 93.397.2%100.0%0.0%1.05 / 1.27 / 1.96 s0.131Fastest
qwen/qwen3.8-27b via cerebras (effort none)97.0%96.6 / 97.7 / 96.797.2%100.0%0.0%1.27 / 1.41 / 1.57 s0.214Passes every bar
openai/gpt-4.1-mini97.4%98.9 / 96.6 / 96.798.6%100.0%0.0%1.45 / 1.66 / 2.25 s0.524Passes every bar
qwen/qwen3-next-80b-a3b-instruct97.0%97.8 / 96.6 / 96.791.7%100.0%1.9%0.79 / 1.66 / 2.69 s0.139Below the bar: recall
deepseek/deepseek-v4.1-flash (effort none)98.5%98.9 / 98.9 / 97.894.4%100.0%0.0%1.24 / 1.67 / 2.92 s0.069Below the bar: recall
google/gemma-4-26b-a4b-it (effort none)97.7%97.8 / 98.9 / 96.797.2%100.0%1.9%1.21 / 1.91 / 2.81 s0.058Cheapest
openai/gpt-6-luna (effort none)98.9%98.9 / 100.0 / 97.898.6%100.0%0.6%1.55 / 1.94 / 2.80 s0.162Recommended, most accurate
openai/gpt-oss-120b (effort low)95.1%95.5 / 95.4 / 94.497.2%100.0%4.9%1.44 / 2.28 / 3.46 s0.120Passes every bar
google/gemma-4-31b-it (effort none)95.9%94.4 / 100.0 / 93.397.2%100.0%8.6%2.07 / 2.46 / 3.53 s0.101Below the bar: fallbacks
qwen/qwen3-30b-a3b-instruct-250795.9%97.8 / 94.3 / 95.695.8%100.0%3.1%0.98 / 2.47 / 3.00 s0.090Below the bar: recall
mistralai/mistral-small-3.2-24b-instruct96.6%94.4 / 97.7 / 97.895.8%100.0%5.6%2.00 / 3.10 / 3.71 s0.106Below the bar: recall, fallbacks

Default fast model: openai/gpt-6-luna, the model with the highest business-question recall (98.6%) among those that pass every bar, then the highest overall accuracy (98.9%): p90 1.94 s, $0.162 per 1,000 labels. Budget option (the cheapest passing model): google/gemma-4-26b-a4b-it (64% cheaper than the default, $0.058 per 1,000, 97.7% overall, p90 1.91 s). Fastest passing: openai/gpt-4.1-nano (p90 1.27 s, 94.0% overall). Most accurate: openai/gpt-6-luna (98.9% overall, p90 1.94 s). Bars: overall 90%, each language 85%, business-question recall 97%, reply language 95%, label fallbacks at most 5%. Updated 2026-10-03; thinking control not verified for 0 of 15 rows.

Security and operations

Built to run one service for many customers

The benchmark creates two tenants with a knowledge base each, then tries every key type against the other tenant's data. Latency and throughput use FiQA's 57,638 documents with the engine's default settings.

  • 412/412Cross-tenant reads, writes, deletes, searches, imports, job lookups, settings, conversations, memories, embedding migrations, golden pairs, widget keys, usage queries, past queries, feedback and Content Portal workspaces, staged content, chunks, reviews (finalize included), AI chat and rules refused, also when named from the attacker's own workspace, from tenant keys, knowledge-base keys, an owner's and a member's sign-in, and no key; plus the account attacks (a member on owner-only routes, forged, expired and unsigned tokens, refresh-token reuse, invitation abuse, a removed member, sign-up and reset enumeration, the sign-in lockout) and a suspended tenant's keys stop working
  • refusedWebsite widget key used from another site, with no Origin header, or a secret key presented as a widget key
  • 5 of 8Messages allowed when 8 arrive at once against a 5-per-minute widget limit
  • 0Default passwords: secrets are generated on install, keys are stored hashed, model keys encrypted
GPUCPU only
Retrieval p50, one request at a time45 ms77 ms
Retrieval p9552 ms103 ms
With the reranker on, p50323 ms15.6 s
Queries per second, 1 / 4 / 16 clients22 / 21 / 1514 / 24 / 25
Import, embeddings included107 docs/s~6 passages/s
Memory, whole stack2.1 GB default; +2.3 GB with the reranker

Intel i7-14700K, RTX 5060 Ti 16 GB, Docker Desktop limited to 8 CPUs and 9.4 GB. One API process; throughput scales out with RAG_API_WORKERS. On CPU the embedding model sets the import ceiling; use a hosted embedding model or a GPU for large imports.

What the benchmarks changed

Every finding became a fix, then got measured again

Running the engine against public data exposed defects no unit test had caught. Each is fixed in the engine and listed in the changelog.

FindingBeforeAfter
Retrieval silently capped at what fit an LLM promptRecall@100 0.840.96
Keyword search used raw term frequency, no stemmingFiQA keyword nDCG 0.070.25
Reciprocal-rank fusion dragged results downmean nDCG 0.5050.537
Reranker forced on for every knowledge baseslower and worse on 4 of 6opt-in
Reranker scored every candidate at full precision~6 s per query0.45 s
Diversity step (MMR) was cubic in candidates1,048 ms40 ms
API keys checked with bcrypt on the event loop5 queries/s22 queries/s
An unknown key was checked against every knowledge baseone request, N bcryptsrejected by prefix
Every PDF failed inside the Docker image0 PDFstypeset and scanned PDFs
Embedding migrations dropped search filtersfilters brokenmetadata kept
Deleting a large knowledge base could leave it half-deletedrows without vectorsdatabase first
Tenant keys could read other tenants' import jobsleakscoped

Comparison

Against RAGFlow, Dify, AnythingLLM and R2R

From each project's own documentation, release notes and issue tracker, reviewed September 2026. RAGFlow publishes no retrieval-quality benchmark, so the retrieval numbers above have no counterpart to compare with; the rows below compare what each project documents.

cob-rag-engineRAGFlow 0.27DifyAnythingLLMR2R
LicensePartner terms; commercial licenseApache-2.0Modified Apache-2.0; multi-tenant use needs permissionMITMIT
Tenancy for a multi-customer serviceTenants → knowledge bases, isolation testedOne workspace per userWorkspacesOne organizationUsers, collections
API key scopePer tenant and per knowledge basePer account, full owner powerPer knowledge baseNot reviewedNot reviewed
Website embedScript tag, public key, domain allow-list, rate limitsiframe, token in page URLScript or iframe, public tokenScript, allow-list, limitsNone
Usage metering per customerBuilt inCloud onlyNot documentedNot documentedNot documented
Published retrieval benchmarkBEIR, six datasets, reproducibleNone foundNone foundNone foundNone found
Memory2.1 GB measured16 GB minimum statedNot statedNot statedNot stated
Hybrid keyword + vector searchIndependent legs, weighted fusionVector leg filtered by keyword matchYesVector onlyYes
Document understandingDocling, table structure, OCRDeepDoc, template chunkers (stronger)Not reviewedNot reviewedNot reviewed
Graph RAG, agents, connectorsAgentic mode, web scraperGraphRAG, agent canvas, 20+ connectorsVisual workflowsAgentsKnowledge graphs

Where RAGFlow is ahead

Document layout analysis with DeepDoc and template chunkers for papers, laws and slides; GraphRAG and RAPTOR; an agent canvas; more than twenty data connectors. If those matter most, it is an excellent choice.

Where this engine is ahead

Running a paid chatbot service for many businesses: scoped keys, metering, a hardened website widget and a small footprint. RAGFlow's share token and API key were mutually derivable before 0.22 (CVE-2025-69286), its documented minimum is 16 GB of RAM, and its vector search is filtered by the keyword match, which returns nothing for Thai queries (issue #17041).

Reproduce it

Run every number yourself

You need the stack running and Python 3.12 with httpx and pyarrow. The scripts read the admin key from your environment or the repository's .env. Long runs checkpoint: run the same command again to resume.

# GPU is optional; this overlay embeds in full precision, as published
docker compose -f docker-compose.yml -f docker-compose.gpu.yml \
  -f benchmarks/compose.local-embeddings.yml up -d --build

# BEIR: downloads ~330 MB, imports 272k documents, evaluates
python benchmarks/beir.py --datasets scifact,nfcorpus,arguana,scidocs,fiqa,trec-covid \
  --configs dense,hybrid,"hybrid(rrf)",hybrid+rerank --label mine
python benchmarks/fusion_study.py

# Real documents, security and operations, small policy set
python benchmarks/documents.py --label mine
python benchmarks/ops.py --label mine
python benchmarks/run.py --label mine

Retrieval benchmarks measure whether the right passage is found, not how an LLM words the answer. BEIR is English. Reference numbers for other models are their published results, not re-runs. Method and raw results: the benchmarks/ folder in the repository, available to partners.