Plattform:
Infrastruktur · Selbst hosten

Lokale KI — LLMs & Embeddings selbst betreiben

Dein eigenes ChatGPT — auf deinem Rechner, ohne dass ein einziges Wort dein Haus verlässt. Und mit einem zweiten, winzigen Modell daneben wird daraus ein Assistent, der deine Dokumente kennt. Von der Installation mit Ollama bis zum eigenen Mini-RAG. Dein Fortschritt wird lokal gespeichert.

Worum geht's?

ChatGPT & Co. laufen in fremden Rechenzentren — jede Frage, jedes hochgeladene Dokument reist dorthin. Lokale KI dreht das um: Das Modell ist eine Datei auf deiner Hardware, die Verarbeitung passiert bei dir, und deine Daten bleiben, wo sie sind.

Diese Schulung führt dich von null: warum lokal → was ein LLM wirklich ist → Ollama installieren → erstes Modell laden → und dann das unterschätzte Duo: warum neben das große Sprachmodell ein zweites, winziges Embedding-Modell gehört — und wie beide zusammen als RAG deine eigenen Dokumente beantworten.

Selbstlern-Kurs zum Durchklicken — dein Fortschritt wird lokal gespeichert. (Passenderweise.)

? Für wen ist das interessant?

Für alle, die KI nutzen wollen, ohne ihre Daten aus der Hand zu geben.

🔒
Datenschutz-Bewusste
Prompts und Dokumente bleiben auf deiner Hardware — kein Cloud-Anbieter liest mit.
🏢
Firmen mit sensiblen Daten
Verträge, Personaldaten, Interna — mit KI verarbeiten, ohne Drittlandtransfer.
📦
Self-Hoster & Bastler
Das nächste Puzzle-Teil nach Docker & VPS: dein eigenes KI-Backend.
✈️
Offline-Arbeiter
Im Zug, in der Werkhalle, hinter der Firewall — KI funktioniert auch ohne Internet.
💡 Neu hier? Arbeite die Stufen von oben nach unten durch. Stufen 1–2 sind Theorie zum Mitdenken; ab Stufe 3 brauchst du ein Terminal (siehe Terminal-Basics) und einen halbwegs aktuellen Rechner. Ollama läuft auf Wunsch auch im Container — siehe die Docker-Schulung.

🗺️ Die 9 Stufen

Keine KI-Vorkenntnisse nötig. Ein Rechner mit ca. 8 GB RAM (oder mehr) reicht für den Einstieg — für die Embedding-Teile sogar weniger. Alles läuft mit kostenlosen, offenen Modellen.
Stufe 1

Warum lokale KI?

Das mentale Modell: Was „lokal" wirklich bedeutet — und die vier Gründe, warum sich der Aufwand lohnt.

1 Lokal heißt: Das Modell läuft bei dir

Ein KI-Modell ist am Ende eine Datei plus ein Programm, das sie ausführt. Bei Cloud-KI liegen beide in einem fremden Rechenzentrum — bei lokaler KI liegen beide auf deiner Hardware.

Wohin geht dein Prompt? — Skizze
Skizze
Cloud-KI
Lokale KI
Oben reist alles zum Anbieter — unten dreht sich der komplette Kreislauf auf deiner eigenen Hardware. localhost:11434 ist die Adresse, unter der Ollama ab Stufe 3 bei dir lauschen wird.

2 Vier gute Gründe

🛡️
DSGVO & Souveränität
Kein Drittlandtransfer, kein CLOUD Act, kein AVV-Thema für die reine Verarbeitung — die Daten verlassen deine Infrastruktur nicht.
💶
Kosten
Einmal Hardware statt laufender Token-Rechnung. Rechnet sich bei Dauerlast und Automatisierung — nicht bei drei Prompts pro Woche.
✈️
Offline
Funktioniert im Zug, in der Werkhalle, im abgeschotteten Netz. Kein Internet nötig, keine Ausfälle beim Anbieter.
📦
Beständigkeit
Kein Anbieter kann „dein" Modell abschalten, umtrainieren oder den Preis ändern — die Datei gehört dir.

3 Ehrlich bleiben: Cloud vs. lokal

☁️ Cloud-KI
  • stärkste Frontier-Modelle, riesige Kontexte
  • keine eigene Hardware nötig
  • Daten reisen zum Anbieter (Logs, Drittland)
  • laufende Kosten pro Token
🖥️ Lokale KI
  • Daten bleiben zu 100 % bei dir
  • offline, planbar, dauerhaft verfügbar
  • Leistung durch deine Hardware begrenzt
  • einmalige Anschaffung statt Abo
