RAG für medizinische Bücher


Guten Tag.
Von der Installation eines einfachen RAG-Systems für medizinische Bücher habe ich ein Protokoll geschrieben.
Retrieval-Augmented Generation (RAG) kombiniert das Abrufen von Informationen (Retrieval) aus internen Dokumenten mit der Textgenerierung (Generation) durch KI.
Wikipedia zu RAG
Es gibt auch RAG mit Nutzung externer Quellen.
Dieses RAG hier soll sich strikt auf lokale Buchtexte begrenzen.
Dieses RAG hier ist nicht für schutzbedürftige personenbezogene Daten vorgesehen.
Idee ist, medizinische Lehrbücher besser nutzen zu können.
Vorgesehen ist ein Nutzer und 5 bis 50 Bücher.
Fundstellen sollen kapitelgenau angegeben werden.
Was mir die KI erzählt nehme ich als Anregung und lese ggf. das Orginal.

Eine Nvidia-RTX Grafikkarte ist nötig, angeblich reicht eine RTX 2060, ich nutze eine RTX 3700.
Installiert wird am besten auf einer separaten Festplatte mit >100GB.
Es sollte klar sein, welche Taste beim Computerstart gedrückt werden muss für Boot-Auswahl (bei mir F11) und Bios-Menü (bei mir DEL).
Im Bios-Menü muss eingestellt sein, dass kein(!) secure-boot erfolgt, weil sonst angeblich CUDA nicht funktioniert.
Bei mir war secure-boot sowieso ausgeschaltet gewesen.
Mit secure-boot ist nicht gemeint die Einstellung, die TPM deaktiviert.
Die Deaktivierung von secure-boot war bei mir im Bios-UEFI-Menü arg versteckt.
Bei Unsicherheit ist es gut, mit genauer Bezeichnung des Mainboard ChatGPT oder die Google-KI zu fragen.
Die Vorgehensweise bei der Installation ist eher kleinschrittig, um Fehler besser eingrenzen zu können.
Ein falscher Buchstabe reicht ja schon für ein Scheitern.

Installiert wird Debian, bei mir ist es Version 13.4.
Dann werden installiert Nvidia-Driver und Nvidia-Cuda-Toolkit, Docker-Ce und Nvidia-Container-Toolkit.
Dann aus dem Docker-Hub Open-WebUI (bei mir Version 0.8.10.), Ollama, Qdrant.
LLM für das Embedding ist z.B. mxbai-embed-largest,
LLM für Auswertung ist z.B. llama 3.1 8B.
Sprache der Wissenstexte ist Englisch, deutsche Texte übersetze ich z.B. mit Google Translate.

Viele Einzelschritte. Die ich reichlich für Irrwege nutzte.
Ohne viele Nachfragen bei ChatGPT und der Google-Ki hätte ich es nicht geschafft.
Auch bei der Fehlersuche im Protokoll war ChatGPT hilfreich.
Interessant war dabei auch, wie anders und auch eigenartig die Missverständnisse beim Dialog mit KI sind.
In der Richtung sehe ich auch den besonderen Wert von RAG bei medizinischen Fragen. Mit den vom System genutzten Büchern neben mir.
Die Installation ist eigentlich ganz einfach. Wenn man eine klare Linie hat. Deshalb die Weitergabe des Protokolls.
Bei meiner Art der Nutzung (privat, lokal, ein Nutzer) sind alle Programme gratis und ohne Registrierung nutzbar.
Bei einer anderen Nutzung sind Lizenzbedingungen zu klären.
Alle Angaben sind natürlich ohne jede Gewähr, Haftung usw.

Debian und Cuda installieren


