<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>System Design |</title><link>https://aretascodes.dev/de/tags/system-design/</link><atom:link href="https://aretascodes.dev/de/tags/system-design/index.xml" rel="self" type="application/rss+xml"/><description>System Design</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de-DE</language><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><image><url>https://aretascodes.dev/media/icon_hu_2ab4f4763b27c75b.png</url><title>System Design</title><link>https://aretascodes.dev/de/tags/system-design/</link></image><item><title>Teil 3 · CogniVault Architektur: Warum wir Ollama nicht in Docker packen</title><link>https://aretascodes.dev/de/blog/cognivault-deployment-architecture/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/cognivault-deployment-architecture/</guid><description>
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Alle Abkürzungen werden im Anhang am Ende der Seite ausführlich erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die goldene Regel für modernes Software-Deployment heißt Containerisierung. Pack alles in Docker, um die Abhängigkeiten zu isolieren, und es läuft auf jeder Maschine absolut identisch.&lt;/p&gt;
&lt;p&gt;Als ich CogniVault anfangs entworfen habe, war der erste Impuls, den FastAPI-Server, die PostgreSQL-Datenbank und die Ollama LLM-Engine in ein einziges, sicheres Docker-Netzwerk zu stecken.&lt;/p&gt;
&lt;p&gt;Aber das haben wir nicht getan. Wir haben Ollama nativ auf dem Host-System laufen lassen. Schauen wir uns mal an, warum.&lt;/p&gt;
&lt;h2 id="das-gpu-passthrough-problem"&gt;Das GPU-Passthrough-Problem&lt;/h2&gt;
&lt;p&gt;Stell dir deine GPU wie die Küche in einem Restaurant vor. Die Köche (deine KI-Modelle) müssen &lt;em&gt;in der Küche&lt;/em&gt; sein — am Herd stehen, die Hände an den Geräten. Stell dir nun vor, du sagst den Köchen, sie müssten aus einem verschlossenen Konferenzraum am Ende des Flurs kochen und Anweisungen durch eine Durchreiche rufen. Technisch gesehen kommt vielleicht immer noch Essen heraus. Aber es wird nicht schnell gehen.&lt;/p&gt;
&lt;p&gt;Dieser verschlossene Raum ist ein Container. Large Language Models wie Gemma 4 brauchen direkten, ungehinderten Zugriff auf die GPU deiner Hardware (wie Apple Silicons Unified Memory oder eine dedizierte Nvidia-Karte), um Text schnell genug für ein Echtzeit-Chat-Interface zu generieren. Und die Situation ist je nach Plattform unterschiedlich:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auf macOS&lt;/strong&gt; lässt Docker Container in einer ressourcenschonenden virtuellen Maschine laufen — und es gibt aktuell &lt;strong&gt;überhaupt kein GPU (Metal) Passthrough&lt;/strong&gt;. Ein Ollama-Container auf einem Mac läuft also nur über die CPU. Für eine Chat-App ist das an sich schon ein K.o.-Kriterium.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unter Linux&lt;/strong&gt; gibt es Nvidia GPU-Passthrough und es funktioniert auch, aber es erfordert zusätzliche Toolkit-Konfiguration, die die &amp;ldquo;es funktioniert einfach&amp;rdquo;-Philosophie der lokalen Entwicklung zunichte macht.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn man Ollama nativ laufen lässt, umgeht man diese ganze Kategorie von Problemen.&lt;/p&gt;
&lt;h2 id="die-brückenlösung"&gt;Die Brückenlösung&lt;/h2&gt;
&lt;p&gt;CogniVault verwendet ein geteiltes Deployment-Modell, das die Anwendungslogik von der rechenintensiven KI-Verarbeitung trennt.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Die sicheren Räume (Docker):&lt;/strong&gt; PostgreSQL — wo das DBOS-Workflow-Ledger aus
liegt — befindet sich in einem &lt;strong&gt;Docker Bridge Network&lt;/strong&gt; (einem privaten virtuellen Netzwerk). Isoliert, sauber, reproduzierbar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Das Hauptgebäude (Nativer Host):&lt;/strong&gt; Ollama läuft direkt auf deinem Mac-, Windows- oder Linux-Betriebssystem und hat so direkten Zugriff auf deine GPU.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;CogniVault wird tatsächlich mit &lt;strong&gt;zwei Ausführungsmodi&lt;/strong&gt; ausgeliefert, und es lohnt sich, hier genau zu sein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Der Standardmodus (&lt;code&gt;scripts/start.sh&lt;/code&gt;):&lt;/strong&gt; Nur PostgreSQL läuft in Docker. Das FastAPI-Backend läuft ebenfalls nativ (&lt;code&gt;python -m backend.main&lt;/code&gt;), direkt neben Ollama. Das ist der einfachste Loop für die lokale Entwicklung.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Der vollcontainerisierte Modus (&lt;code&gt;docker-compose.yaml&lt;/code&gt;):&lt;/strong&gt; Die FastAPI-App gesellt sich zu Postgres ins Compose-Netzwerk. In diesem Modus erreicht der App-Container die native Ollama-Engine über eine spezielle Docker-Routing-Adresse: &lt;code&gt;host.docker.internal:11434&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So oder so bleibt die Regel die gleiche: &lt;strong&gt;Das Modell kommt niemals in die Box.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Client[📱 Browser / Nutzer] --&gt;|HTTP: 8000| App
subgraph HostMachine ["Host-OS: Nativer GPU-Zugriff"]
Ollama[🧠 Ollama Engine]
Models[(gemma4:e4b)]
Ollama &lt;--&gt; Models
subgraph DockerNetzwerk ["Docker Compose Netzwerk"]
App[🖥️ FastAPI App Container]
Postgres[(🐘 PostgreSQL)]
App &lt;--&gt;|Interner Port 5432| Postgres
end
App &lt;--&gt;|host.docker.internal:11434| Ollama
end
&lt;/div&gt;
&lt;h3 id="was-ist-mit-der-vektor-datenbank"&gt;Was ist mit der Vektor-Datenbank?&lt;/h3&gt;
&lt;p&gt;Dir fällt vielleicht auf, dass FAISS hier kein Container ist. Im Gegensatz zu massiven SQL-Datenbanken ist FAISS extrem leichtgewichtig. In CogniVault läuft FAISS direkt im Speicher des FastAPI-Python-Prozesses und speichert seine Daten in einem lokalen Ordner. Es braucht keinen eigenen Container.&lt;/p&gt;
&lt;p&gt;Indem wir die schwere LLM-Arbeit direkt auf der Hardware (Bare-Metal) erledigen und die Buchhaltung in Containern belassen, erreichen wir genau die Balance, an der die lokale KI-Entwicklung so oft scheitert: null Abhängigkeitskonflikte kombiniert mit maximaler KI-Performance.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="erlebe-es-in-aktion"&gt;Erlebe es in Aktion&lt;/h3&gt;
&lt;p&gt;Das schließt unsere CogniVault-Architekturserie ab! Wenn du diesen zu 100% lokalen, datenschutzfreundlichen Lernbegleiter auf deiner eigenen Hardware ausführen möchtest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hol dir den Code:&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schau dir das Walkthrough an:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="anhang-abkürzungen-in-diesem-beitrag"&gt;Anhang: Abkürzungen in diesem Beitrag&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abbreviation&lt;/th&gt;
&lt;th&gt;Full form&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graphics Processing Unit&lt;/td&gt;
&lt;td&gt;Die Hardware, die lokale Modell-Inferenz schnell macht; Container haben Probleme, darauf zuzugreifen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Large Language Model&lt;/td&gt;
&lt;td&gt;Ein auf riesigen Textmengen trainiertes neuronales Netzwerk, das Sprache lesen und erzeugen kann&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Artificial Intelligence&lt;/td&gt;
&lt;td&gt;Software, die Aufgaben ausführt, für die normalerweise menschliche Intelligenz erforderlich ist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Application Programming Interface&lt;/td&gt;
&lt;td&gt;Die URLs, die das Frontend aufruft, um mit dem Backend zu kommunizieren&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HyperText Transfer Protocol&lt;/td&gt;
&lt;td&gt;Das Protokoll, mit dem Browser und APIs Anfragen und Antworten austauschen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Operating System&lt;/td&gt;
&lt;td&gt;macOS, Windows oder Linux — wo Ollama nativ läuft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DBOS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database-Oriented Operating System&lt;/td&gt;
&lt;td&gt;Die Durable-Workflow-Bibliothek, deren Ledger im Postgres-Container liegt (siehe Teil 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured Query Language&lt;/td&gt;
&lt;td&gt;Die Sprache relationaler Datenbanken wie PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAISS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Facebook AI Similarity Search&lt;/td&gt;
&lt;td&gt;Der In-Process-Vektorindex — absichtlich &lt;em&gt;kein&lt;/em&gt; separater Container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Virtual Machine&lt;/td&gt;
&lt;td&gt;Die versteckte Schicht, die Docker auf macOS nutzt — und der Grund, warum Mac-Container die GPU nicht erreichen können&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Teil 2 · CogniVault Architektur: Dauerhafte Ingestion mit DBOS</title><link>https://aretascodes.dev/de/blog/cognivault-ingestion-pipeline/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/cognivault-ingestion-pipeline/</guid><description>
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Alle Abkürzungen werden im Anhang am Ende der Seite ausführlich erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In einem einfachen lokalen KI-Setup ist das Hinzufügen von Dokumenten zu deiner Datenbank normalerweise nur ein simples Python-Skript. Du öffnest ein PDF, zerhackst den Text in Chunks, verwandelst diese Chunks in Mathe (Embeddings) und speicherst sie.&lt;/p&gt;
&lt;p&gt;Das funktioniert super für ein fünfseitiges Essay. Aber was passiert, wenn du ein 1.000-seitiges technisches Handbuch einliest (Ingestion) und dein Laptop bei Seite 800 in den Ruhemodus geht?&lt;/p&gt;
&lt;p&gt;Das Skript stirbt. Wenn du deinen Laptop aufweckst, musst du wieder bei Seite 1 anfangen und verschwendest so Zeit und Rechenleistung. Ein einfaches Skript reichte für CogniVault nicht aus. Wir brauchten einen &lt;strong&gt;Durable Workflow&lt;/strong&gt; (dauerhaften Workflow).&lt;/p&gt;
&lt;h2 id="das-fabrikbuch-dbos"&gt;Das Fabrikbuch (DBOS)&lt;/h2&gt;
&lt;p&gt;Stell dir die Daten-Ingestion wie ein Fließband in einer Fabrik vor. Wenn der Strom ausfällt, sollten die Arbeiter nicht jedes Produkt von Grund auf neu bauen müssen. Sie sollten einfach in ein permanentes Kassenbuch (Ledger) schauen, genau sehen, welche Kiste sie gerade gepackt haben, als das Licht ausging, und dort weitermachen.&lt;/p&gt;
&lt;p&gt;CogniVault verwendet ein Framework namens &lt;strong&gt;DBOS (Database-Oriented Operating System)&lt;/strong&gt;, das von einer PostgreSQL-Datenbank gestützt wird, um als dieses Buch zu fungieren.&lt;/p&gt;
&lt;p&gt;Jeder Schritt des Ingestion-Prozesses protokolliert seinen Abschluss in Postgres. Wenn der Server mittendrin abstürzt, passiert im Moment nichts Dramatisches — die Magie entfaltet sich beim Neustart: DBOS liest das Buch, sieht, welche Schritte bereits abgeschlossen sind, spielt die aufgezeichneten Ergebnisse sofort ab und macht beim ersten unvollendeten Schritt weiter.&lt;/p&gt;
&lt;p&gt;Eine wichtige Grenze: Postgres enthält &lt;strong&gt;nur das Buch&lt;/strong&gt; — welche Schritte gelaufen sind und was sie zurückgegeben haben. Deine Dokumente, Chunks und Vektoren leben dort nie. Sie wandern in einen FAISS-Index plus eine JSON-Metadaten-Datei auf der Festplatte.&lt;/p&gt;
&lt;h2 id="sha-256-hashing-der-idempotenz-trick"&gt;SHA-256 Hashing: Der Idempotenz-Trick&lt;/h2&gt;
&lt;p&gt;Das System muss auch bei erneuten Uploads clever sein. Wenn du einen Tippfehler in einem riesigen Dokument behebst und es noch einmal hochlädst, willst du nicht, dass das System 10 Minuten verschwendet, um das Ganze neu einzubetten (re-embedding).&lt;/p&gt;
&lt;p&gt;CogniVault erreicht &lt;strong&gt;Idempotenz&lt;/strong&gt; (die Fähigkeit, dieselbe Operation mehrmals auszuführen, ohne das Ergebnis nach der ersten Anwendung zu verändern) mit dem allerersten Schritt des Workflows: Es scannt den &lt;code&gt;docs/&lt;/code&gt;-Ordner und generiert einen &lt;strong&gt;SHA-256-Hash&lt;/strong&gt; (einen einzigartigen digitalen Fingerabdruck) für jede Datei.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn der Hash neu ist, wird die Datei verarbeitet.&lt;/li&gt;
&lt;li&gt;Wenn sich der Hash geändert hat (weil du die Datei bearbeitet hast), löscht es die alten Text-Chunks per &amp;ldquo;Soft-Delete&amp;rdquo; und bettet nur die neue Version neu ein.&lt;/li&gt;
&lt;li&gt;Wenn der Hash identisch ist, überspringt es die Datei komplett.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hier können wir sehen, wie das logisch abläuft:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Raw[📄 Hochgeladenes Dokument] --&gt; DBOS[🐘 DBOS Workflow startet]
subgraph DauerhaftePipeline ["Dauerhafte Ingestion-Pipeline"]
DBOS --&gt;|Schritt 1| Hash{Hash-Prüfung SHA-256}
Hash --&gt;|Unverändert| Skip[Verarbeitung überspringen]
Hash --&gt;|Neu / Geändert| Extract[✂️ Schritt 2: Text pro Dokument extrahieren]
Extract --&gt; Chunk[Chunking: 1000 Zeichen, 100 Überlappung]
Chunk --&gt;|Schritt 3, 5er-Batches| Embed[🔢 embeddinggemma Embeddings]
Embed --&gt;|Schritt 4| Save[(💾 FAISS Index + Metadaten JSON)]
end
Save --&gt;|Workflow abgeschlossen| Done[✅ Bereit für die Suche]
&lt;/div&gt;
&lt;p&gt;(Ein Detail für die Neugierigen: Die per Checkpoint gesicherten &lt;em&gt;Schritte&lt;/em&gt; sind der Scan, die Extraktion pro Dokument, jeder Embedding-Batch und das Speichern. Das Chunking dazwischen ist schnelle, reine Python-Arbeit, also läuft es einfach als Teil des Workflow-Körpers erneut — es mit einem Checkpoint zu versehen, würde mehr kosten, als es neu zu machen.)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="was-kommt-als-nächstes"&gt;Was kommt als Nächstes?&lt;/h3&gt;
&lt;p&gt;Indem wir die Ingestion-Pipeline in DBOS verpacken, verwandelt sich das System von einem anfälligen Skript in eine robuste Zustandsmaschine (State Machine) auf Produktionsniveau.&lt;/p&gt;
&lt;p&gt;Jetzt, da unsere Daten sicher eingelesen sind, wie deployen wir diese gesamte Pipeline, ohne die GPU unseres Laptops zum Schmelzen zu bringen?
&lt;strong&gt;Lies Teil 3: Warum wir Ollama nicht in Docker packen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Du kannst die DBOS-Implementierung auch direkt in der Datei &lt;code&gt;backend/services/ingest.py&lt;/code&gt; im
erkunden.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="anhang-abkürzungen-in-diesem-beitrag"&gt;Anhang: Abkürzungen in diesem Beitrag&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abbreviation&lt;/th&gt;
&lt;th&gt;Full form&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DBOS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database-Oriented Operating System&lt;/td&gt;
&lt;td&gt;Eine Bibliothek, die Workflow-Schritte in einer Datenbank sichert, sodass abgestürzte Jobs fortgesetzt statt neu gestartet werden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SHA-256&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secure Hash Algorithm, 256-bit&lt;/td&gt;
&lt;td&gt;Eine Fingerabdruck-Funktion: Jede Datei wird auf einen einzigartigen 64-Zeichen-Hash abgebildet; änderst du ein Byte, ändert sich der Hash komplett&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PDF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Portable Document Format&lt;/td&gt;
&lt;td&gt;Das Dokumentenformat, dessen Text (und Scans) die Pipeline extrahiert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAISS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Facebook AI Similarity Search&lt;/td&gt;
&lt;td&gt;Metas Vektorsuch-Bibliothek — wo die Embeddings tatsächlich leben&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JavaScript Object Notation&lt;/td&gt;
&lt;td&gt;Das Textformat, das für die Chunk-Metadaten-Datei neben dem FAISS-Index verwendet wird&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Artificial Intelligence&lt;/td&gt;
&lt;td&gt;Software, die Aufgaben ausführt, für die normalerweise menschliche Intelligenz erforderlich ist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graphics Processing Unit&lt;/td&gt;
&lt;td&gt;Die Hardware, die lokale Modell-Inferenz schnell macht — das Thema von Teil 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Teil 1 · CogniVault Architektur: Warum Standard-RAG nicht reicht (Hybride Suche)</title><link>https://aretascodes.dev/de/blog/cognivault-retrieval-loop/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/cognivault-retrieval-loop/</guid><description>
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Alle Abkürzungen werden im Anhang am Ende der Seite ausführlich erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vektorsuche ist der Prozess, bei dem die ähnlichsten Elemente in einem Datensatz basierend auf ihren Vektor-Embeddings gefunden werden. So funktionieren RAG-Systeme normalerweise.
Aber was passiert, wenn du die ähnlichsten Elemente in einem Datensatz nicht nur aufgrund ihrer semantischen Bedeutung, sondern auch anhand des exakten Wortlauts der Suchanfrage finden musst?&lt;/p&gt;
&lt;p&gt;Das wird kritisch, wenn die Information, die du suchst, nicht nur inhaltlich verwandt sein soll, sondern genau mit einer bestimmten Zeichenkette oder einem bestimmten Schlüsselwort übereinstimmen muss.&lt;/p&gt;
&lt;h2 id="zwei-wege-ein-buch-zu-finden"&gt;Zwei Wege, ein Buch zu finden&lt;/h2&gt;
&lt;p&gt;Stell dir eine gute lokale Buchhandlung vor. Die Besitzerin hat alles gelesen und empfiehlt nach &lt;em&gt;Gefühl&lt;/em&gt;. Sag ihr, dass du &lt;em&gt;Der Marsianer&lt;/em&gt; geliebt hast, und sie gibt dir &lt;em&gt;Project Hail Mary&lt;/em&gt; — anderer Titel, andere Handlung, aber dieselbe DNA: ein einsamer Wissenschaftler, ein unmögliches Überlebensproblem, Witze unter Druck. Frag nach &amp;ldquo;sowas wie &lt;em&gt;Stolz und Vorurteil&lt;/em&gt;&amp;rdquo; und du gehst mit &lt;em&gt;Emma&lt;/em&gt; raus. Sie gleicht keine Wörter ab. Sie gleicht &lt;em&gt;Bedeutung&lt;/em&gt; ab.&lt;/p&gt;
&lt;p&gt;Nun stell ihr eine andere Art von Frage: &amp;ldquo;Ich brauche das Buch mit der ISBN 978-0-553-41802-6&amp;rdquo; oder &amp;ldquo;das Handbuch, auf dessen Cover der Fehlercode 404B erwähnt wird.&amp;rdquo; Ihre Superkraft ist hier nutzlos. Keine noch so große literarische Intuition findet einen exakten String. Dafür gehst du zur Kasse und schaust in den &lt;strong&gt;Katalog&lt;/strong&gt; — einen langweiligen, wörtlichen Index, der genau weiß, welches Regal welche Kennung enthält, und dem &amp;ldquo;Vibes&amp;rdquo; völlig egal sind.&lt;/p&gt;
&lt;p&gt;Eine gut geführte Buchhandlung braucht beides. Genauso wie ein gut geführtes RAG-System:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;FAISS — Facebook AI Similarity Search (die belesene Besitzerin):&lt;/strong&gt; ein Vektorindex, der Textabschnitte findet, deren &lt;em&gt;Bedeutung&lt;/em&gt; mathematisch nah an deinem Prompt liegt. Genial für &amp;ldquo;Wie ist die praktische Prüfung aufgebaut?&amp;rdquo;, aber blind für &amp;ldquo;§3 Absatz 2&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BM25 — Best Match 25 (der Katalog):&lt;/strong&gt; ein klassischer Keyword-Scoring-Algorithmus, der exakte Worttreffer belohnt, gewichtet danach, wie selten und markant diese Wörter sind. Genial für Identifikatoren und zitierte Phrasen, aber blind für Umschreibungen (Paraphrasen).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;CogniVault führt bei jeder Suche &lt;strong&gt;beide&lt;/strong&gt; Retriever aus — das nennt man &lt;strong&gt;Hybride Suche (Hybrid Search)&lt;/strong&gt; — und führt dann die beiden Ranglisten mit einer Formel namens &lt;strong&gt;Reciprocal Rank Fusion (RRF)&lt;/strong&gt; zusammen. RRF bewertet jeden Chunk rein nach seiner &lt;em&gt;Position&lt;/em&gt; in jeder Liste: Ein Chunk, der von einem der beiden Retriever hoch eingestuft wird, schneidet gut ab, und ein Chunk, bei dem sich beide Retriever einig sind, steigt nach ganz oben. Da nur Ränge verwendet werden, müssen die inkompatiblen Bewertungsskalen der beiden Retriever niemals in Einklang gebracht werden.&lt;/p&gt;
&lt;h2 id="der-agent-entscheidet-wann-gesucht-wird"&gt;Der Agent entscheidet, wann gesucht wird&lt;/h2&gt;
&lt;p&gt;Hier ist der Teil, den die meisten Diagramme verdrehen (meins in einem früheren Entwurf eingeschlossen): Das Retrieval (die Abfrage) passiert nicht, &lt;em&gt;bevor&lt;/em&gt; das Modell ins Spiel kommt. Es passiert &lt;em&gt;innerhalb&lt;/em&gt; des eigenen Loops des Modells.&lt;/p&gt;
&lt;p&gt;CogniVault verpackt Gemma im &lt;strong&gt;Strands Agents SDK&lt;/strong&gt;. Das Modell erhält deine Frage zusammen mit einer Reihe von &lt;strong&gt;Tools&lt;/strong&gt; (vorgeschriebene Python-Funktionen wie &lt;code&gt;search_knowledge_base&lt;/code&gt;, &lt;code&gt;calculator&lt;/code&gt; oder &lt;code&gt;compare_documents&lt;/code&gt;). Es denkt dann über die Frage nach und &lt;em&gt;entscheidet selbst&lt;/em&gt;, ob — und welche — Tools es aufruft. Bei den meisten Fragen zu Dokumenten ruft es &lt;code&gt;search_knowledge_base&lt;/code&gt; auf, liest die abgerufenen Chunks und schreibt erst dann seine Antwort, basierend auf dem, was es gefunden hat.&lt;/p&gt;
&lt;p&gt;Hier ist die Blaupause der Architektur dieses Loops:&lt;/p&gt;
&lt;div class="mermaid"&gt;graph TD
Client[📱 Nutzer-Anfrage] --&gt; App[🖥️ FastAPI Server]
subgraph AgentLoop["Der Strands Agent-Loop (powered by Gemma 4)"]
App --&gt; Agent[🧠 Agent analysiert die Frage]
Agent --&gt;|Entscheidet zu suchen| Search[search_knowledge_base]
subgraph HybrideSuche ["Hybride Such-Engine"]
Search --&gt;|Semantisch| FAISS[(FAISS Vektor)]
Search --&gt;|Exakter Treffer| BM25[(BM25 Keyword)]
FAISS --&gt; RRF{RRF Fusion}
BM25 --&gt; RRF
end
RRF --&gt;|Beste Chunks + Quellenangaben| Agent
Agent --&gt;|Fundierte Antwort| Answer[Gestreamte Antwort]
end
Answer --&gt; Client
&lt;/div&gt;
&lt;p&gt;Eine Feinheit, die erwähnenswert ist: Der Agent &lt;em&gt;ist&lt;/em&gt; Gemma. Es gibt am Ende kein separates &amp;ldquo;Formatierungsmodell&amp;rdquo; — dasselbe Modell, das sich für die Suche entschieden hat, schreibt auch die endgültige Antwort, nun mit den abgerufenen Chunks vor Augen.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="was-kommt-als-nächstes"&gt;Was kommt als Nächstes?&lt;/h3&gt;
&lt;p&gt;Eine Spielzeug-RAG-App zu bauen ist einfach, aber eine zu bauen, die tatsächlich genau das Dokument abruft, das du brauchst, erfordert hybride Engines und einen Agenten, der weiß, wann er sie einsetzen muss.&lt;/p&gt;
&lt;p&gt;Willst du sehen, wie dieses System riesige Dokumente sicher einliest, ohne Arbeit zu verlieren, wenn mal etwas abstürzt?
&lt;strong&gt;Lies Teil 2: Dauerhafte Ingestion mit DBOS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Oder, wenn du lieber direkt in den Code springen willst: Die hybride Suche befindet sich in &lt;code&gt;backend/services/vector_db.py&lt;/code&gt; des
.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="anhang-abkürzungen-in-diesem-beitrag"&gt;Anhang: Abkürzungen in diesem Beitrag&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abbreviation&lt;/th&gt;
&lt;th&gt;Full form&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Retrieval-Augmented Generation&lt;/td&gt;
&lt;td&gt;Rufe zuerst relevante Passagen aus deinen eigenen Dokumenten ab; lass das Modell daraus antworten anstatt aus dem Trainingsgedächtnis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FAISS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Facebook AI Similarity Search&lt;/td&gt;
&lt;td&gt;Metas Bibliothek zum Speichern von Vektoren und zum schnellen Finden der ähnlichsten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BM25&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Best Match 25&lt;/td&gt;
&lt;td&gt;Eine Keyword-Ranking-Formel — die 25. Ranking-Funktion, die im Okapi-Information-Retrieval-System entwickelt wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RRF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reciprocal Rank Fusion&lt;/td&gt;
&lt;td&gt;Eine Formel, die mehrere Ranglisten nur anhand des Rangs jedes Elements zusammenführt: &lt;code&gt;score = Σ 1/(k + rank)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Large Language Model&lt;/td&gt;
&lt;td&gt;Ein auf riesigen Textmengen trainiertes neuronales Netzwerk, das Sprache lesen und erzeugen kann&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Software Development Kit&lt;/td&gt;
&lt;td&gt;Eine Bibliothek mit Bausteinen — hier Strands, was den Agent-Loop bereitstellt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Application Programming Interface&lt;/td&gt;
&lt;td&gt;Die URLs, die das Frontend aufruft, um mit dem Backend zu kommunizieren&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISBN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;International Standard Book Number&lt;/td&gt;
&lt;td&gt;Die eindeutige Kennung, die auf jedem veröffentlichten Buch gedruckt ist — der beste Freund des Katalogs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>