Die ehrliche Bilanz — wann welche Seite gewinnt — ziehen wir in Stufe 9, wenn du beide Welten kennst. Kleiner Spoiler: Für erstaunlich viele Alltags- und Dokumenten-Aufgaben reicht lokal längst.

✓ Geschafft, wenn Du …

Stufe 2

Was ist ein LLM?

Parameter, Quantisierung und VRAM — die drei Begriffe, mit denen du jedes Modell einordnen kannst.

1 Ein LLM ist eine Datei voller Zahlen

Ein Large Language Model ist im Kern eine riesige Sammlung gelernter Zahlen — der Parameter (auch „Gewichte"). Heißt ein Modell gemma4:12b, dann steht 12b für 12 Milliarden Parameter.

In diesen Zahlen steckt alles, was das Modell beim Training „gelernt" hat: Sprachgefühl, Weltwissen, Muster. Grobe Faustregel: mehr Parameter ≈ mehr Können — aber auch mehr Speicherbedarf und langsamere Antworten auf gleicher Hardware.

Open Weights: Familien wie Gemma 4 (Google), Qwen 3.5/3.6 (Alibaba), Llama (Meta), Mistral, DeepSeek-Distills oder gpt-oss (OpenAI) veröffentlichen ihre Gewichte — genau die kannst du lokal betreiben. Die Namen wechseln alle paar Monate, das Prinzip bleibt.

2 Quantisierung: dasselbe Modell, viel kleiner

Standardmäßig belegt jeder Parameter 16 Bit (FP16). Quantisierung speichert die Gewichte mit weniger Bits — Q8 mit ~8, Q4 mit ~4. Das Modell wird drastisch kleiner, die Qualität sinkt meist nur minimal.

Quantisierung ausprobieren — Skizze
Skizze · interaktiv
≈ 24 GB
FP16: 16 Bit pro Gewicht — volle Präzision, voller Speicherhunger.
Beispiel: die Gewichte eines 12B-Modells. Kontextspeicher und Overhead kommen obendrauf (Stufe 9). Q4_K_M ist der übliche Alltags-Kompromiss — die meisten Ollama-Modelle kommen genau so vorquantisiert.

Merkregel: ~2 GB pro Milliarde Parameter bei FP16, ~0,5–0,6 GB bei Q4. Ein 8B-Modell in Q4 passt so in ~5 GB — machbar für viele Laptops.

3 VRAM ist die Währung

Damit ein Modell schnell antwortet, müssen seine Gewichte in den Grafikspeicher (VRAM) passen — bei Apple Silicon zählt der gemeinsame Unified Memory. Was nicht hineinpasst, wird langsam aus dem RAM nachgeladen.

ModellgrößeDownload (Q4)läuft gut ab
3–4B~2–3 GBfast überall, auch CPU-only
7–8B~5 GB8 GB VRAM / 16 GB RAM
12–14B~8–9 GB12–16 GB VRAM
27–32B~17–20 GB24 GB VRAM
70B+~40 GB+48 GB+ / Multi-GPU

4 Und welches Modell ist gerade wie stark?

Genau das ändert sich monatlich — deshalb steht es bewusst nicht als Tabelle in dieser Schulung.

📊 Live-Übersicht statt veralteter Liste: Florian pflegt ein tagesaktuelles Board mit KI-Leistungs-Index, Preisen und DSGVO-Einordnung der aktuellen Modelle — inklusive der lokal betreibbaren Open-Weights-Modelle: Aktuelle Leistung der KI-Modelle →
Diese Schulung erklärt das Wie — das Board zeigt das Was gerade. Schau dort nach, bevor du dich in Stufe 4 für ein Modell entscheidest.

✓ Geschafft, wenn Du …

Versionsstand: Modellfamilien & Größen · Stand Juli 2026 — tagesaktuell im verlinkten Board.

Stufe 3

Ollama installieren

Der Modell-Manager für dein System: ein Werkzeug, das Modelle lädt, verwaltet und als lokalen Server bereitstellt.

1 Was Ollama ist

Ollama ist Modell-Verwaltung und lokaler KI-Server in einem — so etwas wie „das Docker für LLMs": ollama pull lädt ein Modell, ollama run startet den Chat, und im Hintergrund lauscht ein Server auf http://localhost:11434, den jede App auf deinem Rechner nutzen kann.

Es gibt Alternativen (LM Studio mit grafischer Oberfläche, llama.cpp für Puristen) — wir nehmen Ollama, weil es auf allen drei Systemen gleich funktioniert und die Modell-Bibliothek direkt eingebaut ist.

2 Installieren

Wähle oben deine Plattform — ab Stufe 4 sind dann alle Befehle auf allen Systemen identisch.

Installation — Linux
$ curl -fsSL https://ollama.com/install.sh | sh >>> Installing ollama to /usr/local ... >>> Install complete. Run "ollama" from the command line.
🐧 Das Install-Skript richtet Ollama als systemd-Dienst ein — der Server startet ab jetzt automatisch mit dem System.
Installation — macOS
$ brew install ollama ==> Pouring ollama ... $ brew services start ollama Successfully started `ollama`
Alternativ die App von ollama.com laden — sie legt ein Menüleisten-Symbol an und startet den Server automatisch. Apple-Silicon-Macs sind dank Unified Memory ideale Lokal-KI-Maschinen.
Installation — Windows (PowerShell)
PS> winget install Ollama.Ollama Gefunden Ollama [Ollama.Ollama] ... Erfolgreich installiert
🪟 Alternativ der grafische Installer von ollama.com. Nach der Installation läuft Ollama als Hintergrund-Dienst (Symbol im Infobereich) und nutzt deine NVIDIA-/AMD-GPU automatisch, falls vorhanden.

3 Prüfen, dass alles läuft

Funktionstest (alle Systeme)
$ ollama --version ollama version is 0.9.x $ curl http://localhost:11434 Ollama is running
Merk dir diese Adresse: localhost:11434 ist ab jetzt dein persönlicher KI-Endpunkt — dieselbe Rolle, die bei Cloud-KI api.openai.com spielt. Nur eben bei dir.

4 Sicherheit: localhost bleibt localhost

Ollama bindet per Default nur an localhost — von außen kommt niemand dran. Genau so lassen! Wer Ollama auf einem Server betreiben will, stellt es niemals nackt ins Internet, sondern hinter einen Reverse Proxy mit Authentifizierung — das Handwerkszeug dafür liefert die Self-Hosting-Schulung.

Auch als Container geht's: docker run -d -v ollama:/root/.ollama -p 11434:11434 ollama/ollama — Details in der Docker-Schulung.

✓ Geschafft, wenn Du …

Versionsstand: Ollama 0.9.x · Stand Juli 2026

Stufe 4

Dein erstes LLM laden & nutzen

Modell ziehen, im Terminal chatten, die API verstehen — und die entscheidende Grenze selbst erleben.

1 Modell wählen

Wähle nach deinem Speicher (Tabelle in Stufe 2): mit 8 GB VRAM z. B. qwen3.5:8b, mit 12–16 GB gemma4:12b. Klein anfangen — wechseln ist ein Einzeiler.

📊 Unsicher, welches Modell? Die verfügbaren Tags stehen auf ollama.com, die aktuelle Leistungseinordnung im Modell-Board aus Stufe 2.

2 Laden und chatten

ollama pull & run
$ ollama pull gemma4:12b pulling manifest … 100% ▕████████████████▏ 7.3 GB success $ ollama run gemma4:12b >>> Erkläre in einem Satz, was ein Kontextfenster ist. Das Kontextfenster ist die maximale Menge an Text (in Tokens), die ein Sprachmodell gleichzeitig „im Blick" behalten kann. >>> /bye $ ollama ls NAME SIZE gemma4:12b 7.3 GB

Nützlich im Alltag: ollama ls (was ist installiert), ollama ps (was ist gerade im Speicher), ollama rm <modell> (aufräumen).

3 Ollama ist ein Server — die API dahinter

Der Terminal-Chat ist nur eine Hülle: In Wahrheit spricht alles über HTTP mit localhost:11434. Denselben Chat kannst du per curl führen — und genau so binden Apps, Editoren und Skripte dein Modell an:

1Chat per API — /api/chat
curl http://localhost:11434/api/chat -d '{
  "model": "gemma4:12b",
  "stream": false,
  "messages": [
    { "role": "user", "content": "Was ist ein Kontextfenster?" }
  ]
}'
Gut zu wissen: Ollama bietet zusätzlich OpenAI-kompatible Endpunkte unter /v1/… — viele Tools, die „OpenAI" erwarten, lassen sich einfach auf http://localhost:11434/v1 umbiegen.

