Selected work · 01
Cross-Lingual RAG Evaluation
A controlled study of how much retrieval-augmented generation degrades when questions and documents are in different languages, and which fix closes the gap.
Highlights
What shipped
- Compared keyword search, English-only and multilingual embeddings, query translation, and cross-encoder reranking on German and Spanish questions over an English corpus.
- Showed that a naive English retriever ranks the right paragraph first for only 36.9% of German questions, against 95.8% for multilingual embeddings with reranking.
- Traced the failures in an error analysis, rejected the first explanation, and confirmed the real cause with a direct test.
- Reported every result with bootstrap confidence intervals and paired significance tests rather than single scores.
- Checked the LLM judge against labels from a second, independent model, per language, before trusting its scores, and reported where it could not be validated.
The story
Behind the build
Overview
Most RAG systems are built and evaluated in English, while many users ask in German or Spanish over a knowledge base that is mostly English. The study measures that gap under controlled conditions on XQuAD, a professionally translated benchmark in which every German and Spanish question maps to an exact English paragraph, so retrieval can be scored without guesswork: 1,190 questions per language over 240 paragraphs.
Approach
Five retrieval conditions run behind one interface: BM25, an English-only embedding model, two multilingual embedding models, translating the question before retrieval, and a multilingual cross-encoder reranking the best first stage. Each is scored by recall@k and MRR with bootstrap confidence intervals, and differences are tested with a paired bootstrap on the same questions.
Answers were then generated by a local LLM from the top three paragraphs, for the naive and the best setup, and scored by an LLM judge. Before its scores were used, the judge was checked, per language, against labels on 150 answers from a second model of a different family. That is a weaker check than human labels, and is reported as one.
Outcome
A naive English retriever ranks the right paragraph first for 88.5% of English questions but only 36.9% of German and 34.0% of Spanish ones. Each fix recovers most of that gap, and they stack: multilingual embeddings with reranking reach 95.8% for German and 97.6% for Spanish, within a few points of English. A model roughly twice the size performed no better.

At answer level, correctness followed retrieval: when the right paragraph was missing, the model said it did not know rather than inventing an answer, in 43 of 44 cases. The judge agreed with the second model’s labels on correctness (Cohen’s κ 0.98), but its faithfulness scores could not be validated, and the write-up reports them as such.
What breaks, and why
Half of the German and Spanish questions share no meaningful word with the English paragraph that answers them. On those, keyword search finds the right paragraph 1–2% of the time and English-only embeddings 17–19%. The multilingual retrievers barely notice: with reranking they still reach 93–96%.

Keyword search also did much worse on Spanish than on German. The obvious explanation, that German keeps more English words, turned out to be wrong: both languages share English words at almost the same rate. The real cause is Spanish articles. Words like el, la and los are rare in English text, appearing only in names like Los Angeles, so keyword search treats them as highly informative and sends Spanish questions to the wrong paragraphs. Dropping short words from the queries nearly doubled Spanish accuracy, from 19% to 36%, left German unchanged, and closed the gap.
Keep exploring
More projects
qado.ai IDP: RAG and AI Agents for Procurement
My interdisciplinary project at the AI startup qado.ai: a modular RAG pipeline over contract data, a benchmark for its retrieval quality, and prototype agents for strategic purchasing.
Blog Studio
A web app that turns SEO keywords into source-grounded B2B blog posts in English and German, with a human review step at every stage.
Job Hunt
A local job-search dashboard that writes tailored CVs, cover letters and application emails, and refuses to claim anything the applicant's own CV does not support.
Application Optimizer
A command-line pipeline that scores job fit, tailors a LaTeX CV towards a posting's keywords, and writes a matching cover letter, delivered as two finished PDFs.
Haushalt — Personal Finance Tracker
A local budgeting app that replaced a set of spreadsheets, with linked money pots, automatic capital-gains tax handling and a one-click desktop launcher.
Legacy Data Migration Platform
A relational data platform consolidating historically grown legacy records into a clean target structure, with a Dash front end and REST API for exploration.
Machine Learning Pipeline
A supervised and unsupervised modelling pipeline in Python, covering feature engineering, hyperparameter tuning, and cross-validated evaluation.
In design
Automated Trading System
The design for an automated swing-trading system on Interactive Brokers, built around separate processes, shared backtest and live code, and safety rules that must exist before any real order.
Questions?