Adiós a la Nube: Cómo Montar tu Propio Agente de IA con Ollama y Open WebUI en Raspberry Pi 5
El movimiento de IA local está explotando. Según un estudio de Gartner (2025), el 67% de los usuarios de Home Assistant priorizan la privacidad sobre la comodidad, y esta tendencia está disparando el interés por ejecutar modelos de lenguaje en hardware propio.
En esta guía te muestro cómo montar tu propio "ChatGPT privado" en una Raspberry Pi 5, con modelos como Llama 3, Mistral o DeepSeek funcionando 100% offline, sin que tus conversaciones salgan nunca de tu casa.
¿Por qué ejecutar IA en local? El fin de la dependencia de la nube
La IA local ofrece privacidad total, cero costes recurrentes y funcionamiento sin internet. Tus datos nunca abandonan tu dispositivo.
El problema de las APIs en la nube
Cada vez que usas ChatGPT, Claude o Gemini:
- Tus prompts se envían a servidores externos en Estados Unidos o Europa
- OpenAI puede usar tus conversaciones para entrenar futuros modelos (a menos que pagues)
- Dependes de su disponibilidad: si OpenAI cae, tu sistema se para
- Pagas por uso: GPT-4 cuesta $0.03/1K tokens de entrada
Las ventajas de Ollama en local
| Aspecto | API en la nube | Ollama local |
|---|---|---|
| Privacidad | Datos en servidores externos | 100% en tu dispositivo |
| Coste mensual | $20-100+ según uso | €0 después de la inversión inicial |
| Latencia | 200-500ms red | 50-100ms local |
| Disponibilidad | Depende del proveedor | Siempre disponible |
| Personalización | Limitada | Fine-tuning completo |
| Offline | No funciona | Funciona sin internet |
"La IA local no es solo privacidad, es soberanía digital. Tu modelo, tus reglas, tus datos." — Andrej Karpathy, ex-Director de IA en Tesla
¿Qué es Ollama y por qué es perfecto para Raspberry Pi 5?
Ollama es un servidor de modelos de lenguaje que simplifica la ejecución local de LLMs en cualquier dispositivo. Soporta ARM64 nativamente.
Ollama funciona como un "Docker para modelos de IA":
- Descarga modelos con un solo comando (
ollama pull llama3) - Gestiona versiones y actualizaciones automáticamente
- Expone una API REST compatible con OpenAI
- Optimiza para tu hardware automáticamente
¿Por qué la Raspberry Pi 5 es viable para IA local?
La Raspberry Pi 5 (2023) supuso un salto de rendimiento brutal:
| Especificación | Raspberry Pi 4 | Raspberry Pi 5 |
|---|---|---|
| CPU | Cortex-A72 (4 cores @ 1.5GHz) | Cortex-A76 (4 cores @ 2.4GHz) |
| RAM máxima | 8GB | 8GB |
| Velocidad memoria | LPDDR4 | LPDDR4X-4267 |
| Rendimiento IA | ~2 tokens/s | ~8-12 tokens/s |
| PCIe | No | Sí (para aceleradores) |
Según benchmarks de Pi My Life Up, la Pi 5 genera entre 8-12 tokens por segundo con modelos de 3-7B parámetros, suficiente para una conversación fluida.
Requisitos previos: Hardware y software necesario
Necesitas una Raspberry Pi 5 con 8GB de RAM, tarjeta SD de 64GB+ (recomendado SSD NVMe), y Raspberry Pi OS 64-bit.
Lista de materiales
| Componente | Mínimo | Recomendado | Precio aprox. |
|---|---|---|---|
| Raspberry Pi 5 | 4GB | 8GB | €80-95 |
| Almacenamiento | SD 64GB | SSD NVMe 256GB+ | €15-50 |
| Alimentación | 5V/3A | Oficial 27W | €15 |
| Carcasa | Básica | Con ventilador activo | €10-30 |
| Cable Ethernet | Opcional | Cat6 | €5 |
Requisitos de software
- Sistema operativo: Raspberry Pi OS 64-bit (Bookworm)
- Docker: Para ejecutar Open WebUI
- Git: Para clonar repositorios
- Python 3.11+: Para scripts auxiliares
Paso 1: Preparar la Raspberry Pi 5 para IA
1.1 Instalar Raspberry Pi OS 64-bit
Descarga Raspberry Pi Imager y flashea la versión 64-bit de Raspberry Pi OS:
1# Después del primer arranque, actualiza el sistema2sudo apt update && sudo apt upgrade -y3 4# Instala dependencias básicas5sudo apt install -y curl wget git jq python3-pip6 7# Verifica la arquitectura (debe mostrar aarch64)8uname -m
1.2 Optimizar el sistema para IA
1# Aumentar swap para modelos grandes (4GB)2sudo dphys-swapfile swapoff3sudo sed -i 's/CONF_SWAPSIZE=.*/CONF_SWAPSIZE=4096/' /etc/dphys-swapfile4sudo dphys-swapfile setup5sudo dphys-swapfile swapon6 7# Verificar swap8free -h9 10# Deshabilitar servicios innecesarios11sudo systemctl disable bluetooth12sudo systemctl disable avahi-daemon
1.3 Configurar SSD NVMe (recomendado)
Si usas un SSD NVMe con adaptador PCIe:
1# Verificar que el SSD está detectado2lsblk3 4# Formatear y montar (cuidado: esto borra el SSD)5sudo mkfs.ext4 /dev/nvme0n16sudo mkdir /mnt/ssd7sudo mount /dev/nvme0n1 /mnt/ssd8 9# Añadir al fstab para montaje automático10echo '/dev/nvme0n1 /mnt/ssd ext4 defaults 0 2' | sudo tee -a /etc/fstab11 12# Mover Docker al SSD para mejor rendimiento13sudo systemctl stop docker14sudo mv /var/lib/docker /mnt/ssd/docker15sudo ln -s /mnt/ssd/docker /var/lib/docker16sudo systemctl start docker
Paso 2: Instalar Ollama en Raspberry Pi 5
2.1 Instalación automática
Ollama tiene un script de instalación oficial que detecta ARM64:
1# Instalar Ollama2curl -fsSL https://ollama.com/install.sh | sh3 4# Verificar instalación5ollama --version6 7# El servicio se inicia automáticamente8systemctl status ollama
2.2 Configurar Ollama para acceso en red
Por defecto, Ollama solo escucha en localhost. Para que Open WebUI pueda conectarse:
1# Crear archivo de configuración del servicio2sudo mkdir -p /etc/systemd/system/ollama.service.d3 4# Configurar para escuchar en todas las interfaces5sudo tee /etc/systemd/system/ollama.service.d/override.conf << 'EOF'6[Service]7Environment="OLLAMA_HOST=0.0.0.0:11434"8Environment="OLLAMA_ORIGINS=*"9EOF10 11# Recargar y reiniciar12sudo systemctl daemon-reload13sudo systemctl restart ollama14 15# Verificar que escucha en todas las interfaces16curl http://localhost:11434/api/tags
2.3 Descargar tu primer modelo
1# Modelos recomendados para Raspberry Pi 5 (8GB RAM)2 3# TinyLlama: El más ligero, ideal para empezar (1.1B parámetros)4ollama pull tinyllama5 6# Phi-3: Excelente relación calidad/tamaño de Microsoft (3.8B)7ollama pull phi38 9# Llama 3.2: El más capaz que puede correr en Pi 5 (3B versión)10ollama pull llama3.2:3b11 12# Mistral 7B: Para Pi 5 con SSD y 8GB RAM (requiere paciencia)13ollama pull mistral:7b-instruct-q4_014 15# Verificar modelos instalados16ollama list
2.4 Probar el modelo
1# Conversación interactiva2ollama run llama3.2:3b3 4# Test rápido via API5curl http://localhost:11434/api/generate -d '{6 "model": "llama3.2:3b",7 "prompt": "¿Qué es Home Assistant en 2 frases?",8 "stream": false9}'
Paso 3: Instalar Open WebUI (interfaz tipo ChatGPT)
Open WebUI proporciona una interfaz web moderna tipo ChatGPT que se conecta a Ollama y soporta múltiples usuarios, historial y personalización.
3.1 Instalar Docker
1# Instalar Docker2curl -fsSL https://get.docker.com | sh3 4# Añadir usuario al grupo docker5sudo usermod -aG docker $USER6 7# Reiniciar sesión o ejecutar8newgrp docker9 10# Verificar11docker --version
3.2 Ejecutar Open WebUI con Docker
1# Crear directorio para datos persistentes2mkdir -p ~/open-webui-data3 4# Ejecutar Open WebUI5docker run -d \6 --name open-webui \7 --restart unless-stopped \8 -p 3000:8080 \9 -v ~/open-webui-data:/app/backend/data \10 -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \11 --add-host=host.docker.internal:host-gateway \12 ghcr.io/open-webui/open-webui:main13 14# Verificar que está corriendo15docker logs -f open-webui
3.3 Acceder a la interfaz
- Abre el navegador en:
http://IP_DE_TU_PI:3000 - Crea una cuenta de administrador (primer usuario)
- Ve a Settings > Models y verifica que Ollama está conectado
- Selecciona un modelo y empieza a chatear

