<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Beginners |</title><link>https://aretascodes.dev/de/tags/beginners/</link><atom:link href="https://aretascodes.dev/de/tags/beginners/index.xml" rel="self" type="application/rss+xml"/><description>Beginners</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de-DE</language><lastBuildDate>Fri, 12 Jun 2026 00:00:00 +0000</lastBuildDate><image><url>https://aretascodes.dev/media/icon_hu_2ab4f4763b27c75b.png</url><title>Beginners</title><link>https://aretascodes.dev/de/tags/beginners/</link></image><item><title>CogniVault Backend erklärt, Teil 1 · Das Backend kennenlernen: Drei Prozesse, vier Schichten</title><link>https://aretascodes.dev/de/blog/backend-explained-meet-the-backend/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/backend-explained-meet-the-backend/</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 vollständig erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn Leute das erste Mal das CogniVault-Repository öffnen, höre ich meistens eine Variante der Frage: &lt;em&gt;&amp;ldquo;Wo fange ich überhaupt an?&amp;rdquo;&lt;/em&gt; Da gibt es einen RAG-Agenten, einen FAISS-Index, einen DBOS-Workflow, einen Ollama-Host — und wenn du gerade erst in die Tech-Welt einsteigst, ist jedes dieser Wörter wie eine verschlossene Tür.&lt;/p&gt;
&lt;p&gt;Diese Serie öffnet die Türen, eine nach der anderen. Kein RAG-Vorwissen vorausgesetzt, jede Abkürzung wird ausgeschrieben und jede Behauptung lässt sich im
nachprüfen. Falls du meine
schon gelesen hast, betrachte diese Serie als die Führung, die eigentlich hätte zuerst kommen sollen.&lt;/p&gt;
&lt;p&gt;Lass uns das mal aufzeichnen.&lt;/p&gt;
&lt;h2 id="die-ganze-app-besteht-aus-drei-prozessen"&gt;Die ganze App besteht aus drei Prozessen&lt;/h2&gt;
&lt;p&gt;Mit CogniVault kannst du mit deinen eigenen Dokumenten chatten und sie in Quizzes, Workshops, Karteikarten und Mindmaps verwandeln — und dabei verlässt absolut nichts jemals deinen Rechner. (Das &lt;em&gt;Warum&lt;/em&gt; hinter dieser Einschränkung ist eine eigene Geschichte:
.)&lt;/p&gt;
&lt;p&gt;Man könnte erwarten, dass so eine App ein Wildwuchs an Microservices ist. Aber es sind genau drei Prozesse:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prozess&lt;/th&gt;
&lt;th&gt;Was er macht&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Das Python-Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Eine FastAPI-App auf Port 8000 — sie serviert auch das kompilierte React-Frontend als statische Dateien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Der lokale Model-Server auf Port 11434, auf dem die KI-Modelle laufen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ein Docker-Container, der &lt;em&gt;nur&lt;/em&gt; für Workflow-Checkpoints genutzt wird — niemals für deine Dokumente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Alles andere — deine Dateien, der Suchindex, dein Chatverlauf, deine Quiz-Ergebnisse — ist einfach eine Datei auf der Festplatte. Das ist keine Faulheit; das ist das Privatsphäre-Argument physisch umgesetzt. Du kannst jedes Byte, das die App speichert, mit einem Texteditor und einem SQLite-Browser öffnen.&lt;/p&gt;
&lt;h2 id="die-vier-schichten"&gt;Die vier Schichten&lt;/h2&gt;
&lt;p&gt;Bevor wir Technologien beim Namen nennen, hier das mentale Modell, das du für die ganze Serie im Kopf behalten solltest. Das Backend besteht von oben nach unten aus vier Schichten:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schicht 1 — die Web-Schicht.&lt;/strong&gt; Eine FastAPI-Anwendung nimmt jeden HTTP-Request entgegen und routet ihn an einen von sechs Routern: Chat (&lt;code&gt;/rag&lt;/code&gt;), Wissensmanagement (&lt;code&gt;/upload&lt;/code&gt;, &lt;code&gt;/ingest&lt;/code&gt;), Lerntools (&lt;code&gt;/api/study/*&lt;/code&gt;), Fortschritt (&lt;code&gt;/api/progress/*&lt;/code&gt;), Sprache (&lt;code&gt;/api/transcribe&lt;/code&gt;) und Chatverlauf (&lt;code&gt;/api/history&lt;/code&gt;). FastAPI (ein modernes Python-Web-Framework) generiert unter &lt;code&gt;/api/docs&lt;/code&gt; zudem automatisch eine interaktive API-Dokumentation, was der beste Weg ist, um das Backend zu erkunden, ohne eine Zeile Code lesen zu müssen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schicht 2 — die Intelligenz-Schicht.&lt;/strong&gt; Zwei KI-Modelle mit zwei verschiedenen Jobs. &lt;code&gt;gemma4:e4b&lt;/code&gt; &lt;em&gt;generiert&lt;/em&gt;: Chat-Antworten, Gedankengänge (Reasoning), Bildanalyse und Tool-Aufrufe. &lt;code&gt;embeddinggemma&lt;/code&gt; &lt;em&gt;erstellt Embeddings&lt;/em&gt;: Es verwandelt Text in Vektoren (Zahlenlisten, die Bedeutung einfangen), sodass ähnliche Ideen mathematisch gefunden werden können. Beide laufen innerhalb von Ollama — stell dir Ollama wie Docker vor, aber für KI-Modelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schicht 3 — die Retrieval-Schicht.&lt;/strong&gt; Eine Suchmaschine über deine Dokumente, die &lt;em&gt;semantische&lt;/em&gt; Suche (finde Dinge mit gleicher Bedeutung) mit &lt;em&gt;Keyword&lt;/em&gt;-Suche (finde exakte Zeichenketten) kombiniert. Teil 3 dieser Serie dreht sich komplett um diese Schicht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Schicht 4 — die Persistenz-Schicht.&lt;/strong&gt; Vier Speichersysteme, jedes für einen speziellen Job ausgewählt: ein FAISS-Index plus einer JSON-Datei für durchsuchbares Wissen, SQLite für Lerndaten, PostgreSQL für Workflow-Checkpoints und einfache JSON-Dateien für den Chatverlauf.&lt;/p&gt;
&lt;h2 id="ein-diagramm-alle-wichtigen-teile"&gt;Ein Diagramm, alle wichtigen Teile&lt;/h2&gt;
&lt;div class="mermaid"&gt;flowchart TB
subgraph CLIENT["Browser"]
UI["React Frontend&lt;br/&gt;(kompiliert, serviert von FastAPI)"]
end
subgraph SERVER["FastAPI Backend — Port 8000"]
ROUTERS["6 Router&lt;br/&gt;rag · knowledge · study ·&lt;br/&gt;progress · audio · history"]
AGENT["RAG Agent&lt;br/&gt;(Strands SDK, 6 Tools)"]
VDB["VectorDB&lt;br/&gt;FAISS + BM25 + RRF"]
INGEST["Ingestion&lt;br/&gt;(DBOS dauerhafter Workflow)"]
GEN["Study Generatoren&lt;br/&gt;quiz · workshop · cards · mindmap"]
PROG["Fortschrittstracker&lt;br/&gt;+ 25 Achievements"]
end
subgraph OLLAMA["Ollama — Port 11434"]
GEMMA["gemma4:e4b&lt;br/&gt;chat · thinking · vision · tools"]
EMBED["embeddinggemma&lt;br/&gt;Text zu Vektoren"]
end
subgraph STORAGE["Lokaler Speicher"]
FAISSF["vector_store.faiss + .json"]
SQLITE["progress.db (SQLite)"]
PG["PostgreSQL&lt;br/&gt;nur Workflow-Status"]
DOCS["docs/ Ordner + chat_history.json"]
end
UI --&gt; ROUTERS
ROUTERS --&gt; AGENT --&gt; VDB
AGENT --&gt; GEMMA
VDB --&gt; EMBED
ROUTERS --&gt; INGEST --&gt; EMBED
INGEST --&gt; PG
INGEST --&gt; FAISSF
VDB --- FAISSF
ROUTERS --&gt; GEN --&gt; GEMMA
GEN --&gt; SQLITE
ROUTERS --&gt; PROG --&gt; SQLITE
ROUTERS --&gt; DOCS
&lt;/div&gt;
&lt;p&gt;Behalte dieses Bild im Hinterkopf — die Teile 2, 3 und 4 zoomen jeweils in einen Bereich davon hinein.&lt;/p&gt;
&lt;h2 id="der-tech-stack-und-warum-jedes-teil-seinen-platz-verdient-hat"&gt;Der Tech-Stack und warum jedes Teil seinen Platz verdient hat&lt;/h2&gt;
&lt;p&gt;Die komplette Liste der Abhängigkeiten (Dependencies) lebt in der &lt;code&gt;requirements.txt&lt;/code&gt;. Hier ist das, was wichtig ist, gruppiert nach Aufgabe:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requests bearbeiten.&lt;/strong&gt; FastAPI definiert die Endpoints und validiert jeden Request und jede Response mit Pydantic (einer Datenvalidierungs-Bibliothek — stell es dir wie einen strengen Zollbeamten für JSON vor). Uvicorn ist der ASGI-Server (Asynchronous Server Gateway Interface — der Python-Standard, der es einem Prozess erlaubt, viele gleichzeitige Requests zu jonglieren), der das Ganze am Ende ausführt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Denken.&lt;/strong&gt; Ollama hostet &lt;code&gt;gemma4:e4b&lt;/code&gt; — das &lt;code&gt;e4b&lt;/code&gt;-Tag steht für die Variante mit rund vier Milliarden effektiven Parametern, was ungefähr einem 9,6 GB Download entspricht — und &lt;code&gt;embeddinggemma&lt;/code&gt; (ca. 622 MB). Das Agentenverhalten wird mit dem Strands Agents SDK gebaut, welches das Modell in einen Loop (Schleife) verpackt, in dem es Tools aufrufen, die Ergebnisse lesen und erst danach antworten kann. (Wo ich Ollama in Relation zu Docker laufen lasse, ist eine bewusste Entscheidung mit eigener Hintergrundgeschichte:
.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dinge finden.&lt;/strong&gt; FAISS (Facebook AI Similarity Search — Metas Vektorsuch-Bibliothek) kümmert sich um semantische Lookups; &lt;code&gt;rank-bm25&lt;/code&gt; kümmert sich um Keyword-Lookups; eine Formel namens Reciprocal Rank Fusion vereint die beiden. Teil 3 packt all das genauer aus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dokumente lesen.&lt;/strong&gt; &lt;code&gt;pypdf&lt;/code&gt; für PDFs, mit einem OCR-Fallback (Optical Character Recognition — verwandelt Bilder von Text in echten Text) für gescannte Seiten via &lt;code&gt;pymupdf&lt;/code&gt; und Tesseract. Word, PowerPoint und Excel bekommen jeweils ihren eigenen Extractor. &lt;code&gt;trafilatura&lt;/code&gt; zieht sauberen Artikeltext aus Webseiten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keine Arbeit verlieren.&lt;/strong&gt; DBOS macht die Ingestion-Pipeline dauerhaft (durable) — jeder Schritt bekommt einen Checkpoint in PostgreSQL, sodass bei einem Absturz fortgesetzt statt von vorn begonnen wird. Teil 2 zeigt das in Aktion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sich erinnern.&lt;/strong&gt; SQLite — eine vollwertige Datenbank-Engine, die in einer einzigen Datei namens &lt;code&gt;progress.db&lt;/code&gt; lebt — hält deine Lernsitzungen, Errungenschaften (Achievements), Quizzes, Workshops, Karteikartendecks und Mindmaps fest.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="anhang-abkürzungen-in-diesem-post"&gt;Anhang: Abkürzungen in diesem Post&lt;/h2&gt;
&lt;p&gt;Das Versprechen dieser Serie ist &amp;ldquo;keine unerklärten Abkürzungen&amp;rdquo;, also ist hier die Tabelle, von der ich wünschte, sie wäre in jedem technischen Tutorial dabei.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abkürzung&lt;/th&gt;
&lt;th&gt;Volle Form&lt;/th&gt;
&lt;th&gt;Bedeutung in einfachem Deutsch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&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 neuronales Netz, das mit massenhaft Text trainiert wurde und Sprache lesen und generieren kann&lt;/td&gt;
&lt;/tr&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;Hole erst relevante Passagen aus &lt;em&gt;deinen&lt;/em&gt; Dokumenten und lass das Modell daraus antworten — statt aus seinem Trainingsgedächtnis&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 Menge an URLs, die das Frontend aufruft, um mit dem Backend zu sprechen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ASGI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Asynchronous Server Gateway Interface&lt;/td&gt;
&lt;td&gt;Der Python-Standard, der es dem Server erlaubt, viele Anfragen gleichzeitig zu bearbeiten&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 universelle Textformat für strukturierte Daten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NDJSON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Newline-Delimited JSON&lt;/td&gt;
&lt;td&gt;Ein Stream, bei dem jede Zeile ein eigenes JSON-Objekt ist — ideal, um KI-Antworten Stück für Stück (Chunk für Chunk) zu streamen&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, um Vektoren zu speichern und die ähnlichsten schnell zu finden&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 klassische 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 zum Zusammenführen mehrerer gerankter Ergebnislisten, die nur die Ränge benutzt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ANN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Approximate Nearest Neighbour&lt;/td&gt;
&lt;td&gt;Eine Geschwindigkeits-Abkürzung, die viele Vektordatenbanken nehmen. CogniVault nutzt stattdessen bewusst einen &lt;em&gt;exakten&lt;/em&gt; Index — präzise und für eine persönliche Bibliothek völlig schnell genug&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 (das Forschungsprojekt, aus dem es entstand)&lt;/td&gt;
&lt;td&gt;Eine Bibliothek, die Workflow-Schritte in einer Datenbank zwischenspeichert, sodass abgestürzte Jobs fortgesetzt werden können&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQL / SQLite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured Query Language / SQLite&lt;/td&gt;
&lt;td&gt;Die Sprache von relationalen Datenbanken / eine winzige Datenbank, die in einer Datei lebt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optical Character Recognition&lt;/td&gt;
&lt;td&gt;Verwandelt Bilder von Text (Scans) in maschinenlesbaren Text&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 eindeutigen Hash abgebildet, genutzt um geänderte Dateien zu erkennen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CORS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cross-Origin Resource Sharing&lt;/td&gt;
&lt;td&gt;Browser-Regeln, die kontrollieren, welche Websites die API aufrufen dürfen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSRF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server-Side Request Forgery&lt;/td&gt;
&lt;td&gt;Ein Angriff, bei dem ein Server ausgetrickst wird, interne URLs abzurufen — der URL-Import Endpoint schützt davor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCQ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple-Choice Question&lt;/td&gt;
&lt;td&gt;Einer der beiden Quizfragen-Typen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Knowledge Base&lt;/td&gt;
&lt;td&gt;All deine eingelesenen, durchsuchbaren Dokumente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;(Jede Behauptung in dieser Serie kann direkt im
überprüft werden — die relevante Datei wird immer genannt, wenn es wichtig ist, und die Repository-README skizziert die komplette Architektur.)&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Nimm die Abkürzungen weg, und CogniVault ist ein kleines System: ein Webserver, eine Modell-Laufzeitumgebung, eine Haltbarkeits-Datenbank (Durability Database) und eine Handvoll Dateien. Die Raffinesse liegt nicht in der Anzahl der Teile — sie liegt darin, wie ein paar gut gewählte Teile zusammenarbeiten. Von dieser Zusammenarbeit handeln die nächsten drei Teile.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Als Nächstes:&lt;/strong&gt;
— wie ein 1.000-seitiges gescanntes PDF zu etwas wird, das die KI in Sekunden durchsuchen kann, und warum die Pipeline einen Absturz bei Seite 800 überlebt.&lt;/p&gt;</description></item><item><title>CogniVault Backend erklärt, Teil 2 · Von der Datei zum durchsuchbaren Wissen</title><link>https://aretascodes.dev/de/blog/backend-explained-ingestion/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/backend-explained-ingestion/</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 vollständig erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ein LLM kann dein PDF nicht &amp;ldquo;öffnen&amp;rdquo;. Dieser Satz überrascht viele Neulinge, also lass uns das kurz sacken lassen: Wenn du in CogniVault mit deinen Dokumenten chattest, fasst das Modell die Originaldateien nie an. Es muss etwas &lt;em&gt;zwischen&lt;/em&gt; &amp;ldquo;Ich habe eine Datei in den Browser gezogen&amp;rdquo; und &amp;ldquo;Die KI hat mir gerade Seite 47 zitiert&amp;rdquo; passieren.&lt;/p&gt;
&lt;p&gt;Dieses Etwas nennt man &lt;strong&gt;Ingestion&lt;/strong&gt; (Datenaufnahme), und darum geht es in diesem Teil. In
haben wir das große Ganze skizziert; heute zoomen wir in einen bestimmten Bereich – das Fließband, das Dateien in durchsuchbares Wissen verwandelt.&lt;/p&gt;
&lt;h2 id="das-fließband"&gt;Das Fließband&lt;/h2&gt;
&lt;p&gt;Stell dir die Ingestion wie ein Fließband mit vier Stationen vor:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Extrahieren:&lt;/strong&gt; Den Text aus jeder Datei herausholen – auch aus gescannten.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chunken (Zerlegen):&lt;/strong&gt; Den Text in Stücke zerschneiden, die klein genug sind, um in einen Prompt zu passen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embedden (Einbetten):&lt;/strong&gt; Jeden Chunk in einen Vektor (eine Liste von Zahlen, die seine Bedeutung einfängt) verwandeln, damit ähnliche Ideen im Vektorraum nah beieinander landen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speichern:&lt;/strong&gt; Vektoren und Metadaten so ablegen, dass sie später durchsucht werden können.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="mermaid"&gt;flowchart TD
A["Upload&lt;br/&gt;POST /upload&lt;br/&gt;gespeichert in docs/"] --&gt; B
subgraph WF["DBOS dauerhafter Workflow"]
B["Schritt 1&lt;br/&gt;Welche Dateien haben sich geändert?&lt;br/&gt;SHA-256 Fingerabdrücke"] --&gt; C["Schritt 2&lt;br/&gt;Text extrahieren&lt;br/&gt;pro Format + OCR-Fallback"]
C --&gt; D["Chunking&lt;br/&gt;1000 Zeichen, 100 Überlappung"]
D --&gt; E["Schritt 3&lt;br/&gt;Embedden&lt;br/&gt;embeddinggemma, 5er-Batches"]
E --&gt; F["Schritt 4&lt;br/&gt;Speichern&lt;br/&gt;FAISS Index + Metadaten JSON"]
end
F --&gt; G["In-Memory Index neu laden&lt;br/&gt;sofort durchsuchbar"]
&lt;/div&gt;
&lt;p&gt;Ziemlich simpel. Die spannende Ingenieursarbeit steckt in den Fehlerfällen – fangen wir also damit an.&lt;/p&gt;
&lt;h2 id="das-kassenbuch-der-fabrik-warum-die-pipeline-keine-arbeit-verlieren-darf"&gt;Das Kassenbuch der Fabrik: Warum die Pipeline keine Arbeit verlieren darf&lt;/h2&gt;
&lt;p&gt;Das Embedden einer großen Bibliothek dauert Minuten. Was passiert, wenn dein Laptop bei Seite 800 eines 1.000-seitigen Handbuchs in den Ruhezustand geht? Bei einem einfachen Python-Skript fängt alles wieder bei Seite 1 an.&lt;/p&gt;
&lt;p&gt;CogniVault schreibt die Pipeline stattdessen als einen &lt;strong&gt;dauerhaften DBOS-Workflow&lt;/strong&gt;. Stell dir eine Fabrik vor, in der jede Station einen dauerhaften Stempel in ein Kassenbuch drückt, sobald sie eine Kiste fertiggestellt hat. Fällt der Strom aus, baut niemand fertige Kisten neu zusammen – die Arbeiter lesen das Buch und machen beim ersten ungestempelten Eintrag weiter.&lt;/p&gt;
&lt;p&gt;DBOS ist dieses Buch, und PostgreSQL ist das Papier, auf dem es geschrieben steht. Jede Station der Pipeline ist ein mit Checkpoints versehener Schritt; nach einem Neustart liefern abgeschlossene Schritte sofort ihre aufgezeichneten Ergebnisse zurück und die Ausführung geht beim ersten unfertigen Schritt weiter. Ein fehlgeschlagener Embedding-Batch wird einfach nochmal probiert.&lt;/p&gt;
&lt;p&gt;Das ist auch der Mechanismus hinter der Live-Fortschrittsanzeige in der UI: Der Start einer Ingestion liefert eine &lt;code&gt;workflow_id&lt;/code&gt; zurück, und das Frontend fragt regelmäßig einen Status-Endpoint ab, der meldet, welche Schritte abgeschlossen sind, welche laufen und welche noch warten.&lt;/p&gt;
&lt;p&gt;Ich habe einen ausführlichen Deep-Dive über diesen Mechanismus geschrieben – inklusive dessen, was passiert, wenn du den Prozess mitten in der Ingestion mit &lt;code&gt;kill -9&lt;/code&gt; beendest – in
.&lt;/p&gt;
&lt;h2 id="fingerabdrücke-kein-blindflug-sha-256-änderungserkennung"&gt;Fingerabdrücke, kein Blindflug: SHA-256 Änderungserkennung&lt;/h2&gt;
&lt;p&gt;Deine komplette Bibliothek jedes Mal neu zu embedden, wenn du eine einzige Datei hinzufügst, wäre Verschwendung. Bevor also irgendwelche Arbeit passiert, berechnet die Pipeline für jede Datei einen &lt;strong&gt;SHA-256 Hash&lt;/strong&gt; (einen Inhalts-Fingerabdruck – ändere ein Zeichen in der Datei, und der Fingerabdruck ändert sich komplett) und vergleicht ihn mit dem Fingerabdruck, der bei den vorhandenen Chunks der Datei gespeichert ist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Noch nie gesehen&lt;/strong&gt; → einlesen (ingest).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fingerabdruck hat sich geändert&lt;/strong&gt; → die alten Chunks werden &lt;em&gt;soft-gelöscht&lt;/em&gt; und die Datei wird neu eingelesen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fingerabdruck identisch&lt;/strong&gt; → komplett überspringen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Warum &amp;ldquo;soft&amp;rdquo;-gelöscht? Weil der FAISS-Indextyp, den CogniVault nutzt, keine einzelnen Vektoren entfernen kann. Veraltete Chunks werden in den Metadaten einfach als &lt;code&gt;deleted: true&lt;/code&gt; markiert; ihre Vektoren bleiben im Index, aber jede Suche filtert sie heraus. Das ist eine ehrliche, langweilige Lösung – und sie korrumpiert niemals den Index.&lt;/p&gt;
&lt;h2 id="jedes-format-kriegt-eine-sonderbehandlung"&gt;Jedes Format kriegt eine Sonderbehandlung&lt;/h2&gt;
&lt;p&gt;Hier ist ein Detail, das eine Demo von einem Produkt unterscheidet. Eine naive Pipeline extrahiert einfach &amp;ldquo;den ganzen Text&amp;rdquo; und macht dann Feierabend. Bei CogniVault bekommt jedes Format einen Extractor, der genau die &lt;em&gt;Struktur&lt;/em&gt; beibehält, die das Retrieval später braucht:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Strategie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PDF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Seite für Seite, wobei die Seitenzahlen behalten werden (diese werden später zu Quellenangaben). Jede Seite mit weniger als 50 Zeichen gilt als gescannt und wird an die OCR geschickt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gescannte Seite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Die Seite wird mit etwa 144 dpi als Bild gerendert, dann extrahiert Tesseract OCR (Optical Character Recognition – Text aus Bildern auslesen) die Wörter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Markdown&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wird an Überschriften aufgeteilt; jeder Abschnitts-Chunk bekommt einen Breadcrumb-Präfix wie &lt;code&gt;[Section: Intro &amp;gt; Setup]&lt;/code&gt;, damit sein Embedding die Dokumentenhierarchie in sich trägt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zeilen werden in 20er-Gruppen gechunkt – und &lt;em&gt;jeder&lt;/em&gt; Chunk bekommt die Kopfzeile vorangestellt, sodass das Modell immer die Spaltennamen kennt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Excel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gleiches Zeilen-Gruppen-Prinzip pro Arbeitsblatt, mit dem Präfix &lt;code&gt;[Sheet: name]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PowerPoint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ein Chunk pro Folie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Word&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Absätze plus Tabellenzellen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Webseiten&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Werden bei Bedarf abgerufen und auf sauberen Artikeltext reduziert – geschützt durch einen SSRF-Guard (Schutz vor Server-Side Request Forgery: der Server weigert sich, private oder interne Adressen abzurufen)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Frag dich mal, warum das CSV-Detail wichtig ist. Wenn Chunk 14 eines Spreadsheets einfach nur zwanzig nackte Zahlenreihen enthält, wird keine Suche ihn jemals mit der Frage &amp;ldquo;Wie hoch war das Q3-Budget?&amp;rdquo; in Verbindung bringen. Stellst du die Kopfzeile voran, &lt;em&gt;weiß&lt;/em&gt; der Chunk, dass er Budget-Spalten enthält. Struktur ist der Treibstoff fürs Retrieval.&lt;/p&gt;
&lt;h2 id="chunking-1000-zeichen-mit-100-zeichen-sicherheitsnetz-überlappung"&gt;Chunking: 1.000 Zeichen mit 100 Zeichen Sicherheitsnetz (Überlappung)&lt;/h2&gt;
&lt;p&gt;Lange Texte werden in Stücke von etwa 1.000 Zeichen zerlegt, wobei sich benachbarte Stücke um 100 Zeichen überlappen. Diese Überlappung ist eine Versicherung: Ein Satz, der genau an der Chunk-Grenze zerschnitten wird, taucht in einem der beiden Nachbarn immer noch als Ganzes auf, sodass keine Idee in die Lücke zwischen den Chunks fällt.&lt;/p&gt;
&lt;h2 id="embedden-und-speichern"&gt;Embedden und Speichern&lt;/h2&gt;
&lt;p&gt;Chunks werden von &lt;code&gt;embeddinggemma&lt;/code&gt; (via Ollama) in 5er-Batches embedded – jeder Chunk wird zu einem Vektor. Die Vektoren werden normalisiert und an einen FAISS-Index angehängt; daneben hält eine JSON-Datei für jeden Chunk den Quelldateinamen, die Seitenzahl, die Kategorie, den Fingerabdruck und den eigentlichen Text fest. Der Index speichert die Zahlen; das JSON speichert die Bedeutung.&lt;/p&gt;
&lt;p&gt;Eine Designentscheidung, die man für Anfänger hervorheben sollte: Das hier ist ein &lt;strong&gt;exakter&lt;/strong&gt; Index, kein approximativer. Viele Vektor-Datenbanken nutzen ANN (Approximate Nearest Neighbour)-Abkürzungen, die bei riesiger Skalierung ein wenig Genauigkeit gegen Geschwindigkeit tauschen. Im Maßstab einer persönlichen Bibliothek brauchst du diesen Kompromiss nicht – CogniVault prüft jeden Vektor bei jeder Suche und ist trotzdem schnell.&lt;/p&gt;
&lt;h2 id="die-gesamte-reise-von-anfang-bis-ende"&gt;Die gesamte Reise, von Anfang bis Ende&lt;/h2&gt;
&lt;div class="mermaid"&gt;%%{init: {'sequence': {'actorFontSize': 28, 'messageFontSize': 24, 'loopTextFontSize': 22, 'noteFontSize': 22}}}%%
sequenceDiagram
actor U as Du
participant F as Frontend
participant B as FastAPI
participant W as DBOS Workflow
participant O as Ollama (embeddinggemma)
participant V as FAISS + Metadaten
U-&gt;&gt;F: Drag and Drop einer Datei, Kategorie wählen
F-&gt;&gt;B: POST /upload
B-&gt;&gt;B: Typ und Größe validieren, in docs/ speichern
F-&gt;&gt;B: POST /ingest
B-&gt;&gt;W: Dauerhaften Workflow starten
B--&gt;&gt;F: workflow_id
loop Status abfragen
F-&gt;&gt;B: GET /ingest/status/{workflow_id}
B--&gt;&gt;F: Schrittliste (steuert die Fortschrittsanzeige)
end
W-&gt;&gt;W: SHA-256 Änderungserkennung
W-&gt;&gt;W: Text extrahieren (pro Format, OCR falls gescannt)
W-&gt;&gt;W: Chunking (1000 Zeichen / 100 Überlappung)
W-&gt;&gt;O: Embedden in 5er-Batches
O--&gt;&gt;W: Vektoren
W-&gt;&gt;V: Vektoren + Metadaten anhängen
B--&gt;&gt;F: SUCCESS — Index neu geladen
F--&gt;&gt;U: "Wissens-Sync abgeschlossen"
&lt;/div&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Bei der Ingestion entscheidet sich meistens die eigentliche RAG-Qualität – lange bevor irgendwelches clevere Prompting ins Spiel kommt. Beibehaltene Seitenzahlen, Header, die in jeden Spreadsheet-Chunk kopiert werden, gerettete Scans durch OCR, und ein Kassenbuch, das das Ganze absturzsicher macht: Nichts davon ist glamourös, aber alles davon zeigt sich später in Form von Antworten, die die richtige Seite zitieren.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="anhang-abkürzungen-in-diesem-post"&gt;Anhang: Abkürzungen in diesem Post&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abkürzung&lt;/th&gt;
&lt;th&gt;Volle Form&lt;/th&gt;
&lt;th&gt;Bedeutung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&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 neuronales Netz, trainiert mit riesigen Textmengen, das Sprache lesen und erzeugen kann&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 Bibliothek, die Workflow-Schritte in PostgreSQL sichert, damit abgestürzte Jobs fortgesetzt werden können&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;Ein Inhalts-Fingerabdruck – ändere ein Byte einer Datei und der Hash ändert sich komplett&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optical Character Recognition&lt;/td&gt;
&lt;td&gt;Text aus Bildern lesen – der Rettungsweg für gescannte PDF-Seiten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSRF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server-Side Request Forgery&lt;/td&gt;
&lt;td&gt;Ein Angriff, bei dem ein Server ausgetrickst wird, interne URLs abzurufen; der URL-Importer blockiert dies&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 Vektor-Index, an den die Embeddings angehängt werden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ANN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Approximate Nearest Neighbour&lt;/td&gt;
&lt;td&gt;Die Genauigkeit-gegen-Geschwindigkeit-Abkürzung, die CogniVault absichtlich &lt;em&gt;nicht&lt;/em&gt; nimmt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;dpi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dots Per Inch&lt;/td&gt;
&lt;td&gt;Bildauflösung – gescannte Seiten werden vor der OCR mit ca. 144 dpi gerendert&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 Format der Chunk-Metadaten-Datei neben dem FAISS-Index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PDF / CSV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Portable Document Format / Comma-Separated Values&lt;/td&gt;
&lt;td&gt;Zwei der acht+ unterstützten Dateiformate&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 Endpoints (&lt;code&gt;/upload&lt;/code&gt;, &lt;code&gt;/ingest&lt;/code&gt;, &lt;code&gt;/ingest/status/…&lt;/code&gt;), die den Ablauf steuern&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Als Nächstes:&lt;/strong&gt;
— hybrides Retrieval, der 6-Tools-Agent und der 2-Phasen-Stream, der zeigt, wie das Modell denkt, bevor es antwortet.&lt;/p&gt;</description></item><item><title>CogniVault Backend erklärt, Teil 3 · Wie aus einer Frage eine belegte Antwort wird</title><link>https://aretascodes.dev/de/blog/backend-explained-rag-agent/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/backend-explained-rag-agent/</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 vollständig erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Du tippst eine Frage ein. Ein paar Sekunden später bekommst du eine Antwort mit Fußnoten — genaue Angabe der Dokumente und Seiten, aus denen sie stammt. Dieser Teil geht alles durch, was dazwischen passiert.&lt;/p&gt;
&lt;p&gt;In
haben wir die Wissensbasis aufgebaut: jedes Dokument gechunkt, embedded und indiziert. Jetzt fangen wir an, sie zu &lt;em&gt;nutzen&lt;/em&gt; — und hier hört CogniVault auf, nur eine Pipeline zu sein, und fängt an, spannend zu werden.&lt;/p&gt;
&lt;h2 id="zwei-bibliothekare-weil-einer-dich-immer-wieder-hängen-lässt"&gt;Zwei Bibliothekare, weil einer dich immer wieder hängen lässt&lt;/h2&gt;
&lt;p&gt;Stell dir eine Bibliothek vor mit einer Bibliothekarin, die alles nach &lt;em&gt;Vibes&lt;/em&gt; ordnet. Frag sie nach &amp;ldquo;Prozeduren bei Server-Ausfall&amp;rdquo; und sie ist genial — sie versteht, was du meinst, und findet Dokumente, die das Konzept diskutieren, egal welche Wörter sie benutzen. Aber frag sie nach &amp;ldquo;Fehlercode 404B&amp;rdquo;, zuckt sie mit den Schultern und reicht dir allgemeine Netzwerk-Guides. Mit exakten Zeichenketten kann sie nichts anfangen.&lt;/p&gt;
&lt;p&gt;Am Ende des Flurs sitzt ein zweiter Bibliothekar mit einem Zettelkasten. Er findet den genauen String &amp;ldquo;404B&amp;rdquo; sofort — aber stell ihm eine konzeptionelle Frage, die anders formuliert ist als im Quelltext, und er findet überhaupt nichts.&lt;/p&gt;
&lt;p&gt;Das sind die zwei Hälften der Suche:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Semantische Suche (FAISS)&lt;/strong&gt; — deine Frage wird in einen Vektor umgewandelt (embedded), und der Index findet Chunks, deren Vektoren in die gleiche Richtung zeigen (technisch gesehen: Cosinus-Ähnlichkeit — wie gut zwei Pfeile übereinstimmen). Super für die Bedeutung, blind für exakte Identifikatoren.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyword-Suche (BM25)&lt;/strong&gt; — eine Bewertungsformel (Scoring), die Chunks belohnt, die deine &lt;em&gt;exakten&lt;/em&gt; Wörter enthalten, gewichtet danach, wie markant diese Wörter sind. Super für Identifikatoren, blind für Synonyme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CogniVault fragt &lt;strong&gt;jedes Mal beide Bibliothekare&lt;/strong&gt;, und verschmilzt dann ihre Antworten mit &lt;strong&gt;Reciprocal Rank Fusion (RRF)&lt;/strong&gt; — einer Formel, die gerankte Listen kombiniert, indem sie nur die &lt;em&gt;Positionen&lt;/em&gt; nutzt:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;score(chunk) = summe aus beiden Listen von 1 / (60 + rang)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ein Chunk, der von einem der beiden Bibliothekare hoch gerankt wird, punktet gut; ein Chunk, den beide gut fanden, schwimmt ganz nach oben. Die Eleganz liegt darin, was &lt;em&gt;fehlt&lt;/em&gt;: Du musst niemals die Ähnlichkeits-Scores von FAISS mit der komplett anderen Skala von BM25 abgleichen, weil Ränge (Ranks) der einzige Input sind. Die Konstante 60 stammt direkt aus dem ursprünglichen Research-Paper von 2009, und ja, sie ist auch im Code zitiert.&lt;/p&gt;
&lt;p&gt;Ein paar Implementierungsdetails, die du kennen solltest: Beide Suchen holen absichtlich zu viel (mindestens 20 Kandidaten jeweils), damit die Fusion Material zum Arbeiten hat; sehr schwache semantische Treffer werden fallengelassen, aber ein perfekt auf Keywords passender Chunk kann durch die Fusion trotzdem noch gerettet werden; und die finale Antwort nutzt die Top-7-Chunks. Ich habe dieses ganze Setup in
gegen eine reine Vektorsuche gebenchmarkt, falls du die Kriegsgeschichten dazu lesen willst.&lt;/p&gt;
&lt;h2 id="der-agent-ein-modell-das-selbst-entscheidet"&gt;Der Agent: Ein Modell, das selbst entscheidet&lt;/h2&gt;
&lt;p&gt;Hier ist der zweite Punkt, der Anfänger oft ins Straucheln bringt: Der Chat von CogniVault ist nicht einfach &amp;ldquo;Kopiere Chunks in einen Prompt, bekomme eine Antwort.&amp;rdquo; Es ist ein &lt;strong&gt;Agent&lt;/strong&gt; — ein Modell, das in einer Schleife läuft, in der es sich &lt;em&gt;entscheiden&lt;/em&gt; kann, Tools aufzurufen, deren Ergebnisse zu lesen und erst dann zu antworten.&lt;/p&gt;
&lt;p&gt;Gebaut mit dem Strands Agents SDK, bekommt der Agent sechs Tools:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Aufgabe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_knowledge_base&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Das Kern-RAG-Tool — führt die hybride Suche von oben aus, liefert Chunks mit Quelle und Seite zurück&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_documents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nachschauen, was im Vault (Tresor) liegt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;analyze_document&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Strukturierte Analyse eines Dokuments: Themen, Entitäten, Fakten, Zusammenfassung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;compare_documents&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Beantwortung einer Frage durch den direkten Vergleich von zwei Dokumenten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;calculator&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sicheres Rechnen — der Ausdruck wird in einen Syntaxbaum (AST) geparst und nur erlaubte Operatoren werden ausgeführt. Niemals &lt;code&gt;eval()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;current_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Datum und Uhrzeit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Es gibt hier kein fest programmiertes Routing. Das &lt;em&gt;Modell&lt;/em&gt; liest deine Frage und entscheidet, welche Tools es aufruft, geleitet von seinem System-Prompt. Fragst du &amp;ldquo;Vergleiche die zwei Verträge hinsichtlich der Kündigungsklauseln&amp;rdquo;, greift es zum &lt;code&gt;compare_documents&lt;/code&gt;; fragst du &amp;ldquo;Was sind 15% von 2.340&amp;rdquo;, nutzt es den Taschenrechner, anstatt Mathematik zu halluzinieren.&lt;/p&gt;
&lt;p&gt;Zwei Sicherheitsdetails, auf die Anfänger achten sollten, weil sie den Unterschied zwischen einem Spielzeug und einem Produkt ausmachen: &lt;strong&gt;Für jeden Request wird ein frischer Agent gebaut&lt;/strong&gt; (kein geteilter State, der zwischen parallelen Chats überspricht), und die Dokumentenanalyse-Tools rufen das Modell &lt;em&gt;direkt&lt;/em&gt; auf statt über den Agenten — sonst könnte ein Agent, der ein Tool aufruft, das wiederum den Agenten aufruft, in einer Endlosschleife feststecken.&lt;/p&gt;
&lt;h2 id="dem-modell-beim-denken-zusehen"&gt;Dem Modell beim Denken zusehen&lt;/h2&gt;
&lt;p&gt;Wenn du eine Nachricht absendest, streamt die Antwort als &lt;strong&gt;NDJSON&lt;/strong&gt; (Newline-Delimited JSON — jede Zeile des Streams ist ein eigenes kleines JSON-Objekt). Und das passiert in zwei Phasen:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1 — Denken.&lt;/strong&gt; Gemmas Argumentationskette (Reasoning Chain) streamt zuerst und wird im aufklappbaren Panel über der Antwort gerendert. Es ist absichtlich so gebaut, dass es nicht zwingend klappen muss (Best-Effort): Falls es aus irgendeinem Grund fehlschlägt, kommt die Antwort trotzdem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 2 — Die Agenten-Antwort.&lt;/strong&gt; Tools laufen, Zitate (Quellenangaben) tauchen im Quellen-Panel auf, sobald die Suche abgeschlossen ist — &lt;em&gt;bevor&lt;/em&gt; die Antwort fertig geschrieben ist — und der Antworttext streamt herein.&lt;/p&gt;
&lt;div class="mermaid"&gt;flowchart TB
Q["Deine Frage&lt;br/&gt;(plus optionale Bilder, Dateien, Scope)"] --&gt; P1
subgraph STREAM["POST /rag — ein NDJSON-Stream"]
P1["Phase 1: Denken&lt;br/&gt;Reasoning-Chunks streamen zuerst"]
P1 --&gt; P2["Phase 2: Agent&lt;br/&gt;frisch pro Request, Historie wiederhergestellt"]
P2 --&gt;|"entscheidet sich aufzurufen"| T["search_knowledge_base"]
T --&gt; D["FAISS&lt;br/&gt;semantisch"]
T --&gt; S["BM25&lt;br/&gt;Keywords"]
D --&gt; RRF["RRF Fusion — Top 7 Chunks"]
S --&gt; RRF
RRF --&gt;|"Chunks + Quellenangaben"| P2
P2 --&gt; OUT["Quellenangaben, dann Antworttext,&lt;br/&gt;dann ein Speicher-Nutzungs-Report"]
end
&lt;/div&gt;
&lt;p&gt;Jede Zeile im Stream ist typisiert: &lt;code&gt;thinking&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; (eine Quelle/Zitat), &lt;code&gt;text&lt;/code&gt; (Antwort), &lt;code&gt;memory&lt;/code&gt; (wie voll das Konversations-Budget ist) oder &lt;code&gt;error&lt;/code&gt;. Das Frontend liest einfach die Zeilen und leitet sie in das richtige Panel weiter. Ich habe dieses Design zerlegt — und erklärt, warum das Denken &lt;em&gt;vor&lt;/em&gt; den Tool-Aufrufen kommt — in
.&lt;/p&gt;
&lt;h2 id="ein-speicher-budget-kein-fassloses-loch"&gt;Ein Speicher-Budget, kein fassloses Loch&lt;/h2&gt;
&lt;p&gt;Gemmas Context Window (die Textmenge, die das Modell auf einmal betrachten kann) beträgt 128K Token, aber CogniVault lässt den Chatverlauf nicht über das komplette Fenster wuchern. Jede Chat-Session bekommt ein Budget von 48.000 Zeichen — grob 12.000 Token. Überschreitest du es, fällt das &lt;em&gt;älteste&lt;/em&gt; Frage-Antwort-Paar leise als erstes heraus. So bleibt der Großteil des Fensters frei für das, was wirklich zählt: deine aktuelle Frage und die abgerufenen Chunks.&lt;/p&gt;
&lt;p&gt;Zwei Resilienz-Tricks, die du für deine eigenen Projekte klauen solltest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reboots überleben.&lt;/strong&gt; In-Memory-Verlauf stirbt mit dem Prozess. Deshalb baut die erste Nachricht in einer Session nach einem Backend-Neustart ihren Verlauf aus dem Chat-Log wieder auf, den das Frontend persistiert hat. Multi-Turn-Gedächtnis überlebt Neustarts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bearbeiten und neu generieren.&lt;/strong&gt; Wenn du eine frühere Nachricht bearbeitest, wird der gespeicherte Verlauf auf genau diesen Punkt zurückgespult, bevor neu gefragt wird — das Modell vergisst buchstäblich die Zeitlinie, die jetzt nicht mehr existiert.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="scope-die-ki-auf-bestimmte-dokumente-festnageln"&gt;Scope: Die KI auf bestimmte Dokumente festnageln&lt;/h2&gt;
&lt;p&gt;Noch ein letztes Feature, und eine Lektion über kleine lokale Modelle. Du kannst einen Chat auf bestimmte Dateien oder eine Kategorie pinnen (Scope). Dieser Filter reist mit dem Request &lt;em&gt;und&lt;/em&gt; eine zwingende Such-Anweisung wird sowohl in den System-Prompt als auch in deine eigentliche Nutzer-Nachricht injiziert.&lt;/p&gt;
&lt;p&gt;Warum in beide? Weil kleine Modelle manchmal Anweisungen ignorieren, die nur im System-Prompt stehen — aber sie können nicht ignorieren, was direkt in der Frage steckt. Gürtel und Hosenträger. Wenn du mit 4-Milliarden-Parameter-Modellen arbeitest statt mit den größten Frontrunnern, lernst du, Anweisungen so zu platzieren, dass man sie unmöglich übersehen kann, anstatt nur zu hoffen, dass sie befolgt werden.&lt;/p&gt;
&lt;h2 id="fazit"&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Eine belegte Antwort ist das Zusammenspiel von vier Systemen: Zwei Retriever decken gegenseitig ihre blinden Flecken ab, eine Fusionsformel, die nichts weiter braucht als Ränge, ein Agent, der sich seine Tools selbst aussucht, und ein Stream, der seinen Lösungsweg offenlegt. Keines der vier ist für sich genommen exotisch — das eigentliche Produkt ist ihre Zusammenarbeit.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="anhang-abkürzungen-in-diesem-post"&gt;Anhang: Abkürzungen in diesem Post&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abkürzung&lt;/th&gt;
&lt;th&gt;Volle Form&lt;/th&gt;
&lt;th&gt;Bedeutung&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;Hole erst relevante Passagen aus deinen eigenen Dokumenten; lass das Modell daraus antworten&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;Die semantische (bedeutungsbasierte) Hälfte der hybriden Suche&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;Die Keyword-Hälfte — eine klassische Ranking-Formel aus dem Okapi Information-Retrieval-System&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;Vereint die beiden gerankten Listen und nutzt dafür nur den Rang jedes Chunks: &lt;code&gt;score = Σ 1/(60 + rang)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NDJSON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Newline-Delimited JSON&lt;/td&gt;
&lt;td&gt;Ein Stream, bei dem jede Zeile ein eigenes komplettes JSON-Objekt ist — das Format der Chat-Antwort&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 universelle Textformat für strukturierte Daten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Abstract Syntax Tree&lt;/td&gt;
&lt;td&gt;Die geparste Form eines Ausdrucks — wie der Taschenrechner rechnet, ohne &lt;code&gt;eval()&lt;/code&gt; zu nutzen&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 neuronales Netz, trainiert mit riesigen Textmengen, 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 von Bausteinen — hier Strands, das die Agenten-Schleife bereitstellt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;K&lt;/strong&gt; (in 128K)&lt;/td&gt;
&lt;td&gt;Kilo (Tausend)&lt;/td&gt;
&lt;td&gt;128K Token ≈ 128.000 Token — Gemmas Context Window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Als Nächstes:&lt;/strong&gt;
— die gleiche Maschinerie, aber ausgerichtet auf das Erstellen von Quizzes, Workshops, Karteikarten und Mindmaps, plus eine Tabelle mit jedem Byte, das die App speichert und wo genau es lebt.&lt;/p&gt;</description></item><item><title>CogniVault Backend erklärt, Teil 4 · Study Tools, Fortschritt und die Privacy-Belege</title><link>https://aretascodes.dev/de/blog/backend-explained-study-hub-privacy/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><guid>https://aretascodes.dev/de/blog/backend-explained-study-hub-privacy/</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 vollständig erklärt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In
haben wir eine Frage durch das hybride Retrieval und den Agenten-Loop bis hin zur zitierten Antwort verfolgt. In diesem letzten Teil wird dieselbe Maschinerie auf ein ganz anderes Ziel ausgerichtet: &lt;em&gt;Dir etwas beizubringen&lt;/em&gt; — und dann schließen wir die Serie ab, indem wir das zentrale Versprechen des Projekts überprüfen: Nichts verlässt deinen Rechner.&lt;/p&gt;
&lt;h2 id="ein-rezept-vier-lerntools"&gt;Ein Rezept, vier Lerntools&lt;/h2&gt;
&lt;p&gt;CogniVault generiert Quizzes, mehrteilige Workshops, Karteikartendecks und Mindmaps aus deinen Dokumenten. Vier verschiedene Outputs — aber unter der Haube steckt ein gemeinsames Fünf-Schritte-Rezept:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Abrufen (Retrieve).&lt;/strong&gt; Dieselbe hybride Suche wie aus Teil 3, aber statt deiner Frage lautet der Such-Prompt etwas Breitgefächertes wie &lt;em&gt;&amp;ldquo;Schlüsselkonzepte, Definitionen, wichtige Fakten, Hauptideen&amp;rdquo;&lt;/em&gt;, eingeschränkt auf die von dir ausgewählten Dokumente. Bis zu 15 repräsentative Chunks kommen zurück.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mit einem Template prompten.&lt;/strong&gt; Die Anweisungen an Gemma sind nicht tief in Python vergraben — es sind editierbare Markdown-Dateien im Ordner &lt;code&gt;backend/prompts/&lt;/code&gt; (&lt;code&gt;quiz.md&lt;/code&gt;, &lt;code&gt;flashcards.md&lt;/code&gt; usw.). Legst du eine modifizierte Kopie in &lt;code&gt;backend/prompts/custom/&lt;/code&gt; ab, überschreibt sie die mitgelieferte Version beim allerersten Request danach. Kein Neustart, keine Code-Änderung. Prompt Engineering als reine Konfiguration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Output erzwingen (Constrain).&lt;/strong&gt; Ein kleines lokales Modell zu bitten, &amp;ldquo;bitte gib JSON zurück&amp;rdquo;, klappt in den meisten Fällen — und &lt;em&gt;in den meisten Fällen&lt;/em&gt; bedeutet in Produktion schlichtweg einen Bug. CogniVault nutzt Ollamas grammatikgebundene Generierung (&lt;code&gt;format=&amp;quot;json&amp;quot;&lt;/code&gt;), was ungültiges JSON nicht nur unwahrscheinlich, sondern unmöglich macht, gepaart mit einer niedrigen Temperature für Konstanz. Die ganze Geschichte, wie man zuverlässige Strukturen aus einem 4-Milliarden-Parameter-Modell presst, findest du in
.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Defensiv validieren.&lt;/strong&gt; Jedes generierte Item wird Feld für Feld gecheckt. Fehlerhafte Items werden &lt;em&gt;verworfen&lt;/em&gt;, statt den kompletten Batch crashen zu lassen. Kleine Modelle verhauen manchmal eine von zehn Fragen; ein Produkt sollte deswegen nicht gleich zusammenbrechen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Persistieren.&lt;/strong&gt; Alles landet in SQLite. Quizzes sind später fortsetzbar, Workshop-Fortschritte überleben Neustarts und der Status von Karteikarten wird pro Deck gespeichert.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hier ist das Rezept für ein Quiz in Aktion:&lt;/p&gt;
&lt;div class="mermaid"&gt;%%{init: {'sequence': {'actorFontSize': 28, 'messageFontSize': 24, 'loopTextFontSize': 22, 'noteFontSize': 22}}}%%
sequenceDiagram
actor U as Du
participant F as Study Hub UI
participant B as FastAPI
participant V as VectorDB
participant O as Ollama (gemma4:e4b)
participant S as SQLite
U-&gt;&gt;F: Scope, Schwierigkeit, Fragenanzahl wählen
F-&gt;&gt;B: POST /api/study/quiz/generate
B-&gt;&gt;V: Hybride Suche, eingeschränkt auf deine Dokumente
V--&gt;&gt;B: Bis zu 15 repräsentative Chunks
B-&gt;&gt;B: Render das quiz.md Prompt-Template
B-&gt;&gt;O: chat(format="json", niedrige Temperature)
O--&gt;&gt;B: Grammatikgebundenes JSON
B-&gt;&gt;B: Jede Frage validieren, schlechte verwerfen
B-&gt;&gt;S: Quiz speichern (später fortsetzbar)
B--&gt;&gt;F: Typisierte Antwort
F--&gt;&gt;U: Spielen, einreichen, punkten — und vielleicht ein neues Badge
&lt;/div&gt;
&lt;p&gt;Die vier Tools unterscheiden sich nur in ihrem Template und ihrer Form: Quizzes produzieren Multiple-Choice- und Wahr/Falsch-Fragen mit Erklärungen; Workshops erstellen zuerst eine Gliederung und schreiben dann jede Lektion &lt;em&gt;on demand&lt;/em&gt;, wenn du sie öffnest; Karteikarten liefern Vorder-/Rückseiten-Paare; Mindmaps generieren einen Themenbaum, den das Frontend als interaktives Diagramm rendert. (Dieser Renderer war übrigens sein eigenes kleines Abenteuer:
.)&lt;/p&gt;
&lt;h2 id="sessions-die-sich-selbst-tracken"&gt;Sessions, die sich selbst tracken&lt;/h2&gt;
&lt;p&gt;Die meisten Lern-Apps zwingen dich, einen Start-Button zu drücken, und die meisten Leute vergessen es. CogniVault geht da einen anderen Weg: &lt;strong&gt;Lernsessions werden abgeleitet, nicht manuell gestartet&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Jede Chatnachricht verlängert entweder die aktuelle Session oder — nach einer 15-minütigen Pause — startet stillschweigend eine neue. Geh einen Kaffee holen, komm zurück, mach weiter: gleiche Session. Komm morgen wieder: neue Session. Keine Buttons, kein Vergessen.&lt;/p&gt;
&lt;p&gt;Jede Nachricht speichert außerdem ein winziges Event (Zeitstempel, ob du einen Scope-Filter oder Dateianhänge genutzt hast) in &lt;code&gt;progress.db&lt;/code&gt; — eine SQLite-Datenbank, also eine komplette relationale Datenbank in einer einzigen Datei. Elf Tabellen halten alles fest: Sessions, Nachrichten-Events, verdiente Badges, Quiz-Versuche und gespeicherte Quizzes, Workshops und Lektionen, Decks und Karten sowie Mindmaps.&lt;/p&gt;
&lt;p&gt;Eine kleine Engineering-Note, die sich abzugucken lohnt: Der Tracking-Call im Chat-Endpoint ist so verpackt, dass er den Chat &lt;em&gt;niemals&lt;/em&gt; blockieren oder abbrechen kann. Analytics müssen immer Beifahrer sein, niemals der Fahrer.&lt;/p&gt;
&lt;h2 id="25-badges-als-daten-definiert"&gt;25 Badges, als Daten definiert&lt;/h2&gt;
&lt;p&gt;Die Achievements sind nicht als &lt;code&gt;if&lt;/code&gt;-Statements im Code verstreut. Sie leben in einer einzigen JSON-Datei — 25 Einträge, jeder mit Code, Name, Icon, der Metrik, die er überwacht, und einem Zielwert. Nach jeder relevanten Aktion prüft ein Evaluator jede Definition gegen die Datenbank und speichert neu verdiente Badges. Einige Badges bilden Leitern und verweisen auf das nächste Level.&lt;/p&gt;
&lt;p&gt;Deklarativ schlägt hier imperativ aus einem einfachen Grund: Badge Nummer 26 hinzuzufügen bedeutet einen JSON-Eintrag zu ergänzen, nicht neue Logik zu schreiben. Das Design hinter den Streaks (Serien), der Pausen-Regel und der 90-Tage-Heatmap hat einen eigenen Artikel bekommen:
.&lt;/p&gt;
&lt;h2 id="spracheingabe-ganz-ohne-cloud-mikrofon"&gt;Spracheingabe, ganz ohne Cloud-Mikrofon&lt;/h2&gt;
&lt;p&gt;Der Mikrofon-Button wird von &lt;strong&gt;faster-whisper&lt;/strong&gt; befeuert — OpenAIs Whisper Spracherkennungsmodell, neu implementiert auf einer schnelleren Inference-Engine. Es läuft auf deiner CPU mit int8-Quantisierung (8-Bit-Zahlen statt 32-Bit: kleiner, schneller, genau genug). Kein Ton verlässt jemals deinen Rechner.&lt;/p&gt;
&lt;p&gt;Das Modell wird erst bei der ersten Transkription geladen (Lazy Loading), damit die App sofort startet. Und wenn faster-whisper gar nicht erst installiert ist, versteckt das Frontend den Mikrofon-Button einfach. Features sollten sanft degradieren, nicht explodieren.&lt;/p&gt;
&lt;h2 id="die-privacy-belege"&gt;Die Privacy-Belege&lt;/h2&gt;
&lt;p&gt;Die Serie begann mit einem Versprechen: &lt;em&gt;Nichts verlässt deinen Rechner.&lt;/em&gt; Versprechen sind billig — hier ist das Audit. Jedes Byte, das CogniVault speichert, und wo genau es lebt:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Daten&lt;/th&gt;
&lt;th&gt;Speicherort&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deine hochgeladenen Dateien&lt;/td&gt;
&lt;td&gt;Ordner &lt;code&gt;docs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Die Originaldateien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suchvektoren&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vector_store.faiss&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FAISS Binär-Index&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chunk-Text und Metadaten&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vector_store.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datei-zu-Kategorie-Zuweisung&lt;/td&gt;
&lt;td&gt;&lt;code&gt;categories.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat-Sessions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chat_history.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions, Badges, Quizzes, Workshops, Decks, Mindmaps&lt;/td&gt;
&lt;td&gt;&lt;code&gt;progress.db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ingestion Checkpoints&lt;/td&gt;
&lt;td&gt;PostgreSQL (lokales Docker-Volume)&lt;/td&gt;
&lt;td&gt;DBOS Systemtabellen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Die KI-Modelle selbst&lt;/td&gt;
&lt;td&gt;Ollamas lokaler Model-Store&lt;/td&gt;
&lt;td&gt;Modell-Gewichte&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nichts aus dieser Tabelle liegt auf dem Computer von jemand anderem. Inference geht an &lt;code&gt;localhost&lt;/code&gt;. Embeddings gehen an &lt;code&gt;localhost&lt;/code&gt;. Der einzige ausgehende Request, den das Backend jemals macht, ist der URL-Import — und das nur auf deinen ausdrücklichen Wunsch und geschützt davor, private Adressen abzurufen. Die App zeigt diese Statistiken sogar live im &amp;ldquo;Privacy Vault Audit&amp;rdquo;-Panel an.&lt;/p&gt;
&lt;p&gt;Und weil Vertrauen mehr braucht als nur eine Tabelle: Das gesamte Backend ist von einer pytest-Suite abgedeckt, die du selbst ausführen kannst. Der Ansatz dazu ist in
dokumentiert.&lt;/p&gt;
&lt;h2 id="fazit-der-serie"&gt;Fazit der Serie&lt;/h2&gt;
&lt;p&gt;Vier Teile, eine Architektur:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;
&lt;/strong&gt; — Drei Prozesse, vier Schichten und ein Decoder-Ring für den Jargon&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;
&lt;/strong&gt; — Eine dauerhafte, formatbewusste Pipeline, die jedes Dokument in durchsuchbare Vektoren verwandelt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;
&lt;/strong&gt; — Zwei Retriever, die gegenseitig ihre blinden Flecken abdecken, durch Rang fusioniert und von einem Agenten gesteuert werden&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teil 4&lt;/strong&gt; — Dieselbe Maschinerie, die Lernmaterialien generiert, Fortschritt ohne Buttons trackt, und eine Speichermap ohne Cloud-Abhängigkeiten&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Wenn es ein Hauptthema gibt, dann das: &lt;strong&gt;Langweilige, verifizierbare Entscheidungen im Dienste der Privatsphäre&lt;/strong&gt;. Exakte Suche statt Approximation. SQLite-Dateien statt gehosteter Datenbanken. Grammatikgebundenes JSON statt hoffnungsvollem Parsen. Soft-Deletes statt cleverer Index-Eingriffe. Jedes Puzzleteil ist etwas, das du öffnen, lesen und überprüfen kannst — und genau das ist der Punkt.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="anhang-abkürzungen-in-diesem-post"&gt;Anhang: Abkürzungen in diesem Post&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abkürzung&lt;/th&gt;
&lt;th&gt;Volle Form&lt;/th&gt;
&lt;th&gt;Bedeutung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&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 strukturierte Format, das die Generatoren vom Modell erzwingen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQLite / SQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(SQL = Structured Query Language)&lt;/td&gt;
&lt;td&gt;Eine komplette relationale Datenbank, die in einer einzigen Datei lebt (&lt;code&gt;progress.db&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCQ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multiple-Choice Question&lt;/td&gt;
&lt;td&gt;Einer der beiden Quiz-Fragentypen (der andere ist Wahr/Falsch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Central Processing Unit&lt;/td&gt;
&lt;td&gt;Hier läuft Whisper — keine Grafikkarte notwendig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;int8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8-bit integer (Quantisierung)&lt;/td&gt;
&lt;td&gt;Modellgewichte als kleine Integer speichern: kleiner, schneller, genau genug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Künstliche Intelligenz (AI)&lt;/td&gt;
&lt;td&gt;Software, die Aufgaben ausführt, die normalerweise menschliche Intelligenz erfordern&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 Endpunkte, die der Study Hub und das Dashboard aufrufen&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 Vektor-Index in der Privacy-Tabelle&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 Checkpoints in PostgreSQL leben&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSRF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server-Side Request Forgery&lt;/td&gt;
&lt;td&gt;Die Art von Angriff, vor dem der URL-Importer schützt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PNG / PDF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Portable Network Graphics / Portable Document Format&lt;/td&gt;
&lt;td&gt;Zwei der Export-Formate für Mindmaps (neben Markdown)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SVG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scalable Vector Graphics&lt;/td&gt;
&lt;td&gt;Das Zeichenformat im Browser, das hinter dem interaktiven Mindmap-Rendering steckt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Nächste Schritte:&lt;/strong&gt; Klone
und lies mit — die README skizziert die komplette Architektur, und jede Behauptung in dieser Serie kann direkt mit dem Code unter &lt;code&gt;backend/&lt;/code&gt; abgeglichen werden. Und falls du Lust auf die Deep-Dive-Versionen dieser Themen hast: Die
knüpft genau da an, wo dieser Rundgang endet.&lt;/p&gt;</description></item></channel></rss>