Alle Projekte

Data Engineering und RAG

DeutschlandApp

Sieben amtliche Quellen in einer Datenbank, dazu eine KI, die per RAG daraus antwortet, mit Quelle und Diagramm.

Lokaler Prototyp, nie deployed

111.103.767

amtliche Messwerte in einer einzigen PostgreSQL-Datenbank

  • 8,6 Mio.Zeitreihen
  • 2,4 Mio.Bundestag-Dokumente
  • 6.691GENESIS-Tabellen
  • 30 GBDatenbankgröße

110,8 Mio. Zeilen in unter 44 Stunden

Der erste Import im Juli 2026. Spitze: 10,8 Mio. Zeilen in einer Stunde.

025 Mio.50 Mio.75 Mio.100 Mio.12. Juli, 12:0013. Juli, 00:0013. Juli, 12:0014. Juli, 00:00110,8 Mio.

Daten von 1871 bis 2070

95 % der Werte stammen aus den Jahren 2000 bis 2029. Ab 2030 sind es amtliche Vorausberechnungen.

1870
1920
1970
46,6 Mio.
2020
2070

Wo die 30 GB liegen

Die Messwerte liegen in einer TimescaleDB-Hypertable mit 202 Chunks.

  • Messwerte22,6 GB111.103.767 Zeilen
  • Zeitreihen3,5 GB8.598.448 Zeilen
  • Bundestag-Dokumente2,8 GB2.403.885 Zeilen
  • Abgeordnetendaten0,9 GB687.433 Zeilen

Die größten einzelnen Tabellen

9 Tabellen haben über 1 Million Werte, 242 über 100.000.

  • Produktionserhebung der Industrie1,7 Mio.42131BV003, 252.208 Zeitreihen
  • Produktionserhebung der Industrie1,4 Mio.42131BV203, 211.123 Zeitreihen
  • Diagnosen im Krankenhaus1,1 Mio.23131BJ022, 47.958 Zeitreihen
  • Monatsbericht der Industrie1,1 Mio.42111BM104, 6.708 Zeitreihen
  • Diagnosen im Krankenhaus1,1 Mio.23131BJ019, 52.494 Zeitreihen

Aus den Daten werden Antworten: RAG

Das Modell antwortet aus den abgerufenen Daten. Retrieval läuft über Tools und Volltextsuche.

  1. Frage„Wie haben sich die Verbraucherpreise entwickelt?“
  2. RetrievalDie Volltextsuche findet die Statistik unter 13.164 Katalogeinträgen.
  3. Abruf19 MCP-Tools holen die Werte direkt aus der Datenbank.
  4. AntwortText und Diagramm aus den abgerufenen Werten, mit Quelle.
Alle Werte als Tabelle
Stunde+gesamt
12. Juli, 03:00411.050411.050
12. Juli, 04:00528.359939.409
12. Juli, 05:0053.308992.717
12. Juli, 13:001.181.4282.174.145
12. Juli, 14:0047.0672.221.212
12. Juli, 17:0019.2642.240.476
12. Juli, 20:00485.8622.726.338
12. Juli, 21:0042.3962.768.734
12. Juli, 22:001082.768.842
12. Juli, 23:0099.0742.867.916
13. Juli, 00:0062.7642.930.680
13. Juli, 03:0081.6123.012.292
13. Juli, 04:003.219.0716.231.363
13. Juli, 05:007.849.67114.081.034
13. Juli, 06:0010.771.35624.852.390
13. Juli, 07:007.315.33632.167.726
13. Juli, 08:001.359.01133.526.737
13. Juli, 09:00459.63933.986.376
13. Juli, 10:001.667.67735.654.053
13. Juli, 11:006.770.26842.424.321
13. Juli, 12:006.726.30749.150.628
13. Juli, 13:007.132.23056.282.858
13. Juli, 14:005.029.85361.312.711
13. Juli, 15:008.702.53770.015.248
13. Juli, 16:007.247.19277.262.440
13. Juli, 17:008.902.12186.164.561
13. Juli, 18:009.718.38495.882.945
13. Juli, 19:005.449.487101.332.432
13. Juli, 20:003.533.825104.866.257
13. Juli, 21:004.491.783109.358.040
13. Juli, 22:001.369.868110.727.908
13. Juli, 23:0064.131110.792.039
Daten von 1871 bis 2070Werte
1870er3.636
1880er4.040
1890er4.040
1900er4.040
1910er4.054
1920er4.056
1930er4.060
1940er4.120
1950er18.294
1960er71.607
1970er172.376
1980er371.240
1990er3.689.756
2000er26.711.131
2010er46.561.292
2020er32.144.978
2030er325.917
2040er324.352
2050er324.180
2060er324.180
2070er32.418