4 Die Grenze erleben

Frag dein Modell jetzt etwas, das nur du wissen kannst: „Wann hat unsere Kantine geschlossen?", „Was steht in meinem Vertrag mit Firma X?"

Ergebnis: Es weiß es nicht — oder schlimmer, es erfindet eine plausible Antwort. Logisch: Sein Wissen wurde beim Training eingefroren, und deine Dokumente waren nie Teil davon.

Die Kernfrage dieser Schulung: Woher soll das Modell deine Daten kennen? Die Antwort ist ein zweites, viel kleineres Modell — weiter in Stufe 5.

✓ Geschafft, wenn Du …

Stufe 5

Embedding-Modelle verstehen

Text wird zu Zahlen: Was ein Embedding ist, warum „Bedeutung" plötzlich messbar wird — und wieso das ein eigenes Modell braucht.

1 Text rein, Vektor raus

Ein Embedding-Modell nimmt einen Text und liefert einen Vektor zurück — eine Liste von z. B. 768 Zahlen. Dieser Vektor ist die „Bedeutungs-Koordinate" des Textes in einem hochdimensionalen Raum.

Der Clou: Texte mit ähnlicher Bedeutung landen an ähnlichen Koordinaten. Wie nah sich zwei Vektoren sind, misst man mit der Kosinus-Ähnlichkeit (1 = gleiche Richtung, um 0 = nichts gemeinsam). Bedeutung wird damit — buchstäblich — berechenbar.

