<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ahmed Maaloul · Forschung</title><description>Forschungs- und Engineering-Notizen zu Retrieval, Evaluierung und den Systemen, die KI in Produktion genau halten.</description><link>https://ahmedmaaloul.com/</link><language>de</language><item><title>Ein Leck mit perfekter Kalibrierung: Same-Day-Leakage in der Verspätungsprognose messen</title><link>https://ahmedmaaloul.com/de/research/leakage-perfect-calibration-delay-prediction/</link><guid isPermaLink="true">https://ahmedmaaloul.com/de/research/leakage-perfect-calibration-delay-prediction/</guid><description>Wird „wie läuft der Tag an diesem Flughafen“ über den ganzen Tag statt nur über die bereits vergangenen Stunden berechnet, steigt die PR-AUC um 21 % und der erwartete Kalibrierungsfehler fällt auf 0.00008, was jede Ergebnistabelle als 0.000 ausgibt. Gute Kalibrierung belegt keine saubere Pipeline.</description><pubDate>Sun, 13 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Veröffentlichte Modelle zur Verspätungsprognose werden regelmäßig auf einer
zufälligen Aufteilung evaluiert, mit historischen Merkmalen, die über den
gesamten Datensatz berechnet wurden. Beides sind Lecks. Beim Bau von
&lt;a href=&quot;https://github.com/ahmedmaaloul/transportpredictor&quot;&gt;TransportPredictor&lt;/a&gt; habe ich
gemessen, was das zweite wert ist, und festgestellt, dass sich sein deutlichstes
Symptom hinter einer Kennzahl verbirgt, die üblicherweise als Entwarnung gelesen
wird.&lt;/p&gt;
&lt;h2 id=&quot;aufbau-und-warum-es-us-flüge-sind&quot;&gt;Aufbau, und warum es US-Flüge sind&lt;/h2&gt;
&lt;p&gt;Knapp ist in europäischen Luftfahrtdaten nicht die Menge, sondern die Zielgröße.
Keine Quelle veröffentlicht tatsächliche Abflugzeiten je Flug für europäische
Flughäfen zu den Bedingungen, die dieses Projekt akzeptiert: kein Konto, kein
API-Schlüssel, kein Kontingent, keine Aufbewahrungsklausel. Das US-Verkehrsministerium
veröffentlicht genau das, gemeinfrei, für jeden Inlandsflug.&lt;/p&gt;
&lt;p&gt;Die Methode entsteht deshalb dort, wo die Grundwahrheit in dieser Größenordnung
vorliegt. &lt;strong&gt;Methoden lassen sich zwischen Regionen übertragen, angepasste Modelle
nicht, und nichts in diesem Text beschreibt Frankfurt oder irgendeinen
europäischen Flughafen.&lt;/strong&gt; Leakage ist eine Eigenschaft davon, wie ein Merkmal
gegen eine Uhr berechnet wird, nicht eine Eigenschaft eines Landes. Genau deshalb
lässt sich diese Frage auf dem Korpus beantworten, der sie beantworten kann.&lt;/p&gt;
&lt;p&gt;5.834.764 US-Inlandsflüge ab 15 großen Drehkreuzen, Januar 2023 bis Dezember
2024. Zielgröße ist ein Abflug mit 15 Minuten Verspätung oder mehr; die Basisrate
im Testzeitraum liegt bei 18,7 %. Die Prognose erfolgt &lt;strong&gt;zwei Stunden vor dem
planmäßigen Abflug&lt;/strong&gt;. Ein Merkmal ist also nur zulässig, wenn es zu diesem
Zeitpunkt bereits beobachtbar war. Die Aufteilung ist chronologisch und
überschneidungsfrei: Die letzten beiden Monate werden zurückgehalten.&lt;/p&gt;
&lt;h2 id=&quot;zwei-varianten-desselben-merkmals&quot;&gt;Zwei Varianten desselben Merkmals&lt;/h2&gt;
&lt;p&gt;Der stärkste Einzelprädiktor ist die Verspätungsquote, die am Abflughafen im
bisherigen Tagesverlauf beobachtet wurde. Dafür gibt es zwei Rechenwege:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;as-of&lt;/strong&gt;: nur Flüge, die zum Prognosezeitpunkt tatsächlich abgeflogen waren;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ganzer Tag&lt;/strong&gt;: ein Group-by über den Kalendertag, einschließlich der Stunden,
die noch gar nicht stattgefunden hatten.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die zweite Variante ist kein Strohmann. Genau das liefert ein Group-by von Haus
aus.&lt;/p&gt;























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Kodierung&lt;/th&gt;&lt;th&gt;PR-AUC&lt;/th&gt;&lt;th&gt;Brier-Skill&lt;/th&gt;&lt;th&gt;Kalibrierungsfehler&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;as-of&lt;/td&gt;&lt;td&gt;0.287&lt;/td&gt;&lt;td&gt;+0.015&lt;/td&gt;&lt;td&gt;0.050&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ganzer Tag&lt;/td&gt;&lt;td&gt;0.348&lt;/td&gt;&lt;td&gt;+0.072&lt;/td&gt;&lt;td&gt;&lt;strong&gt;0.00008&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Das Leck ist +21,3 % PR-AUC wert und verfünffacht den Brier-Skill nahezu.&lt;/p&gt;
&lt;h2 id=&quot;entscheidend-ist-die-letzte-zahl&quot;&gt;Entscheidend ist die letzte Zahl&lt;/h2&gt;
&lt;p&gt;Der erwartete Kalibrierungsfehler des undichten Merkmals beträgt 0.00008. Auf die
drei Nachkommastellen gerundet, die eine Ergebnistabelle üblicherweise führt,
steht dort 0.000, und in sechs der neun besetzten Zuverlässigkeitsklassen ist die
Abweichung exakt null. Die as-of-Kodierung kommt auf 0.050, rund
sechshundertfünfzigmal schlechter.&lt;/p&gt;
&lt;p&gt;Ein Modell, das die Antwort gesehen hat, ist auf genau diesen Daten kalibriert,
weil Vorhersage und Ergebnis innerhalb jeder Klasse dieselbe Größe sind.
Kalibrierung gilt gemeinhin als Beleg dafür, dass eine Pipeline sauber ist. Hier
ist sie der deutlichste verfügbare Hinweis darauf, dass sie es nicht ist.&lt;/p&gt;
&lt;h2 id=&quot;warum-eine-grobe-prüfung-das-übersieht&quot;&gt;Warum eine grobe Prüfung das übersieht&lt;/h2&gt;
&lt;p&gt;Derselbe Test auf einer streckenbezogenen Verspätungsquote verschiebt die PR-AUC
von 0.219 auf 0.223, ein Zuwachs von 1,7 %. Streckenbezogene Quoten sind über
Monate stabil, ein Blick in die Zukunft verbessert die Schätzung daher kaum. Wer
Leakage nur an einer groben, träge veränderlichen Gruppierung prüft, kommt zu dem
Schluss, seine Pipeline sei sauber.&lt;/p&gt;
&lt;h2 id=&quot;was-hier-nicht-behauptet-wird&quot;&gt;Was hier nicht behauptet wird&lt;/h2&gt;
&lt;p&gt;Nichts davon besagt, dass das as-of-Modell gut ist. Mit 0.287 gegenüber einer
Basisrate von 0.187 ist es ein moderates Signal, und mehr geben zwei Stunden
Vorlauf nicht her. Die Aussage betrifft ausschließlich die Größe des Abstands zwischen
beiden Kodierungen und die Frage, wo er sich versteckt.&lt;/p&gt;
&lt;h2 id=&quot;der-rest-der-arbeit&quot;&gt;Der Rest der Arbeit&lt;/h2&gt;
&lt;p&gt;Diese Messung stammt aus einem größeren Projekt, dessen übriger Teil als Dashboard
veröffentlicht ist. Es hält dieselbe Grenze ein und benennt sie auf jeder Seite: Frankfurt und
31 weitere europäische Flughäfen sind über die veröffentlichte Tagesreihe von EUROCONTROL
abgedeckt, während das Modell je Flug das oben beschriebene amerikanische ist. Das Dashboard
zeigt also Frankfurts tägliche Pünktlichkeit seit 2022, diese 32 Flughäfen im Ranking vor und
nach Herausrechnen des netzweiten Tageseffekts, sowie eine Model Card mit einer nummerierten
Liste dessen, was das Modell nicht aussagt, beginnend damit, dass es keinen europäischen
Flughafen beschreibt.&lt;/p&gt;
&lt;p&gt;Alles dahinter sind offene Massendaten. Kein Konto, kein API-Schlüssel, kein Kontingent, und
jede Zahl ist auf den Commit zurückführbar, der sie erzeugt hat.&lt;/p&gt;
&lt;p&gt;→ &lt;strong&gt;&lt;a href=&quot;https://ahmedmaaloul.github.io/transportpredictor/&quot;&gt;Das TransportPredictor-Dashboard öffnen&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</content:encoded><category>leakage</category><category>evaluation</category><category>aviation</category></item><item><title>Eine Containment-Metrik ohne Untergrenze: ein Audit des Retrieval-Scorings in GraphRAG</title><link>https://ahmedmaaloul.com/de/research/containment-metric-no-lower-bound/</link><guid isPermaLink="true">https://ahmedmaaloul.com/de/research/containment-metric-no-lower-bound/</guid><description>Ein Null-Retriever, der nur Entitätsnamen zurückgibt, erreicht unter Containment-Scoring 100 % Fakten-Recall. Warum dieser Metrik der Boden fehlt, und ein Channel-Gating-Fix, der ehrliche Systeme nichts kostet.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Retrieval-augmentierte Systeme auf Basis von Wissensgraphen werden häufig mit
einer &lt;em&gt;Containment&lt;/em&gt;-Regel evaluiert: Eine Gold-Passage gilt als gefunden,
sobald der Kontext die Oberflächenform einer daraus extrahierten Entität
enthält. Beim Bau von &lt;a href=&quot;https://github.com/ahmedmaaloul/synapse&quot;&gt;Synapse&lt;/a&gt; bin
ich auf eine Eigenschaft dieser Regel gestoßen, die niemand in einer Metrik
haben will: &lt;strong&gt;sie hat keine Untergrenze&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;das-null-kontroll-ergebnis&quot;&gt;Das Null-Kontroll-Ergebnis&lt;/h2&gt;
&lt;p&gt;Am saubersten zeigt das ein Retriever, der seine Aufgabe unmöglich erfüllen
kann. Auf einem internen Multi-Hop-Benchmark mit 14 Fragen habe ich einen
&lt;em&gt;Null-Retriever&lt;/em&gt; bewertet, der nichts als das alphabetische Entitätsvokabular
des Graphen zurückgibt. Keine Beschreibungen, keine Kanten, keine Prosa, und
keine Möglichkeit, irgendeine Frage zu beantworten.&lt;/p&gt;
&lt;p&gt;Unter Containment-Scoring erreicht er &lt;strong&gt;100 % Fakten-Recall&lt;/strong&gt;. Unter einer
prosa-basierten Regel, die einen Fakt nur anrechnet, wenn der Kontext
tatsächliche Evidenz dafür enthält, erreicht derselbe Retriever &lt;strong&gt;0 %&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;es-repliziert-und-es-ist-nicht-der-bug-eines-einzelnen-systems&quot;&gt;Es repliziert, und es ist nicht der Bug eines einzelnen Systems&lt;/h2&gt;
&lt;p&gt;Derselbe Mechanismus zeigt sich auf HotpotQA (n = 50). Dessen Both-gold-Regel
rechnet eine Frage nur dann an, wenn beide zugehörigen Gold-Absätze gefunden
wurden; ein Graph-only-Retriever erreicht darauf unter Containment 100 % und 0 %
unter Prosa-Grounding, wobei 93 % seiner angerechneten Treffer aus
Entitätsnamen-Blöcken stammen statt aus abgerufener Evidenz.&lt;/p&gt;
&lt;p&gt;Um eine Implementierungs-Eigenheit auszuschließen, habe ich dieselbe
Null-Kontrolle gegen ein zweites, unabhängig entwickeltes GraphRAG-System
laufen lassen, LightRAG. Gleiches Bild: Ein Retriever ohne jede Evidenz
erreicht 100 % unter Containment und 0 % unter Prosa-Grounding. Die Inflation
ist eine Eigenschaft der Metrik, nicht einer Codebasis.&lt;/p&gt;
&lt;h2 id=&quot;was-ehrliches-scoring-übrig-lässt&quot;&gt;Was ehrliches Scoring übrig lässt&lt;/h2&gt;
&lt;p&gt;Unter prosa-basiertem Scoring ist der Vorteil des Wissensgraphen real, aber
budgetneutral: Eine einfache Passagen-Baseline erreicht dasselbe Ergebnis und
liest dabei 45 % des Kontexts. Das ist eine bescheidenere Aussage, als die
meisten GraphRAG-Evaluationen treffen, und ich halte sie für die zutreffende
in Setups wie diesem.&lt;/p&gt;
&lt;h2 id=&quot;der-fix&quot;&gt;Der Fix&lt;/h2&gt;
&lt;p&gt;Das Paper schlägt Channel-Gated-Scoring vor: Eine Entität wird nur
angerechnet, wenn sie über einen Kanal ankommt, der Evidenz tragen kann. Das
kostet prosa-tragende Systeme nichts und beseitigt den freien Boden
vollständig. Das Null-Kontroll-Protokoll ist mit dem Code veröffentlicht,
sodass sich dasselbe Audit gegen jede eigene Retrieval-Eval fahren lässt,
bevor man ihren Zahlen vertraut.&lt;/p&gt;
&lt;p&gt;Wer ein GraphRAG-System mit Recall-artigen Metriken evaluiert, hat mit einer
Null-Kontrolle den günstigsten Sanity-Check überhaupt: Wenn ein Retriever,
der nur Entitätsnamen zurückgibt, punkten kann, misst die Metrik Vokabular,
nicht Retrieval.&lt;/p&gt;</content:encoded><category>graphrag</category><category>evaluation</category><category>retrieval</category></item><item><title>GraphRAG-Retrieval in Synapse messen</title><link>https://ahmedmaaloul.com/de/research/measuring-graphrag-retrieval-synapse/</link><guid isPermaLink="true">https://ahmedmaaloul.com/de/research/measuring-graphrag-retrieval-synapse/</guid><description>Acht paraphrasierte Anfragen gegen eine geseedete Neo4j-Fixture: Hit@1 88 %, MRR 0.92. Was Synapses Eval-Harness misst, und was es bewusst nicht behauptet.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die meisten RAG-Projekte werden ausgeliefert, ohne Retrieval überhaupt zu
messen. Synapse bringt ein kleines Harness mit, &lt;code&gt;backend/eval/&lt;/code&gt;, das aus
„fühlt sich grounded an“ Zahlen macht, die sich über Änderungen hinweg
verfolgen lassen. Diese Notiz dokumentiert, was gemessen wird und wie die
Ergebnisse zu lesen sind.&lt;/p&gt;
&lt;h2 id=&quot;aufbau&quot;&gt;Aufbau&lt;/h2&gt;
&lt;p&gt;Das Harness seedet einen Fixture-Graphen nach Neo4j (15 Entitäten, 10
Relationen), führt für jede Anfrage den Produktions-Retrieval-Pfad aus
(&lt;code&gt;retrieve_subgraph&lt;/code&gt;) und bewertet die zurückgegebenen Entitäten. Embeddings
werden lokal mit &lt;code&gt;fastembed&lt;/code&gt; berechnet, das Ganze läuft also offline:&lt;/p&gt;
&lt;pre class=&quot;astro-code site&quot; style=&quot;background-color:var(--shiki-background);color:var(--shiki-foreground); overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; neo4j&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;make&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; eval&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;        # schreibt backend/eval/results.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die 8 Anfragen sind bewusst so paraphrasiert, dass sie keinerlei lexikalische
Überlappung mit den Entitätsnamen haben. „Welche Technologie speichert Daten
als verbundene Knoten und Kanten?“ muss Neo4j über Embedding-Ähnlichkeit
erreichen; eine Stichwortsuche würde den Großteil des Sets verfehlen. Genau
diese Eigenschaft wird getestet: Hybrides Retrieval (Vektor- und
Volltext-Seeds, dann 1-Hop-Graph-Expansion) soll Paraphrase überleben.&lt;/p&gt;
&lt;h2 id=&quot;ergebnisse&quot;&gt;Ergebnisse&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Metrik&lt;/th&gt;&lt;th&gt;Wert&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Hit@1&lt;/td&gt;&lt;td&gt;88 %&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Recall@8&lt;/td&gt;&lt;td&gt;100 %&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Precision@8&lt;/td&gt;&lt;td&gt;17 %&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MRR&lt;/td&gt;&lt;td&gt;0.917&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Hit@1 und MRR sind das Qualitätssignal: Bei 7 von 8 Anfragen ist die
top-platzierte Entität eine korrekte, und jede Anfrage hat alle erwarteten
Entitäten irgendwo in den Top 8. MRR ist der mittlere reziproke Rang, also der
Durchschnitt von eins geteilt durch die Position der ersten korrekten Entität;
0.917 heißt, dass der erste Treffer fast immer ganz oben steht.&lt;/p&gt;
&lt;p&gt;Precision@8 wirkt alarmierend, bis man sieht, dass sie konstruktionsbedingt
niedrig ist. Die meisten Anfragen haben nur ein oder zwei relevante
Entitäten, und der Retriever gibt 8 Kandidaten zurück, weil die UI eine
Nachbarschaft hervorhebt, nicht einen einzelnen Knoten. Weniger Kandidaten
zurückzugeben würde die Precision erhöhen und das Produkt verschlechtern.&lt;/p&gt;
&lt;h2 id=&quot;was-hier-nicht-behauptet-wird&quot;&gt;Was hier nicht behauptet wird&lt;/h2&gt;
&lt;p&gt;Das ist eine Eval in Fixture-Größe: 8 Anfragen über einen Graphen mit 15
Entitäten. Sie fängt Regressionen im Retrieval-Pfad und validiert, dass
Paraphrase den Weg durch die Embeddings übersteht, und genau das brauche ich
von der CI. Über Retrieval-Qualität auf großen Graphen, verrauschten
Extraktionen oder adversarialen Anfragen sagt sie nichts.&lt;/p&gt;
&lt;p&gt;Sie erbt außerdem eine subtilere Schwäche des Entity-Level-Scorings selbst,
aus der eine eigene Untersuchung wurde: Eine Scoring-Regel, die
Entitätsnamen anrechnet, lässt sich von einem Retriever austricksen, der
nichts anderes zurückgibt. Dieses Ergebnis, ein Null-Kontroll-Audit des
Containment-Scorings mit Replikation auf HotpotQA und LightRAG, ist separat
aufgeschrieben in
&lt;a href=&quot;https://ahmedmaaloul.com/de/research/containment-metric-no-lower-bound/&quot;&gt;dem Paper&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>graphrag</category><category>evaluation</category><category>neo4j</category></item></channel></rss>