Meine Debian-ISO-Datei war debian-13.4.0-amd64-DVD-1.iso
Die Debian-Seite mit Download.
Mit dem Hilfsprogramm Rufus kommt unter Windows die ISO-Datei auf einen USB-Stick.
Hier ein Link zu Rufus: Rufus-Download bei Chip
Bei der Debian-Installation kann man eigentlich nichts wirklich falsch machen.
Ausser: Auf der falschen Festplatte installieren!
Es kann deshalb sinnvoll sein, zur Sicherheit bei allen anderen Festplatten das Stromkabel zu entfernen.
Beim Computerstart zum Installieren die Taste für Bootauswahl gedrückt halten, den USB-Stick als Quelle wählen.
Im Zweifelsfall ist immer die voreingestellte Auswahl zu nehmen.
Die Frage ob man einen lokalen Treiber laden wolle verneinen.
Die Frage nach Spiegelserver bejahen.
Kein root-Passwort eingeben.
Ein sehr kurzes Nutzerpasswort nehmen - es muss oft (!) eingegeben werden.
Wenn doch etwas schief geht: Alles von vorne.
Jetzt ist Debian fertig installiert und gestartet.
In den Einstellungen (Zahnrad) > Energie > Automatische Bereitschaft nein.
Einstellungen > System > Softwareaktualisierungen manuell.
Evtl. Desktop aufräumen nach Geschmack.
Vor manuellen Debian-Updates mache ich ggf. ein Backup der Festplatte mit Clonezilla.

Nun werden installiert die zu Debian-Repos gehörende Ausführung von nvidia-driver
und von nvidia-cuda-toolkit, das ist bei späterer Kernel-Aktualisierung viel stabiler,
als die Verwendung der von nvidia direkt angebotenen Treiber/Toolkits.
Die Debian-Pakete bieten höhere Stabilität, unterstützen aber ggf. nicht die neuesten NVIDIA-GPUs.
Erstmal kommen Vorarbeiten.
Im Folgenden werden alle Terminalbefehle im blauen Rahmen und alle Dateitexte im roten Rahmen zum Kopieren mit Copy-Button angeboten.
Bei mehrzeiligen Texten enthält die HTML-Quelle die Zeichenfolge <br>, diese erscheint aber nicht bei der Einfügung.
Trotzdem ist darauf zu achten, dass nicht durch irgendwelche Umstände doch die Zeichenfolge <br> erscheint.

Hier der erste Terminalbefehl. Er öffnet eine vorhandene Konfigurationsdatei im Editor nano.
Einfügen erfolgt im Terminal und auch sonst in Linux am besten mit Rechtsklick und dann Klick auf Einfügen.
Dann mit der Pfeiltaste nach rechts, damit die Markierung verschwindet.
Der Editor nano hat ungewohnte Befehle. Cursorsteuerung mit den Pfeiltasten. Einfügen mit Rechtsklick und Klick auf Einfügen. Speichern mit STRG o.

sudo nano /etc/apt/sources.list


Gehe mit den Pfeiltasten mit dem Cursor hinter "non-free-firmware" ans Zeilenende.
Gib ein Leerzeichen ein. Gib dann mit Rechtsklick und Klick auf Einfügen den kopierten Text contrib non-free ein.
Mache das für alle sechs Vorkommen von "non-free-firmware".

contrib non-free


Dann wird gespeichert mit STRG o, der Dateinamen wird bestätigt mit ENTER, geschlossen wird mit STRG x
Der nächste Terminalbefehl:

sudo apt update


Jetzt kommen zwei Terminalbefehle zur Reinigung von alten nvidia und cuda Programmen (ob nötig lasse ich offen).

sudo apt purge -y 'nvidia-*' 'cuda-*' || true


sudo apt autoremove -y


Jetzt kommt ein Terminalbefehl, der eine Blacklist für nouveau mit dem Nano-Editor erstellt (ob nötig lasse ich offen).

sudo nano /etc/modprobe.d/blacklist-nouveau.conf


Jetzt kommt Text der dazu in nano als Inhalt einzufügen ist:

blacklist nouveau
options nouveau modeset=0


Wieder speichern mit STRG o, bestätigen mit ENTER, schliessen mit STRG x.

Weiterer Terminalbefehl:

