🧠 SL5 Aura Hybrid-Modus: Lokale LLM-Integration¶
Status: Experimentell / Stable Technologie: Ollama (Llama 3.2) + Python Subprocess Datenschutz: 100% Offline
Das Konzept: “Architekt & Praktikant”¶
Aura basiert traditionell auf deterministischen Regeln (RegEx) – schnell, präzise, vorhersagbar. Das ist der “Architekt”. Doch manchmal will der Nutzer etwas “Unscharfes” (Fuzzy) fragen, wie “Erzähl einen Witz” oder “Fasse diesen Text zusammen”.
Hier kommt das Local LLM Plugin ins Spiel (der “Praktikant”):
Aura (RegEx) prüft zuerst alle strikten Befehle (“Licht an”, “App öffnen”).
Wenn nichts passt UND/ODER ein Trigger-Wort (z.B. “Aura …”) erkannt wird, greift die Fallback-Regel.
Der Text wird an eine lokale KI (Ollama) gesendet.
Die Antwort wird bereinigt und via TTS oder Text-Output ausgegeben.
🛠 Voraussetzungen¶
Das Plugin benötigt eine laufende Instanz von Ollama, die lokal auf dem Rechner läuft.
# Installation (Arch/Manjaro)
sudo pacman -S ollama
sudo systemctl enable --now ollama
# Modell laden (Llama 3.2 3B - nur ca. 2GB, sehr schnell)
ollama run llama3.2
📂 Struktur & Ladereihenfolge¶
Das Plugin liegt bewusst im Ordner z_fallback_llm.
Da Aura Plugins alphabetisch lädt, stellen wir so sicher, dass die LLM-Regel als letztes geladen wird. Sie dient als “Auffangnetz” (Safety Net).
Pfad: config/maps/plugins/z_fallback_llm/de-DE/
1. Die Map (FUZZY_MAP_pre.py)¶
Wir nutzen einen hohen Score (100) und ein Trigger-Wort, um Aura zu zwingen, die Kontrolle abzugeben.
import re
from pathlib import Path
CONFIG_DIR = Path(__file__).parent
FUZZY_MAP_pre = [
# Trigger: "Aura" + beliebiger Text
('ask_ollama', r'^\s*(Aura|Aurora|Laura)\s+(.*)$', 100, {
'command_flags': re.IGNORECASE,
'on_match_exec': [CONFIG_DIR / 'ask_ollama.py']
}),
]
2. Der Handler (ask_ollama.py)¶
Dieses Skript kommuniziert mit der CLI von Ollama.
Wichtig: Es enthält eine clean_text_for_typing Funktion. Rohe LLM-Ausgaben enthalten oft Emojis (😂, 🚀), die Tools wie xdotool oder alte TTS-Systeme zum Absturz bringen können.
# Auszug aus ask_ollama.py
def execute(match_data):
# ... (Extraktion der Regex-Gruppe) ...
# System-Prompt für kurze Antworten
system_instruction = "Antworte auf Deutsch. Maximal 2 Sätze. Keine Emojis."
# Subprocess Aufruf (blockiert kurzzeitig, Timeout beachten!)
cmd = ["ollama", "run", "llama3.2", full_prompt]
result = subprocess.run(cmd, capture_output=True, ...)
# WICHTIG: Bereinigung für Stabilität
return clean_text_for_typing(result.stdout)
⚙️ Anpassungsmöglichkeiten¶
Trigger ändern¶
Ändere die RegEx in FUZZY_MAP_pre.py, wenn du nicht “Aura” sagen willst.
Beispiel für Catch-All (alles, was Aura nicht kennt):
r'^(.*)$'
Modell wechseln¶
In ask_ollama.py kann das Modell einfach getauscht werden (z.B. zu mistral für komplexere Logik, benötigt aber mehr RAM).
cmd = ["ollama", "run", "mistral", full_prompt]
System Prompt (Persona)¶
Du kannst Aura eine Persönlichkeit geben, indem du system_instruction anpasst:
“Du bist ein sarkastischer Assistent aus einem Sci-Fi Film.”
⚠️ Bekannte Limitierungen¶
Latenz: Der erste Aufruf kann 1-3 Sekunden dauern, da das Modell in den RAM geladen wird. Danach geht es schneller.
Konflikte: Wenn die RegEx zu allgemein ist (
.*), könnten Standard-Befehle verschluckt werden. Die alphabetische Sortierung (z_...) ist essenziell.Hardware: Benötigt ca. 2GB freien RAM für Llama 3.2.