Paso 4: Optimizar rendimiento para uso diario
4.1 Configurar modelos por defecto
Crea un archivo de configuración para Ollama:
1# Modelfile personalizado para conversaciones2cat > ~/Modelfile-assistant << 'EOF'3FROM llama3.2:3b4 5# Parámetros optimizados para Pi 56PARAMETER temperature 0.77PARAMETER top_p 0.98PARAMETER num_ctx 20489PARAMETER num_gpu 010 11# System prompt en español12SYSTEM """13Eres un asistente de IA personal que funciona en local.14Tu nombre es Jarvis. Respondes en español de España.15Eres conciso pero útil. Si no sabes algo, lo admites.16Tienes acceso a Home Assistant para controlar dispositivos domésticos.17"""18EOF19 20# Crear el modelo personalizado21ollama create jarvis -f ~/Modelfile-assistant22 23# Probarlo24ollama run jarvis "¿Cómo puedo automatizar las luces de casa?"
4.2 Configurar para Home Assistant
Si ya tienes Home Assistant, puedes integrarlo:
1# configuration.yaml de Home Assistant2rest_command:3 ask_jarvis:4 url: "http://IP_RASPBERRY:11434/api/generate"5 method: POST6 headers:7 content-type: "application/json"8 payload: >9 {10 "model": "jarvis",11 "prompt": "{{ prompt }}",12 "stream": false13 }
4.3 Script de automatización con IA local
1#!/usr/bin/env python32"""3Script para automatizar tareas con Ollama local4Autor: Javier Santos5"""6 7import requests8import json9 10OLLAMA_URL = "http://localhost:11434/api/generate"11 12def ask_jarvis(prompt: str, model: str = "jarvis") -> str:13 """Envía una pregunta a Ollama y devuelve la respuesta."""14 response = requests.post(15 OLLAMA_URL,16 json={17 "model": model,18 "prompt": prompt,19 "stream": False20 }21 )22 return response.json()["response"]23 24# Ejemplo: Analizar logs de Home Assistant25def analyze_ha_logs(log_content: str) -> str:26 """Pide a la IA que analice logs de HA."""27 prompt = f"""28 Analiza estos logs de Home Assistant y dime si hay problemas:29 30 {log_content}31 32 Responde con:33 1. Resumen del estado34 2. Problemas encontrados35 3. Acciones recomendadas36 """37 return ask_jarvis(prompt)38 39if __name__ == "__main__":40 # Test básico41 respuesta = ask_jarvis("¿Qué hora es en Madrid?")42 print(respuesta)
Paso 5: Comparativa de modelos para Raspberry Pi 5
Rendimiento por modelo (benchmarks reales)
| Modelo | Tamaño | RAM usada | Tokens/s | Calidad respuestas |
|---|---|---|---|---|
| TinyLlama 1.1B | 638MB | 1.2GB | 15-20 | ⭐⭐ Básica |
| Phi-3 Mini 3.8B | 2.2GB | 3.5GB | 10-12 | ⭐⭐⭐⭐ Muy buena |
| Llama 3.2 3B | 2.0GB | 3.2GB | 8-12 | ⭐⭐⭐⭐ Muy buena |
| Mistral 7B Q4 | 4.1GB | 5.5GB | 3-5 | ⭐⭐⭐⭐⭐ Excelente |
| DeepSeek 7B Q4 | 4.0GB | 5.3GB | 3-5 | ⭐⭐⭐⭐⭐ Excelente |
Recomendaciones por caso de uso
Para conversación rápida: Phi-3 Mini o Llama 3.2 3B
- Respuestas en 1-2 segundos
- Calidad suficiente para el 90% de tareas
Para tareas complejas: Mistral 7B Q4
- Mejor razonamiento y seguimiento de instrucciones
- Requiere paciencia (5-10s por respuesta)
Para dispositivos con menos RAM (4GB): TinyLlama
- Funcional pero limitado
- Ideal para automatizaciones simples
Paso 6: Casos de uso avanzados
6.1 Asistente de voz local con Whisper
1# Instalar dependencias2pip3 install openai-whisper sounddevice numpy3 4# Script de transcripción local5cat > ~/voice-assistant.py << 'EOF'6import whisper7import sounddevice as sd8import numpy as np9import requests10 11# Cargar Whisper (solo la primera vez)12model = whisper.load_model("tiny") # tiny, base, small, medium13 14def record_audio(duration=5, samplerate=16000):15 """Graba audio del micrófono."""16 print("🎤 Escuchando...")17 audio = sd.rec(int(duration * samplerate),18 samplerate=samplerate, channels=1)19 sd.wait()20 return audio.flatten()21 22def transcribe(audio):23 """Transcribe audio con Whisper."""24 result = model.transcribe(audio, language="es")25 return result["text"]26 27def ask_ollama(text):28 """Envía texto a Ollama."""29 response = requests.post(30 "http://localhost:11434/api/generate",31 json={"model": "jarvis", "prompt": text, "stream": False}32 )33 return response.json()["response"]34 35if __name__ == "__main__":36 while True:37 audio = record_audio()38 text = transcribe(audio)39 print(f"Tú: {text}")40 41 response = ask_ollama(text)42 print(f"Jarvis: {response}")43EOF
6.2 RAG local para documentación personal
1#!/usr/bin/env python32"""3Sistema RAG local con Ollama y ChromaDB4Para indexar y consultar documentos personales5"""6 7from langchain_community.llms import Ollama8from langchain_community.embeddings import OllamaEmbeddings9from langchain_community.vectorstores import Chroma10from langchain.text_splitter import RecursiveCharacterTextSplitter11from langchain.chains import RetrievalQA12 13# Configurar LLM local14llm = Ollama(model="llama3.2:3b", base_url="http://localhost:11434")15embeddings = OllamaEmbeddings(model="llama3.2:3b")16 17# Cargar y dividir documentos18def create_knowledge_base(documents_path: str):19 """Crea base de conocimiento desde archivos locales."""20 from langchain_community.document_loaders import DirectoryLoader21 22 loader = DirectoryLoader(documents_path, glob="**/*.md")23 docs = loader.load()24 25 splitter = RecursiveCharacterTextSplitter(26 chunk_size=500,27 chunk_overlap=5028 )29 splits = splitter.split_documents(docs)30 31 # Crear vectorstore32 vectorstore = Chroma.from_documents(33 splits,34 embeddings,35 persist_directory="./chroma_db"36 )37 return vectorstore38 39# Crear cadena de QA40def create_qa_chain(vectorstore):41 """Crea cadena de preguntas y respuestas."""42 return RetrievalQA.from_chain_type(43 llm=llm,44 chain_type="stuff",45 retriever=vectorstore.as_retriever()46 )
6.3 Integración con Home Assistant via API
1# automation.yaml - Automatización con IA local2 3automation:4 - alias: "Analizar consumo con IA local"5 trigger:6 - platform: time7 at: "08:00:00"8 action:9 - service: rest_command.ask_jarvis10 data:11 prompt: >12 Analiza mi consumo eléctrico de ayer:13 {{ states('sensor.energia_consumida_ayer') }} kWh.14 ¿Es normal? ¿Qué puedo mejorar?15 response_variable: ia_response16 - service: notify.telegram17 data:18 message: "🤖 Análisis IA: {{ ia_response.content }}"
Solución de problemas comunes
Error: "Out of memory" al cargar modelos
1# Aumentar swap2sudo dphys-swapfile swapoff3sudo sed -i 's/CONF_SWAPSIZE=.*/CONF_SWAPSIZE=8192/' /etc/dphys-swapfile4sudo dphys-swapfile setup5sudo dphys-swapfile swapon6 7# Usar versión cuantizada más pequeña8ollama pull llama3.2:3b-instruct-q4_K_M # En lugar de q8
Ollama no responde o muy lento
1# Verificar estado del servicio2systemctl status ollama3 4# Ver logs5journalctl -u ollama -f6 7# Reiniciar si está atascado8sudo systemctl restart ollama9 10# Liberar memoria11sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'
Open WebUI no conecta con Ollama
1# Verificar que Ollama escucha en todas las interfaces2curl http://localhost:11434/api/tags3 4# Si usas Docker, verificar networking5docker exec open-webui curl http://host.docker.internal:11434/api/tags6 7# Alternativa: usar red del host8docker run -d \9 --name open-webui \10 --network host \11 -v ~/open-webui-data:/app/backend/data \12 -e OLLAMA_BASE_URL=http://localhost:11434 \13 ghcr.io/open-webui/open-webui:main
¿Cuánto cuesta realmente vs suscripciones cloud?
Comparativa de costes a 2 años
| Solución | Coste inicial | Coste mensual | Total 2 años |
|---|---|---|---|
| ChatGPT Plus | €0 | €20 | €480 |
| Claude Pro | €0 | €18 | €432 |
| API OpenAI (uso moderado) | €0 | €30-50 | €720-1200 |
| Raspberry Pi 5 + Ollama | €200 | €3 (electricidad) | €272 |
Próximos pasos: Expande tu sistema
Una vez tienes Ollama funcionando, puedes:
- Añadir más modelos especializados (código, matemáticas, idiomas)
- Integrar con Home Assistant para control por voz
- Crear agentes autónomos con LangChain
- Añadir RAG para consultar tus documentos
- Conectar con n8n para automatizaciones complejas
Recursos adicionales
- Documentación oficial de Ollama
- Open WebUI en GitHub
- Modelos disponibles en Ollama
- Guía Pi My Life Up
Conclusión: El futuro de la IA es local
Montar tu propio agente de IA local ya no es ciencia ficción. Con una inversión de €200 y un par de horas de configuración, puedes tener un asistente de IA privado que:
- No envía tus datos a ningún servidor externo
- Funciona sin internet
- No tiene costes recurrentes
- Es totalmente personalizable
La combinación de Raspberry Pi 5 + Ollama + Open WebUI democratiza la IA local, haciendo accesible tecnología que hace dos años solo estaba al alcance de empresas con grandes presupuestos.
¿El siguiente paso? En el próximo artículo te muestro cómo integrar este agente con Frigate NVR para que tu casa entienda lo que ve en las cámaras.
¿Ya tienes Ollama funcionando? Comparte tu experiencia en los comentarios. Y si este artículo te ha sido útil, compártelo con otros entusiastas de Home Assistant y la IA local.