sudo update-initramfs -u


Jetzt Header erneuern und die eigentliche Installation

sudo apt install linux-headers-$(uname -r) nvidia-driver nvidia-cuda-toolkit


Den Hinweis auf den wegen momentanem TreiberKonflikt nach Ende der Installation nötigen Neustart mit Klick auf OK bestätigen.
Weiterer Terminalbefehl noch vor dem Neustart:

sudo apt update


Weiterer Terminalbefehl zum Neustart:

sudo reboot



Wenn nach dem Herunterfahren der Neustart beginnt die Bootmenütaste drücken.
Der Neustart klappt ohne Probleme
Jetzt kommt die Prüfung, ob CUDA korrekt installiert ist.

nvidia-smi


Wenn hier die GPU benannt ist, ist alles OK.

nvcc --version


Wenn hier die CUDA-Treiber-Version - aktuell 12.4. - angegeben ist, ist alles OK.
Anmerkungen:
Die recht alte CUDA-Version 12.4. des Debian-Repos kann angeblich bei RTX 5090 manchmal Probleme machen.
Andererseits ist angeblich Ollama derzeit primär auf CUDA 12.x optimiert. Neuere CUDA-Versionen (z. B. 13.x) könnten zu Inkompatibilitäten führen.
Fertig.
Hier habe ich die Festplatte gesichert mit Clonezilla.

Docker Engine installieren


Verwendet wird die proprietäre Docker-CE Engine und nicht die Docker-Engine aus den Debian-Repos.
Angeblich würde die Nutzung der Debian-Repos bei KI-Anwendungen Probleme machen.
Hier der Link zur offiziellen Docker Anleitung.
Vorbereitend wird jetzt das System von alten Docker Resten gereinigt:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)


Im Folgenden wird in mehreren Schritten Docker's official GPG key hinzugefügt:

sudo apt update


sudo apt install ca-certificates curl


sudo install -m 0755 -d /etc/apt/keyrings


sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc


sudo chmod a+r /etc/apt/keyrings/docker.asc



Add the repository to Apt sources (als 1 Block ins Terminal kopieren, bitte Vorsicht wegen <br> u.a.)

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF


sudo apt update


Jetzt kommt die eigentliche Docker Installation:

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin



Es wird geprüft ob Docker gestartet ist:

sudo systemctl status docker


Wenn der erfolgte Start angezeigt wird, muss die Anzeige mit STRG c geschlossen werden.
Nur (!) wenn nicht gestartet: Manueller Docker-Start:

sudo systemctl start docker


Jetzt ein Probelauf von Docker:

sudo docker run hello-world




Docker soll ohne sudo laufen. Offizielle Anleitung dazu

sudo groupadd docker


sudo usermod -aG docker $USER


Neustart oder/und

newgrp docker


Test:

docker run hello-world



Um Docker-ce unter Debian 13.4 die Nutzung der Nvidia-GPU zu ermöglichen ist Nvidia Container Toolkit nötig.
Hierfür den GPG-Schlüssel herunterladen und speichern:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg


Repository-Konfiguration erstellen:

curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list


Paketliste aktualisieren:

sudo apt-get update


Damit Docker Zugriff auf die GPU erhält, wird das NVIDIA Container Toolkit installiert und konfiguriert.
Jetzt die eigentliche Installation des Nvidia Container Toolkit:

sudo apt-get install -y nvidia-container-toolkit


Konfigurieren:

sudo nvidia-ctk runtime configure --runtime=docker


Docker-Daemon neu starten:

sudo systemctl restart docker


Prüfen ob Docker die GPU sieht:

sudo docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi


Man muss eine Tabelle mit der GPU sehen. Docker ist fertig.
Hier habe ich die Festplatte gesichert mit Clonezilla.

Docker Images, Container und Volumes erstellen für die
RAG-Oberfläche (OpenWebUI), RAG-System(Ollama), RAG-Datenbank(Qdrant)