2 Der Aha-Moment: Suche ohne gemeinsame Wörter

„Der Hund bellt laut" und „Ein Vierbeiner macht Krach" teilen kein einziges Wort — ihre Vektoren liegen trotzdem direkt nebeneinander. Strg+F kann das nicht. Probier die Fragen aus:

Der Vektorraum — Skizze
Skizze · interaktiv
Der Hund bellt laut Ein Vierbeiner macht Krach Die Katze döst Die Rechnung ist überfällig Bitte die Zahlung anweisen Das Angebot gilt bis Mai Der Strand war traumhaft Wir fliegen nach Kreta
Stark vereinfacht: 2 von 768 Dimensionen. Die Frage (limonengrün) landet automatisch neben den Sätzen, die dasselbe meinen — die gestrichelten Linien zeigen die zwei nächsten Nachbarn. Genau das ist semantische Suche.

3 Embedding-Modell ≠ LLM

Beide stammen aus derselben Transformer-Familie — aber sie haben völlig verschiedene Jobs:

🧲 Embedding-Modell
  • Output: ein Vektor (Zahlen)
  • generiert keinen Text
  • winzig: ~0,3–1 GB
  • schnell — läuft sogar auf CPU gut
🧠 LLM
  • Output: Text (Antworten)
  • versteht & formuliert
  • groß: 5–40+ GB
  • braucht möglichst viel (V)RAM

4 Sofort anfassen

Ein Embedding-Modell lädst du genauso wie ein LLM — nur der Endpunkt ist ein anderer:

Dein erstes Embedding
$ ollama pull embeddinggemma pulling manifest … 100% ▕████████████████▏ 622 MB success $ curl http://localhost:11434/api/embed -d '{"model":"embeddinggemma","input":"Warum lokale KI?"}' {"model":"embeddinggemma","embeddings":[[0.0102,-0.0017,0.0534, … ]]} ↑ 768 Zahlen — die Bedeutungs-Koordinate deines Satzes
Dimensionen: Die Länge des Vektors (hier 768) ist eine feste Eigenschaft des Modells. Manche Modelle („Matryoshka") erlauben es, den Vektor verlustarm zu kürzen — wichtig wird das in Stufe 7.

✓ Geschafft, wenn Du …

Stufe 6

RAG: Warum du beide Modelle lädst

Die Antwort auf die Kernfrage: Das Embedding-Modell ist das Gedächtnis, das LLM das Sprachzentrum — zusammen heißt das RAG.

1 Das Problem: eingefrorenes Wissen + teurer Kontext

Zwei Dinge stehen zwischen deinem LLM und deinen Dokumenten:

  • Eingefrorenes Wissen: Das Modell kennt nur, was beim Training da war. Deine Verträge, Notizen und Handbücher waren es nicht.
  • Kontextfenster-Ökonomie: „Dann kippe ich halt alles in den Prompt!" scheitert schnell — jedes Token kostet Rechenzeit und Speicher (den KV-Cache, Stufe 9), 500 Seiten passen schlicht nicht hinein. Und selbst wenn: Bei riesigen Prompts übersehen Modelle nachweislich Details in der Mitte („lost in the middle").

2 Die Arbeitsteilung

Deshalb lädst du zwei Modelle nebeneinander — mit klar verteilten Rollen:

