PflegeLotse
DSGVO-konformer KI-Assistent für das Pflege-Recht (SGB XI). RAG-System mit quellenbelegten Antworten, Anti-Halluzination und messbarer Qualität — EU- oder lokal gehostet.
Management Summary
PflegeLotse beantwortet Fragen zum SGB XI ausschließlich aus dem amtlichen Gesetzestext, belegt jede Aussage mit dem Paragraphen und verweigert ehrlich die Antwort, wenn keine Quelle trägt. Das Projekt zeigt End-to-End-Kompetenz: Clean Architecture, eine eigene RAG-Pipeline, eine quantitative Evaluations-Pipeline (Recall@5 80 %, 0 Halluzinationen auf Out-of-Scope-Fragen), DSGVO-/EU-AI-Act-Konformität, Tests, CI/CD und ein reproduzierbares Docker-Deployment.
1Projektumfeld & Ausgangssituation
Pflegekräfte, Pflegeberatung und Angehörige müssen Leistungsansprüche nach dem Elften Sozialgesetzbuch (SGB XI) schnell und korrekt einschätzen. Die Recherche im Gesetzestext ist zeitaufwändig; generische Chatbots halluzinieren — bei Rechtsfragen inakzeptabel.
2Projektziel & Anforderungen
Projektziel
Ein in Produktion deploytes RAG-System, das Fragen zu SGB XI mit quellenbelegten Antworten beantwortet, Halluzinationen durch striktes Grounding und Abstention verhindert und seine Qualität messbar macht.
- Frage (DE) → Antwort mit §-Zitaten
- Sichtbare Quellenangabe (Originaltext + Link)
- „Ich weiß nicht" bei schwachem Retrieval
- Umschaltung EU-Cloud (Mistral) / Lokal (Ollama)
- DSGVO/EU-AI-Act-Konformität, RDG-Disclaimer
- Antwortzeit p50 ~1 s
- WCAG 2.1 AA, self-hosted Fonts
- Reproduzierbar (Docker), getestet, CI-grün
Abgrenzung: keine Rechtsberatung (RDG), keine Speicherung personenbezogener Daten, Korpus auf SGB XI begrenzt.
3Projektplanung
Inkrementelles, nachvollziehbares Vorgehen in 6 Phasen — jede Phase lässt etwas Lauffähiges und Commitfähiges zurück (TDD, CI-grün vor dem Weitergehen).
| Phase | Inhalt | Ergebnis |
|---|---|---|
| 0 Setup | Clean-Arch-Gerüst, Docker, CI, ADRs | Lauffähiges Skelett |
| 1 Ingest | SGB-XI-XML → §-Chunks → E5 → pgvector | 235 §§ durchsuchbar |
| 2 RAG-Core | /ask: Retrieval + Grounding + LLM + Citations | Antworten mit Belegen |
| 3 Evaluation | Golden-Set, Metriken, Tuning | Recall@5 80 %, 0 Halluzinationen |
| 4 Frontend | Chat (Jinja2/HTMX), Zustände, a11y | Bediente UI |
| 5 Deploy | VPS, Caddy, Subdomain, Doku | Öffentlich erreichbar |
4Architektur & Entwurf
Clean Architecture
Abhängigkeiten zeigen nach innen; die Domäne kennt keine Frameworks. Ports (Protokolle) in der Domäne, konkrete Adapter in der Infrastruktur — LLM/Embedder/DB sind austauschbar.
/, /ask, /info, Legal, /health)AnswerQuestion (Grounding + Abstention) · IngestCorpusRAG-Flow (Anfrage)
Verzweigung: Score < 0.78 oder LLM ohne Beleg → „Keine Quelle gefunden — keine Antwort" (Abstention statt Halluzination). Konversationell: der Verlauf wird stateless mitgeschickt (kein Cookie); ein Follow-up wird per Query-Rewriting zu einer eigenständigen Suchanfrage aufgelöst. Der Abstention-Gate sitzt vor dem LLM und bleibt damit prompt-unabhängig.
Datenmodell
| Entität | Felder (Auszug) |
|---|---|
documents | id, source_url, gesetz, ingested_at |
chunks | id, document_id, paragraph („§ 36"), titel, text, source_url, token_count, embedding vector(1024) (hnsw, cosine) |
Technologieentscheidungen (ADR-Auszug)
| Thema | Entscheidung | Begründung |
|---|---|---|
| Vector-Store | PostgreSQL + pgvector | Ein Motor (relational + vektoriell), einfacher Betrieb |
| Embeddings | Mistral-API (Deploy) · E5 lokal (Option) | beide 1024-dim; mistral-embed = leicht (kein torch, kleiner VPS); E5 = 100% lokal (kein Datenabfluss). ADR-002. |
| LLM | Mistral (EU) · Ollama (lokal) | DSGVO-Story; Provider hinter Port austauschbar |
| Chunking | nach §/Titel | präzise, verlinkbare Zitate statt blinder Token-Fenster |
| Frontend | Jinja2 + HTMX | server-rendered, ein Deploy, kein JS-Framework |
5Implementierung
Ingest (offline, idempotent)
Die amtliche SGB-XI-XML wird je <norm> nach § zerlegt (Enbez/Titel/Text),
pro § ein Chunk gebildet, mit E5 eingebettet und in pgvector upgesertet. Schlüsselentscheidung:
ins Embedding fließt §-Nummer + Titel + Text — so findet die Query „Verhinderungspflege"
den § 39 (dessen Titel „Verhinderung der Pflegeperson" den Begriff trägt).
Embeddings — zwei austauschbare Provider
Über EMBED_PROVIDER wählbar: Mistral-API (mistral-embed,
Deploy-Default — leicht, kein torch, kleiner VPS) oder E5 lokal (für den
100%-lokalen Modus, kein Datenabfluss). Beide 1024-dim → dasselbe pgvector-Schema; Wechsel = Re-Ingest.
Entscheidung & Begründung in docs/adr/ADR-002.
Grounding & Anti-Halluzination
Der System-Prompt erzwingt: „antworte ausschließlich aus dem Kontext, zitiere §, sonst abstiniere". Zusätzlich kappt eine Retrieval-Schwelle (Cosine < 0.78) zu schwache Treffer. Das Citation-Parsing belegt nur §§, die im Antworttext UND im Kontext vorkommen.
Frontend (server-rendered + Streaming)
Chat-Shell mit HTMX: POST /ask liefert ein HTML-Fragment (Antwort + Beleg-Chips)
und aktualisiert per Out-of-Band-Swap das Quellen-Panel — ohne Full-Reload, ohne JS-Framework.
Darüber liegt ein konversationeller Streaming-Pfad: POST /chat sendet
die Antwort als Server-Sent-Events; chat.js (~150 Zeilen Vanilla-JS) hängt die
Tokens live an und hält den Gesprächs-Verlauf (stateless). Ist JS deaktiviert, bleibt der
HTMX-Fallback aktiv — Progressive Enhancement.
6Qualitätssicherung
Statische Analyse (ruff, mypy --strict), Unit-Tests (pytest) und
CI (GitHub Actions) bei jedem Push. Kern ist die Evaluations-Pipeline über ein
Golden-Set (26 Fälle: 20 echt + 6 Trap).
Ehrliche Analyse: Die Abstention-Fehler sind durchweg konservative False-Abstentions (System sagt „weiß nicht", obwohl der § gefunden wurde) — nie Halluzinationen. Ein stärkeres LLM bzw. ein weicherer Grounding-Prompt würde die Hilfsbereitschaft erhöhen (Helpfulness ↔ Safety-Trade-off). Iteration: Recall@5 stieg messbar durch das §+Titel-Embedding (s. o.) — „messen, Ursache finden, gezielt fixen, neu messen".
7Datenschutz & Compliance
- Datenminimierung: keine Speicherung personenbezogener Daten; Fragen nicht zum Training.
- EU / lokal: Mistral (EU) oder Ollama (lokal) → kein Datenabfluss; E5-Embeddings laufen lokal.
- Transparenz (EU-AI-Act): jede Aussage quellenbelegt, Unsicherheit wird deklariert.
- Recht: Impressum (DDG §5), Datenschutz (Art. 13 DSGVO inkl. LLM-Verarbeitung), Barrierefreiheit (BFSG), Cookie-Banner (TDDDG), RDG-Disclaimer „keine Rechtsberatung".
- Quelle: SGB XI von gesetze-im-internet.de (amtliches Werk, § 5 UrhG → gemeinfrei).
8Betrieb & Deployment
Docker-Compose-Stack: Caddy (Auto-HTTPS) → FastAPI (uvicorn) →
Postgres/pgvector. Zielumgebung: Linux-VPS unter pflegelotse.limbermartinez.com.
CI/CD über GitHub Actions. Secrets (MISTRAL_API_KEY) nur als Umgebungsvariable, nie im Repo.
docker compose up startet die App;
docker compose run --rm ingest lädt SGB XI; … python eval/run_eval.py erzeugt den Eval-Report.9Anwenderdokumentation (Kundendokumentation)
Zielgruppe: Pflegekräfte, Pflegeberatung und Angehörige. Die Bedienung ist bewusst einfach (ein Eingabefeld, sofort belegte Antworten).
Erste Schritte
- Seite öffnen — der Startbildschirm zeigt Beispielfragen.
- Frage eintippen oder eine Beispielfrage anklicken.
- Antwort lesen — jede Aussage trägt einen §-Beleg; rechts erscheinen die Quellen mit Originaltext und Link.
- Bei „Keine Quelle gefunden" die Frage konkreter stellen (z. B. mit Pflegegrad/Leistungsart).
- Über EU-Cloud / Lokal den Datenschutz-Modus wählen.


10Fazit & Ausblick
Soll-Ist: Alle Kernziele erreicht — quellenbelegte, halluzinationssichere Antworten, messbare Qualität, DSGVO-konformer, getesteter und reproduzierbarer Aufbau.
Ausblick: Golden-Set erweitern (stabilere Zahlen), Absatz-genaues Chunking und hybride Suche (pgvector + Volltext) für höhere Recall, stärkeres LLM gegen False-Abstentions, Konversations-Verlauf, Eval-Dashboard.
Anhang
Glossar
| Begriff | Bedeutung |
|---|---|
| RAG | Retrieval-Augmented Generation — Antworten aus abgerufenen Quellen statt aus dem Modellgedächtnis |
| Embedding | Vektor-Darstellung von Text für semantische Ähnlichkeit |
| Grounding | Bindung der Antwort an den bereitgestellten Kontext |
| Abstention | bewusstes „weiß nicht", wenn keine Quelle trägt |
| Recall@k | Anteil der Fragen, bei denen der richtige § in den Top-k liegt |
Quellen & Repository
- SGB XI:
gesetze-im-internet.de/sgb_11(amtliches Werk, § 5 UrhG) - Code:
github.com/limbpuma/pflegelotse· Live:pflegelotse.limbermartinez.com - Architektur-Details:
docs/architecture.md,docs/adr/