Hier verwende ich ein Script, das mir bis auf eine kleine Abweichung dankenswerter Weise ChatGPT erstellte.
Unterverzeichnis rag erstellen:

mkdir rag


In rag wechseln.

cd rag


Das System ist für lokale Nutzung ausgelegt. Alle Docker-Dienste sind an 127.0.0.1 gebunden, um Zugriff aus dem Netzwerk zu verhindern.
Achtung bei eventuellem Editieren von docker-compose.yml: korrekte Einrückungen sind nötig.

Mit dem Editor nano in diesem Verzeichnis die Datei docker-compose.yml erstellen:

nano docker-compose.yml


Bitte diesen Link öffnen: Inhalt von docker-compose Den gesamten (!) Inhalt markieren z.B. mit STRG a und kopieren mit Rechtsklick mit der Maus und Klick auf Kopieren.
Nur zur Information ist dieser Text auch ganz unten im grossen grünen Rahmen gezeigt.
Wegen der Formatierung der Einrückungen in HTML ist der Inhalt im grünen Rahmen
jedoch formal nicht als Inhalt einrer compose-Datei geeignet.

Dann den Inhalt im nano-Editor einfügen mit Rechtsklick und Klick auf Einfügen.
Dann in nano speichern mit STRG o , Dateiname bestätigen mit ENTER, Verlassen mit STRG x
Dann die Compose-Datei ausführen mit:

docker compose up -d


Achtung. Der Download der Images von etwa 8 GB aus dem Docker-Hub dauert lange, dann werden aus Images Container und Volumes erstellt.
Wenn aus technischem Grund der Download abbrechen sollte einfach docker compose up -d neu starten

Als Test die Oberfläche von OpenWebUI öffnen in Firefox: localhost:3000
Bitte jetzt noch keine Eingaben machen.
Fertig.

Open-WebUI einrichten und die ersten LLM und Wissenstexte laden


Die Angaben im Folgenden beziehen sich auf die am 20.3.206 aktuelle Version 0.8.10 von OpenWebUI
Jetzt(!) in Firefox in OpenWebUI die Aufforderung zum Starten anklicken.
Lokal anmelden mit Name, Emailadresse, Passwort.
Die Angaben bleiben lokal, sie können beliebig gemacht werden, müssen nicht echt sein, müssen nur erinnert werden.

Modelle von Ollama holen für Auswertung und Embedding, ich empfehle llama3.1:8b und mxbai-embed-large:latest
Links unten im Eck auf den orange Punkt mit den Initialen klicken
In der Auswahl links Admin-Bereich anklicken
In der Auswahl in der Leiste oben auf Einstellungen klicken
In der Auswahl Links auf Modelle klicken
Rechts oben auf das kleine Feld Verwalten klicken
Bei Bedarf auf den klein geschriebenen Link rechts "hier klicken" klicken, es öffnet sich ein neuer Tab mit der Modellauswahl von Ollama.
Im Firefox-Tab "Admin-Bereich" bei dem grauen Text "Modell Tag eingeben .. " ein Modell eingeben, z.B. :

llama3.1:8b


Rechts neben dieser Eingabe auf den Download-Pfeil klicken, den Download abwarten, der Fortschritt wird mit einem Balken angezeigt.
Nochmal Verwalten anklicken
Jetzt nochmal bei dem grauen Text "Modell Tag eingeben .. " ein Modell eingeben, z.B.:

mxbai-embed-large:latest


Und auf den Download-Pfeil klicken

Einstellen, dass mxbai-embed-large:latest zum Embedding verwendet wird:
Auf Admin-Bereich>Einstellungen>Dokumente gehen,
Wichtig: Bei Embedding-Modell-Engine in der Auswahl rechts anstelle von "Standard .." "Ollama" auswählen.
Bei dem grauen Text "Embedding Modell festlegen" eingeben mxbai-embed-large:latest
Rechts unten auf Speichern klicken.

