Bau einer RAG-Pipeline von Grund auf
Ich wollte SmartQueue um einen KI-Assistenten erweitern.
SmartQueue ist eine Task-Queue, die ich in Go für IT-Support-Tickets entwickelt habe. Ich wollte keine generische KI. Ein generisches Modell kennt weder Ihre spezifischen Regeln für die Passwortrücksetzung noch Ihre Runbooks für Ausfälle.
Ich benötigte Retrieval-Augmented Generation (RAG). Dabei werden zuerst Fakten aus Ihren Dokumenten abgerufen. Diese Fakten werden dem Modell dann als Kontext übergeben.
Hier ist das, was ich beim Bau dieser Pipeline gelernt habe.
Das Scheitern beim Deployment
Meine erste Version nutzte ChromaDB für die Vektorsuche. Lokal funktionierte es. Beim Deployment schlug es fehl.
Ich habe alles in einem einzigen Container auf Hugging Face Spaces laufen lassen. Das beinhaltete Redis, eine Go-API, Worker, einen FastAPI-Service und ChromaDB. Fünf Prozesse konkurrierten um begrenzten Arbeitsspeicher und CPU. ChromaDB verursachte Race Conditions beim Start und stille Fehler.
Ich habe eine Entscheidung getroffen. Ich habe die Vektordatenbank entfernt und durch eine einfache BM25-Suche ersetzt.
Die einfache Lösung
Der neue Ersatz besteht aus 50 Zeilen Python. Er benötigt keinen externen Prozess. Er macht keine Netzwerkaufrufe. Er nutzt die Okapi-BM25-Formel, um Schlüsselwörter im Arbeitsspeicher abzugleichen.
Der Kompromiss ist eindeutig:
- BM25 verlässt sich auf exakte Wortübereinstimmungen. Synonyme werden nicht erkannt.
- Bei 10 kurzen IT-Runbooks spielt das keine Rolle. Nutzer verwenden spezifische Begriffe wie „VPN“ oder „Passwortrücksetzung“.
- Der Dienst startet nun jedes Mal zuverlässig.
Tuning des Systems
Ich habe mehrere Einstellungen optimiert, um das System stabil zu halten: • Abgerufene Dokumente (k): 4. Dies bietet genügend Kontext, ohne die Token-Limits zu überschreiten. • Bot-Temperatur: 0,2. Fehlerbehebung erfordert wörtliche Antworten, keine Kreativität. • Classifier-Temperatur: 0,1. Dies stellt sicher, dass die JSON-Ausgabe vorhersagbar bleibt. • Sitzungsverlauf: Letzte 10 Interaktionen. Dies sorgt für Kontinuität, ohne zu viel Arbeitsspeicher zu verbrauchen. • Rate-Limits: 30 Anfragen pro Minute. Dies schützt mein API-Kontingent.
Das beste Design ist ein Design mit kontrolliertem Funktionsabbau
Ich habe jeden Endpunkt mit einem Non-AI-Fallback ausgestattet. Wenn der KI-Dienst ausfällt, nutzt das System Keyword-Matching oder regelbasierte Logik. Das System baut seine Funktionen kontrolliert ab, anstatt komplett auszufallen.
Dies ist kein komplexes RAG-Setup. Es verfügt über kein Re-Ranking oder Hybrid-Suche. Es ist ein kleines, intelligentes Werkzeug, das für eine spezifische Skalierung entwickelt wurde.
Erkenntnisse:
- Optimiere auf deine Einschränkungen hin, nicht auf ein Lehrbuch-Szenario.
- Zuverlässigkeit schlägt oft die theoretische Genauigkeit.
- Nutze die Vektorsuche, wenn du hunderte von Dokumenten hast. Nutze die Stichwortsuche, wenn du nur zehn hast.
Optionale Lern-Community: https://t.me/GyaanSetuAi