RAG-Chat
Retrieval-Augmented Generation Chat mit semantischer Suche und Session-Persistenz.
| Tool | /chat |
|---|---|
| API-Referenz | /docs/api/chat |
| LLM | Claude Opus 4.5 (Anthropic) / Ollama (lokal) |
| Embedding | mxbai-embed-large (Ollama) |
| Vektoren | Qdrant |
| Datenbank | ki_content (chat_sessions, chat_messages) |
Web-UI Routen
| Route | Methode | Beschreibung |
|---|---|---|
| /chat | GET | Neue Session erstellen, Redirect zu /chat/{uuid} |
| /chat/{uuid} | GET | Session anzeigen (Sidebar + Nachrichten) |
| /chat/{uuid}/message | POST | Nachricht senden (HTMX) |
| /chat/{uuid}/title | POST | Session-Titel aktualisieren (HTMX) |
| /chat/{uuid}/system-prompt | GET | System-Prompt Modal laden (HTMX) |
| /chat/{uuid}/system-prompt | POST | System-Prompt speichern (HTMX) |
| /chat/{uuid} | DELETE | Session löschen (HTMX) |
| /chat/sessions | GET | Session-Liste Partial (HTMX) |
Features
Session-Verwaltung
- Session-Persistenz mit UUID-basierten URLs
- Session-Liste in Sidebar mit Auto-Refresh (HTMX)
- Auto-Titel aus erster Nachricht
- Manueller Titel-Edit via Inline-Input
- Session löschen (CASCADE auf Nachrichten)
Konfiguration
- Modell-Auswahl (Claude / Ollama)
- Collection-Auswahl (5 Qdrant-Collections)
- Kontext-Limit (3/5/10/15 Quellen)
- Autorenprofil-Auswahl für Schreibstil
- System-Prompt pro Session
Token & Kosten
- Pro Nachricht: Input-Tokens, Output-Tokens, Kosten
- Pro Session: Token-Summe und Gesamtkosten in Sidebar
- Kosten-Berechnung: Opus 4.5 Pricing ($15/1M input, $75/1M output)
- Ollama: "lokal" Label statt Token-Zahlen
Datenbank-Schema
Session-Persistenz in ki_content:
chat_sessions
| Spalte | Typ | Beschreibung |
|---|---|---|
| id | INT AUTO_INCREMENT | Primary Key |
| uuid | VARCHAR(36) UNIQUE | Session-UUID für URLs |
| title | VARCHAR(255) | Session-Titel (auto/manuell) |
| model | VARCHAR(50) | LLM-Modell (anthropic/ollama) |
| collection | VARCHAR(50) | Qdrant-Collection |
| context_limit | INT | Anzahl RAG-Quellen (Default: 5) |
| created_at | TIMESTAMP | Erstellungszeitpunkt |
| last_activity | TIMESTAMP | Letzte Aktivität |
chat_messages
| Spalte | Typ | Beschreibung |
|---|---|---|
| id | INT AUTO_INCREMENT | Primary Key |
| session_id | INT NOT NULL | FK zu chat_sessions (CASCADE DELETE) |
| role | ENUM('user','assistant') | Nachrichtenrolle |
| content | TEXT | Nachrichteninhalt |
| tokens_input | INT | Input-Tokens (Claude) |
| tokens_output | INT | Output-Tokens (Claude) |
| sources | JSON | RAG-Quellen mit Scores |
| model | VARCHAR(50) | Verwendetes Modell |
| created_at | TIMESTAMP | Erstellungszeitpunkt |
RAG-Pipeline
User Query (Text)
↓
Embedding erzeugen (mxbai-embed-large)
↓
Qdrant: Ähnliche Chunks finden (Top-K)
↓
Kontext zusammenstellen
↓
LLM (Claude/Ollama): Antwort generieren
↓
Response + Quellenangaben + Tokens speichern