Gemessen in der Datenbank der App, Datenstand Juli 2026. Lokaler Prototyp, kein offizielles Angebot.

Kernkompetenzen

  • Daten-Engineering
  • LLMs und Agenten
  • Backend und APIs
  • Zuverlässigkeit
  • Mobile und Native
  • Integrationen

Tech-Stack

  • PostgreSQL 16
  • TimescaleDB
  • JSONB
  • Full-text search
  • Playwright
  • NestJS 11
  • TypeORM
  • Zod
  • Swagger
  • RAG
  • OpenAI Responses API
  • MCP
  • Whisper
  • Expo
  • React Native
  • NativeWind
  • Reanimated

Das Schwierigste

Die Zahlen, die angeblich nicht zu holen waren

„Unmöglich“ ist nur eine Vermutung, bis man den Weg eines echten Browsers probiert hat.

Die ganze Geschichte
  1. Was man sah

    Auf dem Dashboard Deutschland stehen die Werte für jeden sichtbar. Das Programm bekam sie trotzdem nicht: In den JSON-Daten fehlten sie, und die versteckten Schnittstellen antworteten mit 403.

  2. Was wirklich los war

    Für die Seite gibt es keine Dokumentation, und der naheliegende Weg führte ins Leere. In den Notizen stand deshalb zuerst: nicht erreichbar.

  3. Die Lösung

    Die Seite in einem echten Browser öffnen und mitlesen, was sie im Hintergrund lädt. Dort tauchten die Download-IDs der CSV-Dateien auf. So findet die Pipeline heute auch neue Themen automatisch.

7
amtliche und öffentliche Datenquellen in einer Datenbank
19
MCP-Tools für das Retrieval
49.766
nachträgliche Korrekturen an alten Werten erkannt
92
HTTP-Routen, 18 Entitäten und 14 Migrationen
In einfachen Worten

Wie hat sich die Arbeitslosigkeit entwickelt? Wie hat der Bundestag abgestimmt? Die Antworten sind öffentlich, aber über viele Behördenseiten verstreut. Diese App legt sieben Quellen in eine Datenbank, und eine KI beantwortet Fragen daraus, statt zu raten. Kein offizielles Angebot, sondern ein privates Projekt.

Amtliche Daten sind öffentlich, aber schwer zu finden, und ein LLM rät gern. Die Idee: Das Modell muss jede Zahl aus einer Datenbank holen und zeigt die Quelle dazu. Dafür mussten die Daten erst einmal an einem Ort liegen.

So funktioniert es

Schritt 1 von 5

Quellen

Ein täglicher Cron-Job aktualisiert alle Quellen nacheinander hinter einem Lock. Dumps lassen sich nach einem Neustart fortsetzen.

Was gebaut wurde
  • Sieben gespiegelte Quellen, darunter GENESIS (Statistisches Bundesamt), Bundestag DIP und abgeordnetenwatch
  • Zeitreihen-Speicher in einer TimescaleDB-Hypertable, mit 111 Millionen Beobachtungen
  • Änderungserkennung mit getrennten Hashes und einem Log rückwirkender Korrekturen (49.766 Einträge)
  • MCP-Server mit 19 Tools für Suche, Zeitreihen, Vergleiche, Abstimmungen und Gesetzgebung
  • Assistent mit sichtbaren Tool-Schritten, Spracheingabe und interaktiven Diagrammen in den Antworten
  • App mit 16 Screens, davon 14 fertig: Chat, Abstimmungen, Gesetzgebung, Statistiksuche, Politikerkarten
Wie die Kompetenzen eingesetzt wurden
Daten-Engineering
Idempotente Imports, Revisionen, wiederaufnehmbare Bulk-Loads und tägliche Syncs auf über 100 Millionen Zeilen
LLMs und Agenten
RAG über 19 selbst geschriebene MCP-Tools und deutsche Volltextsuche, angebunden an ein gehostetes Modell, mit Prompt-Regeln gegen erfundene Werte
Backend und APIs
92 HTTP-Routen, 42 davon als typisierte Fassade über die GENESIS-API, 18 Entitäten und 14 Migrationen in TypeORM
Zuverlässigkeit
Semaphoren und Token-Buckets gegen fremde Limits, und eine ausgefallene Quelle stoppt die anderen nicht
Mobile und Native
Expo-App mit typisierten Routen und interaktiven SVG-Diagrammen, gebaut nach einem Design-Handoff
Integrationen
Sieben externe Datenquellen mit jeweils eigenen Formaten, Limits und Fehlerarten
Meine Rolle

Konzept, Architektur, Führung der Agenten und Prüfung. Den Großteil des Codes hat Claude Code in meinem selbst entwickelten Agent-Workflow geschrieben.

Siehe Projekt Context Observer
Nächstes ProjektContext Observer