🧠 Modo híbrido SL5 Aura: integración local de LLM¶
Estado: Experimental / Estable Tecnología: Ollama (Llama 3.2) + Subproceso Python Privacidad: 100% sin conexión
El concepto: “Arquitecto y pasante”¶
Tradicionalmente, Aura se basa en reglas deterministas (RegEx): rápidas, precisas y predecibles. Este es el “Arquitecto”. Sin embargo, a veces el usuario quiere preguntar algo “confuso” o creativo, como “Cuéntame un chiste” o “Resume este texto”.
Aquí es donde entra en juego el Complemento LLM local (el “Pasante”):
Aura (RegEx) primero verifica todos los comandos estrictos (“Encender luces”, “Abrir aplicación”).
Si no se detecta nada que coincida con Y/ O con una palabra desencadenante específica (por ejemplo, “Aura …”), se activa la regla alternativa.
El texto se envía a un modelo de IA local (Ollama).
La respuesta se desinfecta y se envía mediante TTS o escritura de texto.
🛠 Requisitos previos¶
El complemento requiere una instancia en ejecución de Ollama que funcione localmente en la máquina.
# Installation (Arch/Manjaro)
sudo pacman -S ollama
sudo systemctl enable --now ollama
# Download model (Llama 3.2 3B - only ~2GB, very fast)
ollama run llama3.2
📂 Estructura y orden de carga¶
El complemento se coloca intencionalmente en la carpeta z_fallback_llm.
Dado que Aura carga complementos alfabéticamente, este nombre garantiza que la regla LLM se cargue al final. Sirve como “red de seguridad” para comandos no reconocidos.
Ruta: config/maps/plugins/z_fallback_llm/de-DE/
1. El mapa (FUZZY_MAP_pre.py)¶
Usamos una puntuación alta (100) y una palabra desencadenante para obligar a Aura a ceder el control del guión.
import re
from pathlib import Path
CONFIG_DIR = Path(__file__).parent
FUZZY_MAP_pre = [
# Trigger: "Aura" + any text
('ask_ollama', r'^\s*(Aura|Aurora|Laura)\s+(.*)$', 100, {
'command_flags': re.IGNORECASE,
# 'skip_list': ['LanguageTool'], # Optional: Performance boost
'on_match_exec': [CONFIG_DIR / 'ask_ollama.py']
}),
]
2. El controlador (ask_ollama.py)¶
Este script se comunica con la CLI de Ollama.
Importante: Contiene una función clean_text_for_typing. Los resultados sin procesar de LLM a menudo contienen emojis (😂, 🚀) o caracteres especiales que pueden bloquear herramientas como xdotool o sistemas TTS heredados.
# Snippet from ask_ollama.py
def execute(match_data):
# ... (Regex group extraction) ...
# System prompt for short answers
system_instruction = "Answer in German. Max 2 sentences. No emojis."
# Subprocess call (blocks briefly, note the timeout!)
cmd = ["ollama", "run", "llama3.2", full_prompt]
result = subprocess.run(cmd, capture_output=True, ...)
# IMPORTANT: Sanitize output for system stability
return clean_text_for_typing(result.stdout)
⚙️ Opciones de personalización¶
Cambiando el gatillo¶
Modifique la expresión regular en FUZZY_MAP_pre.py si no desea utilizar “Aura” como palabra de activación.
Ejemplo de un verdadero Catch-All (todo lo que Aura no sabe):
r'^(.*)$'(Precaución: ¡Ajuste la puntuación!)
Intercambiando el modelo¶
Puedes cambiar fácilmente el modelo en ask_ollama.py (por ejemplo, a mistral para una lógica más compleja, aunque requiere más RAM).
cmd = ["ollama", "run", "mistral", full_prompt]
Aviso del sistema (Persona)¶
You can give Aura a personality by adjusting the system_instruction:
“Eres un asistente sarcástico de una película de ciencia ficción”.
⚠️ Limitaciones conocidas¶
Latencia: La primera solicitud después del arranque puede tardar entre 1 y 3 segundos mientras el modelo se carga en la RAM. Las solicitudes posteriores son más rápidas.
Conflictos: Si la expresión regular es demasiado amplia (
.*) sin una estructura de carpetas adecuada, podría tragarse los comandos estándar. El orden alfabético (z_...) es imprescindible.Hardware: Requiere aprox. 2 GB de RAM libres para Llama 3.2.