Knowledge-Hub-Modul — Architektur-Konzept (v2)¶
Status: Konsolidierter Entwurf Zielversion: v2.0.0 Aufwand: ~150h Abhängigkeiten: Multi-Tenancy-Fundament v1.0.0, Konnektor-Welle 1 + Teile Welle 2 Trigger: Start nach 2-3 Monaten AVS-Feedback-Phase zum v1.0.0-Fundament Letzte Aktualisierung: 2026-04-17
Änderungshistorie v1 → v2¶
| Änderung | Grund |
|---|---|
| Frontend-Stack: Vue 3 ohne Pinia festgelegt | Plattform-Entscheidung aus Dialog |
Aktivierung über tenant_packages |
Einstufige Freischaltung, kein Lizenz-Gate |
| UI-Defaults festgelegt | Aus Dialog-Block 4: Responsiveness ja, Mobile-First nein, etc. |
| Timing: 2-3 Monate nach v1.0.0-Launch, nicht parallel | Bewusste Lernphase aus Produktivdaten |
1. Ziel & Positionierung¶
Was das Modul liefert¶
Eine zweite Interaktionsform für das aggregierte Wissen eines Tenants — neben dem Chatbot. Fokus: Such-First, mit Chat als Feature daneben.
Typischer Workflow: 1. User öffnet Knowledge-Hub-UI 2. Tippt Suchbegriff oder Frage 3. Bekommt semantisch rangierte Ergebnisse mit Snippet, Quellen-Badges, Facetten-Filtern 4. Klickt ein Ergebnis → volles Dokument mit Source-Attribution 5. Alternativ: "Chat zu diesem Thema" → springt in Chatbot mit vorgefülltem Kontext
Was das Modul nicht ist¶
Explizit nicht im Scope:
- Kein Knowledge-Graph mit Entitäts-Extraktion
- Keine ML-Personalisierung
- Kein Governance-Dashboard
- Kein Document-Lifecycle-Management
- Keine agentischen Workflows
- Keine Browser-Extension, keine Desktop-App, keine Mobile-Native-App
Wir bleiben im Pfad B des Gesamtkonzepts: Plattform-Fundament für Tourismus/Verwaltungs-Domäne, nicht horizontales SaaS-Produkt (würde Stufe 3 entsprechen).
Verhältnis zum Chatbot¶
Beide greifen auf denselben Index zu (Qdrant-Collections des Chatbots + optional Shared-Collections). Beide sehen dieselben Daten. Unterschied: Chatbot ist konversationell + generativ, Knowledge-Hub ist retrieval-fokussiert + explorativ.
Rationale für Timing (festgelegt)¶
Start nach 2-3 Monaten AVS-Feedback zum v1.0.0-Fundament. Grund: Ohne echte Nutzungsdaten aus produktivem AVS-Betrieb können wir nur raten, ob eine Such-First-UI wirklich angenommen wird oder ob Chat das bevorzugte Paradigma bleibt. Die Lernphase gibt uns Entscheidungsgrundlage.
2. Aktivierung und Scope¶
2.1 Als Plattform-Modul¶
Knowledge-Hub ist ein external_eligible Plattform-Modul (knowledge_hub). Einstufige Freischaltung über tenant_packages:
-- Aktivierung pro Tenant durch Operator (AVS):
UPDATE tenant_packages
SET enabled_modules = enabled_modules || '"knowledge_hub"'
WHERE tenant_id = :tenant_id;
Kein Lizenz-Feature-Gate. AVS-Operator entscheidet im Paket-Konfigurations-UI, welche Tenants das Modul bekommen. Preis-Durchreichung an die Kurverwaltung ist Sache von AVS.
2.2 Scope pro Tenant¶
Aktivierte Tenants haben UI-Route /tenant/knowledge/, die alle Chatbots des Tenants als potentielle Suchquellen anzeigt. Alle Wissensquellen (chatbot_sources) quer über alle Chatbots sind durchsuchbar.
Tenant-User mit tenant-viewer oder höher kann nutzen.
2.3 Nicht-Tenant-übergreifend¶
Invariante: Knowledge-Hub eines Tenants sieht nie Daten eines anderen Tenants. Die Isolationsgrenze des Multi-Tenancy-Fundaments gilt.
3. Architektur¶
3.1 Einordnung ins Drei-Schichten-Modell¶
Das Knowledge-Hub ist eine zusätzliche konsumierende Schicht auf dem Fundament aus v1.0.0 — keine eigene Indexierung, keine eigene Ingestion:
┌─────────────────────────────────────────────────────────┐
│ KONSUMIERENDE SCHICHT │
│ ┌──────────────┐ ┌──────────────────┐ ┌───────────┐ │
│ │ Chatbot (v1) │ │ Knowledge-Hub │ │ API │ │
│ │ │ │ (v2.0.0) │ │ │ │
│ └──────┬───────┘ └────────┬─────────┘ └─────┬─────┘ │
│ │ │ │ │
└─────────┴───────────────────┴───────────────────┴───────┘
│
▼
┌─────────────────────────────────┐
│ Indexierungs-Schicht (v1.0.0) │
└─────────────────────────────────┘
3.2 Neue Services¶
- Search-Service (
src/avs_chatbot/modules/knowledge_hub/search.py): Retrieval-basiert, ohne LLM-Generierung - Browse-Service: SQL-basiert, Facet-Aggregation auf
document_versions - Summary-Service: LLM-Call für on-demand-Dokumenten-Zusammenfassungen, gecached
3.3 Datenmodell-Erweiterungen¶
Neue Tabellen (alle tenant-scoped, RLS aktiv):
CREATE TABLE kh_bookmarks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
user_id VARCHAR(255) NOT NULL,
document_id UUID NOT NULL REFERENCES document_versions(id) ON DELETE CASCADE,
note TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (user_id, document_id)
);
CREATE TABLE kh_search_history (
id BIGSERIAL PRIMARY KEY,
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
user_id VARCHAR(255) NOT NULL,
query TEXT NOT NULL,
result_count INT,
searched_at TIMESTAMPTZ NOT NULL DEFAULT now(),
clicked_doc_ids UUID[]
);
CREATE TABLE kh_saved_searches (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
user_id VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
query TEXT NOT NULL,
filters JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE kh_document_summaries (
document_id UUID PRIMARY KEY REFERENCES document_versions(id) ON DELETE CASCADE,
summary TEXT NOT NULL,
language VARCHAR(5) NOT NULL,
generated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
model_version VARCHAR(64)
);
4. UI-Architektur¶
4.1 Stack (festgelegt in v2)¶
Vue 3 + Composition API, analog zur Plattform-Entscheidung. Ohne Pinia — State-Weitergabe über Props/Events und bei Bedarf provide/inject.
Search-Listen, Facetten-Filter, Bookmarks-Widget als einzeln mountbare Vue-Apps in bestehende Jinja2-Seiten oder als zusammenhängende Hub-SPA unter /tenant/knowledge/*. Die Entscheidung (SPA vs. teil-eingebettet) wird beim Implementierungsstart getroffen — beide Varianten sind architektonisch kompatibel.
4.2 Routen¶
/tenant/knowledge/
├── / → Landing: Suchfeld + kürzliche Suchen + Bookmarks
├── /search?q=... → Ergebnisseite mit Facetten
├── /doc/{id} → Einzeldokument-Detail
├── /source/{id} → Quellen-Übersicht (alle Docs einer Source)
├── /bookmarks → Meine Bookmarks
├── /history → Mein Suchverlauf
└── /saved → Gespeicherte Suchen
4.3 Landing-Page (Wireframe)¶
┌────────────────────────────────────────────────────┐
│ Wissensbasis Kurverwaltung Bad Tölz │
│ │
│ ┌────────────────────────────────────────────────┐ │
│ │ 🔍 Worin wird gesucht? (Was ist Kurtaxe?) │ │
│ └────────────────────────────────────────────────┘ │
│ │
│ ┌─ Kürzlich gesucht ────────────────────────────┐ │
│ │ Kurtaxe-Berechnung vor 2h │ │
│ │ Meldeschein-Workflow gestern │ │
│ └───────────────────────────────────────────────┘ │
│ │
│ ┌─ Bookmarks ──┐ ┌─ Quellen-Übersicht ──────────┐ │
│ │ 📌 3 Docs │ │ 📄 42 Uploads │ │
│ │ │ │ 📚 156 Confluence-Seiten │ │
│ └──────────────┘ └───────────────────────────────┘ │
└────────────────────────────────────────────────────┘
4.4 Ergebnisseite¶
(Unverändert zu v1: Filter-Sidebar + Ergebnis-Liste mit Snippet, Source-Badge, Datum, Chat-Button)
4.5 Dokument-Detail¶
(Unverändert zu v1: KI-Zusammenfassung + Volltext + Source-Attribution + Bookmark + Chat-Option)
4.6 Chatbot-Integration¶
"Chat zu diesem Dokument" öffnet den zugehörigen Chatbot mit vorgefüllter System-Kontext-Nachricht. Der Chatbot priorisiert das referenzierte Dokument beim Retrieval.
4.7 UI-Defaults (festgelegt in v2)¶
| Thema | Default |
|---|---|
| Volltext-Highlighting | highlight.js für Code + eigene Span-Wrapper für Fließtext |
| Sprachen (UI) | DE + EN von Anfang an |
| Mobile Responsiveness | Responsive, aber kein Mobile-First |
Keyboard-Shortcuts (/, ⌘K) |
v2.1.0-Feature, nicht Launch-kritisch |
| Dokument-Vorschau | Voller Download in v2.0.0, Streaming in v2.1.0 |
5. Technische Umsetzung¶
5.1 API-Endpoints¶
GET /api/v2/knowledge/search
?q=<query>&sources=<id1,id2>&chatbots=<id1,id2>
&date_from=&date_to=&limit=20&offset=0
→ { results, facets, total }
GET /api/v2/knowledge/documents/{id}
GET /api/v2/knowledge/documents/{id}/summary
POST /api/v2/knowledge/bookmarks
GET /api/v2/knowledge/bookmarks
DELETE /api/v2/knowledge/bookmarks/{id}
GET /api/v2/knowledge/history
POST /api/v2/knowledge/saved-searches
5.2 Search-Algorithmus¶
- Query-Embedding generieren
- Parallel über alle relevanten Qdrant-Collections suchen (Chatbot-Collections + optional Shared)
- Top-20 pro Collection, Merge + Re-Ranking via Cross-Encoder
- Facet-Aggregation auf PostgreSQL-Seite (aus
document_versions) - Response: Top-N + Facet-Counts
Performance-Ziel: <1s p95 (deutlich schneller als Chatbot, weil kein LLM-Call).
5.3 Zusammenfassungs-Caching¶
On-demand generiert, in kh_document_summaries gecached. Invalidierung bei Neuindizierung des Dokuments.
5.4 Permission-Awareness¶
Das Knowledge-Hub profitiert direkt vom Permission-Framework aus Konnektor-Ausbau (siehe Konnektor-Roadmap §6):
- Beim Launch (v2.0.0): Wenn Permission-Framework in Phase 1 → alle Tenant-User sehen alles Tenant-interne (keine Filterung)
- Wenn Phase 2 vorher aktiviert: Automatische Filterung auf User-Gruppen
Der Hub bringt keine eigene Permission-Logik mit.
6. Aktivierungsworkflow¶
6.1 Operator-Seite (AVS)¶
- Knowledge-Hub-Modul wird beim Deployment installiert (Teil des v2.0.0-Packages)
- Operator-Admin:
tenant_packages.enabled_modulesumknowledge_huberweitern für gewünschte Tenants
6.2 Tenant-Seite¶
- Tenant-Admin sieht neue Navigation "Wissensbasis" in der Tenant-UI
- Einmalige Einrichtung: welche Chatbots im Hub durchsuchbar? (Default: alle)
- Nutzung beginnt
7. Was wir NICHT aus Chatbot-Logik erben¶
- Kein Chat-History
- Keine Guardrails (kein LLM-Call in Hauptinteraktion)
- Kein Thumb-up/down-Feedback — stattdessen Click-Tracking
- Kein Rate-Limiting auf Such-Ebene, nur generisch auf API
8. Aufwandsschätzung¶
| Block | Aufwand |
|---|---|
| 1. Frontend-Framework-Setup (Vue 3 + Build) | 12h |
| 2. Datenmodell-Migration (4 neue Tabellen) | 8h |
| 3. Search-Service | 24h |
| 4. Browse-Service | 12h |
| 5. Summary-Service + Caching | 12h |
| 6. UI — Landing-Page + Suchfeld | 8h |
| 7. UI — Suchergebnisse mit Facetten | 20h |
| 8. UI — Dokument-Detail | 16h |
| 9. UI — Bookmarks + History + Saved-Searches | 12h |
| 10. Chatbot-Integration ("Chat zu diesem Dok") | 8h |
| 11. API-Endpoints | 12h |
| 12. Permission-Integration (nutzt vorhandenes Framework) | 8h |
| 13. Testing + Dokumentation | 14h |
| Total | ~166h |
Realistisch ~150-170h.
8.1 Reduktionen¶
- Block 9 in v2.1.0 verschieben: -12h
- Block 10 in v2.1.0 verschieben: -8h
- Summary-Caching minimal (nur on-demand, kein Store): -4h
Minimal-Scope: ~130h
9. Phasierung¶
Phase I — Backend-Services (~56h)¶
Blöcke 2, 3, 4, 5, 11.
Phase II — Core-UI (~56h)¶
Blöcke 1, 6, 7, 8.
Phase III — Ergänzungen (~54h)¶
Blöcke 9, 10, 12, 13.
Kalenderzeit: ~4-5 Wochen fokussiert.
10. Voraussetzungen¶
- Multi-Tenancy-Fundament v1.0.0 steht
- Mindestens 2-3 Konnektor-Typen implementiert (Welle 1)
- 2-3 Monate AVS-Produktivbetrieb als Lernphase durchlaufen
- Permission-Framework Phase 1 reicht; Phase 2 wäre Bonus
- Vue-3-Build-Infrastruktur aus v1.0.0 bereits etabliert
11. Erfolgs-Kennzahlen¶
| Metrik | Ziel (3 Monate nach Launch) |
|---|---|
| Monthly Active Users pro Tenant | >50% der Tenant-User |
| Searches pro User pro Monat | >10 |
| Click-Through-Rate auf Ergebnisse | >40% |
| Time-to-Found (median) | <20s |
| "Chat zu diesem Dok"-Nutzung | >15% der Dokument-Views |
| Bookmarks pro aktivem User | >3 |
Zweck: Verstehen, ob Such-Paradigma angenommen wird oder Chat dominiert.
12. Geklärte und offene Punkte¶
Geklärt (aus Dialog)¶
- ✅ Vue 3 + Composition API als Stack
- ✅ Timing: nach 2-3 Monaten AVS-Feedback
- ✅ Aktivierung über
tenant_packages, kein Lizenz-Gate - ✅ DE + EN von Anfang an
- ✅ Responsive, aber kein Mobile-First
- ✅ Keyboard-Shortcuts und Stream-Preview in v2.1.0
Offen (Feinheiten, erst beim Implementierungsstart)¶
- SPA vs. teil-eingebettete Vue-Komponenten (hängt an AVS-Feedback zum Admin-UI-Gefühl)
- Facetten-Detailumfang (welche Metadaten werden zu Filtern?)
- Volltext-Viewer-Integration für PDFs (Browser-nativ oder PDF.js?)
13. Was als Nächstes¶
Dieses Konzept wird nicht direkt umgesetzt, sondern nach der AVS-Feedback-Phase erneut validiert. Vor der Implementierung sollten gesehen werden:
- AVS-Nutzungsdaten aus ~2-3 Monaten Produktivbetrieb
- Welche Konnektoren realistisch bis dahin implementiert sind
- Bedarfsabschätzung: Wie viele Tenant-User pro aktiviertem Modul können wir erwarten?
Falls sich in dieser Phase zeigt, dass der Chatbot die Such-Bedürfnisse ausreichend bedient, kann das Modul verschoben oder reduziert werden. Falls Such-First-Bedarf deutlich wird: Dieses Konzept wird zur Umsetzungsgrundlage.