🧲 Das Embedding-Modell ist das Gedächtnis: Es macht dein Wissen durchsuchbar und findet zu jeder Frage die 2–3 wirklich relevanten Absätze.
🧠 Das LLM ist das Sprachzentrum: Es bekommt nur diese Treffer — und formuliert daraus die Antwort.
Keines kann den Job des anderen effizient übernehmen. Zusammen heißt das Muster RAGRetrieval-Augmented Generation.
So sieht das bei dir aus
$ ollama ls NAME SIZE gemma4:12b 7.3 GB ← das Sprachzentrum embeddinggemma 622 MB ← das Gedächtnis (kostet fast nichts extra)

3 RAG in zwei Phasen

Die RAG-Pipeline — Skizze
Skizze
① Indexieren — einmalig
② Fragen — bei jeder Anfrage
Fällt dir auf? Das Embedding-Modell taucht zweimal auf — es bettet beim Indexieren und bei jeder Frage ein. Deshalb muss es dauerhaft geladen bleiben und darf ruhig klein und flott sein.

4 Einordnung

Genau nach diesem Muster arbeiten „Chat mit deinem PDF"-Tools, Firmen-Wissensbots und die Dokumenten-Funktionen vieler KI-Plattformen. Du kennst jetzt den Maschinenraum.

RAG ersetzt kein Fine-Tuning: RAG ergänzt Wissen (Fakten zur Laufzeit nachschlagen), Fine-Tuning ändert Verhalten (Ton, Format, Spezialaufgaben). Für „beantworte Fragen zu meinen Dokumenten" ist RAG fast immer der richtige — und viel billigere — Weg.

✓ Geschafft, wenn Du …

Stufe 7

Die Embedding-Modelle 2026

Welche Modelle typisch sind, wonach du auswählst — und die goldene Regel, die dir ein komplettes Neu-Indexieren erspart.

1 Wonach auswählen? (In dieser Reihenfolge)

  1. Sprache: Für deutsche Texte muss das Modell mehrsprachig sein. Die klassische Falle: Die alten Ollama-Nummer-1-Modelle nomic-embed-text (v1.5) und mxbai-embed-large sind englisch-zentriert — mit deutschen Dokumenten sinkt die Trefferqualität spürbar.
  2. Dimensionen: Mehr Zahlen pro Vektor = feinere Bedeutung, aber mehr Speicher pro Chunk und langsamere Vergleiche. „Matryoshka"-Modelle lassen sich verlustarm kürzen (768 → 256).
  3. Kontextlänge: Bestimmt, wie groß ein einzelner Chunk sein darf (2k Tokens reichen für normale Absätze locker).
  4. Größe/Tempo: Das Modell läuft bei jeder Frage — klein ist hier eine Tugend. CPU reicht oft völlig.

2 Die typischen Modelle im Überblick

ModellGrößeDim.Deutsch?KontextNotiz
embeddinggemma~0,6 GB768*✅ 100+ Spr.2kGoogle, aus Gemma — stark für die Größe. Unser Hands-on-Default.
qwen3-embedding
(0.6b / 4b / 8b)
0,6–5 GBbis 4096*✅ 100+ Spr.32kBestenlisten-Spitze (MTEB multilingual); das 0.6b ist der beste Winzling.
bge-m3~1,2 GB1024✅ 100+ Spr.8kBewährtes Produktions-Arbeitspferd (BAAI).
snowflake-arctic-embed2~1,2 GB10248kMehrsprachig ohne Englisch-Einbußen.
granite-embedding:278m~0,5 GB768✅ 12 Spr. (inkl. DE)IBM, Apache 2.0 — unternehmensfreundlich.
nomic-embed-text (v1.5)~0,3 GB768*⚠ EN-zentriert8kDer Ollama-Klassiker; die v2-moe-Variante kann multilingual.
mxbai-embed-large~0,7 GB1024⚠ EN-zentriert512Beliebt, aber kurzer Kontext.
all-minilm46 MB384256Winzling — heute eher Lehrbeispiel.

* Matryoshka/MRL: Vektor lässt sich verlustarm kürzen. — Versionsstand: Ollama-Library · Stand Juli 2026. Tags vor dem pull auf ollama.com prüfen.

3 Die goldene Regel

🔒 Index und Modell gehören zusammen. Vektoren verschiedener Modelle sind nicht vergleichbar — oft haben sie nicht einmal dieselbe Länge. Wechselst du das Embedding-Modell, musst du alle Dokumente neu einbetten. Deshalb: erst Modell wählen, dann indexieren. Und: Frage und Dokumente immer mit demselben Modell einbetten.

4 Welches nehme ich?