Den Arbeitsbereich konfigurieren:
In der Ecke links oben auf "OI" klicken
Links auf Arbeitsbereich klicken
Rechts oben auf +Neues Modell klicken
Den grossen Text Modellname überschreiben z.B. mit MeineFrage
"Wählen Sie ein Basismodell" anklicken und llama3.1:8b wählen
Den grauen Text "Fügen Sie eine kurze Beschreibung .." beliebig überschreiben, z.B. Auswertung
Bei Bedarf ein Bild eingeben mit Klick auf den schwarzen Punkt im grossen OI-Feld
Unter System-Prompt eingeben: Use provided context only
Unten Speichern & Erstellen anklicken
Klick links unten auf orangen Punkt. Dann Klick auf Einstellungen>Allgemein.
Bei System-Prompt Use provided context only eintragen und speichern.

Wissen hinzufügen
Oben auf "Wissen" klicken
Rechts auf + Neues Wissen klicken
Den grauen Text Benennen Sie Ihren Wissensspeicher überschreiben, bei mir Merck
Den grauen Text Beschreiben Sie Ihren Wissensspeicher .. überschreiben, bei mir Ausgabe
Klick rechts unten auf Wissen erstellen
Klick rechts oben auf +
Bei mir klicken auf Ordner hochladen, alternativ auf Datei hochladen
Bei mir wähle ich den Ordner aus, in dem ich die pdf-Dateien für die englisch-sprachigen Kapitel des Merck-Manual-of-Diagnosis-and-Therapy habe
Anmerkung: Bisher habe ich noch kein gutes zweisprachiges Embedding Modell för Deutsch und Englisch zum Laufen gebracht.
Ich nehme deshalb zum Embedding nur Texte in englischer Sprache. Deutsche Texte übersetze ich vorher mit Google-Translate.
Klick rechts oben auf Hochladen
Firefox fragt nochmal nach, auch hier Klick auf Hochladen
Fortschritt und Erfolg werden angezeigt. Abwarten. Bei laufendem Embedding nicht (!) gleichzeitig Abfragen machen.
Klick Arbeitsbereich
Klick auf das Bild für meinen Arbeitsbereich
Klick auf Wissensspeicher auswählen
Klick bei mir auf auf Merck
Klick auf Speichern & Aktualisieren

Die erste Abfrage
Klick auf Arbeitsbereich
Klick auf - bei mir - "MeineFrage"
Die Beispielfrage - Welche Krankheiten machen Gelbsucht - gibt eine schlechte Antwort
Die Beispielfrage - Give diseases with icterus - gibt eine gute Antwort
Antworten sind begrenzt auf die Wissenstexte. Genutzte Kapitel werden angegeben.


Guten Erfolg beim Testen!
21.3.2026 Peter G.
Sende Mail
##############################################################################################################

services:

  ollama:

    image: ollama/ollama:latest

    container_name: ollama

    restart: unless-stopped

    ports:

      - "127.0.0.1:11434:11434"

    volumes:

      - ollama:/root/.ollama

    deploy:

      resources:

        reservations:

          devices:

            - driver: nvidia

              count: all

              capabilities: [gpu]


  open-webui:

    image: ghcr.io/open-webui/open-webui:cuda

    container_name: open-webui

    restart: unless-stopped

    ports:

      - "127.0.0.1:3000:8080"

    volumes:

      - open-webui:/app/backend/data

    environment:

      - OLLAMA_BASE_URL=http://ollama:11434

      - QDRANT_URL=http://qdrant:6333

    depends_on:

      - ollama

      - qdrant

    deploy:

      resources:

        reservations:

          devices:

            - driver: nvidia

              count: all

              capabilities: [gpu]


  qdrant:

    image: qdrant/qdrant:latest

    container_name: qdrant

    restart: unless-stopped

    ports:

      - "127.0.0.1:6333:6333"

    volumes:

      - qdrant_data:/qdrant/storage


volumes:

  ollama:

  open-webui:

  qdrant_data: