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.
Daten von 1871 bis 2070
95 % der Werte stammen aus den Jahren 2000 bis 2029. Ab 2030 sind es amtliche Vorausberechnungen.
Wo die 30 GB liegen
Die Messwerte liegen in einer TimescaleDB-Hypertable mit 202 Chunks.
Die größten einzelnen Tabellen
9 Tabellen haben über 1 Million Werte, 242 über 100.000.
Aus den Daten werden Antworten: RAG
Das Modell antwortet aus den abgerufenen Daten. Retrieval läuft über Tools und Volltextsuche.
- Frage„Wie haben sich die Verbraucherpreise entwickelt?“
- RetrievalDie Volltextsuche findet die Statistik unter 13.164 Katalogeinträgen.
- Abruf19 MCP-Tools holen die Werte direkt aus der Datenbank.
- AntwortText und Diagramm aus den abgerufenen Werten, mit Quelle.
Alle Werte als Tabelle
| Stunde | + | gesamt |
|---|---|---|
| 12. Juli, 03:00 | 411.050 | 411.050 |
| 12. Juli, 04:00 | 528.359 | 939.409 |
| 12. Juli, 05:00 | 53.308 | 992.717 |
| 12. Juli, 13:00 | 1.181.428 | 2.174.145 |
| 12. Juli, 14:00 | 47.067 | 2.221.212 |
| 12. Juli, 17:00 | 19.264 | 2.240.476 |
| 12. Juli, 20:00 | 485.862 | 2.726.338 |
| 12. Juli, 21:00 | 42.396 | 2.768.734 |
| 12. Juli, 22:00 | 108 | 2.768.842 |
| 12. Juli, 23:00 | 99.074 | 2.867.916 |
| 13. Juli, 00:00 | 62.764 | 2.930.680 |
| 13. Juli, 03:00 | 81.612 | 3.012.292 |
| 13. Juli, 04:00 | 3.219.071 | 6.231.363 |
| 13. Juli, 05:00 | 7.849.671 | 14.081.034 |
| 13. Juli, 06:00 | 10.771.356 | 24.852.390 |
| 13. Juli, 07:00 | 7.315.336 | 32.167.726 |
| 13. Juli, 08:00 | 1.359.011 | 33.526.737 |
| 13. Juli, 09:00 | 459.639 | 33.986.376 |
| 13. Juli, 10:00 | 1.667.677 | 35.654.053 |
| 13. Juli, 11:00 | 6.770.268 | 42.424.321 |
| 13. Juli, 12:00 | 6.726.307 | 49.150.628 |
| 13. Juli, 13:00 | 7.132.230 | 56.282.858 |
| 13. Juli, 14:00 | 5.029.853 | 61.312.711 |
| 13. Juli, 15:00 | 8.702.537 | 70.015.248 |
| 13. Juli, 16:00 | 7.247.192 | 77.262.440 |
| 13. Juli, 17:00 | 8.902.121 | 86.164.561 |
| 13. Juli, 18:00 | 9.718.384 | 95.882.945 |
| 13. Juli, 19:00 | 5.449.487 | 101.332.432 |
| 13. Juli, 20:00 | 3.533.825 | 104.866.257 |
| 13. Juli, 21:00 | 4.491.783 | 109.358.040 |
| 13. Juli, 22:00 | 1.369.868 | 110.727.908 |
| 13. Juli, 23:00 | 64.131 | 110.792.039 |
| Daten von 1871 bis 2070 | Werte |
|---|---|
| 1870er | 3.636 |
| 1880er | 4.040 |
| 1890er | 4.040 |
| 1900er | 4.040 |
| 1910er | 4.054 |
| 1920er | 4.056 |
| 1930er | 4.060 |
| 1940er | 4.120 |
| 1950er | 18.294 |
| 1960er | 71.607 |
| 1970er | 172.376 |
| 1980er | 371.240 |
| 1990er | 3.689.756 |
| 2000er | 26.711.131 |
| 2010er | 46.561.292 |
| 2020er | 32.144.978 |
| 2030er | 325.917 |
| 2040er | 324.352 |
| 2050er | 324.180 |
| 2060er | 324.180 |
| 2070er | 32.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
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.
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.
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