🇩🇪
Deutsch + wenig Speicher
embeddinggemma — oder granite-embedding:278m, wenn Apache-2.0-Lizenz zählt.
🏆
Maximale Qualität
qwen3-embedding — so groß, wie es dein Speicher erlaubt — oder das bewährte bge-m3.
🇬🇧
Nur englische Texte
Dann sind auch nomic-embed-text und mxbai-embed-large weiter gute, schlanke Wahl.

✓ Geschafft, wenn Du …

Stufe 8

Hands-on: Dein Mini-RAG

~45 Zeilen Node, keine Pakete: Embedding-Modell + LLM beantworten Fragen zu deinen eigenen Fakten — komplett lokal.

1 Vorbereitung

  1. Beide Modelle bereit? ollama pull embeddinggemma plus dein LLM aus Stufe 4 (jedes funktioniert).
  2. Node.js ≥ 18 installiert? Prüfen mit node --version. Falls nicht: 🪟 winget install OpenJS.NodeJS.LTS brew install node🐧 sudo apt install nodejs (oder via nodesource) — mehr braucht es nicht, wir nutzen nur Bordmittel.
  3. Schnelltest: /api/embed nimmt auch ein Array — mehrere Texte, ein Request:
Array-Embedding testen
$ curl http://localhost:11434/api/embed -d '{"model":"embeddinggemma","input":["Der Hund bellt","Ein Vierbeiner macht Krach"]}' {"embeddings":[[…768 Zahlen…],[…768 Zahlen…]]} ← zwei Vektoren, gleiche Reihenfolge wie die Eingaben

2 Das komplette Mini-RAG

Speichere das als mini-rag.js. Unser „Wissen" sind sechs Fakten über die fiktive Firma Nordwerk — ersetze sie später durch deine eigenen:

1mini-rag.js — komplett, ohne Dependencies
// Mini-RAG mit Ollama (Node ≥ 18, keine Pakete nötig)
// Nutzung: node mini-rag.js "Deine Frage"
const OLLAMA = 'http://localhost:11434';
const EMBED_MODEL = 'embeddinggemma';   // das Gedächtnis
const CHAT_MODEL  = 'gemma4:12b';       // das Sprachzentrum (dein LLM aus Stufe 4)

// 1) Unser "Wissen": 6 Fakten über die fiktive Firma Nordwerk
const WISSEN = [
  'Die Kantine von Nordwerk ist freitags geschlossen.',
  'Urlaubsanträge gehen per Mail an personal@nordwerk.example.',
  'Nordwerk hat 42 Mitarbeitende an zwei Standorten.',
  'Das WLAN-Passwort für Gäste lautet Besuch2026.',
  'Die IT-Hotline ist unter Durchwahl 555 erreichbar.',
  'Firmenwagen müssen freitags bis 16 Uhr zurückgegeben werden.'
];

// Texte -> Vektoren (ein Request, input darf ein Array sein)
async function embed(texts) {
  const res = await fetch(OLLAMA + '/api/embed', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ model: EMBED_MODEL, input: texts })
  });
  return (await res.json()).embeddings;
}

// Kosinus-Ähnlichkeit: 1 = gleiche Richtung, um 0 = nichts gemeinsam
function cosine(a, b) {
  let dot = 0, na = 0, nb = 0;
  for (let i = 0; i < a.length; i++) {
    dot += a[i] * b[i]; na += a[i] * a[i]; nb += b[i] * b[i];
  }
  return dot / (Math.sqrt(na) * Math.sqrt(nb));
}

(async () => {
  const frage = process.argv[2] || 'Wann hat die Kantine zu?';

  // 2) Alles einbetten: Wissen + Frage — mit DEMSELBEN Modell (Stufe 7!)
  const wissenVecs = await embed(WISSEN);
  const frageVec = (await embed([frage]))[0];

  // 3) Retrieval: die 2 nächsten Nachbarn per Kosinus-Ähnlichkeit
  const treffer = WISSEN
    .map((text, i) => ({ text, score: cosine(frageVec, wissenVecs[i]) }))
    .sort((x, y) => y.score - x.score)
    .slice(0, 2);

  console.log('Frage:', frage);
  treffer.forEach(t => console.log('  ' + t.score.toFixed(2) + '  ' + t.text));

  // 4) Generation: Treffer + Frage ans LLM — antworten NUR aus dem Kontext
  const res = await fetch(OLLAMA + '/api/chat', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      model: CHAT_MODEL, stream: false,
      messages: [
        { role: 'system', content: 'Antworte NUR anhand des Kontexts. Steht die Antwort nicht im Kontext, sag genau das.' },
        { role: 'user', content: 'Kontext:\n' + treffer.map(t => '- ' + t.text).join('\n') + '\n\nFrage: ' + frage }
      ]
    })
  });
  console.log('\nAntwort:', (await res.json()).message.content.trim());
})();
Das ist echtes RAG — nur der „Index" ist ein simples Array: embed() holt die Vektoren, cosine() misst Nähe (5 Zeilen Mathematik!), und das LLM bekommt statt 500 Seiten nur die Top-2-Treffer plus eine strenge System-Anweisung.

