Von 30s auf 3s: Aufbau einer halluzinationsfreien Hybrid-RAG-Pipeline
Wie wir die KI-Suche in Routing, Python-Filterung und intelligente Fallbacks entkoppelt haben.
Die KI-Suchleiste Ihrer Community-App sieht wunderschön aus. Ein Nutzer tippt âNachtapotheke in Torrance", drĂŒckt Enter und beobachtet einen Spinner, der sich 30 volle Sekunden dreht. Als die Ergebnisse endlich eintreffen, ist die Top-Empfehlung ein Nachbar-Beitrag ĂŒber eine gebrauchte Fahrradwerkstatt. Warum? Weil die Wörter âNacht" und âReparatur" einen verdĂ€chtig nahen Embedding-Vektor mit âNachtapotheke" teilen.
Das ist das Vektor-Raum-Halluzinationsproblem (Vector Space Hallucination Problem), und es hÀtte unser Kkaertalk-Projekt fast zerstört.
đ Das Dilemma: Ein Modell, um alles zu ruinieren
Unsere V1-Architektur war ein Lehrbuch-Beispiel fĂŒr naives RAG: Die Benutzeranfrage entgegennehmen, einbetten, die Top-K nĂ€chsten Nachbarn per Kosinus-Ăhnlichkeit abrufen, alles in einen einzigen massiven gpt-4-Prompt packen und darauf hoffen, dass das Modell das Rauschen ignoriert.
Was tatsÀchlich passierte:
| Metrik | V1 (Naives RAG) | Ziel |
|---|---|---|
| End-to-End-Latenz | 28â35s | < 3s |
| Halluzinationsrate | ~22 % | 0 % |
| Monatliche API-Kosten | 2.400 $ | < 250 $ |
| Nutzer-Retention (D7) | 12 % | > 40 % |
Der 30-Sekunden-Spinner war ein Todesurteil. Doch die Halluzinationen waren schlimmer â die Nutzer verloren dauerhaft das Vertrauen, wenn die KI selbstbewusst irrelevante Ergebnisse empfahl. Kosinus-Ăhnlichkeit ist ein stumpfes Instrument: Sie misst geometrische NĂ€he im Embedding-Raum, aber geometrische NĂ€he â semantische Relevanz, wenn Ihr Korpus aus unstrukturierten, mehrsprachigen Community-Daten besteht.
đ§Ź Innovation 1: Hybrid Model Split
Der erste Durchbruch war die Erkenntnis, dass ein einzelnes LLM drei grundlegend verschiedene Aufgaben erledigte â und bei allen gleichzeitig schlecht war.
Wir zerlegten die KI-Pipeline in drei spezialisierte Rollen:
| Rolle | Modell | BegrĂŒndung |
|---|---|---|
| Echtzeit-Intent-Extraktion | gpt-4o-mini | JSON-erzwungene Ausgabe, ultraschnell (~200ms). Extrahiert strukturierten Intent aus natĂŒrlicher Sprache. |
| Hintergrund-Batch-Verarbeitung | qwen3.5-flash | GĂŒnstig. Ăbernachtung: Tagging, Ăbersetzung und Keyword-Extraktion fĂŒr den gesamten Korpus. |
| Vektor-Embedding | text-embedding-v4 | Konsistenter Koordinatenraum. Alle Dokumente und Abfragen leben im selben geometrischen Universum. |
Die entscheidende Erkenntnis: Das Modell, das in Echtzeit mit dem Nutzer spricht, sollte niemals das Modell sein, das schwere Hintergrundarbeit erledigt. Durch die Isolierung von gpt-4o-mini als einziges Runtime-Modell reduzierten wir die Latenz pro Abfrage allein im Extraktionsschritt von 28s auf unter 800ms.
# Echtzeit: Ultraschnelle Intent-Extraktion (gpt-4o-mini) response = openai.chat.completions.create( model="gpt-4o-mini", response_format={"type": "json_object"}, messages=[{ "role": "system", "content": "Extract search intent as JSON: {keywords: string[], location: string | null, time_context: string | null}" }, { "role": "user", "content": user_query }] ) # RĂŒckgabe in ~200ms: {"keywords": ["pharmacy"], "location": "Torrance", "time_context": "late-night"}
đ Innovation 2: Kostenfreie Hintergrund-Keyword-Extraktion
Unser nĂ€chtlicher Seeding-Bot ĂŒbersetzte bereits jeden Community-Beitrag von Koreanisch nach Englisch (und umgekehrt) mit qwen3.5-flash. Wir erkannten, dass wir diese bestehende Pipeline kapern konnten, um gleichzeitig strukturierte Keywords zu extrahieren â ohne zusĂ€tzliche API-Kosten.
Vorher:
Prompt: âĂbersetze diesen Beitrag ins Englische."
â 1 API-Aufruf pro Beitrag (nur Ăbersetzung)
Nachher:
Prompt: âĂbersetze diesen Beitrag ins Englische UND extrahiere genau 3 reprĂ€sentative Keywords."
â 1 API-Aufruf pro Beitrag (Ăbersetzung + Keyword-Extraktion)
Das Ergebnis: Jedes Dokument in unserer Supabase-posts-Tabelle trĂ€gt jetzt ein extracted_keywords-JSONB-Array â ein Geschenk der Ăbersetzungspipeline, das uns nichts kostete:
-- Jeder Beitrag hat jetzt kostenlos strukturierte Metadaten SELECT id, title, extracted_keywords FROM posts WHERE id = 42; -- â { id: 42, title: "24ì ìœê” ì¶ìČ Torrance", extracted_keywords: ["pharmacy", "24-hour", "Torrance"] }
Diese Metadaten werden zur Munition des Gatekeepers.
đĄ Innovation 3: Der Python-Gatekeeper
Hier entwickelt sich Kkaertalks Suche von âganz ordentlichem RAG" zu null Halluzinationen. Der Python-Gatekeeper ist ein gnadenloser 15-Zeilen-Filterskript, der zwischen dem Vektor-Retrieval-Schritt und dem finalen LLM-Generierungsschritt sitzt. Er wird in 0,01 Sekunden ausgefĂŒhrt.
Die Pipeline:
gpt-4o-miniextrahiert den Intent des Nutzers â["pharmacy", "late-night"]text-embedding-v4bettet die Abfrage ein und ruft die Top-15-Vektorergebnisse aus Supabasepgvectorab- Der Gatekeeper prĂŒft jeden Kandidaten: EnthĂ€lt sein
extracted_keywords-Array odertitlemindestens eines der extrahierten Intent-Keywords? - Jedes Ergebnis, das durchfĂ€llt â gnadenlos verworfen
- Nur die ĂŒberlebenden Ergebnisse (typischerweise 3â5) werden dem Haupt-KI zur finalen Antwortgenerierung ĂŒbergeben
def gatekeeper_filter(candidates: list, intent_keywords: list[str]) -> list: """ Der Python-Gatekeeper: 0,01s AusfĂŒhrungszeit. Verwirft jedes Vektorergebnis, dessen Metadaten kein einziges extrahiertes Intent-Keyword enthalten. """ survivors = [] for doc in candidates: doc_keywords = set(k.lower() for k in doc.get("extracted_keywords", [])) doc_title = doc.get("title", "").lower() # Harte Ăbereinstimmung: Mindestens ein Intent-Keyword muss vorkommen if any(kw.lower() in doc_keywords or kw.lower() in doc_title for kw in intent_keywords): survivors.append(doc) return survivors[:5] # Nur die Top 5 garantiert relevanten Chunks erreichen die Haupt-KI
Die Eleganz liegt in der Asymmetrie: Kosinus-Ăhnlichkeit ist gut beim Recall (irgendetwas Verwandtes finden), aber schlecht bei der Precision (sicherstellen, dass das Gefundene tatsĂ€chlich dem entspricht, was der Nutzer gemeint hat). Der Gatekeeper kehrt dies um â er opfert Recall zugunsten kugelsicherer Precision.
Testen Sie den interaktiven Vergleich unten:
Raw Vector Results (8 candidates)
24h Pharmacy near Torrance Blvd
Does anyone know a pharmacy open past midnight near Torrance? I need to pick up a prescription urgently.
Best late-night pharmacy spots in South Bay
Moved to the area recently. Where do you all go for late-night pharmacy runs?
Late-night bicycle repair â anyone open?
My bike chain broke at 11pm. Is there a late-night repair shop still open around here?
Pharmacy recommendation for pet meds in Torrance
Need a pharmacy that carries pet medications. Any recommendations in the Torrance area?
Late-night auto parts store near Del Amo
Anyone know an auto parts place open late? Need brake pads urgently for a morning trip.
Online drug deals â WARNING scam alert
PSA: got a sketchy DM about buying cheap drugs online. Reported to admin. Stay safe everyone.
Night shift workers meetup â Torrance
Fellow night owls! Let's organize a weekend brunch meetup for all us late-shift folks.
Pharmacy school prep study group
Starting a study group for pharmacy school entrance exams. DM if you're interested!
đĄ TIP
Der Gatekeeper lĂ€uft in reinem Python ohne ML-AbhĂ€ngigkeiten. Kein Model-Loading, keine GPU, kein numpy. Es ist eine for-Schleife und eine Mengen-Schnittmenge. Ihr ML-Infrastruktur-Team wird Sie dafĂŒr lieben.
đȘ Innovation 4: Intelligenter Fallback (Das Sicherheitsnetz)
Was passiert, wenn der Gatekeeper alle Kandidaten eliminiert? Wenn 0 Ergebnisse den Keyword-Filter ĂŒberleben, bedeutet das einfach: Die Community hat noch keine relevanten BeitrĂ€ge. In V1 gab dies einen leeren Bildschirm zurĂŒck â verheerend fĂŒr die UX.
Unsere Lösung: Intelligenter Fallback unter Nutzung des parametrischen Wissens des LLM.
if len(gatekeeper_results) == 0: # Keine Community-Daten vorhanden. Fallback auf das Weltwissen des LLM. fallback_prompt = f""" Der Nutzer suchte nach: "{user_query}" Noch keine Nachbar-BeitrĂ€ge zu dieser Anfrage vorhanden. Nutze dein allgemeines Wissen, um eine hilfreiche, prĂ€gnante Antwort zu geben. Stelle deiner Antwort folgendes voran: "Noch keine Nachbar-BeitrĂ€ge, aber hier ist, was ich weiĂ:" Beispiel: "Noch keine Nachbar-BeitrĂ€ge, aber die 24h-CVS-Apotheke am Sepulveda Blvd ist die nĂ€chstgelegene Nachtapotheke zu Torrance." """ response = generate_with_fallback(fallback_prompt)
Dies ist konzeptionell identisch mit Googles âAI Overview" â wenn keine lokalen Daten existieren, degradiert das System elegant zu einem Allgemeinwissen-Assistenten. Der Nutzer erhĂ€lt weiterhin Mehrwert, und wir vermeiden den vertrauenszerstörenden leeren Bildschirm.
| Szenario | Verhalten | Latenz |
|---|---|---|
| â„1 Ergebnis ĂŒberlebt den Gatekeeper | Geerdete Antwort aus Community-Daten | ~2,8s |
| 0 Ergebnisse ĂŒberleben den Gatekeeper | Parametrischer Fallback (LLM-Weltwissen) | ~1,5s |
| Vektor-DB nicht erreichbar | Direkter parametrischer Fallback | ~1,2s |
đ Ergebnisse: Vorher vs. Nachher
Nach dem Deployment der vollstÀndigen Hybrid-RAG-Pipeline mit Python-Gatekeeper:
| Metrik | V1 (Naives RAG) | V2 (Hybrid RAG + Gatekeeper) | Î |
|---|---|---|---|
| End-to-End-Latenz | 28â35s | 2,5â3,2s | -90 % |
| Halluzinationsrate | ~22 % | 0 % (1.200 Abfragen auditiert) | -100 % |
| Monatliche API-Kosten | 2.400 $ | 230 $ | -90 % |
| Nutzer-Retention (D7) | 12 % | 38 % | +217 % |
| Verwendete Vektor-Ergebnisse | 15 (alle) | 3â5 (gefiltert) | -73 % |
Die Behauptung von 0 % Halluzinationsrate ist nicht theoretisch â wir haben 1.200 aufeinanderfolgende Suchanfragen in der Produktion manuell auditiert. Jede geerdete Antwort war faktisch auf ihr Quelldokument rĂŒckverfolgbar.
đ§ Fazit: Setzen Sie Ihre Logik auf DiĂ€t
Der Branchenreflex ist, schlechten KI-Output mit gröĂeren Modellen, lĂ€ngeren Kontexten und teurerer Feinabstimmung zu bekĂ€mpfen. Wir machten das Gegenteil: Wir machten die Pipeline schlanker.
Schwere Berechnungen gehören in den Hintergrund-Batch. Der Runtime-Pfad sollte ein Skalpell sein, kein Vorschlaghammer.
Die gesamte Kkaertalk-Architektur kostet im Betrieb weniger als das monatliche Kaffee-Budget eines Junior-Ingenieurs. Der Python-Gatekeeper â 15 Zeilen Code â eliminierte Halluzinationen vollstĂ€ndig.
Hören Sie auf, Infrastrukturprobleme mit gröĂeren Modellen zu bekĂ€mpfen. Setzen Sie Ihre Logik auf DiĂ€t. Verstecken Sie schwere Berechnungen im Hintergrund; lassen Sie im Runtime nur ultraschnelle Python-Filter.
Updated 4/22/2026