Drei RAG-Stacks. Derselbe Korpus, derselbe Embedding-Index, dieselben acht Fragen. Das Ergebnis ist überraschend klar — und es betrifft fast jeden, der aktuell einen eigenen Retrieval-Stack pflegt.

Die Frage

Wir betreiben einen RAG-Index über knapp 2.002 deutschsprachige Fach-Chunks (BPM-Publikationen, Foliensätze, Monatsbeiträge). Heutiger Stack: ein klassischer numpy-Cosine-Index über intfloat/multilingual-e5-small-Embeddings, ein qwen-LLM dahinter. Funktioniert, ist schlank, ist erklärbar.

Die Frage war: Bringt Haystack als Framework messbar mehr? Und wenn ja — liegt das am Framework selbst oder erst, wenn man einen Cross-Encoder-Reranker davorhängt, was Haystack mit drei Zeilen Code erlaubt?

Setup

Drei Modi, identischer Embedding-Index, identische Top-6-Auswahl als Output:

  • Baseline: numpy-Dot-Product über embeddings.npy, wie der bestehende Stack es macht.
  • Haystack pur: dieselben Embeddings, aber durch InMemoryEmbeddingRetriever in einer Haystack-Pipeline.
  • Haystack + Reranker: Top-20 per Cosine retrieven, dann per Cross-Encoder (BAAI/bge-reranker-v2-m3) auf Top-6 einkochen — das, wofür Cross-Encoder gebaut sind: Query+Doc gemeinsam bewerten statt nur Vektor-Distanz.
Haystack-Pipeline mit Reranker (gekürzt)
pipe = Pipeline()
pipe.add_component("text_embedder", SentenceTransformersTextEmbedder(
    model="intfloat/multilingual-e5-small", prefix="query: "))
pipe.add_component("retriever", InMemoryEmbeddingRetriever(
    document_store=store, top_k=20))
pipe.add_component("ranker", SentenceTransformersSimilarityRanker(
    model="BAAI/bge-reranker-v2-m3", top_k=6))
pipe.add_component("prompt_builder", PromptBuilder(template=TPL))
pipe.add_component("generator", OpenAIGenerator(
    api_base_url="http://litellm.local/v1",
    model="qwen3.5-122b-bunker"))

pipe.connect("text_embedder.embedding", "retriever.query_embedding")
pipe.connect("retriever.documents", "ranker.documents")
pipe.connect("ranker.documents", "prompt_builder.documents")
pipe.connect("prompt_builder.prompt", "generator.prompt")

Die Zahlen

Für jede Frage habe ich die Top-6-Treffer aller drei Modi extrahiert und gegen die Baseline verglichen — Jaccard-Overlap (wie viele gemeinsame Chunks?) und Rank-Shift (wie viele Positionen bewegen sich gemeinsame Chunks im Mittel?). Acht Fragen aus dem realen Use-Case (Mitbestimmung, DSGVO, AI Act, Datenschutz, mobiles Arbeiten):

Eval-Ergebnis je Frage (Jaccard vs. Baseline)
Frage                                                       j↔Hay  j↔Rerank
─────────────────────────────────────────────────────────────────────────
Mitbestimmungsrechte BR bei Gamification                    1.00   0.80
Datenschutzfolgenabschätzung KI im Personalmanagement       1.00   0.33  ★
Arbeitsrechtliche Pflichten bei Headset-Einsatz             1.00   0.50
Voraussetzungen für mobiles Arbeiten                        1.00   0.43
Automatisierte Entscheidungen nach Art. 22 DSGVO            1.00   0.75
BR bei Einführung von Smartphones                           1.00   0.33  ★
Informationspflichten bei Videoüberwachung                  1.00   0.60
Datenschutzbeauftragter bei neuen Personalsystemen          1.00   0.50
─────────────────────────────────────────────────────────────────────────
Mittel                                                      1.00   0.53

Zwei Befunde, beide eindeutig:

  1. Haystack ohne Reranker = Baseline. Jaccard 1.00 über alle acht Fragen. Der Sanity-Check passt: gleiche Embeddings → gleiche Cosine-Reihenfolge → identische Treffer. Das Framework allein ändert nichts am Retrieval. Wer Haystack nur wegen schöneren Pipeline-Codes einbaut, gewinnt 70 Zeilen weniger Boilerplate. Sonst nichts.
  2. Reranker dreht das Top-6 substanziell um. Mittlerer Jaccard 0.53 — im Schnitt sind nur ~3 von 6 finalen Treffern identisch zur Baseline. 11 von 48 Reranker-Treffern (23 %) wären in der Baseline-Auswahl gar nicht erschienen. Bei zwei Fragen (DSFA, BR bei Smartphones) sind nur 2 von 6 Treffern identisch — der Reranker baut die Auswahl praktisch neu zusammen.

Wo der Reranker wirklich gewinnt — ein konkretes Beispiel

Frage: „Wann ist eine Datenschutzfolgenabschätzung beim Einsatz von KI-Systemen im Personalmanagement erforderlich?" — eine spezifische regulatorische Pflichtfrage.

Baseline (Cosine über e5-small)
0.880  Foliensatz | KI ist mehr als ChatGPT
0.875  Foliensatz | KI for HR: Aktuelle Nutzung und Trends
0.872  Hype oder Hope? Daten und KI im Diversitätskontext
0.871  Learning Lunch „Strategisches Personalmanagement und KI"
0.871  Foliensatz | KI for HR: Aktuelle Nutzung und Trends
0.868  KI ist mehr als ChatGPT – aber wie finde ich passende Lösungen
Reranker (Cross-Encoder bge-reranker-v2-m3)
0.802  Foliensatz | KI ist mehr als ChatGPT
0.754  Foliensatz | How-to Betriebsvereinbarung zu KI ⭐  (neu)
0.550  Foliensatz | KI for HR: Aktuelle Nutzung und Trends
0.451  Foliensatz | KI for HR: Aktuelle Nutzung und Trends
0.420  Foliensatz | KI for HR: Aktuelle Nutzung und Trends
0.353  Foliensatz | Fachgruppe HR BP | Talking Papers ⭐  (neu)

Die Baseline wärmt sich auf allen Texten, die lexikalisch mit „KI" und „HR" überlappen — darunter ein Aufsatz zu Diversität, der mit der Frage nach Datenschutzfolgenabschätzung nichts zu tun hat. Der Reranker kickt diesen Off-Topic-Treffer raus und holt stattdessen den „How-to Betriebsvereinbarung zu KI"-Foliensatz nach vorne — der inhaltlich genau das tut, was die Frage verlangt: regulatorische Pflichten beim KI-Einsatz im HR-Kontext aufdröseln.

Inhaltlich auch interessant: die Score-Spreizung. Bei der Cosine-Baseline liegen die Top-6 zwischen 0.868 und 0.880 — ein Bandbreiten-Unterschied von 1,2 Prozentpunkten, kaum diskriminierend. Beim Cross-Encoder spannt sich der Score von 0.353 bis 0.802 — du siehst jetzt, welcher Treffer wirklich passt und welcher nur lexikalisch in der Nähe ist. Für nachgelagertes Filtern („nur Quellen mit Score > 0.5") plötzlich brauchbar.

Die operative Realität: CPU reicht nicht

Eine harte Wahrheit aus dem Eval: der bge-reranker-v2-m3 ist auf Top-20-Inputs auf CPU 2–6 Minuten pro Anfrage langsam. Das ist für interaktiven Einsatz inakzeptabel. Auf einer mittleren GPU (z. B. RTX 3060 / A2000) sind dieselben 20 Re-Rankings in ~50–150 ms fertig — ein Größenordnungswechsel um den Faktor 1.000.

Wer also den Reranker-Gewinn ernten will, muss eine GPU im Inferenz-Pfad haben. Das ist keine Haystack-Frage; jeder andere Cross-Encoder-Stack stellt dieselbe Anforderung. Aber es heißt: Reranker als Quality-Upgrade lohnt sich nur, wenn die GPU-Inferenz ohnehin steht.

Die ehrliche Lesart

Die Tabelle und das DSFA-Beispiel zeigen: das Delta zwischen einem reinen Embedding-Retrieval und einem Embedding + Cross-Encoder-Stack ist substanziell und reproduzierbar, nicht marginal. Im Schnitt fast die Hälfte der finalen Treffer ändert sich. Bei spezifischen Pflicht-Fragen praktisch zwei Drittel.

Aber: der Gewinn kommt vom Reranker, nicht von Haystack. Das ist eine wichtige Unterscheidung. Wer heute einen funktionierenden selbstgebauten RAG-Stack hat, braucht nicht auf Haystack zu migrieren — sondern muss einen Cross-Encoder vor den Generator hängen. Das lässt sich in jeder Sprache und in jedem Framework machen; SentenceTransformers liefert den Reranker direkt aus, ohne Pipeline-Layer.

Haystacks tatsächlicher Mehrwert ist nicht „Cross-Encoder erlaubt", sondern die Pipeline-Abstraktion als Daten (YAML-serialisierbar, versionierbar, Eval-Komponenten integriert). Das ist die Stärke, wenn man Pipelines pro Tenant oder pro Use-Case konfigurierbar machen will, ohne Code zu deployen. Dort lohnt sich das Framework. Für einen einzelnen statischen RAG-Stack ist es Overkill.

Was das praktisch heißt

  • Wer einen RAG ohne Reranker betreibt: baut einen ein. Mit GPU im Pfad ist es ein Nachmittag Arbeit für ein Drittel weniger Off-Topic-Treffer.
  • Wer Haystack einführen will: nicht wegen des Frameworks selbst — wegen der Pipeline-als-Daten-Eigenschaft. Sinnvoll, wenn man Multi-Tenant oder Multi-Use-Case bauen will.
  • Wer messen will, ob der eigene RAG gut ist: nicht Bauchgefühl — Jaccard + Rank-Shift gegen einen Referenz-Stack. Acht kuratierte Fragen reichen schon für einen klaren Trend.
  • Wer eine GPU-lose Umgebung hat: Reranker bei kleinen Korpora (< 5 docs/Query) machbar; ansonsten beim Embedding-Modell investieren (z. B. BAAI/bge-m3 statt e5-small) — oft mehr Hebel bei vergleichbarer CPU-Last.

Reproduzierbar

Der Test ist ein kleines Repo: drei Python-Files, ein Eval-Script mit den acht Fragen, JSON-Output. Der Korpus ist intern. Wer einen vergleichbaren Eval auf eurem Korpus aufsetzen möchte — meldet euch, das ist ein klar abgegrenzter ein- bis zweitägiger Job mit aussagekräftigem Output.

Brauchen Sie eine ehrliche Einschätzung Ihres RAG-Stacks? Ich baue Evals dieser Art für Bestandssysteme — Sovereign-AI-tauglich, mit Eurem Korpus, mit Zahlen statt Versprechen.

RAG-Eval anfragen