3 Laufen lassen

node mini-rag.js
$ node mini-rag.js "Wann hat die Kantine zu?" Frage: Wann hat die Kantine zu? 0.78 Die Kantine von Nordwerk ist freitags geschlossen. 0.31 Firmenwagen müssen freitags bis 16 Uhr zurückgegeben werden. Antwort: Die Kantine von Nordwerk ist freitags geschlossen.

Deine Scores werden leicht abweichen — die Rangfolge ist das, was zählt.

4 Zwei Experimente, die alles zeigen

Experiment 1 + 2
$ node mini-rag.js "Wo bekomme ich mittags etwas zu essen — gibt es Einschränkungen?" 0.64 Die Kantine von Nordwerk ist freitags geschlossen. ← trifft trotzdem! $ node mini-rag.js "Wie hoch ist das Gehalt der Geschäftsführung?" Antwort: Das steht nicht im bereitgestellten Kontext.
  • Experiment 1 — Synonyme: „Mittags etwas zu essen" enthält kein Wort aus dem Kantinen-Satz — das Embedding findet ihn trotzdem. Der Aha-Moment aus Stufe 5, jetzt in deinem eigenen Code.
  • Experiment 2 — Halluzinations-Bremse: Fragst du nach etwas, das nicht im Wissen steht, sagt das LLM das ehrlich — weil der System-Prompt es auf den Kontext festnagelt. RAG macht Antworten überprüfbar.

5 So fühlt sich das Retrieval an

Ohne Terminal, direkt hier: Wähle eine Frage und sieh, wie die Ähnlichkeits-Scores gegen die sechs Nordwerk-Fakten ausfallen (vorberechnete Beispielwerte — dein Ollama läuft auf deinem localhost, eine Webseite kommt da absichtlich nicht dran):

Ähnlichkeits-Rechner — Skizze
Skizze · simuliert
Die zwei besten Treffer (lime) gehen als Kontext ans LLM — der Rest bleibt liegen. Genau das macht dein mini-rag.js in Schritt 3.

6 Und wenn es mehr als 6 Fakten sind?

Ab tausenden Chunks ersetzt du das Array durch eine Vektor-Datenbank (Qdrant, Chroma, pgvector — alle laufen bequem per Docker). Das Konzept bleibt exakt dasselbe: einbetten, nächste Nachbarn suchen, Treffer ans LLM. Dein Mini-RAG ist die Blaupause.

✓ Geschafft, wenn Du …

Stufe 9

Hardware, Quantisierung & Grenzen

Was auf deiner Hardware realistisch läuft, der unterschätzte Speicherfresser Kontext — und die ehrliche Bilanz gegen die Cloud.

1 VRAM-Faustregeln (Q4_K_M)

Dein SpeicherLLM-KlasseBeispiel
8 GB7–8Bqwen3.5:8b
12–16 GB12–14B (+ Kontextreserve)gemma4:12b
24 GB27–32B — der Single-GPU-Sweet-Spotgemma4:26b, qwen3.6:27b
48 GB+70B+ (auch als 2×24 GB)llama3.3:70b
Apple SiliconUnified Memory zählt wie VRAMM-Serie ab 16 GB gut dabei
💡 CPU-only geht auch — fürs LLM zäh, aber für Embedding-Modelle völlig okay. Das Gedächtnis ist der billigste Teil deines Stacks: embeddinggemma läuft auf fast allem.

2 Der versteckte Speicherfresser: Kontext

Neben den Gewichten belegt der KV-Cache Speicher — das „Arbeitsgedächtnis" für den aktuellen Kontext. Er wächst mit dem Kontextfenster und kann bei sehr großen Kontexten die Gewichte überholen:

VRAM-Budget eines 8B-Modells (Q4) — Skizze
Skizze
Größenordnungen, keine exakten Werte — sie hängen von Modell und Laufzeit ab. Konsequenz: Kontextfenster (num_ctx) bewusst setzen, statt reflexhaft ans Maximum zu drehen.

