alnv / genai-bundle
Requires
- php: ^8.3
- ext-curl: *
- contao/core-bundle: ~5.3
- helgesverre/chromadb: ~3.0 || ~2.2
- menatwork/contao-multicolumnwizard-bundle: ^3.6
- michelf/php-markdown: ^2.0
- theodo-group/llphant: ^0.11
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-09 16:07:58 UTC
README
RAG-Chatbot für Contao CMS mit lokalen LLMs (Ollama), OpenAI/ChatGPT und ChromaDB Vektorsuche.
Features
- 🤖 Lokale LLMs via Ollama (keine Cloud-Abhängigkeit, Datenschutz-konform)
- 🌐 OpenAI/ChatGPT Unterstützung mit Streaming
- 🔍 RAG (Retrieval Augmented Generation) mit ChromaDB
- ⚡ Streaming-Antworten via Server-Sent Events (SSE)
- 🌐 Multisite-fähig mit Root-Page-Filterung
- 📄 Automatische Indexierung von Seiten und Dateien
- 🎨 Anpassbares Widget für das Frontend
- 🔒 Sicherheit: CSRF-Schutz, Rate-Limiting, XSS-Prävention
Voraussetzungen
Installation
composer require alnv/genai-bundle
Nach der Installation:
# Datenbank aktualisieren php vendor/bin/contao-console contao:migrate # Cache leeren php vendor/bin/contao-console cache:clear
Ollama Modelfile
Mit einem Modelfile können Sie ein bestehendes Ollama-Modell anpassen und optimieren. Das ist besonders nützlich für:
Vorteile eines Modelfile
| Vorteil | Beschreibung |
|---|---|
| Konsistentes Verhalten | System-Prompt ist fest im Modell verankert |
| Schnellerer Start | Kein System-Prompt bei jeder Anfrage nötig |
| Angepasste Parameter | Temperatur, Kontext-Größe, etc. vordefiniert |
| Einfache Verteilung | Modell mit ollama push teilen |
| Persona-Definition | Feste Rolle/Persönlichkeit des Assistenten |
Beispiel: Deutschsprachiger Support-Assistent
Erstellen Sie eine Datei Modelfile:
# Basis-Modell (empfohlen für Deutsch) FROM qwen3:4b # System-Prompt für den Assistenten SYSTEM """ Du bist ein freundlicher und kompetenter Kundenservice-Assistent für ein deutsches Unternehmen. Deine Aufgaben: - Beantworte Fragen basierend auf den bereitgestellten Dokumenten - Antworte immer auf Deutsch, auch wenn die Frage auf Englisch gestellt wird - Sei höflich, präzise und hilfreich - Wenn du etwas nicht weißt, sage es ehrlich - Verweise auf die Quellen, wenn du Informationen aus Dokumenten nutzt Formatierung: - Nutze Markdown für strukturierte Antworten - Verwende Listen für mehrere Punkte - Hebe wichtige Begriffe **fett** hervor """ # Parameter-Optimierung PARAMETER temperature 0.7 PARAMETER num_ctx 8192 PARAMETER top_p 0.9 PARAMETER repeat_penalty 1.1 # Template für Chat-Format (optional) TEMPLATE """ {{- if .System }} <|im_start|>system {{ .System }}<|im_end|> {{- end }} {{- range .Messages }} <|im_start|>{{ .Role }} {{ .Content }}<|im_end|> {{- end }} <|im_start|>assistant """
Modell erstellen und verwenden
# Modell aus Modelfile erstellen ollama create mein-assistent -f Modelfile # Modell testen ollama run mein-assistent "Hallo, wer bist du?" # Modell in Contao verwenden # → Im Backend unter GenAI > Chats das Modell "mein-assistent" eintragen
Weitere Modelfile-Beispiele
Technischer Support
FROM qwen3:4b SYSTEM """ Du bist ein technischer Support-Spezialist. Erkläre komplexe Sachverhalte verständlich. Gib bei Fehlern konkrete Lösungsschritte an. Frage nach, wenn Informationen fehlen. """ PARAMETER temperature 0.5 PARAMETER num_ctx 8192
Kreativer Assistent
FROM qwen3:4b SYSTEM """ Du bist ein kreativer Schreibassistent. Hilf beim Verfassen von Texten, E-Mails und Inhalten. Passe deinen Stil an die gewünschte Zielgruppe an. """ PARAMETER temperature 0.9 PARAMETER num_ctx 4096
Nützliche Parameter
| Parameter | Standard | Beschreibung |
|---|---|---|
temperature |
0.8 | Kreativität (0.0 = deterministisch, 1.0 = kreativ) |
num_ctx |
2048 | Kontextfenster-Größe in Tokens |
top_p |
0.9 | Nucleus Sampling |
top_k |
40 | Top-K Sampling |
repeat_penalty |
1.1 | Vermeidung von Wiederholungen |
num_predict |
-1 | Max. Tokens in Antwort (-1 = unbegrenzt) |
Schnellstart: Backend-Konfiguration
Schritt 1: Chat erstellen
- Navigieren Sie zu GenAI → Chats
- Klicken Sie auf Neu
- Füllen Sie die Felder aus:
| Feld | Beispielwert | Beschreibung |
|---|---|---|
| Name | Ollama Qwen3 |
Interner Name |
| Typ | ollama |
Provider-Typ |
| URL | http://localhost:11434 |
Ollama API URL |
| Modell | qwen3:4b |
LLM-Modell |
- Speichern
Schritt 2: Dokument-Collection erstellen
- Navigieren Sie zu GenAI → Dokumente
- Klicken Sie auf Neu (Collection)
- Füllen Sie die Felder aus:
| Feld | Beispielwert | Beschreibung |
|---|---|---|
| Titel | Website-Inhalte |
Name der Collection |
| Root-Page | Meine Website [de] |
Optional: Nur diese Seiten indexieren |
- Speichern
- Die Dokumente werden automatisch beim nächsten Cronjob indexiert
Schritt 3: Assistenten erstellen
- Navigieren Sie zu GenAI → Assistenten
- Klicken Sie auf Neu
- Füllen Sie die Felder aus:
| Feld | Beispielwert |
|---|---|
| Name | Support-Assistent |
| Assistentenname | KI-Assistent |
| Begrüßungstext | Hallo! Wie kann ich Ihnen helfen? |
| Instruktionen | Du bist ein hilfreicher Assistent. Antworte auf Deutsch. |
| Dokument-Collections | ☑️ Website-Inhalte |
| Chat | Ollama Qwen3 |
- Speichern
Schritt 4: Inhaltselement anlegen
- Bearbeiten Sie einen Artikel in Contao
- Fügen Sie ein neues Inhaltselement hinzu
- Wählen Sie unter GenAI das Element GenAI Chat
- Konfigurieren Sie:
| Feld | Beispielwert |
|---|---|
| Überschrift | Fragen Sie unseren Assistenten |
| Assistent | Support-Assistent |
| Text | Ich beantworte gerne Ihre Fragen. |
- Speichern und schließen
Schritt 5: Indexierung starten
# Vollständiger Index aller Seiten php vendor/bin/contao-console genai:index:full # Status prüfen php vendor/bin/contao-console genai:index:status
Fertig! Das Chat-Widget ist jetzt auf der Seite sichtbar und einsatzbereit.
Inhaltselement: GenAI Chat
Das Bundle stellt ein eigenes Contao-Inhaltselement bereit.
Im Backend
- Artikel bearbeiten → Inhaltselement hinzufügen
- Kategorie GenAI → GenAI Chat auswählen
- Assistent wählen und optional Überschrift/Text anpassen
In eigenen Templates
<?php // In einem Contao-Template oder Modul use Alnv\GenaiBundle\Components\ChatComponent; echo (new ChatComponent(1, [ 'headline' => 'Ihr KI-Assistent', 'text' => 'Stellen Sie mir Ihre Fragen!' ]))->generate(); ?>
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
$assistantId |
int | ID des Assistenten aus dem Backend |
headline |
string | Überschrift über dem Chat-Widget |
text |
string | Beschreibungstext unter der Überschrift |
Beispiel mit dynamischer Assistent-Auswahl
<?php // Assistent je nach Sprache $assistantId = $GLOBALS['TL_LANGUAGE'] === 'en' ? 2 : 1; echo (new \Alnv\GenaiBundle\Components\ChatComponent($assistantId, [ 'headline' => $GLOBALS['TL_LANGUAGE'] === 'en' ? 'Your AI Assistant' : 'Ihr KI-Assistent', 'text' => '' ]))->generate(); ?>
Konfiguration
Alle Config-Optionen
Die Konfiguration erfolgt in config/config.yml oder system/config/localconfig.php:
Ollama Server
| Option | Standard | Beschreibung |
|---|---|---|
genAIOllamaUrl |
http://localhost:11434 |
Ollama API URL |
genAIOllamaTimeout |
120 |
Timeout in Sekunden |
genAIOllamaKeepAlive |
5m |
Modell im RAM halten |
genAIOllamaNumCtx |
4096 |
Kontextfenster-Größe |
genAIOllamaEmbeddingTimeout |
120 |
Embedding-Timeout |
ChromaDB Server
| Option | Standard | Beschreibung |
|---|---|---|
genAIChromaDBUrl |
http://localhost:8000 |
ChromaDB API URL |
genAIChromaDBPort |
8000 |
ChromaDB Port |
genAIChromaDBCollectionName |
genai |
Basis-Collection-Name |
genAIChromaDBTenant |
default_tenant |
ChromaDB Tenant |
genAIChromaDBDatabase |
default_database |
ChromaDB Database |
genAIChromaDBToken |
– | Optional: Auth-Token |
Embedding (Ollama)
| Option | Standard | Beschreibung |
|---|---|---|
genAIChromaDBOllamaUrl |
http://localhost:11434 |
Embedding-Server URL |
genAIChromaDBOllamaModel |
bge-m3 |
Embedding-Modell |
genAIEmbeddingBatchSize |
5 |
Texte pro Request (gegen 413-Fehler) |
genAIEmbeddingMaxTextLength |
8000 |
Max. Zeichen pro Text |
genAIEmbeddingQueryPrefix |
– | Optionaler Query-Prefix |
genAIEmbeddingDocumentPrefix |
– | Optionaler Document-Prefix |
RAG-Einstellungen
| Option | Standard | Beschreibung |
|---|---|---|
genAIMaxContextLength |
8000 |
Max. Kontextlänge für LLM |
genAITopK |
10 |
Anzahl Suchergebnisse |
OpenAI/ChatGPT
| Option | Standard | Beschreibung |
|---|---|---|
genAIOpenAITemperature |
0.7 |
Kreativität (0.0-1.0) |
genAIOpenAIMaxTokens |
4096 |
Max. Antwort-Tokens |
Authentifizierung (optional)
| Option | Beschreibung |
|---|---|
aiServerUser |
Basic Auth Benutzername |
aiServerPassword |
Basic Auth Passwort |
aiServerHostIP |
Host-Header für Reverse Proxy |
Beispiel-Konfiguration
# config/config.yml contao: localconfig: # Ollama Server genAIOllamaUrl: 'http://localhost:11434' genAIOllamaTimeout: 120 genAIOllamaKeepAlive: '5m' genAIOllamaNumCtx: 4096 # ChromaDB Server genAIChromaDBUrl: 'http://localhost:8000' genAIChromaDBCollectionName: 'contao-genai' # Embedding (Ollama) genAIChromaDBOllamaUrl: 'http://localhost:11434' genAIChromaDBOllamaModel: 'bge-m3' # RAG genAIMaxContextLength: 8000 genAITopK: 10 # Optional: Authentifizierung aiServerUser: 'username' aiServerPassword: 'password'
Console-Commands
| Command | Beschreibung |
|---|---|
genai:index:status |
Status der Indexierung anzeigen |
genai:index:sync |
Neue/geänderte Dokumente synchronisieren |
genai:index:full |
Vollständiger Reindex aller Dokumente |
genai:index:purge |
Index bereinigen (Orphans/Alle) |
genai:warmup |
LLM/Embedding-Modelle vorwärmen |
Beispiele
# Status anzeigen php vendor/bin/contao-console genai:index:status # Vollständiger Reindex php vendor/bin/contao-console genai:index:full --force # Index synchronisieren (nur neue) php vendor/bin/contao-console genai:index:sync --limit=100 # Modelle vorwärmen (Cold-Start vermeiden) php vendor/bin/contao-console genai:warmup # Index leeren php vendor/bin/contao-console genai:index:purge --all
Chat-Provider
Ollama (Lokal)
// tl_genai_chats 'type' => 'ollama', 'url' => 'http://localhost:11434', 'model' => 'qwen3:4b' // oder eigenes Modelfile
Empfohlene Modelle:
qwen3:4b– Schnell, gut für Deutschllama3.2:3b– Kompakt, effizientmistral:7b– Ausgewogenqwen3:14b– Beste Qualität (GPU empfohlen)
ChatGPT/OpenAI
// tl_genai_chats 'type' => 'chatgpt', 'url' => 'https://api.openai.com', 'model' => 'gpt-4o-mini'
Unterstützte Modelle:
gpt-4o-mini– Schnell, günstiggpt-4o– Beste Qualitätgpt-4-turbo– Großes Kontextfenster
Empfohlene Embedding-Modelle
| Modell | Dim. | Größe | Deutsch | Empfehlung |
|---|---|---|---|---|
| BGE-M3 | 1024 | 2.2 GB | ⭐⭐⭐⭐⭐ | Standard |
| Qwen3-Embedding | 1024 | 0.6-8 GB | ⭐⭐⭐⭐⭐ | Beste Qualität |
| Multilingual-E5-Large | 1024 | 2.2 GB | ⭐⭐⭐⭐ | Gut |
# Standard (empfohlen) ollama pull bge-m3 # Beste Qualität (GPU) ollama pull qwen3-embedding:8b
Troubleshooting
413 Request Entity Too Large
// localconfig.php $GLOBALS['TL_CONFIG']['genAIEmbeddingBatchSize'] = 1; $GLOBALS['TL_CONFIG']['genAIEmbeddingMaxTextLength'] = 4000;
Langsame erste Antwort (Cold-Start)
php vendor/bin/contao-console genai:warmup
Keine Suchergebnisse
- Index-Status prüfen:
php vendor/bin/contao-console genai:index:status - Bei Modellwechsel: Reindex erforderlich
- Collection-Filter im Assistenten prüfen
Cronjobs
| Cronjob | Intervall | Beschreibung |
|---|---|---|
SyncVectors |
Minutely | Pending-Dokumente verarbeiten |
CleanupOrphans |
Daily | Verwaiste Index-Einträge entfernen |
# Manueller Aufruf
php vendor/bin/contao-console contao:cron
Lizenz
MIT
Autor
💡 GPU/Server-Konfiguration: Benötigen Sie Unterstützung bei der Einrichtung von Ollama, ChromaDB oder GPU-Servern? Kontaktieren Sie mich für individuelle Beratung und Setup.