Provider-Registry statt einem SDK
Erste Skizze hing an einem einzigen RAG-Framework. Nach zwei Upgrades, die das Chunking gebrochen haben, wurde jeder Provider zu einer Lazy-Factory hinter einer kleinen RAG2SQL-Schnittstelle. Wechsel von LangChain zu LlamaIndex oder DSPy ist jetzt Config, kein Refactor.
Zwei Wächter schlagen einen klugen Prompt
Das Modell zu bitten "bitte nur lesen" hat nie gehalten. Der Intent-Filter blockt Schreib-Verben in der Frage, der SQL-Validator läuft den geparsten Token-Tree und lehnt INSERT, UPDATE, DROP und Freunde auch in CTEs ab. Beide müssen grün sein, bevor Postgres das Statement sieht.
Retrieval schlägt Schema-Dump im Prompt
Den ganzen Banking-Schema-Dump in den Prompt zu kippen war teuer und laut. Hybrid-Suche über pgvector-Embeddings plus BM25-Keyword-Scores zieht nur die relevanten Tabellen, Enum-Typen und Custom-Docs. Der Prompt wurde kleiner, die Antworten wurden besser.
Fehler wurden Teil der Schleife
Frühe Demos starben sofort, wenn ein Spaltenname schief war. Jetzt klassifiziert der Executor die Exception: Verbindungsfehler stoppen, Syntax- und Spaltenfehler gehen zurück an das Modell zum Reparieren. Drei Versuche, danach saubere deutsche Fehlermeldung statt Crash.