3 Quantisierung in der Praxis

  • Q4_K_M ist der Standard-Kompromiss — die meisten Ollama-Tags liefern genau das.
  • Q8 ist fast verlustfrei, braucht aber doppelten Speicher; FP16 lohnt fast nur zum Benchmarken.
  • Merksatz: „Klein und ganz im VRAM schlägt groß und ausgelagert" — sobald Schichten in den RAM auslagern, bricht das Tempo um eine Größenordnung ein.

4 Betrieb im Alltag

  • ollama ps zeigt, was gerade im Speicher liegt; Modelle werden nach Inaktivität automatisch entladen (steuerbar per keep_alive).
  • Updates = einfach erneut ollama pull <modell>; Aufräumen mit ollama rm.
  • Speicherort der Modelle: 🪟 C:\Users\<du>\.ollama\models ~/.ollama/models🐧 /usr/share/ollama/.ollama/models (Dienst) bzw. ~/.ollama/models — Platte im Blick behalten, Modelle sind Gigabyte-Brocken.

5 Die ehrliche Bilanz

🖥️ Lokal gewinnt bei …
  • sensiblen Daten & DSGVO-Pflichten
  • Dauerlast / Automatisierung (RAG, Triage)
  • Offline-Szenarien & Unabhängigkeit
  • planbaren Kosten
☁️ Cloud gewinnt (noch) bei …
  • Frontier-Reasoning & Spitzenqualität
  • riesigen Kontexten & Multimodalität
  • Lastspitzen ohne eigene Hardware
  • „sofort loslegen ohne Invest"

Die pragmatische Praxis ist hybrid: lokal für Sensibles und den Alltag, Cloud (idealerweise EU-/DSGVO-konform gehostet) für Spitzenaufgaben.

📊 Wie groß der Abstand gerade ist, siehst du tagesaktuell im Board: Aktuelle Leistung der KI-Modelle →

✓ Geschafft, wenn Du …

🎓 Geschafft! Du kannst LLMs und Embedding-Modelle lokal betreiben — und weißt, warum beide zusammengehören. Schau ins Cheat-Sheet und hol dir dann im Quiz dein Zertifikat.

Versionsstand: Faustregeln & Ollama-Verhalten · Stand Juli 2026

Bonus

Lokale-KI Cheat-Sheet

Die wichtigsten Befehle und Regeln auf einen Blick. (Zählt nicht für den Fortschritt.)

🦙 Ollama-Befehle

1Die Handvoll, die du wirklich brauchst
# Modell laden / aktualisieren
ollama pull gemma4:12b

# Chat im Terminal (beenden: /bye)
ollama run gemma4:12b

# Was ist installiert? / Was ist gerade im Speicher?
ollama ls
ollama ps

# Details & Aufräumen
ollama show gemma4:12b
ollama rm gemma4:12b

🔌 API-Endpunkte (localhost:11434)

EndpunktWofür
/api/chatChat mit Nachrichtenverlauf (unser Standard)
/api/generateEinzel-Prompt ohne Verlauf
/api/embedText(e) → Vektor(en) — nimmt auch Arrays
/v1/…OpenAI-kompatibel — für Tools, die „OpenAI" erwarten

📐 VRAM-Faustregeln

FP16
~2 GB pro Mrd. Parameter
Q4_K_M
~0,5–0,6 GB pro Mrd. Parameter — der Standard
Sweet Spots
8 GB → 8B · 16 GB → 12–14B · 24 GB → 27–32B
Kontext
KV-Cache wächst mit num_ctx — bewusst setzen

🧲 Embedding-Kurzliste (Stand Juli 2026)

  • Deutsch → multilingual ist Pflicht: embeddinggemma (klein) · qwen3-embedding (Spitze) · bge-m3 (bewährt)
  • Nur Englisch: nomic-embed-text, mxbai-embed-large
  • Goldene Regel: Index und Modell gehören zusammen — Modellwechsel = alles neu einbetten.

🧩 RAG-Checkliste

Bevor du indexierst

Lernkontrolle

Quiz

7 Fragen quer durch die Stufen. Ab 6 richtigen Antworten schaltest du dein Zertifikat frei.

Frage 1 von 7
Abschluss

Dein Zertifikat

Glückwunsch! Trage deinen Namen ein und drucke das Zertifikat (oder speichere als PDF).

FL
Florian Ludwig
AI Consultant · Kutzschbach INNOVATIONS
Zertifikat
Lokale KI — LLMs & Embeddings
Hiermit wird bestätigt, dass
Dein Name hier
den Workshop „Lokale KI — LLMs & Embeddings selbst betreiben" erfolgreich abgeschlossen hat.
Datum
GEPRÜFT
Florian LudwigAI Consultant · Kutzschbach INNOVATIONS